in src/backend/mod.rs [1802:1947]
fn create_cubeb_device_info(
intern: &Arc<Mutex<intern::Intern>>,
devid: AudioObjectID,
devtype: DeviceType,
) -> Result<ffi::cubeb_device_info> {
if devtype != DeviceType::INPUT && devtype != DeviceType::OUTPUT {
return Err(Error::error());
}
let channels = get_channel_count(devid, devtype).map_err(|e| {
cubeb_log!("Cannot get the channel count. Error: {}", e);
Error::error()
})?;
if channels == 0 {
// Invalid type for this device.
return Err(Error::error());
}
let mut dev_info = ffi::cubeb_device_info {
max_channels: channels,
..Default::default()
};
match get_device_uid(devid, devtype) {
Ok(uid) => {
let c_string = uid.into_cstring();
// Intern the device UID to provide a stable devid pointer for the lifetime of the context.
dev_info.devid = intern.lock().unwrap().add(&c_string) as ffi::cubeb_devid;
dev_info.device_id = c_string.into_raw();
}
Err(e) => {
cubeb_log!(
"Cannot get the UID for device {} in {:?} scope. Error: {}",
devid,
devtype,
e
);
}
}
match get_device_group_id(devid, devtype) {
Ok(group_id) => {
dev_info.group_id = group_id.into_raw();
}
Err(e) => {
cubeb_log!(
"Cannot get the model UID for device {} in {:?} scope. Error: {}",
devid,
devtype,
e
);
}
}
let label = match get_device_label(devid, devtype) {
Ok(label) => label.into_cstring(),
Err(e) => {
cubeb_log!(
"Cannot get the label for device {} in {:?} scope. Error: {}",
devid,
devtype,
e
);
CString::default()
}
};
dev_info.friendly_name = label.into_raw();
match get_device_manufacturer(devid, devtype) {
Ok(vendor) => {
let vendor = vendor.into_cstring();
dev_info.vendor_name = vendor.into_raw();
}
Err(e) => {
cubeb_log!(
"Cannot get the manufacturer for device {} in {:?} scope. Error: {}",
devid,
devtype,
e
);
}
}
dev_info.device_type = match devtype {
DeviceType::INPUT => ffi::CUBEB_DEVICE_TYPE_INPUT,
DeviceType::OUTPUT => ffi::CUBEB_DEVICE_TYPE_OUTPUT,
_ => panic!("invalid type"),
};
dev_info.state = ffi::CUBEB_DEVICE_STATE_ENABLED;
dev_info.preferred = match get_default_device(devtype) {
Some(id) if id == devid => ffi::CUBEB_DEVICE_PREF_ALL,
_ => ffi::CUBEB_DEVICE_PREF_NONE,
};
dev_info.format = ffi::CUBEB_DEVICE_FMT_ALL;
dev_info.default_format = ffi::CUBEB_DEVICE_FMT_F32NE;
match get_device_sample_rate(devid, devtype) {
Ok(rate) => {
dev_info.default_rate = rate as u32;
}
Err(e) => {
cubeb_log!(
"Cannot get the sample rate for device {} in {:?} scope. Error: {}",
devid,
devtype,
e
);
}
}
match get_range_of_sample_rates(devid, devtype) {
Ok((min, max)) => {
dev_info.min_rate = min as u32;
dev_info.max_rate = max as u32;
}
Err(e) => {
cubeb_log!(
"Cannot get the range of sample rate for device {} in {:?} scope. Error: {}",
devid,
devtype,
e
);
}
}
let latency = get_fixed_latency(devid, devtype);
let (latency_low, latency_high) = match get_device_buffer_frame_size_range(devid, devtype) {
Ok(range) => (
latency + range.mMinimum as u32,
latency + range.mMaximum as u32,
),
Err(e) => {
cubeb_log!("Cannot get the buffer frame size for device {} in {:?} scope. Using default value instead. Error: {}", devid, devtype, e);
(
10 * dev_info.default_rate / 1000,
100 * dev_info.default_rate / 1000,
)
}
};
dev_info.latency_lo = latency_low;
dev_info.latency_hi = latency_high;
Ok(dev_info)
}