in src/backend/mod.rs [1976:2022]
fn audiounit_get_devices_of_type(devtype: DeviceType) -> Vec<AudioObjectID> {
assert!(devtype.intersects(DeviceType::INPUT | DeviceType::OUTPUT));
debug_assert_running_serially();
let mut devices = get_devices();
// Remove the aggregate device from the list of devices (if any).
devices.retain(|&device| {
// TODO: (bug 1628411) Figure out when `device` is `kAudioObjectUnknown`.
if device == kAudioObjectUnknown {
false
} else if let Ok(uid) = get_device_global_uid(device) {
let uid = uid.into_string();
!uid.contains(PRIVATE_AGGREGATE_DEVICE_NAME)
&& !uid.contains(VOICEPROCESSING_AGGREGATE_DEVICE_NAME)
} else {
// Fail to get device uid.
true
}
});
// Expected sorted but did not find anything in the docs.
devices.sort_unstable();
if devtype.contains(DeviceType::INPUT | DeviceType::OUTPUT) {
return devices;
}
let mut devices_in_scope = Vec::new();
for device in devices {
let label = match get_device_label(device, DeviceType::OUTPUT | DeviceType::INPUT) {
Ok(label) => label.into_string(),
Err(e) => format!("Unknown(error: {})", e),
};
let info = format!("{} ({})", device, label);
if let Ok(channels) = get_channel_count(device, devtype) {
cubeb_log!("Device {} has {} {:?}-channels", info, channels, devtype);
if channels > 0 {
devices_in_scope.push(device);
}
} else {
cubeb_log!("Cannot get the channel count for device {}. Ignored.", info);
}
}
devices_in_scope
}