@@ -4579,6 +4579,7 @@ struct AudioUnitStream<'ctx> {
4579
4579
stopped : AtomicBool ,
4580
4580
draining : AtomicBool ,
4581
4581
reinit_pending : AtomicBool ,
4582
+ delayed_reinit : bool ,
4582
4583
destroy_pending : AtomicBool ,
4583
4584
// Latency requested by the user.
4584
4585
latency_frames : u32 ,
@@ -4626,6 +4627,7 @@ impl<'ctx> AudioUnitStream<'ctx> {
4626
4627
stopped : AtomicBool :: new ( true ) ,
4627
4628
draining : AtomicBool :: new ( false ) ,
4628
4629
reinit_pending : AtomicBool :: new ( false ) ,
4630
+ delayed_reinit : false ,
4629
4631
destroy_pending : AtomicBool :: new ( false ) ,
4630
4632
latency_frames,
4631
4633
output_device_latency_frames : AtomicU32 :: new ( 0 ) ,
@@ -4685,7 +4687,8 @@ impl<'ctx> AudioUnitStream<'ctx> {
4685
4687
}
4686
4688
4687
4689
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 = true ;
4689
4692
return Ok ( ( ) ) ;
4690
4693
}
4691
4694
@@ -4877,14 +4880,25 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> {
4877
4880
self . stopped . store ( false , Ordering :: SeqCst ) ;
4878
4881
self . draining . store ( false , Ordering :: SeqCst ) ;
4879
4882
4880
- // Execute start in serial queue to avoid racing with destroy or reinit.
4881
- let result = self
4882
- . queue
4883
+ self . queue
4883
4884
. clone ( )
4884
- . run_sync ( || self . core_stream_data . start_audiounits ( ) )
4885
- . unwrap ( ) ;
4886
-
4887
- result?;
4885
+ . run_sync ( || -> Result < ( ) > {
4886
+ // Need reinitialization: device was changed when paused.
4887
+ if self . delayed_reinit {
4888
+ self . reinit ( ) . inspect_err ( |_| {
4889
+ cubeb_log ! (
4890
+ "({:p}) delayed reinit during start failed." ,
4891
+ self . core_stream_data. stm_ptr
4892
+ ) ;
4893
+ } ) ?;
4894
+ self . delayed_reinit = false ;
4895
+ }
4896
+ // Execute start in serial queue to avoid racing with destroy or reinit.
4897
+ self . core_stream_data . start_audiounits ( ) . inspect_err ( |_| {
4898
+ cubeb_log ! ( "({:p}) start failed." , self . core_stream_data. stm_ptr) ;
4899
+ } )
4900
+ } )
4901
+ . ok_or ( Error :: error ( ) ) ;
4888
4902
4889
4903
self . notify_state_changed ( State :: Started ) ;
4890
4904
0 commit comments