1 use coreaudio_sys::*;
2 use std::convert::TryFrom;
3 use std::os::raw::c_void;
4 use std::ptr;
5 
audio_unit_get_property_info( unit: AudioUnit, property: AudioUnitPropertyID, scope: AudioUnitScope, element: AudioUnitElement, size: &mut usize, writable: Option<&mut bool>, ) -> OSStatus6 pub fn audio_unit_get_property_info(
7     unit: AudioUnit,
8     property: AudioUnitPropertyID,
9     scope: AudioUnitScope,
10     element: AudioUnitElement,
11     size: &mut usize,
12     writable: Option<&mut bool>, // Use `Option` since `writable` is nullable.
13 ) -> OSStatus {
14     assert!(!unit.is_null());
15     assert!(UInt32::try_from(*size).is_ok()); // Check if `size` can be converted to a UInt32.
16     unsafe {
17         AudioUnitGetPropertyInfo(
18             unit,
19             property,
20             scope,
21             element,
22             size as *mut usize as *mut UInt32,
23             writable.map_or(ptr::null_mut(), |v| v as *mut bool as *mut Boolean),
24         )
25     }
26 }
27 
audio_unit_get_property<T>( unit: AudioUnit, property: AudioUnitPropertyID, scope: AudioUnitScope, element: AudioUnitElement, data: &mut T, size: &mut usize, ) -> OSStatus28 pub fn audio_unit_get_property<T>(
29     unit: AudioUnit,
30     property: AudioUnitPropertyID,
31     scope: AudioUnitScope,
32     element: AudioUnitElement,
33     data: &mut T,
34     size: &mut usize,
35 ) -> OSStatus {
36     assert!(!unit.is_null());
37     assert!(UInt32::try_from(*size).is_ok()); // Check if `size` can be converted to a UInt32.
38     unsafe {
39         AudioUnitGetProperty(
40             unit,
41             property,
42             scope,
43             element,
44             data as *mut T as *mut c_void,
45             size as *mut usize as *mut UInt32,
46         )
47     }
48 }
49 
audio_unit_set_property<T>( unit: AudioUnit, property: AudioUnitPropertyID, scope: AudioUnitScope, element: AudioUnitElement, data: &T, size: usize, ) -> OSStatus50 pub fn audio_unit_set_property<T>(
51     unit: AudioUnit,
52     property: AudioUnitPropertyID,
53     scope: AudioUnitScope,
54     element: AudioUnitElement,
55     data: &T,
56     size: usize,
57 ) -> OSStatus {
58     assert!(!unit.is_null());
59     unsafe {
60         AudioUnitSetProperty(
61             unit,
62             property,
63             scope,
64             element,
65             data as *const T as *const c_void,
66             size as UInt32,
67         )
68     }
69 }
70 
audio_unit_get_parameter( unit: AudioUnit, id: AudioUnitParameterID, scope: AudioUnitScope, element: AudioUnitElement, value: &mut AudioUnitParameterValue, ) -> OSStatus71 pub fn audio_unit_get_parameter(
72     unit: AudioUnit,
73     id: AudioUnitParameterID,
74     scope: AudioUnitScope,
75     element: AudioUnitElement,
76     value: &mut AudioUnitParameterValue,
77 ) -> OSStatus {
78     assert!(!unit.is_null());
79     unsafe {
80         AudioUnitGetParameter(
81             unit,
82             id,
83             scope,
84             element,
85             value as *mut AudioUnitParameterValue,
86         )
87     }
88 }
89 
audio_unit_set_parameter( unit: AudioUnit, id: AudioUnitParameterID, scope: AudioUnitScope, element: AudioUnitElement, value: AudioUnitParameterValue, buffer_offset_in_frames: UInt32, ) -> OSStatus90 pub fn audio_unit_set_parameter(
91     unit: AudioUnit,
92     id: AudioUnitParameterID,
93     scope: AudioUnitScope,
94     element: AudioUnitElement,
95     value: AudioUnitParameterValue,
96     buffer_offset_in_frames: UInt32,
97 ) -> OSStatus {
98     assert!(!unit.is_null());
99     unsafe { AudioUnitSetParameter(unit, id, scope, element, value, buffer_offset_in_frames) }
100 }
101 
audio_unit_initialize(unit: AudioUnit) -> OSStatus102 pub fn audio_unit_initialize(unit: AudioUnit) -> OSStatus {
103     assert!(!unit.is_null());
104     unsafe { AudioUnitInitialize(unit) }
105 }
106 
audio_unit_uninitialize(unit: AudioUnit) -> OSStatus107 pub fn audio_unit_uninitialize(unit: AudioUnit) -> OSStatus {
108     assert!(!unit.is_null());
109     unsafe { AudioUnitUninitialize(unit) }
110 }
111 
dispose_audio_unit(unit: AudioUnit) -> OSStatus112 pub fn dispose_audio_unit(unit: AudioUnit) -> OSStatus {
113     unsafe { AudioComponentInstanceDispose(unit) }
114 }
115 
audio_output_unit_start(unit: AudioUnit) -> OSStatus116 pub fn audio_output_unit_start(unit: AudioUnit) -> OSStatus {
117     assert!(!unit.is_null());
118     unsafe { AudioOutputUnitStart(unit) }
119 }
120 
audio_output_unit_stop(unit: AudioUnit) -> OSStatus121 pub fn audio_output_unit_stop(unit: AudioUnit) -> OSStatus {
122     assert!(!unit.is_null());
123     unsafe { AudioOutputUnitStop(unit) }
124 }
125 
audio_unit_render( in_unit: AudioUnit, io_action_flags: &mut AudioUnitRenderActionFlags, in_time_stamp: &AudioTimeStamp, in_output_bus_number: u32, in_number_frames: u32, io_data: &mut AudioBufferList, ) -> OSStatus126 pub fn audio_unit_render(
127     in_unit: AudioUnit,
128     io_action_flags: &mut AudioUnitRenderActionFlags,
129     in_time_stamp: &AudioTimeStamp,
130     in_output_bus_number: u32,
131     in_number_frames: u32,
132     io_data: &mut AudioBufferList,
133 ) -> OSStatus {
134     assert!(!in_unit.is_null());
135     unsafe {
136         AudioUnitRender(
137             in_unit,
138             io_action_flags,
139             in_time_stamp,
140             in_output_bus_number,
141             in_number_frames,
142             io_data,
143         )
144     }
145 }
146 
147 #[allow(non_camel_case_types)]
148 pub type audio_unit_property_listener_proc =
149     extern "C" fn(*mut c_void, AudioUnit, AudioUnitPropertyID, AudioUnitScope, AudioUnitElement);
150 
audio_unit_add_property_listener<T>( unit: AudioUnit, id: AudioUnitPropertyID, listener: audio_unit_property_listener_proc, data: *mut T, ) -> OSStatus151 pub fn audio_unit_add_property_listener<T>(
152     unit: AudioUnit,
153     id: AudioUnitPropertyID,
154     listener: audio_unit_property_listener_proc,
155     data: *mut T,
156 ) -> OSStatus {
157     assert!(!unit.is_null());
158     unsafe { AudioUnitAddPropertyListener(unit, id, Some(listener), data as *mut c_void) }
159 }
160 
audio_unit_remove_property_listener_with_user_data<T>( unit: AudioUnit, id: AudioUnitPropertyID, listener: audio_unit_property_listener_proc, data: *mut T, ) -> OSStatus161 pub fn audio_unit_remove_property_listener_with_user_data<T>(
162     unit: AudioUnit,
163     id: AudioUnitPropertyID,
164     listener: audio_unit_property_listener_proc,
165     data: *mut T,
166 ) -> OSStatus {
167     assert!(!unit.is_null());
168     unsafe {
169         AudioUnitRemovePropertyListenerWithUserData(unit, id, Some(listener), data as *mut c_void)
170     }
171 }
172