@@ -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,12 +4888,18 @@ 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 Err ( Error :: error ( ) ) ;
4902
+ }
4895
4903
self . delayed_reinit = false ;
4896
4904
Ok ( ( ) )
4897
4905
} else {
@@ -4901,7 +4909,7 @@ impl<'ctx> StreamOps for AudioUnitStream<'ctx> {
4901
4909
} )
4902
4910
}
4903
4911
} )
4904
- . unwrap ( ) ;
4912
+ . unwrap ( ) ? ;
4905
4913
4906
4914
self . notify_state_changed ( State :: Started ) ;
4907
4915
0 commit comments