Skip to content

Commit e8f19e4

Browse files
committed
Restore some state in case of reinit failure when device has changed while paused, or when starting fails
1 parent 387e7e2 commit e8f19e4

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/backend/mod.rs

+18-5
Original file line numberDiff line numberDiff line change
@@ -4877,6 +4877,8 @@ impl<'ctx> Drop for AudioUnitStream<'ctx> {
48774877

48784878
impl<'ctx> StreamOps for AudioUnitStream<'ctx> {
48794879
fn start(&mut self) -> Result<()> {
4880+
let was_stopped = self.stopped.load(Ordering::SeqCst);
4881+
let was_draining = self.draining.load(Ordering::SeqCst);
48804882
self.stopped.store(false, Ordering::SeqCst);
48814883
self.draining.store(false, Ordering::SeqCst);
48824884

@@ -4886,22 +4888,33 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> {
48864888
// Need reinitialization: device was changed when paused. It will be started after
48874889
// reinit because self.stopped is false.
48884890
if self.delayed_reinit {
4889-
self.reinit().inspect_err(|_| {
4891+
let rv = self.reinit().inspect_err(|_| {
48904892
cubeb_log!(
48914893
"({:p}) delayed reinit during start failed.",
48924894
self.core_stream_data.stm_ptr
48934895
);
4894-
})?;
4896+
});
4897+
// In case of failure, restore the state
4898+
if rv.is_err() {
4899+
self.stopped.store(was_stopped, Ordering::SeqCst);
4900+
self.draining.store(was_draining, Ordering::SeqCst);
4901+
return rv;
4902+
}
48954903
self.delayed_reinit = false;
48964904
Ok(())
48974905
} else {
48984906
// Execute start in serial queue to avoid racing with destroy or reinit.
4899-
self.core_stream_data.start_audiounits().inspect_err(|_| {
4907+
let rv = self.core_stream_data.start_audiounits();
4908+
if rv.is_err() {
49004909
cubeb_log!("({:p}) start failed.", self.core_stream_data.stm_ptr);
4901-
})
4910+
self.stopped.store(was_stopped, Ordering::SeqCst);
4911+
self.draining.store(was_draining, Ordering::SeqCst);
4912+
return rv;
4913+
}
4914+
Ok(())
49024915
}
49034916
})
4904-
.unwrap();
4917+
.unwrap()?;
49054918

49064919
self.notify_state_changed(State::Started);
49074920

0 commit comments

Comments
 (0)