Skip to content

Commit 8744c74

Browse files
committed
Listeners working again
1 parent 95b9943 commit 8744c74

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

examples/feedback_interleaved.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ fn main() -> Result<(), coreaudio::Error> {
7474
let consumer_right = buffer_right.clone();
7575

7676
// Register a rate listener for playback
77-
let mut listener_pb = RateListener::new(output_device_id, None)?;
77+
let mut listener_pb = RateListener::new(output_device_id, None);
7878
listener_pb.register()?;
7979

8080
// Register a rate listener for capture
81-
let mut listener_cap = RateListener::new(input_device_id, None)?;
81+
let mut listener_cap = RateListener::new(input_device_id, None);
8282
listener_cap.register()?;
8383

8484
// seed roughly 1 second of data to create a delay in the feedback loop for easier testing

examples/sine_advanced.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ fn main() -> Result<(), coreaudio::Error> {
108108
assert!(SampleFormat::F32 == stream_format.sample_format);
109109

110110
// Register a rate listener
111-
let mut listener = RateListener::new(audio_unit_id, None)?;
111+
let mut listener = RateListener::new(audio_unit_id, None);
112112
listener.register()?;
113113

114114
if INTERLEAVED {

src/audio_unit/macos_helpers.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use std::collections::VecDeque;
44
use std::ffi::CStr;
55
use std::os::raw::{c_char, c_void};
66
use std::ptr::null;
7-
use std::sync::atomic::{AtomicBool, Ordering};
87
use std::sync::mpsc::{channel, Sender};
98
use std::sync::Mutex;
109
use std::time::Duration;
@@ -289,7 +288,7 @@ pub fn set_device_sample_rate(device_id: AudioDeviceID, new_rate: f64) -> Result
289288
// Add a listener to know when the sample rate changes.
290289
// Since the listener implements Drop, we don't need to manually unregister this later.
291290
let (sender, receiver) = channel();
292-
let mut listener = RateListener::new(device_id, Some(sender))?;
291+
let mut listener = RateListener::new(device_id, Some(sender));
293292
listener.register()?;
294293

295294
// Finally, set the sample rate.
@@ -491,21 +490,21 @@ impl RateListener {
491490
pub fn new(
492491
device_id: AudioDeviceID,
493492
sync_channel: Option<Sender<f64>>,
494-
) -> Result<RateListener, Error> {
493+
) -> RateListener {
495494
// Add our sample rate change listener callback.
496495
let property_address = AudioObjectPropertyAddress {
497496
mSelector: kAudioDevicePropertyNominalSampleRate,
498497
mScope: kAudioObjectPropertyScopeGlobal,
499498
mElement: kAudioObjectPropertyElementMaster,
500499
};
501500
let queue = Mutex::new(VecDeque::new());
502-
Ok(RateListener {
501+
RateListener {
503502
queue,
504503
sync_channel,
505504
device_id,
506505
property_address,
507506
rate_listener: None,
508-
})
507+
}
509508
}
510509

511510
/// Register this listener to receive notifications.
@@ -599,7 +598,7 @@ impl RateListener {
599598
/// Use an AliveListener to get notified when a device is disconnected.
600599
/// Only implemented for macOS, not iOS.
601600
pub struct AliveListener {
602-
alive: AtomicBool,
601+
alive: Mutex<bool>,
603602
device_id: AudioDeviceID,
604603
property_address: AudioObjectPropertyAddress,
605604
alive_listener: Option<
@@ -617,19 +616,19 @@ impl AliveListener {
617616
/// Create a new ErrorListener for the given AudioDeviceID.
618617
/// If a sync Sender is provided, then events will be pushed to that channel.
619618
/// 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 {
621620
// Add our error listener callback.
622621
let property_address = AudioObjectPropertyAddress {
623622
mSelector: kAudioDevicePropertyDeviceIsAlive,
624623
mScope: kAudioObjectPropertyScopeGlobal,
625624
mElement: kAudioObjectPropertyElementMaster,
626625
};
627-
Ok(AliveListener {
628-
alive: AtomicBool::new(true),
626+
AliveListener {
627+
alive: Mutex::new(true),
629628
device_id,
630629
property_address,
631630
alive_listener: None,
632-
})
631+
}
633632
}
634633

635634
/// Register this listener to receive notifications.
@@ -656,7 +655,10 @@ impl AliveListener {
656655
&data_size as *const _ as *mut _,
657656
&alive as *const _ as *mut _,
658657
);
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");
660662
result
661663
}
662664

@@ -692,8 +694,10 @@ impl AliveListener {
692694
Ok(())
693695
}
694696

695-
/// Get the number of sample rate values received (equals the number of change events).
697+
/// Check if the device is still alive.
696698
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
698702
}
699703
}

0 commit comments

Comments
 (0)