@@ -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,28 @@ 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. It will be started after
4887
+ // reinit because self.stopped is false.
4888
+ if self . delayed_reinit {
4889
+ self . reinit ( ) . inspect_err ( |_| {
4890
+ cubeb_log ! (
4891
+ "({:p}) delayed reinit during start failed." ,
4892
+ self . core_stream_data. stm_ptr
4893
+ ) ;
4894
+ } ) ?;
4895
+ self . delayed_reinit = false ;
4896
+ Ok ( ( ) )
4897
+ } else {
4898
+ // Execute start in serial queue to avoid racing with destroy or reinit.
4899
+ self . core_stream_data . start_audiounits ( ) . inspect_err ( |_| {
4900
+ cubeb_log ! ( "({:p}) start failed." , self . core_stream_data. stm_ptr) ;
4901
+ } )
4902
+ }
4903
+ } )
4904
+ . ok_or ( Error :: error ( ) ) ?;
4888
4905
4889
4906
self . notify_state_changed ( State :: Started ) ;
4890
4907
0 commit comments