use cpal::traits::{DeviceTrait, HostTrait};
use crate::error::{Error, Result};
#[derive(Debug, Clone)]
pub struct AudioDevice {
pub name: String,
pub is_default: bool,
}
pub fn list_audio_devices() -> Result<Vec<AudioDevice>> {
let host = cpal::default_host();
let default_device = host.default_input_device();
let default_name = default_device
.as_ref()
.and_then(|d| d.description().ok())
.map(|desc| desc.name().to_string());
let devices = host
.input_devices()?
.filter_map(|device| {
device.description().ok().map(|desc| {
let name = desc.name().to_string();
let is_default = default_name.as_ref() == Some(&name);
AudioDevice { name, is_default }
})
})
.collect();
Ok(devices)
}
pub fn get_device_by_name(name: &str) -> Result<cpal::Device> {
let host = cpal::default_host();
host.input_devices()?
.find(|device| {
device
.description()
.ok()
.map(|desc| desc.name() == name)
.unwrap_or(false)
})
.ok_or_else(|| Error::DeviceNotFound(name.to_string()))
}
pub fn get_default_device() -> Result<cpal::Device> {
let host = cpal::default_host();
host.default_input_device().ok_or(Error::NoDeviceFound)
}