in src/backend/mod.rs [4226:4303]
fn close(&mut self) {
self.debug_assert_is_on_stream_queue();
if !self.input_unit.is_null() {
audio_unit_uninitialize(self.input_unit);
if self.using_voice_processing_unit() {
// Handle the VoiceProcessIO case where there is a single unit.
self.output_unit = ptr::null_mut();
}
// Cannot unset self.input_unit yet, since the output callback might be live
// and reading it.
}
if !self.output_unit.is_null() {
audio_unit_uninitialize(self.output_unit);
dispose_audio_unit(self.output_unit);
self.output_unit = ptr::null_mut();
}
if !self.input_unit.is_null() {
if !self.using_voice_processing_unit() {
// The VPIO unit is shared and must not be disposed.
dispose_audio_unit(self.input_unit);
}
self.input_unit = ptr::null_mut();
}
// Return the VPIO unit if present.
self.voiceprocessing_unit_handle = None;
#[cfg(feature = "audio-dump")]
{
if !self.audio_dump_session.is_null() {
unsafe {
ffi::cubeb_audio_dump_stop(self.audio_dump_session);
if !self.audio_dump_input.is_null() {
let rv = ffi::cubeb_audio_dump_stream_shutdown(
self.audio_dump_session,
self.audio_dump_input,
);
if rv != 0 {
cubeb_log!("Failed to shutdown audio dump for input");
}
}
if !self.audio_dump_output.is_null() {
let rv = ffi::cubeb_audio_dump_stream_shutdown(
self.audio_dump_session,
self.audio_dump_output,
);
if rv != 0 {
cubeb_log!("Failed to shutdown audio dump for output");
}
}
ffi::cubeb_audio_dump_shutdown(self.audio_dump_session);
self.audio_dump_session = ptr::null_mut();
self.audio_dump_session_running = false;
}
}
}
self.resampler.destroy();
self.mixer = None;
self.aggregate_device = None;
if self.uninstall_system_changed_callback().is_err() {
cubeb_log!(
"({:p}) Could not uninstall the system changed callback",
self.stm_ptr
);
}
if self.uninstall_device_changed_callback().is_err() {
cubeb_log!(
"({:p}) Could not uninstall all device change listeners",
self.stm_ptr
);
}
}