@@ -4877,6 +4877,8 @@ impl<'ctx> Drop for AudioUnitStream<'ctx> {
4877
4877
4878
4878
impl < ' ctx > StreamOps for AudioUnitStream < ' ctx > {
4879
4879
fn start ( & mut self ) -> Result < ( ) > {
4880
+ let was_stopped = self . stopped . load ( Ordering :: SeqCst ) ;
4881
+ let was_draining = self . draining . load ( Ordering :: SeqCst ) ;
4880
4882
self . stopped . store ( false , Ordering :: SeqCst ) ;
4881
4883
self . draining . store ( false , Ordering :: SeqCst ) ;
4882
4884
@@ -4886,22 +4888,33 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> {
4886
4888
// Need reinitialization: device was changed when paused. It will be started after
4887
4889
// reinit because self.stopped is false.
4888
4890
if self . delayed_reinit {
4889
- self . reinit ( ) . inspect_err ( |_| {
4891
+ let rv = self . reinit ( ) . inspect_err ( |_| {
4890
4892
cubeb_log ! (
4891
4893
"({:p}) delayed reinit during start failed." ,
4892
4894
self . core_stream_data. stm_ptr
4893
4895
) ;
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
+ }
4895
4903
self . delayed_reinit = false ;
4896
4904
Ok ( ( ) )
4897
4905
} else {
4898
4906
// 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 ( ) {
4900
4909
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 ( ( ) )
4902
4915
}
4903
4916
} )
4904
- . unwrap ( ) ;
4917
+ . unwrap ( ) ? ;
4905
4918
4906
4919
self . notify_state_changed ( State :: Started ) ;
4907
4920
0 commit comments