From f04a50e74876a7cccbc2683ad6bcacb7cc59971e Mon Sep 17 00:00:00 2001 From: Paul Adenot Date: Fri, 9 Aug 2024 13:26:29 +0200 Subject: [PATCH] Restore some state in case of reinit failure when device has changed while paused --- src/backend/mod.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/backend/mod.rs b/src/backend/mod.rs index 1de1a31c..e9669d53 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -4877,6 +4877,8 @@ impl<'ctx> Drop for AudioUnitStream<'ctx> { impl<'ctx> StreamOps for AudioUnitStream<'ctx> { fn start(&mut self) -> Result<()> { + let was_stopped = self.stopped.load(Ordering::SeqCst); + let was_draining = self.draining.load(Ordering::SeqCst); self.stopped.store(false, Ordering::SeqCst); self.draining.store(false, Ordering::SeqCst); @@ -4886,12 +4888,18 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> { // Need reinitialization: device was changed when paused. It will be started after // reinit because self.stopped is false. if self.delayed_reinit { - self.reinit().inspect_err(|_| { + let rv = self.reinit().inspect_err(|_| { cubeb_log!( "({:p}) delayed reinit during start failed.", self.core_stream_data.stm_ptr ); - })?; + }); + // In case of failure, restore the state + if rv.is_err() { + self.stopped.store(was_stopped, Ordering::SeqCst); + self.draining.store(was_draining, Ordering::SeqCst); + return Err(Error::error()); + } self.delayed_reinit = false; Ok(()) } else { @@ -4901,7 +4909,7 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> { }) } }) - .unwrap(); + .unwrap()?; self.notify_state_changed(State::Started);