@@ -4,7 +4,6 @@ use std::collections::VecDeque;
4
4
use std:: ffi:: CStr ;
5
5
use std:: os:: raw:: { c_char, c_void} ;
6
6
use std:: ptr:: null;
7
- use std:: sync:: atomic:: { AtomicBool , Ordering } ;
8
7
use std:: sync:: mpsc:: { channel, Sender } ;
9
8
use std:: sync:: Mutex ;
10
9
use std:: time:: Duration ;
@@ -289,7 +288,7 @@ pub fn set_device_sample_rate(device_id: AudioDeviceID, new_rate: f64) -> Result
289
288
// Add a listener to know when the sample rate changes.
290
289
// Since the listener implements Drop, we don't need to manually unregister this later.
291
290
let ( sender, receiver) = channel ( ) ;
292
- let mut listener = RateListener :: new ( device_id, Some ( sender) ) ? ;
291
+ let mut listener = RateListener :: new ( device_id, Some ( sender) ) ;
293
292
listener. register ( ) ?;
294
293
295
294
// Finally, set the sample rate.
@@ -491,21 +490,21 @@ impl RateListener {
491
490
pub fn new (
492
491
device_id : AudioDeviceID ,
493
492
sync_channel : Option < Sender < f64 > > ,
494
- ) -> Result < RateListener , Error > {
493
+ ) -> RateListener {
495
494
// Add our sample rate change listener callback.
496
495
let property_address = AudioObjectPropertyAddress {
497
496
mSelector : kAudioDevicePropertyNominalSampleRate,
498
497
mScope : kAudioObjectPropertyScopeGlobal,
499
498
mElement : kAudioObjectPropertyElementMaster,
500
499
} ;
501
500
let queue = Mutex :: new ( VecDeque :: new ( ) ) ;
502
- Ok ( RateListener {
501
+ RateListener {
503
502
queue,
504
503
sync_channel,
505
504
device_id,
506
505
property_address,
507
506
rate_listener : None ,
508
- } )
507
+ }
509
508
}
510
509
511
510
/// Register this listener to receive notifications.
@@ -599,7 +598,7 @@ impl RateListener {
599
598
/// Use an AliveListener to get notified when a device is disconnected.
600
599
/// Only implemented for macOS, not iOS.
601
600
pub struct AliveListener {
602
- alive : AtomicBool ,
601
+ alive : Mutex < bool > ,
603
602
device_id : AudioDeviceID ,
604
603
property_address : AudioObjectPropertyAddress ,
605
604
alive_listener : Option <
@@ -617,19 +616,19 @@ impl AliveListener {
617
616
/// Create a new ErrorListener for the given AudioDeviceID.
618
617
/// If a sync Sender is provided, then events will be pushed to that channel.
619
618
/// If not, they will be stored in an internal queue that will need to be polled.
620
- pub fn new ( device_id : AudioDeviceID ) -> Result < AliveListener , Error > {
619
+ pub fn new ( device_id : AudioDeviceID ) -> AliveListener {
621
620
// Add our error listener callback.
622
621
let property_address = AudioObjectPropertyAddress {
623
622
mSelector : kAudioDevicePropertyDeviceIsAlive,
624
623
mScope : kAudioObjectPropertyScopeGlobal,
625
624
mElement : kAudioObjectPropertyElementMaster,
626
625
} ;
627
- Ok ( AliveListener {
628
- alive : AtomicBool :: new ( true ) ,
626
+ AliveListener {
627
+ alive : Mutex :: new ( true ) ,
629
628
device_id,
630
629
property_address,
631
630
alive_listener : None ,
632
- } )
631
+ }
633
632
}
634
633
635
634
/// Register this listener to receive notifications.
@@ -656,7 +655,10 @@ impl AliveListener {
656
655
& data_size as * const _ as * mut _ ,
657
656
& alive as * const _ as * mut _ ,
658
657
) ;
659
- self_ptr. alive . store ( alive > 0 , Ordering :: Relaxed ) ;
658
+ println ! ( "store alive {}" , alive) ;
659
+ let mut shared_alive = self_ptr. alive . lock ( ) . unwrap ( ) ;
660
+ * shared_alive = alive > 0 ;
661
+ println ! ( "stored" ) ;
660
662
result
661
663
}
662
664
@@ -692,8 +694,10 @@ impl AliveListener {
692
694
Ok ( ( ) )
693
695
}
694
696
695
- /// Get the number of sample rate values received (equals the number of change events) .
697
+ /// Check if the device is still alive .
696
698
pub fn is_alive ( & self ) -> bool {
697
- self . alive . load ( Ordering :: Relaxed )
699
+ let alive = self . alive . lock ( ) . unwrap ( ) ;
700
+ println ! ( "read alive {}" , alive) ;
701
+ * alive
698
702
}
699
703
}
0 commit comments