1 /*
2 
3 Boost Software License - Version 1.0 - August 17th, 2003
4 
5 Permission is hereby granted, free of charge, to any person or organization
6 obtaining a copy of the software and accompanying documentation covered by
7 this license (the "Software") to use, reproduce, display, distribute,
8 execute, and transmit the Software, and to prepare derivative works of the
9 Software, and to permit third-parties to whom the Software is furnished to
10 do so, all subject to the following:
11 
12 The copyright notices in the Software and this entire statement, including
13 the above license grant, this restriction and the following disclaimer,
14 must be included in all copies of the Software, in whole or in part, and
15 all derivative works of the Software, unless such copies or derivative
16 works are solely in the form of machine-executable object code generated by
17 a source language processor.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
22 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
23 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
24 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 DEALINGS IN THE SOFTWARE.
26 
27 */
28 module derelict.openal.dynload;
29 
30 version(Derelict_Static) {}
31 else version(DerelictAL_Static) {}
32 else { version = DerelictAL_Dynamic; }
33 
34 version(DerelictAL_Dynamic):
35 
36 public import derelict.openal.types;
37 import derelict.util.loader,
38        derelict.util.system;
39 
40 extern(C) @nogc nothrow {
41     alias da_alEnable = void function(ALenum);
42     alias da_alDisable = void function(ALenum);
43     alias da_alIsEnabled = ALboolean function(ALenum);
44 
45     alias da_alGetString = const(ALchar)* function(ALenum);
46     alias da_alGetBooleanv = void function(ALenum, ALboolean*);
47     alias da_alGetIntegerv = void function(ALenum, ALint*);
48     alias da_alGetFloatv = void function(ALenum, ALfloat*);
49     alias da_alGetDoublev = void function(ALenum, ALdouble*);
50     alias da_alGetBoolean = ALboolean function(ALenum);
51     alias da_alGetInteger = ALint function(ALenum);
52     alias da_alGetFloat = ALfloat function(ALenum);
53     alias da_alGetDouble = ALdouble function(ALenum);
54     alias da_alGetError = ALenum function();
55 
56     alias da_alIsExtensionPresent = ALboolean function(const(char)*);
57     alias da_alGetProcAddress = ALvoid* function(const(char)*);
58     alias da_alGetEnumValue = ALenum function(const(char)*);
59 
60     alias da_alListenerf = void function(ALenum, ALfloat);
61     alias da_alListener3f = void function(ALenum, ALfloat, ALfloat, ALfloat);
62     alias da_alListenerfv = void function(ALenum, const(ALfloat)*);
63     alias da_alListeneri = void function(ALenum, ALint);
64     alias da_alListener3i = void function(ALenum, ALint, ALint, ALint);
65     alias da_alListeneriv = void function(ALenum, const(ALint)*);
66 
67     alias da_alGetListenerf = void function(ALenum, ALfloat*);
68     alias da_alGetListener3f = void function(ALenum, ALfloat*, ALfloat*, ALfloat*);
69     alias da_alGetListenerfv = void function(ALenum, ALfloat*);
70     alias da_alGetListeneri = void function(ALenum, ALint*);
71     alias da_alGetListener3i = void function(ALenum, ALint*, ALint*, ALint*);
72     alias da_alGetListeneriv = void function(ALenum, ALint*);
73 
74     alias da_alGenSources = void function(ALsizei, ALuint*);
75     alias da_alDeleteSources = void function(ALsizei, const(ALuint)*);
76     alias da_alIsSource = ALboolean function(ALuint);
77 
78     alias da_alSourcef = void function(ALuint, ALenum, ALfloat);
79     alias da_alSource3f = void function(ALuint, ALenum, ALfloat, ALfloat, ALfloat);
80     alias da_alSourcefv = void function(ALuint, ALenum, const(ALfloat)*);
81     alias da_alSourcei = void function(ALuint, ALenum, ALint);
82     alias da_alSource3i = void function(ALuint, ALenum, ALint, ALint, ALint);
83     alias da_alSourceiv = void function(ALuint, ALenum, const(ALint)*);
84 
85     alias da_alGetSourcef = void function(ALuint, ALenum, ALfloat*);
86     alias da_alGetSource3f = void function(ALuint, ALenum, ALfloat*, ALfloat*, ALfloat*);
87     alias da_alGetSourcefv = void function(ALuint, ALenum, ALfloat*);
88     alias da_alGetSourcei = void function(ALuint, ALenum, ALint*);
89     alias da_alGetSource3i = void function(ALuint, ALenum, ALint*, ALint*, ALint*);
90     alias da_alGetSourceiv = void function(ALuint, ALenum, ALint*);
91 
92     alias da_alSourcePlayv = void function(ALsizei, const(ALuint)*);
93     alias da_alSourceStopv = void function(ALsizei, const(ALuint)*);
94     alias da_alSourceRewindv = void function(ALsizei, const(ALuint)*);
95     alias da_alSourcePausev = void function(ALsizei, const(ALuint)*);
96     alias da_alSourcePlay = void function(ALuint);
97     alias da_alSourcePause = void function(ALuint);
98     alias da_alSourceRewind = void function(ALuint);
99     alias da_alSourceStop = void function(ALuint);
100 
101     alias da_alSourceQueueBuffers = void function(ALuint, ALsizei, ALuint*);
102     alias da_alSourceUnqueueBuffers = void function(ALuint, ALsizei, ALuint*);
103 
104     alias da_alGenBuffers = void function(ALsizei, ALuint*);
105     alias da_alDeleteBuffers = void function(ALsizei, const(ALuint)*);
106     alias da_alIsBuffer = ALboolean function(ALuint);
107     alias da_alBufferData = void function(ALuint, ALenum, const(ALvoid)*, ALsizei, ALsizei);
108 
109     alias da_alBufferf = void function(ALuint, ALenum, ALfloat);
110     alias da_alBuffer3f = void function(ALuint, ALenum, ALfloat, ALfloat, ALfloat);
111     alias da_alBufferfv = void function(ALuint, ALenum, const(ALfloat)*);
112     alias da_alBufferi = void function(ALuint, ALenum, ALint);
113     alias da_alBuffer3i = void function(ALuint, ALenum, ALint, ALint, ALint);
114     alias da_alBufferiv = void function(ALuint, ALenum, const(ALint)*);
115 
116     alias da_alGetBufferf = void function(ALuint, ALenum, ALfloat*);
117     alias da_alGetBuffer3f = void function(ALuint, ALenum, ALfloat*, ALfloat*, ALfloat*);
118     alias da_alGetBufferfv = void function(ALuint, ALenum, ALfloat*);
119     alias da_alGetBufferi = void function(ALuint, ALenum, ALint*);
120     alias da_alGetBuffer3i = void function(ALuint, ALenum, ALint*, ALint*, ALint*);
121     alias da_alGetBufferiv = void function(ALuint, ALenum, ALint*);
122 
123     alias da_alDopplerFactor = void function(ALfloat);
124     alias da_alDopplerVelocity = void function(ALfloat);
125     alias da_alSpeedOfSound = void function(ALfloat);
126     alias da_alDistanceModel = void function(ALenum);
127 
128     alias da_alcCreateContext = ALCcontext* function(ALCdevice*, const(ALCint)*);
129     alias da_alcMakeContextCurrent = ALCboolean function(ALCcontext*);
130     alias da_alcProcessContext = void function(ALCcontext*);
131     alias da_alcSuspendContext = void function(ALCcontext*);
132     alias da_alcDestroyContext = void function(ALCcontext*);
133     alias da_alcGetCurrentContext = ALCcontext* function();
134     alias da_alcGetContextsDevice = ALCdevice* function(ALCcontext*);
135     alias da_alcOpenDevice = ALCdevice* function(const(char)*);
136     alias da_alcCloseDevice = ALCboolean function(ALCdevice*);
137     alias da_alcGetError = ALCenum function(ALCdevice*);
138     alias da_alcIsExtensionPresent = ALCboolean function(ALCdevice*, const(char)*);
139     alias da_alcGetProcAddress = void* function(ALCdevice*, const(char)*);
140     alias da_alcGetEnumValue = ALCenum function(ALCdevice*, const(char)*);
141     alias da_alcGetString = const(char)* function(ALCdevice*, ALCenum);
142     alias da_alcGetIntegerv = void function(ALCdevice*, ALCenum, ALCsizei, ALCint*);
143     alias da_alcCaptureOpenDevice = ALCdevice* function(const(char)*, ALCuint, ALCenum, ALCsizei);
144     alias da_alcCaptureCloseDevice = ALCboolean function(ALCdevice*);
145     alias da_alcCaptureStart = void function(ALCdevice*);
146     alias da_alcCaptureStop = void function(ALCdevice*);
147     alias da_alcCaptureSamples = void function(ALCdevice*, ALCvoid*, ALCsizei);
148 }
149 
150 __gshared {
151     da_alEnable alEnable;
152     da_alDisable alDisable;
153     da_alIsEnabled alIsEnabled;
154 
155     da_alGetString alGetString;
156     da_alGetBooleanv alGetBooleanv;
157     da_alGetIntegerv alGetIntegerv;
158     da_alGetFloatv alGetFloatv;
159     da_alGetDoublev alGetDoublev;
160     da_alGetBoolean alGetBoolean;
161     da_alGetInteger alGetInteger;
162     da_alGetFloat alGetFloat;
163     da_alGetDouble alGetDouble;
164     da_alGetError alGetError;
165 
166     da_alIsExtensionPresent alIsExtensionPresent;
167     da_alGetProcAddress alGetProcAddress;
168     da_alGetEnumValue alGetEnumValue;
169 
170     da_alListenerf alListenerf;
171     da_alListener3f alListener3f;
172     da_alListenerfv alListenerfv;
173     da_alListeneri alListeneri;
174     da_alListener3i alListener3i;
175     da_alListeneriv alListeneriv;
176 
177     da_alGetListenerf alGetListenerf;
178     da_alGetListener3f alGetListener3f;
179     da_alGetListenerfv alGetListenerfv;
180     da_alGetListeneri alGetListeneri;
181     da_alGetListener3i alGetListener3i;
182     da_alGetListeneriv alGetListeneriv;
183 
184     da_alGenSources alGenSources;
185     da_alDeleteSources alDeleteSources;
186     da_alIsSource alIsSource;
187 
188     da_alSourcef alSourcef;
189     da_alSource3f alSource3f;
190     da_alSourcefv alSourcefv;
191     da_alSourcei alSourcei;
192     da_alSource3i alSource3i;
193     da_alSourceiv alSourceiv;
194 
195 
196     da_alGetSourcef alGetSourcef;
197     da_alGetSource3f alGetSource3f;
198     da_alGetSourcefv alGetSourcefv;
199     da_alGetSourcei alGetSourcei;
200     da_alGetSource3i alGetSource3i;
201     da_alGetSourceiv alGetSourceiv;
202 
203     da_alSourcePlayv alSourcePlayv;
204     da_alSourceStopv alSourceStopv;
205     da_alSourceRewindv alSourceRewindv;
206     da_alSourcePausev alSourcePausev;
207     da_alSourcePlay alSourcePlay;
208     da_alSourcePause alSourcePause;
209     da_alSourceRewind alSourceRewind;
210     da_alSourceStop alSourceStop;
211 
212     da_alSourceQueueBuffers alSourceQueueBuffers;
213     da_alSourceUnqueueBuffers alSourceUnqueueBuffers;
214 
215     da_alGenBuffers alGenBuffers;
216     da_alDeleteBuffers alDeleteBuffers;
217     da_alIsBuffer alIsBuffer;
218     da_alBufferData alBufferData;
219 
220     da_alBufferf alBufferf;
221     da_alBuffer3f alBuffer3f;
222     da_alBufferfv alBufferfv;
223     da_alBufferi alBufferi;
224     da_alBuffer3i alBuffer3i;
225     da_alBufferiv alBufferiv;
226     da_alGetBufferf alGetBufferf;
227     da_alGetBuffer3f alGetBuffer3f;
228     da_alGetBufferfv alGetBufferfv;
229     da_alGetBufferi alGetBufferi;
230     da_alGetBuffer3i alGetBuffer3i;
231     da_alGetBufferiv alGetBufferiv;
232 
233     da_alDopplerFactor alDopplerFactor;
234     da_alDopplerVelocity alDopplerVelocity;
235     da_alSpeedOfSound alSpeedOfSound;
236     da_alDistanceModel alDistanceModel;
237 
238     da_alcCreateContext alcCreateContext;
239     da_alcMakeContextCurrent alcMakeContextCurrent;
240     da_alcProcessContext alcProcessContext;
241     da_alcSuspendContext alcSuspendContext;
242     da_alcDestroyContext alcDestroyContext;
243     da_alcGetCurrentContext alcGetCurrentContext;
244     da_alcGetContextsDevice alcGetContextsDevice;
245     da_alcOpenDevice alcOpenDevice;
246     da_alcCloseDevice alcCloseDevice;
247     da_alcGetError alcGetError;
248     da_alcIsExtensionPresent alcIsExtensionPresent;
249     da_alcGetProcAddress alcGetProcAddress;
250     da_alcGetEnumValue alcGetEnumValue;
251     da_alcGetString alcGetString;
252     da_alcGetIntegerv alcGetIntegerv;
253     da_alcCaptureOpenDevice alcCaptureOpenDevice;
254     da_alcCaptureCloseDevice alcCaptureCloseDevice;
255     da_alcCaptureStart alcCaptureStart;
256     da_alcCaptureStop alcCaptureStop;
257     da_alcCaptureSamples alcCaptureSamples;
258 }
259 
260 
261 class DerelictALLoader : SharedLibLoader {
262     this()
263     {
264         super(libNames);
265     }
266 
267     protected override void loadSymbols()
268     {
269         bindFunc(cast(void**)&alEnable, "alEnable");
270         bindFunc(cast(void**)&alDisable, "alDisable");
271         bindFunc(cast(void**)&alIsEnabled, "alIsEnabled");
272         bindFunc(cast(void**)&alGetString, "alGetString");
273         bindFunc(cast(void**)&alGetBooleanv, "alGetBooleanv");
274         bindFunc(cast(void**)&alGetIntegerv, "alGetIntegerv");
275         bindFunc(cast(void**)&alGetFloatv, "alGetFloatv");
276         bindFunc(cast(void**)&alGetDoublev, "alGetDoublev");
277         bindFunc(cast(void**)&alGetInteger, "alGetInteger");
278         bindFunc(cast(void**)&alGetFloat, "alGetFloat");
279         bindFunc(cast(void**)&alGetDouble, "alGetDouble");
280         bindFunc(cast(void**)&alGetError, "alGetError");
281         bindFunc(cast(void**)&alIsExtensionPresent, "alIsExtensionPresent");
282         bindFunc(cast(void**)&alGetProcAddress, "alGetProcAddress");
283         bindFunc(cast(void**)&alGetEnumValue, "alGetEnumValue");
284         bindFunc(cast(void**)&alListenerf, "alListenerf");
285         bindFunc(cast(void**)&alListener3f, "alListener3f");
286         bindFunc(cast(void**)&alListenerfv, "alListenerfv");
287         bindFunc(cast(void**)&alListeneri, "alListeneri");
288         bindFunc(cast(void**)&alListener3i, "alListener3i");
289         bindFunc(cast(void**)&alListeneriv, "alListeneriv");
290         bindFunc(cast(void**)&alGetListenerf, "alGetListenerf");
291         bindFunc(cast(void**)&alGetListener3f, "alGetListener3f");
292         bindFunc(cast(void**)&alGetListenerfv, "alGetListenerfv");
293         bindFunc(cast(void**)&alGetListeneri, "alGetListeneri");
294         bindFunc(cast(void**)&alGetListener3i, "alGetListener3i");
295         bindFunc(cast(void**)&alGetListeneriv, "alGetListeneriv");
296         bindFunc(cast(void**)&alGenSources, "alGenSources");
297         bindFunc(cast(void**)&alDeleteSources, "alDeleteSources");
298         bindFunc(cast(void**)&alIsSource, "alIsSource");
299         bindFunc(cast(void**)&alSourcef, "alSourcef");
300         bindFunc(cast(void**)&alSource3f, "alSource3f");
301         bindFunc(cast(void**)&alSourcefv, "alSourcefv");
302         bindFunc(cast(void**)&alSourcei, "alSourcei");
303         bindFunc(cast(void**)&alSource3i, "alSource3i");
304         bindFunc(cast(void**)&alSourceiv, "alSourceiv");
305         bindFunc(cast(void**)&alGetSourcef, "alGetSourcef");
306         bindFunc(cast(void**)&alGetSource3f, "alGetSource3f");
307         bindFunc(cast(void**)&alGetSourcefv, "alGetSourcefv");
308         bindFunc(cast(void**)&alGetSourcei, "alGetSourcei");
309         bindFunc(cast(void**)&alGetSource3i, "alGetSource3i");
310         bindFunc(cast(void**)&alGetSourceiv, "alGetSourceiv");
311         bindFunc(cast(void**)&alSourcePlayv, "alSourcePlayv");
312         bindFunc(cast(void**)&alSourceStopv, "alSourceStopv");
313         bindFunc(cast(void**)&alSourceRewindv, "alSourceRewindv");
314         bindFunc(cast(void**)&alSourcePausev, "alSourcePausev");
315         bindFunc(cast(void**)&alSourcePlay, "alSourcePlay");
316         bindFunc(cast(void**)&alSourcePause, "alSourcePause");
317         bindFunc(cast(void**)&alSourceRewind, "alSourceRewind");
318         bindFunc(cast(void**)&alSourceStop, "alSourceStop");
319         bindFunc(cast(void**)&alSourceQueueBuffers, "alSourceQueueBuffers");
320         bindFunc(cast(void**)&alSourceUnqueueBuffers, "alSourceUnqueueBuffers");
321         bindFunc(cast(void**)&alGenBuffers, "alGenBuffers");
322         bindFunc(cast(void**)&alDeleteBuffers, "alDeleteBuffers");
323         bindFunc(cast(void**)&alIsBuffer, "alIsBuffer");
324         bindFunc(cast(void**)&alBufferData, "alBufferData");
325         bindFunc(cast(void**)&alBufferf, "alBufferf");
326         bindFunc(cast(void**)&alBuffer3f, "alBuffer3f");
327         bindFunc(cast(void**)&alBufferfv, "alBufferfv");
328         bindFunc(cast(void**)&alBufferi, "alBufferi");
329         bindFunc(cast(void**)&alBuffer3i, "alBuffer3i");
330         bindFunc(cast(void**)&alBufferiv, "alBufferiv");
331         bindFunc(cast(void**)&alGetBufferf, "alGetBufferf");
332         bindFunc(cast(void**)&alGetBuffer3f, "alGetBuffer3f");
333         bindFunc(cast(void**)&alGetBufferfv, "alGetBufferfv");
334         bindFunc(cast(void**)&alGetBufferi, "alGetBufferi");
335         bindFunc(cast(void**)&alGetBuffer3i, "alGetBuffer3i");
336         bindFunc(cast(void**)&alGetBufferiv, "alGetBufferiv");
337         bindFunc(cast(void**)&alDopplerFactor, "alDopplerFactor");
338         bindFunc(cast(void**)&alDopplerVelocity, "alDopplerVelocity");
339         bindFunc(cast(void**)&alSpeedOfSound, "alSpeedOfSound");
340         bindFunc(cast(void**)&alDistanceModel, "alDistanceModel");
341         bindFunc(cast(void**)&alcCreateContext, "alcCreateContext");
342         bindFunc(cast(void**)&alcMakeContextCurrent, "alcMakeContextCurrent");
343         bindFunc(cast(void**)&alcProcessContext, "alcProcessContext");
344         bindFunc(cast(void**)&alcGetCurrentContext, "alcGetCurrentContext");
345         bindFunc(cast(void**)&alcGetContextsDevice, "alcGetContextsDevice");
346         bindFunc(cast(void**)&alcSuspendContext, "alcSuspendContext");
347         bindFunc(cast(void**)&alcDestroyContext, "alcDestroyContext");
348         bindFunc(cast(void**)&alcOpenDevice, "alcOpenDevice");
349         bindFunc(cast(void**)&alcCloseDevice, "alcCloseDevice");
350         bindFunc(cast(void**)&alcGetError, "alcGetError");
351         bindFunc(cast(void**)&alcIsExtensionPresent, "alcIsExtensionPresent");
352         bindFunc(cast(void**)&alcGetProcAddress, "alcGetProcAddress");
353         bindFunc(cast(void**)&alcGetEnumValue, "alcGetEnumValue");
354         bindFunc(cast(void**)&alcGetString, "alcGetString");
355         bindFunc(cast(void**)&alcGetIntegerv, "alcGetIntegerv");
356         bindFunc(cast(void**)&alcCaptureOpenDevice, "alcCaptureOpenDevice");
357         bindFunc(cast(void**)&alcCaptureCloseDevice, "alcCaptureCloseDevice");
358         bindFunc(cast(void**)&alcCaptureStart, "alcCaptureStart");
359         bindFunc(cast(void**)&alcCaptureStop, "alcCaptureStop");
360         bindFunc(cast(void**)&alcCaptureSamples, "alcCaptureSamples");
361     }
362 }
363 
364 __gshared DerelictALLoader DerelictAL;
365 
366 shared static this()
367 {
368     DerelictAL = new DerelictALLoader();
369 }
370 
371 private:
372     static if(Derelict_OS_Windows)
373         enum libNames = "OpenAl32.dll";
374     else static if(Derelict_OS_Mac)
375         enum libNames = "../Frameworks/OpenAL.framework/OpenAL, /Library/Frameworks/OpenAL.framework/OpenAL, /System/Library/Frameworks/OpenAL.framework/OpenAL";
376     else static if(Derelict_OS_Posix)
377         enum libNames = "libal.so, libAL.so, libopenal.so, libopenal.so.1, libopenal.so.0";
378     else
379         static assert(0, "Need to implement OpenAL libNames for this operating system.");
380