Skip to content

Commit df897dd

Browse files
committed
When the device in use by a stream changes but the stream is pause, reinitialize the stream next time it is started
1 parent 9ef7194 commit df897dd

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

src/backend/mod.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -4579,6 +4579,7 @@ struct AudioUnitStream<'ctx> {
45794579
stopped: AtomicBool,
45804580
draining: AtomicBool,
45814581
reinit_pending: AtomicBool,
4582+
delayed_reinit: AtomicBool,
45824583
destroy_pending: AtomicBool,
45834584
// Latency requested by the user.
45844585
latency_frames: u32,
@@ -4626,6 +4627,7 @@ impl<'ctx> AudioUnitStream<'ctx> {
46264627
stopped: AtomicBool::new(true),
46274628
draining: AtomicBool::new(false),
46284629
reinit_pending: AtomicBool::new(false),
4630+
delayed_reinit: AtomicBool::new(false),
46294631
destroy_pending: AtomicBool::new(false),
46304632
latency_frames,
46314633
output_device_latency_frames: AtomicU32::new(0),
@@ -4685,7 +4687,8 @@ impl<'ctx> AudioUnitStream<'ctx> {
46854687
}
46864688

46874689
if self.stopped.load(Ordering::SeqCst) {
4688-
// Something stopped the stream, we must not reinit.
4690+
// Something stopped the stream, reinit on next start
4691+
self.delayed_reinit.store(true, Ordering::SeqCst);
46894692
return Ok(());
46904693
}
46914694

@@ -4877,6 +4880,12 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> {
48774880
self.stopped.store(false, Ordering::SeqCst);
48784881
self.draining.store(false, Ordering::SeqCst);
48794882

4883+
if self.delayed_reinit.load(Ordering::SeqCst) {
4884+
// Need reinitialization: device was changed when paused
4885+
let result = self.queue.clone().run_sync(|| self.reinit()).unwrap();
4886+
result?;
4887+
}
4888+
48804889
// Execute start in serial queue to avoid racing with destroy or reinit.
48814890
let result = self
48824891
.queue

0 commit comments

Comments
 (0)