use cpal::traits::{DeviceTrait, HostTrait}; pub struct CpalDeviceInfo { pub index: String, pub name: String, pub is_default: bool, pub device: cpal::Device, } pub fn list_input_devices() -> Result, Box> { let host = cpal::default_host(); let default_name = host.default_input_device().and_then(|d| d.name().ok()); let mut out = Vec::::new(); for (index, device) in host.input_devices()?.enumerate() { let name = device.name().unwrap_or_else(|_| "Unknown".into()); let is_default = Some(name.clone()) == default_name; out.push(CpalDeviceInfo { index: index.to_string(), name, is_default, device, }); } Ok(out) }