@@ -8,7 +8,7 @@ use std::sync::{Arc, Mutex};
8
8
use coreaudio:: audio_unit:: audio_format:: LinearPcmFlags ;
9
9
use coreaudio:: audio_unit:: render_callback:: { self , data} ;
10
10
use coreaudio:: audio_unit:: { audio_unit_from_device_id, get_default_device_id, get_device_name} ;
11
- use coreaudio:: audio_unit:: { Element , SampleFormat , Scope , StreamFormat } ;
11
+ use coreaudio:: audio_unit:: { Element , SampleFormat , Scope , StreamFormat , RateListener } ;
12
12
use coreaudio:: sys:: * ;
13
13
14
14
const SAMPLE_RATE : f64 = 44100.0 ;
@@ -73,6 +73,14 @@ fn main() -> Result<(), coreaudio::Error> {
73
73
let producer_right = buffer_right. clone ( ) ;
74
74
let consumer_right = buffer_right. clone ( ) ;
75
75
76
+ // Register a rate listener for playback
77
+ let mut listener_pb = RateListener :: new ( output_device_id, None ) ?;
78
+ listener_pb. register ( ) ?;
79
+
80
+ // Register a rate listener for capture
81
+ let mut listener_cap = RateListener :: new ( input_device_id, None ) ?;
82
+ listener_cap. register ( ) ?;
83
+
76
84
// seed roughly 1 second of data to create a delay in the feedback loop for easier testing
77
85
for buffer in vec ! [ buffer_left, buffer_right] {
78
86
let mut buffer = buffer. lock ( ) . unwrap ( ) ;
@@ -121,8 +129,14 @@ fn main() -> Result<(), coreaudio::Error> {
121
129
Ok ( ( ) )
122
130
} ) ?;
123
131
output_audio_unit. start ( ) ?;
124
-
125
- std:: thread:: sleep ( std:: time:: Duration :: from_millis ( 100000 ) ) ;
126
-
132
+ for _ in 0 ..1000 {
133
+ std:: thread:: sleep ( std:: time:: Duration :: from_millis ( 100 ) ) ;
134
+ if listener_cap. get_nbr_values ( ) > 0 {
135
+ println ! ( "capture rate change: {:?}" , listener_cap. drain_values( ) ) ;
136
+ }
137
+ if listener_pb. get_nbr_values ( ) > 0 {
138
+ println ! ( "playback rate change: {:?}" , listener_pb. drain_values( ) ) ;
139
+ }
140
+ }
127
141
Ok ( ( ) )
128
142
}
0 commit comments