1#[cfg(all(not(target_os = "emscripten"), feature = "dynamic"))]
2#[macro_use]
3extern crate rental;
4
5
6mod alc;
7mod al;
8mod efx;
9mod efx_presets;
10
11pub use alc::*;
12pub use al::*;
13pub use efx::*;
14pub use efx_presets::*;
15
16
17#[cfg(all(not(target_os = "emscripten"), feature = "dynamic"))]
18macro_rules! al_api {
19 {
20 $($sym:ident: unsafe extern "C" fn ($($param:ident: $param_ty:ty),*) -> $ret_ty:ty,)*
21 } => {
22 mod al_api {
23 extern crate libloading;
24
25 use std::io;
26 use std::path::Path;
27
28 use super::*;
29
30
31 #[allow(non_snake_case)]
32 pub struct AlSymbols<'lib> {
33 $(pub $sym: libloading::Symbol<'lib, unsafe extern "C" fn ($($param: $param_ty),*) -> $ret_ty>,)*
34 }
35
36 rental!{
37 mod rent {
38 use super::libloading;
39
40 #[rental]
41 pub struct RentSymbols {
42 lib: Box<libloading::Library>,
43 syms: super::AlSymbols<'lib>,
44 }
45 }
46 }
47
48 use self::rent::RentSymbols;
49
50
51 pub struct AlApi(rent::RentSymbols);
52
53
54 impl AlApi {
55 pub fn load_default() -> io::Result<AlApi> {
56 AlApi::from_lib(libloading::Library::new("libopenal.so")
57 .or_else(|_| libloading::Library::new("libopenal.dylib"))
58 .or_else(|_| libloading::Library::new("OpenAL.framework/OpenAL"))
59 .or_else(|_| libloading::Library::new("soft_oal.dll"))
60 .or_else(|_| libloading::Library::new("OpenAL32.dll"))
61 ?)
62 }
63
64
65 pub fn load<P: AsRef<Path>>(path: P) -> io::Result<AlApi> {
66 AlApi::from_lib(libloading::Library::new(path.as_ref())?)
67 }
68
69
70 fn from_lib(lib: libloading::Library) -> io::Result<AlApi> {
71 match RentSymbols::try_new(Box::new(lib), |lib| Ok(AlSymbols{
72 $($sym: unsafe { lib.get(stringify!($sym).as_bytes())? },)*
73 })) {
74 Ok(syms) => Ok(AlApi(syms)),
75 Err(rental::RentalError(e, _)) => return Err(e),
76 }
77 }
78
79
80 $(#[allow(non_snake_case)]
81 #[inline]
82 pub unsafe fn $sym(&self, $($param: $param_ty),*) -> $ret_ty {
83 self.0.rent(|s| (s.$sym)($($param),*))
84 })*
85 }
86 }
87
88 pub use al_api::AlApi;
89 };
90}
91
92
93#[cfg(any(target_os = "emscripten", not(feature = "dynamic")))]
94macro_rules! al_api {
95 {
96 $($sym:ident: unsafe extern "C" fn ($($param:ident: $param_ty:ty),*) -> $ret_ty:ty,)*
97 } => {
98 mod al_api {
99 use std::io;
100 use std::path::Path;
101 use super::*;
102
103
104 #[allow(non_snake_case)]
105 pub mod al_symbols {
106 use super::*;
107
108 extern "C" {
109 $(pub fn $sym ($($param: $param_ty),*) -> $ret_ty;)*
110 }
111 }
112
113
114 pub struct AlApi;
115
116
117 impl AlApi {
118 pub fn load_default() -> io::Result<AlApi> {
119 Ok(AlApi)
120 }
121
122
123 pub fn load<P: AsRef<Path>>(_path: P) -> io::Result<AlApi> {
124 Err(io::Error::new(io::ErrorKind::Other, "Dynamic loading is not supported on emscripten"))
125 }
126
127
128 $(#[allow(non_snake_case)]
129 #[inline]
130 pub unsafe fn $sym(&self, $($param: $param_ty),*) -> $ret_ty {
131 al_symbols::$sym($($param),*)
132 })*
133 }
134 }
135
136 pub use al_api::AlApi;
137 };
138}
139
140
141al_api! {
142 alcCreateContext: unsafe extern "C" fn(device: *mut ALCdevice, attrlist: *const ALCint) -> *mut ALCcontext,
143 alcMakeContextCurrent: unsafe extern "C" fn(context: *mut ALCcontext) -> ALCboolean,
144 alcProcessContext: unsafe extern "C" fn(context: *mut ALCcontext) -> (),
145 alcSuspendContext: unsafe extern "C" fn(context: *mut ALCcontext) -> (),
146 alcDestroyContext: unsafe extern "C" fn(context: *mut ALCcontext) -> (),
147 alcGetCurrentContext: unsafe extern "C" fn() -> *mut ALCcontext,
148 alcGetContextsDevice: unsafe extern "C" fn(context: *mut ALCcontext) -> *mut ALCdevice,
149 alcOpenDevice: unsafe extern "C" fn(devicename: *const ALCchar) -> *mut ALCdevice,
150 alcCloseDevice: unsafe extern "C" fn(device: *mut ALCdevice) -> ALCboolean,
151 alcGetError: unsafe extern "C" fn(device: *mut ALCdevice) -> ALCenum,
152 alcIsExtensionPresent: unsafe extern "C" fn(device: *mut ALCdevice, extname: *const ALCchar) -> ALCboolean,
153 alcGetProcAddress: unsafe extern "C" fn(device: *mut ALCdevice, funcname: *const ALCchar) -> *mut ::std::os::raw::c_void,
154 alcGetEnumValue: unsafe extern "C" fn(device: *mut ALCdevice, enumname: *const ALCchar) -> ALCenum,
155 alcGetString: unsafe extern "C" fn(device: *mut ALCdevice, param: ALCenum) -> *const ALCchar,
156 alcGetIntegerv: unsafe extern "C" fn(device: *mut ALCdevice, param: ALCenum, size: ALCsizei, values: *mut ALCint) -> (),
157 alcCaptureOpenDevice: unsafe extern "C" fn(devicename: *const ALCchar, frequency: ALCuint, format: ALCenum, buffersize: ALCsizei) -> *mut ALCdevice,
158 alcCaptureCloseDevice: unsafe extern "C" fn(device: *mut ALCdevice) -> ALCboolean,
159 alcCaptureStart: unsafe extern "C" fn(device: *mut ALCdevice) -> (),
160 alcCaptureStop: unsafe extern "C" fn(device: *mut ALCdevice) -> (),
161 alcCaptureSamples: unsafe extern "C" fn(device: *mut ALCdevice, buffer: *mut ALCvoid, samples: ALCsizei) -> (),
162
163 alDopplerFactor: unsafe extern "C" fn(value: ALfloat) -> (),
164 alDopplerVelocity: unsafe extern "C" fn(value: ALfloat) -> (),
165 alSpeedOfSound: unsafe extern "C" fn(value: ALfloat) -> (),
166 alDistanceModel: unsafe extern "C" fn(distanceModel: ALenum) -> (),
167 alEnable: unsafe extern "C" fn(capability: ALenum) -> (),
168 alDisable: unsafe extern "C" fn(capability: ALenum) -> (),
169 alIsEnabled: unsafe extern "C" fn(capability: ALenum) -> ALboolean,
170 alGetString: unsafe extern "C" fn(param: ALenum) -> *const ALchar,
171 alGetBooleanv: unsafe extern "C" fn(param: ALenum, values: *mut ALboolean) -> (),
172 alGetIntegerv: unsafe extern "C" fn(param: ALenum, values: *mut ALint) -> (),
173 alGetFloatv: unsafe extern "C" fn(param: ALenum, values: *mut ALfloat) -> (),
174 alGetDoublev: unsafe extern "C" fn(param: ALenum, values: *mut ALdouble) -> (),
175 alGetBoolean: unsafe extern "C" fn(param: ALenum) -> ALboolean,
176 alGetInteger: unsafe extern "C" fn(param: ALenum) -> ALint,
177 alGetFloat: unsafe extern "C" fn(param: ALenum) -> ALfloat,
178 alGetDouble: unsafe extern "C" fn(param: ALenum) -> ALdouble,
179 alGetError: unsafe extern "C" fn() -> ALenum,
180 alIsExtensionPresent: unsafe extern "C" fn(extname: *const ALchar) -> ALboolean,
181 alGetProcAddress: unsafe extern "C" fn(fname: *const ALchar) -> *mut ::std::os::raw::c_void,
182 alGetEnumValue: unsafe extern "C" fn(ename: *const ALchar) -> ALenum,
183 alListenerf: unsafe extern "C" fn(param: ALenum, value: ALfloat) -> (),
184 alListener3f: unsafe extern "C" fn(param: ALenum, value1: ALfloat, value2: ALfloat, value3: ALfloat) -> (),
185 alListenerfv: unsafe extern "C" fn(param: ALenum, values: *const ALfloat) -> (),
186 alListeneri: unsafe extern "C" fn(param: ALenum, value: ALint) -> (),
187 alListener3i: unsafe extern "C" fn(param: ALenum, value1: ALint, value2: ALint, value3: ALint) -> (),
188 alListeneriv: unsafe extern "C" fn(param: ALenum, values: *const ALint) -> (),
189 alGetListenerf: unsafe extern "C" fn(param: ALenum, value: *mut ALfloat) -> (),
190 alGetListener3f: unsafe extern "C" fn(param: ALenum, value1: *mut ALfloat, value2: *mut ALfloat, value3: *mut ALfloat) -> (),
191 alGetListenerfv: unsafe extern "C" fn(param: ALenum, values: *mut ALfloat) -> (),
192 alGetListeneri: unsafe extern "C" fn(param: ALenum, value: *mut ALint) -> (),
193 alGetListener3i: unsafe extern "C" fn(param: ALenum, value1: *mut ALint, value2: *mut ALint, value3: *mut ALint) -> (),
194 alGetListeneriv: unsafe extern "C" fn(param: ALenum, values: *mut ALint) -> (),
195 alGenSources: unsafe extern "C" fn(n: ALsizei, sources: *mut ALuint) -> (),
196 alDeleteSources: unsafe extern "C" fn(n: ALsizei, sources: *const ALuint) -> (),
197 alIsSource: unsafe extern "C" fn(source: ALuint) -> ALboolean,
198 alSourcef: unsafe extern "C" fn(source: ALuint, param: ALenum, value: ALfloat) -> (),
199 alSource3f: unsafe extern "C" fn(source: ALuint, param: ALenum, value1: ALfloat, value2: ALfloat, value3: ALfloat) -> (),
200 alSourcefv: unsafe extern "C" fn(source: ALuint, param: ALenum, values: *const ALfloat) -> (),
201 alSourcei: unsafe extern "C" fn(source: ALuint, param: ALenum, value: ALint) -> (),
202 alSource3i: unsafe extern "C" fn(source: ALuint, param: ALenum, value1: ALint, value2: ALint, value3: ALint) -> (),
203 alSourceiv: unsafe extern "C" fn(source: ALuint, param: ALenum, values: *const ALint) -> (),
204 alGetSourcef: unsafe extern "C" fn(source: ALuint, param: ALenum, value: *mut ALfloat) -> (),
205 alGetSource3f: unsafe extern "C" fn(source: ALuint, param: ALenum, value1: *mut ALfloat, value2: *mut ALfloat, value3: *mut ALfloat) -> (),
206 alGetSourcefv: unsafe extern "C" fn(source: ALuint, param: ALenum, values: *mut ALfloat) -> (),
207 alGetSourcei: unsafe extern "C" fn(source: ALuint, param: ALenum, value: *mut ALint) -> (),
208 alGetSource3i: unsafe extern "C" fn(source: ALuint, param: ALenum, value1: *mut ALint, value2: *mut ALint, value3: *mut ALint) -> (),
209 alGetSourceiv: unsafe extern "C" fn(source: ALuint, param: ALenum, values: *mut ALint) -> (),
210 alSourcePlayv: unsafe extern "C" fn(n: ALsizei, sources: *const ALuint) -> (),
211 alSourceStopv: unsafe extern "C" fn(n: ALsizei, sources: *const ALuint) -> (),
212 alSourceRewindv: unsafe extern "C" fn(n: ALsizei, sources: *const ALuint) -> (),
213 alSourcePausev: unsafe extern "C" fn(n: ALsizei, sources: *const ALuint) -> (),
214 alSourcePlay: unsafe extern "C" fn(source: ALuint) -> (),
215 alSourceStop: unsafe extern "C" fn(source: ALuint) -> (),
216 alSourceRewind: unsafe extern "C" fn(source: ALuint) -> (),
217 alSourcePause: unsafe extern "C" fn(source: ALuint) -> (),
218 alSourceQueueBuffers: unsafe extern "C" fn(source: ALuint, nb: ALsizei, buffers: *const ALuint) -> (),
219 alSourceUnqueueBuffers: unsafe extern "C" fn(source: ALuint, nb: ALsizei, buffers: *mut ALuint) -> (),
220 alGenBuffers: unsafe extern "C" fn(n: ALsizei, buffers: *mut ALuint) -> (),
221 alDeleteBuffers: unsafe extern "C" fn(n: ALsizei, buffers: *const ALuint) -> (),
222 alIsBuffer: unsafe extern "C" fn(buffer: ALuint) -> ALboolean,
223 alBufferData: unsafe extern "C" fn(buffer: ALuint, format: ALenum, data: *const ALvoid, size: ALsizei, freq: ALsizei) -> (),
224 alBufferf: unsafe extern "C" fn(buffer: ALuint, param: ALenum, value: ALfloat) -> (),
225 alBuffer3f: unsafe extern "C" fn(buffer: ALuint, param: ALenum, value1: ALfloat, value2: ALfloat, value3: ALfloat) -> (),
226 alBufferfv: unsafe extern "C" fn(buffer: ALuint, param: ALenum, values: *const ALfloat) -> (),
227 alBufferi: unsafe extern "C" fn(buffer: ALuint, param: ALenum, value: ALint) -> (),
228 alBuffer3i: unsafe extern "C" fn(buffer: ALuint, param: ALenum, value1: ALint, value2: ALint, value3: ALint) -> (),
229 alBufferiv: unsafe extern "C" fn(buffer: ALuint, param: ALenum, values: *const ALint) -> (),
230 alGetBufferf: unsafe extern "C" fn(buffer: ALuint, param: ALenum, value: *mut ALfloat) -> (),
231 alGetBuffer3f: unsafe extern "C" fn(buffer: ALuint, param: ALenum, value1: *mut ALfloat, value2: *mut ALfloat, value3: *mut ALfloat) -> (),
232 alGetBufferfv: unsafe extern "C" fn(buffer: ALuint, param: ALenum, values: *mut ALfloat) -> (),
233 alGetBufferi: unsafe extern "C" fn(buffer: ALuint, param: ALenum, value: *mut ALint) -> (),
234 alGetBuffer3i: unsafe extern "C" fn(buffer: ALuint, param: ALenum, value1: *mut ALint, value2: *mut ALint, value3: *mut ALint) -> (),
235 alGetBufferiv: unsafe extern "C" fn(buffer: ALuint, param: ALenum, values: *mut ALint) -> (),
236}