extern crate anyhow; extern crate cpal; use cpal::traits::{DeviceTrait, HostTrait}; fn main() -> Result<(), anyhow::Error> { println!("Supported hosts:\n {:?}", cpal::ALL_HOSTS); let available_hosts = cpal::available_hosts(); println!("Available hosts:\n {:?}", available_hosts); for host_id in available_hosts { println!("{}", host_id.name()); let host = cpal::host_from_id(host_id)?; let default_in = host.default_input_device().map(|e| e.name().unwrap()); let default_out = host.default_output_device().map(|e| e.name().unwrap()); println!(" Default Input Device:\n {:?}", default_in); println!(" Default Output Device:\n {:?}", default_out); let devices = host.devices()?; println!(" Devices: "); for (device_index, device) in devices.enumerate() { println!(" {}. \"{}\"", device_index + 1, device.name()?); // Input configs if let Ok(conf) = device.default_input_config() { println!(" Default input stream config:\n {:?}", conf); } let mut input_configs = match device.supported_input_configs() { Ok(f) => f.peekable(), Err(e) => { println!("Error: {:?}", e); continue; } }; if input_configs.peek().is_some() { println!(" All supported input stream configs:"); for (config_index, config) in input_configs.enumerate() { println!( " {}.{}. {:?}", device_index + 1, config_index + 1, config ); } } // Output configs if let Ok(conf) = device.default_output_config() { println!(" Default output stream config:\n {:?}", conf); } let mut output_configs = match device.supported_output_configs() { Ok(f) => f.peekable(), Err(e) => { println!("Error: {:?}", e); continue; } }; if output_configs.peek().is_some() { println!(" All supported output stream configs:"); for (config_index, config) in output_configs.enumerate() { println!( " {}.{}. {:?}", device_index + 1, config_index + 1, config ); } } } } Ok(()) }