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