use cpal::traits::HostTrait;
use cpal::{Device, Error, ErrorKind, Host};
pub fn list_devices(host: Option<Host>) -> Result<Vec<Device>, Error> {
if let Some(host) = host {
Ok(host.input_devices()?.collect())
} else {
Ok(cpal::default_host().input_devices()?.collect())
}
}
pub fn list_device_names() -> Result<Vec<String>, Error> {
Ok(list_devices(None)?.iter().map(Device::to_string).collect())
}
pub fn find_device(name: &str) -> Result<Device, Error> {
let devices = list_devices(None)?;
devices
.iter()
.find(|device| device.to_string() == name)
.or_else(|| {
devices
.iter()
.find(|device| device.to_string().eq_ignore_ascii_case(name))
})
.cloned()
.ok_or_else(|| {
Error::with_message(
ErrorKind::DeviceNotAvailable,
format!("no input device named {name:?}"),
)
})
}
pub fn default_device() -> Option<Device> {
cpal::default_host().default_input_device()
}