in src/backend/mod.rs [4413:4479]
fn install_system_changed_callback(&mut self) -> Result<()> {
self.debug_assert_is_on_stream_queue();
assert!(!self.stm_ptr.is_null());
let stm = unsafe { &(*self.stm_ptr) };
if !self.output_unit.is_null()
&& self
.output_device
.flags
.contains(device_flags::DEV_SELECTED_DEFAULT)
{
assert!(
self.default_output_listener.is_none(),
"register default_output_listener without unregistering the one in use"
);
// Get the notification when the default output audio changes, e.g.,
// when the user plugs in a USB headset and the system chooses it automatically as the default,
// or when another device is chosen in the dropdown list.
self.default_output_listener = Some(device_property_listener::new(
kAudioObjectSystemObject,
get_property_address(
Property::HardwareDefaultOutputDevice,
DeviceType::INPUT | DeviceType::OUTPUT,
),
audiounit_property_listener_callback,
));
let r = stm.add_device_listener(self.default_output_listener.as_ref().unwrap());
if r != NO_ERR {
self.default_output_listener = None;
cubeb_log!("AudioObjectAddPropertyListener/output/kAudioHardwarePropertyDefaultOutputDevice rv={}", r);
return Err(Error::error());
}
}
if !self.input_unit.is_null()
&& self
.input_device
.flags
.contains(device_flags::DEV_SELECTED_DEFAULT)
{
assert!(
self.default_input_listener.is_none(),
"register default_input_listener without unregistering the one in use"
);
// Get the notification when the default intput audio changes, e.g.,
// when the user plugs in a USB mic and the system chooses it automatically as the default,
// or when another device is chosen in the system preference.
self.default_input_listener = Some(device_property_listener::new(
kAudioObjectSystemObject,
get_property_address(
Property::HardwareDefaultInputDevice,
DeviceType::INPUT | DeviceType::OUTPUT,
),
audiounit_property_listener_callback,
));
let r = stm.add_device_listener(self.default_input_listener.as_ref().unwrap());
if r != NO_ERR {
self.default_input_listener = None;
cubeb_log!("AudioObjectAddPropertyListener/input/kAudioHardwarePropertyDefaultInputDevice rv={}", r);
return Err(Error::error());
}
}
Ok(())
}