al_sys/
lib.rs

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}