@@ -77,7 +77,14 @@ pub enum Element {
77
77
/// Find the original Audio Unit Programming Guide [here](https://developer.apple.com/library/mac/documentation/MusicAudio/Conceptual/AudioUnitProgrammingGuide/TheAudioUnit/TheAudioUnit.html).
78
78
pub struct AudioUnit {
79
79
instance : sys:: AudioUnit ,
80
- maybe_callback : Option < * mut render_callback:: InputProcFnWrapper >
80
+ maybe_render_callback : Option < * mut render_callback:: InputProcFnWrapper > ,
81
+ maybe_input_callback : Option < InputCallback > ,
82
+ }
83
+
84
+ struct InputCallback {
85
+ // The audio buffer list to which input data is rendered.
86
+ buffer_list : * mut sys:: AudioBufferList ,
87
+ callback : * mut render_callback:: InputProcFnWrapper ,
81
88
}
82
89
83
90
@@ -158,7 +165,8 @@ impl AudioUnit {
158
165
try_os_status ! ( sys:: AudioUnitInitialize ( instance) ) ;
159
166
Ok ( AudioUnit {
160
167
instance : instance,
161
- maybe_callback : None
168
+ maybe_render_callback : None ,
169
+ maybe_input_callback : None ,
162
170
} )
163
171
}
164
172
}
@@ -183,17 +191,7 @@ impl AudioUnit {
183
191
pub fn set_property < T > ( & mut self , id : u32 , scope : Scope , elem : Element , maybe_data : Option < & T > )
184
192
-> Result < ( ) , Error >
185
193
{
186
- let ( data_ptr, size) = maybe_data. map ( |data| {
187
- let ptr = data as * const _ as * const c_void ;
188
- let size = :: std:: mem:: size_of :: < T > ( ) as u32 ;
189
- ( ptr, size)
190
- } ) . unwrap_or_else ( || ( :: std:: ptr:: null ( ) , 0 ) ) ;
191
- let scope = scope as c_uint ;
192
- let elem = elem as c_uint ;
193
- unsafe {
194
- try_os_status ! ( sys:: AudioUnitSetProperty ( self . instance, id, scope, elem, data_ptr, size) )
195
- }
196
- Ok ( ( ) )
194
+ set_property ( self . instance , id, scope, elem, maybe_data)
197
195
}
198
196
199
197
/// Gets the value of an **AudioUnit** property.
@@ -207,18 +205,7 @@ impl AudioUnit {
207
205
/// - **scope**: The audio unit scope for the property.
208
206
/// - **elem**: The audio unit element for the property.
209
207
pub fn get_property < T > ( & self , id : u32 , scope : Scope , elem : Element ) -> Result < T , Error > {
210
- let scope = scope as c_uint ;
211
- let elem = elem as c_uint ;
212
- let mut size = :: std:: mem:: size_of :: < T > ( ) as u32 ;
213
- unsafe {
214
- let mut data: T = :: std:: mem:: uninitialized ( ) ;
215
- let data_ptr = & mut data as * mut _ as * mut c_void ;
216
- let size_ptr = & mut size as * mut _ ;
217
- try_os_status ! (
218
- sys:: AudioUnitGetProperty ( self . instance, id, scope, elem, data_ptr, size_ptr)
219
- ) ;
220
- Ok ( data)
221
- }
208
+ get_property ( self . instance , id, scope, elem)
222
209
}
223
210
224
211
/// Starts an I/O **AudioUnit**, which in turn starts the audio unit processing graph that it is
@@ -267,19 +254,32 @@ impl AudioUnit {
267
254
/// > - Mac input and output: Linear PCM with 32-bit floating point samples.
268
255
/// > - Mac audio units and other audio processing: Noninterleaved linear PCM with 32-bit
269
256
/// floating-point
270
- pub fn set_stream_format ( & mut self , stream_format : StreamFormat ) -> Result < ( ) , Error > {
257
+ pub fn set_stream_format (
258
+ & mut self ,
259
+ stream_format : StreamFormat ,
260
+ scope : Scope ,
261
+ ) -> Result < ( ) , Error > {
271
262
let id = sys:: kAudioUnitProperty_StreamFormat;
272
263
let asbd = stream_format. to_asbd ( ) ;
273
- self . set_property ( id, Scope :: Input , Element :: Output , Some ( & asbd) )
264
+ self . set_property ( id, scope , Element :: Output , Some ( & asbd) )
274
265
}
275
266
276
267
/// Return the current Stream Format for the AudioUnit.
277
- pub fn stream_format ( & self ) -> Result < StreamFormat , Error > {
268
+ pub fn stream_format ( & self , scope : Scope ) -> Result < StreamFormat , Error > {
278
269
let id = sys:: kAudioUnitProperty_StreamFormat;
279
- let asbd = try!( self . get_property ( id, Scope :: Output , Element :: Output ) ) ;
270
+ let asbd = try!( self . get_property ( id, scope , Element :: Output ) ) ;
280
271
StreamFormat :: from_asbd ( asbd)
281
272
}
282
273
274
+ /// Return the current output Stream Format for the AudioUnit.
275
+ pub fn output_stream_format ( & self ) -> Result < StreamFormat , Error > {
276
+ self . stream_format ( Scope :: Output )
277
+ }
278
+
279
+ /// Return the current input Stream Format for the AudioUnit.
280
+ pub fn input_stream_format ( & self ) -> Result < StreamFormat , Error > {
281
+ self . stream_format ( Scope :: Input )
282
+ }
283
283
}
284
284
285
285
@@ -299,6 +299,79 @@ impl Drop for AudioUnit {
299
299
error:: Error :: from_os_status ( sys:: AudioUnitUninitialize ( self . instance ) ) . ok ( ) ;
300
300
301
301
self . free_render_callback ( ) ;
302
+ self . free_input_callback ( ) ;
302
303
}
303
304
}
304
305
}
306
+
307
+
308
+ /// Sets the value for some property of the **AudioUnit**.
309
+ ///
310
+ /// To clear an audio unit property value, set the data paramater with `None::<()>`.
311
+ ///
312
+ /// Clearing properties only works for those properties that do not have a default value.
313
+ ///
314
+ /// For more on "properties" see [the reference](https://developer.apple.com/library/ios/documentation/AudioUnit/Reference/AudioUnitPropertiesReference/index.html#//apple_ref/doc/uid/TP40007288).
315
+ ///
316
+ /// **Available** in iOS 2.0 and later.
317
+ ///
318
+ /// Parameters
319
+ /// ----------
320
+ ///
321
+ /// - **au**: The AudioUnit instance.
322
+ /// - **id**: The identifier of the property.
323
+ /// - **scope**: The audio unit scope for the property.
324
+ /// - **elem**: The audio unit element for the property.
325
+ /// - **maybe_data**: The value that you want to apply to the property.
326
+ pub fn set_property < T > (
327
+ au : sys:: AudioUnit ,
328
+ id : u32 ,
329
+ scope : Scope ,
330
+ elem : Element ,
331
+ maybe_data : Option < & T > ,
332
+ ) -> Result < ( ) , Error >
333
+ {
334
+ let ( data_ptr, size) = maybe_data. map ( |data| {
335
+ let ptr = data as * const _ as * const c_void ;
336
+ let size = :: std:: mem:: size_of :: < T > ( ) as u32 ;
337
+ ( ptr, size)
338
+ } ) . unwrap_or_else ( || ( :: std:: ptr:: null ( ) , 0 ) ) ;
339
+ let scope = scope as c_uint ;
340
+ let elem = elem as c_uint ;
341
+ unsafe {
342
+ try_os_status ! ( sys:: AudioUnitSetProperty ( au, id, scope, elem, data_ptr, size) )
343
+ }
344
+ Ok ( ( ) )
345
+ }
346
+
347
+ /// Gets the value of an **AudioUnit** property.
348
+ ///
349
+ /// **Available** in iOS 2.0 and later.
350
+ ///
351
+ /// Parameters
352
+ /// ----------
353
+ ///
354
+ /// - **au**: The AudioUnit instance.
355
+ /// - **id**: The identifier of the property.
356
+ /// - **scope**: The audio unit scope for the property.
357
+ /// - **elem**: The audio unit element for the property.
358
+ pub fn get_property < T > (
359
+ au : sys:: AudioUnit ,
360
+ id : u32 ,
361
+ scope : Scope ,
362
+ elem : Element ,
363
+ ) -> Result < T , Error >
364
+ {
365
+ let scope = scope as c_uint ;
366
+ let elem = elem as c_uint ;
367
+ let mut size = :: std:: mem:: size_of :: < T > ( ) as u32 ;
368
+ unsafe {
369
+ let mut data: T = :: std:: mem:: uninitialized ( ) ;
370
+ let data_ptr = & mut data as * mut _ as * mut c_void ;
371
+ let size_ptr = & mut size as * mut _ ;
372
+ try_os_status ! (
373
+ sys:: AudioUnitGetProperty ( au, id, scope, elem, data_ptr, size_ptr)
374
+ ) ;
375
+ Ok ( data)
376
+ }
377
+ }
0 commit comments