1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19 */
20
21
22 // qal_win.c -- binding of AL to QAL function pointers
23
24 #ifdef USE_OPENAL
25
26 #include <dlfcn.h> // ELF dl loader
27 #include "../client/snd_loc.h"
28
29 qboolean openal_active;
30
31 ALCOPENDEVICE qalcOpenDevice;
32 ALCCLOSEDEVICE qalcCloseDevice;
33 ALCCREATECONTEXT qalcCreateContext;
34 ALCDESTROYCONTEXT qalcDestroyContext;
35 ALCMAKECONTEXTCURRENT qalcMakeContextCurrent;
36 ALCPROCESSCONTEXT qalcProcessContext;
37 ALCSUSPENDCONTEXT qalcSuspendContext;
38 ALCGETCURRENTCONTEXT qalcGetCurrentContext;
39 ALCGETCONTEXTSDEVICE qalcGetContextsDevice;
40 ALCGETSTRING qalcGetString;
41 ALCGETINTEGERV qalcGetIntegerv;
42 ALCGETERROR qalcGetError;
43 ALCISEXTENSIONPRESENT qalcIsExtensionPresent;
44 ALCGETPROCADDRESS qalcGetProcAddress;
45 ALCGETENUMVALUE qalcGetEnumValue;
46
47 ALBUFFERDATA qalBufferData;
48 ALDELETEBUFFERS qalDeleteBuffers;
49 ALDELETESOURCES qalDeleteSources;
50 ALDISABLE qalDisable;
51 ALDISTANCEMODEL qalDistanceModel;
52 ALDOPPLERFACTOR qalDopplerFactor;
53 ALDOPPLERVELOCITY qalDopplerVelocity;
54 ALENABLE qalEnable;
55 ALGENBUFFERS qalGenBuffers;
56 ALGENSOURCES qalGenSources;
57 ALGETBOOLEAN qalGetBoolean;
58 ALGETBOOLEANV qalGetBooleanv;
59 ALGETBUFFERF qalGetBufferf;
60 ALGETBUFFERI qalGetBufferi;
61 ALGETDOUBLE qalGetDouble;
62 ALGETDOUBLEV qalGetDoublev;
63 ALGETENUMVALUE qalGetEnumValue;
64 ALGETERROR qalGetError;
65 ALGETFLOAT qalGetFloat;
66 ALGETFLOATV qalGetFloatv;
67 ALGETINTEGER qalGetInteger;
68 ALGETINTEGERV qalGetIntegerv;
69 ALGETLISTENER3F qalGetListener3f;
70 ALGETLISTENERF qalGetListenerf;
71 ALGETLISTENERFV qalGetListenerfv;
72 ALGETLISTENERI qalGetListeneri;
73 ALGETPROCADDRESS qalGetProcAddress;
74 ALGETSOURCE3F qalGetSource3f;
75 ALGETSOURCEF qalGetSourcef;
76 ALGETSOURCEFV qalGetSourcefv;
77 ALGETSOURCEI qalGetSourcei;
78 ALGETSTRING qalGetString;
79 ALHINT qalHint;
80 ALISBUFFER qalIsBuffer;
81 ALISENABLED qalIsEnabled;
82 ALISEXTENSIONPRESENT qalIsExtensionPresent;
83 ALISSOURCE qalIsSource;
84 ALLISTENER3F qalListener3f;
85 ALLISTENERF qalListenerf;
86 ALLISTENERFV qalListenerfv;
87 ALLISTENERI qalListeneri;
88 ALSOURCE3F qalSource3f;
89 ALSOURCEF qalSourcef;
90 ALSOURCEFV qalSourcefv;
91 ALSOURCEI qalSourcei;
92 ALSOURCEPAUSE qalSourcePause;
93 ALSOURCEPAUSEV qalSourcePausev;
94 ALSOURCEPLAY qalSourcePlay;
95 ALSOURCEPLAYV qalSourcePlayv;
96 ALSOURCEQUEUEBUFFERS qalSourceQueueBuffers;
97 ALSOURCEREWIND qalSourceRewind;
98 ALSOURCEREWINDV qalSourceRewindv;
99 ALSOURCESTOP qalSourceStop;
100 ALSOURCESTOPV qalSourceStopv;
101 ALSOURCEUNQUEUEBUFFERS qalSourceUnqueueBuffers;
102
103 ALEAXSET qalEAXSet;
104 ALEAXGET qalEAXGet;
105
106
107 // =====================================================================
108
109 #define GPA(a) dlsym(alState.ALlib, a);
110
111
112 /*
113 =================
114 QAL_Shutdown
115
116 Unloads the specified DLL then nulls out all the proc pointers
117 =================
118 */
QAL_Shutdown(void)119 void QAL_Shutdown (void){
120
121 Com_Printf("...shutting down QAL\n", LOG_CLIENT);
122
123 if (alState.ALlib)
124 {
125 Com_Printf("...unloading OpenAL DLL\n", LOG_CLIENT);
126
127 dlclose(alState.ALlib);
128 alState.ALlib = NULL;
129 }
130
131 openal_active = false;
132
133 qalcOpenDevice = NULL;
134 qalcCloseDevice = NULL;
135 qalcCreateContext = NULL;
136 qalcDestroyContext = NULL;
137 qalcMakeContextCurrent = NULL;
138 qalcProcessContext = NULL;
139 qalcSuspendContext = NULL;
140 qalcGetCurrentContext = NULL;
141 qalcGetContextsDevice = NULL;
142 qalcGetString = NULL;
143 qalcGetIntegerv = NULL;
144 qalcGetError = NULL;
145 qalcIsExtensionPresent = NULL;
146 qalcGetProcAddress = NULL;
147 qalcGetEnumValue = NULL;
148
149 qalBufferData = NULL;
150 qalDeleteBuffers = NULL;
151 qalDeleteSources = NULL;
152 qalDisable = NULL;
153 qalDistanceModel = NULL;
154 qalDopplerFactor = NULL;
155 qalDopplerVelocity = NULL;
156 qalEnable = NULL;
157 qalGenBuffers = NULL;
158 qalGenSources = NULL;
159 qalGetBoolean = NULL;
160 qalGetBooleanv = NULL;
161 qalGetBufferf = NULL;
162 qalGetBufferi = NULL;
163 qalGetDouble = NULL;
164 qalGetDoublev = NULL;
165 qalGetEnumValue = NULL;
166 qalGetError = NULL;
167 qalGetFloat = NULL;
168 qalGetFloatv = NULL;
169 qalGetInteger = NULL;
170 qalGetIntegerv = NULL;
171 qalGetListener3f = NULL;
172 qalGetListenerf = NULL;
173 qalGetListenerfv = NULL;
174 qalGetListeneri = NULL;
175 qalGetProcAddress = NULL;
176 qalGetSource3f = NULL;
177 qalGetSourcef = NULL;
178 qalGetSourcefv = NULL;
179 qalGetSourcei = NULL;
180 qalGetString = NULL;
181 qalHint = NULL;
182 qalIsBuffer = NULL;
183 qalIsEnabled = NULL;
184 qalIsExtensionPresent = NULL;
185 qalIsSource = NULL;
186 qalListener3f = NULL;
187 qalListenerf = NULL;
188 qalListenerfv = NULL;
189 qalListeneri = NULL;
190 qalSource3f = NULL;
191 qalSourcef = NULL;
192 qalSourcefv = NULL;
193 qalSourcei = NULL;
194 qalSourcePause = NULL;
195 qalSourcePausev = NULL;
196 qalSourcePlay = NULL;
197 qalSourcePlayv = NULL;
198 qalSourceQueueBuffers = NULL;
199 qalSourceRewind = NULL;
200 qalSourceRewindv = NULL;
201 qalSourceStop = NULL;
202 qalSourceStopv = NULL;
203 qalSourceUnqueueBuffers = NULL;
204
205 qalEAXSet = NULL;
206 qalEAXGet = NULL;
207 }
208
209 /*
210 =================
211 QAL_Init
212
213 Binds our QAL function pointers to the appropriate AL stuff
214 =================
215 */
QAL_Init(const char * driver)216 qboolean QAL_Init (const char *driver){
217
218 Com_Printf("...initializing QAL\n", LOG_CLIENT);
219
220 Com_Printf("...calling dlopen( '%s' ): ", LOG_CLIENT, driver);
221
222 if ((alState.ALlib = dlopen(driver, RTLD_NOW)) == NULL)
223 {
224 Com_Printf("failed\n", LOG_CLIENT);
225 return false;
226 }
227 Com_Printf("succeeded\n", LOG_CLIENT);
228
229 qalcOpenDevice = (ALCOPENDEVICE)GPA("alcOpenDevice");
230 qalcCloseDevice = (ALCCLOSEDEVICE)GPA("alcCloseDevice");
231 qalcCreateContext = (ALCCREATECONTEXT)GPA("alcCreateContext");
232 qalcDestroyContext = (ALCDESTROYCONTEXT)GPA("alcDestroyContext");
233 qalcMakeContextCurrent = (ALCMAKECONTEXTCURRENT)GPA("alcMakeContextCurrent");
234 qalcProcessContext = (ALCPROCESSCONTEXT)GPA("alcProcessContext");
235 qalcSuspendContext = (ALCSUSPENDCONTEXT)GPA("alcSuspendContext");
236 qalcGetCurrentContext = (ALCGETCURRENTCONTEXT)GPA("alcGetCurrentContext");
237 qalcGetContextsDevice = (ALCGETCONTEXTSDEVICE)GPA("alcGetContextsDevice");
238 qalcGetString = (ALCGETSTRING)GPA("alcGetString");
239 qalcGetIntegerv = (ALCGETINTEGERV)GPA("alcGetIntegerv");
240 qalcGetError = (ALCGETERROR)GPA("alcGetError");
241 qalcIsExtensionPresent = (ALCISEXTENSIONPRESENT)GPA("alcIsExtensionPresent");
242 qalcGetProcAddress = (ALCGETPROCADDRESS)GPA("alcGetProcAddress");
243 qalcGetEnumValue = (ALCGETENUMVALUE)GPA("alcGetEnumValue");
244
245 qalBufferData = (ALBUFFERDATA)GPA("alBufferData");
246 qalDeleteBuffers = (ALDELETEBUFFERS)GPA("alDeleteBuffers");
247 qalDeleteSources = (ALDELETESOURCES)GPA("alDeleteSources");
248 qalDisable = (ALDISABLE)GPA("alDisable");
249 qalDistanceModel = (ALDISTANCEMODEL)GPA("alDistanceModel");
250 qalDopplerFactor = (ALDOPPLERFACTOR)GPA("alDopplerFactor");
251 qalDopplerVelocity = (ALDOPPLERVELOCITY)GPA("alDopplerVelocity");
252 qalEnable = (ALENABLE)GPA("alEnable");
253 qalGenBuffers = (ALGENBUFFERS)GPA("alGenBuffers");
254 qalGenSources = (ALGENSOURCES)GPA("alGenSources");
255 qalGetBoolean = (ALGETBOOLEAN)GPA("alGetBoolean");
256 qalGetBooleanv = (ALGETBOOLEANV)GPA("alGetBooleanv");
257 qalGetBufferf = (ALGETBUFFERF)GPA("alGetBufferf");
258 qalGetBufferi = (ALGETBUFFERI)GPA("alGetBufferi");
259 qalGetDouble = (ALGETDOUBLE)GPA("alGetDouble");
260 qalGetDoublev = (ALGETDOUBLEV)GPA("alGetDoublev");
261 qalGetEnumValue = (ALGETENUMVALUE)GPA("alGetEnumValue");
262 qalGetError = (ALGETERROR)GPA("alGetError");
263 qalGetFloat = (ALGETFLOAT)GPA("alGetFloat");
264 qalGetFloatv = (ALGETFLOATV)GPA("alGetFloatv");
265 qalGetInteger = (ALGETINTEGER)GPA("alGetInteger");
266 qalGetIntegerv = (ALGETINTEGERV)GPA("alGetIntegerv");
267 qalGetListener3f = (ALGETLISTENER3F)GPA("alGetListener3f");
268 qalGetListenerf = (ALGETLISTENERF)GPA("alGetListenerf");
269 qalGetListenerfv = (ALGETLISTENERFV)GPA("alGetListenerfv");
270 qalGetListeneri = (ALGETLISTENERI)GPA("alGetListeneri");
271 qalGetProcAddress = (ALGETPROCADDRESS)GPA("alGetProcAddress");
272 qalGetSource3f = (ALGETSOURCE3F)GPA("alGetSource3f");
273 qalGetSourcef = (ALGETSOURCEF)GPA("alGetSourcef");
274 qalGetSourcefv = (ALGETSOURCEFV)GPA("alGetSourcefv");
275 qalGetSourcei = (ALGETSOURCEI)GPA("alGetSourcei");
276 qalGetString = (ALGETSTRING)GPA("alGetString");
277 qalHint = (ALHINT)GPA("alHint");
278 qalIsBuffer = (ALISBUFFER)GPA("alIsBuffer");
279 qalIsEnabled = (ALISENABLED)GPA("alIsEnabled");
280 qalIsExtensionPresent = (ALISEXTENSIONPRESENT)GPA("alIsExtensionPresent");
281 qalIsSource = (ALISSOURCE)GPA("alIsSource");
282 qalListener3f = (ALLISTENER3F)GPA("alListener3f");
283 qalListenerf = (ALLISTENERF)GPA("alListenerf");
284 qalListenerfv = (ALLISTENERFV)GPA("alListenerfv");
285 qalListeneri = (ALLISTENERI)GPA("alListeneri");
286 qalSource3f = (ALSOURCE3F)GPA("alSource3f");
287 qalSourcef = (ALSOURCEF)GPA("alSourcef");
288 qalSourcefv = (ALSOURCEFV)GPA("alSourcefv");
289 qalSourcei = (ALSOURCEI)GPA("alSourcei");
290 qalSourcePause = (ALSOURCEPAUSE)GPA("alSourcePause");
291 qalSourcePausev = (ALSOURCEPAUSEV)GPA("alSourcePausev");
292 qalSourcePlay = (ALSOURCEPLAY)GPA("alSourcePlay");
293 qalSourcePlayv = (ALSOURCEPLAYV)GPA("alSourcePlayv");
294 qalSourceQueueBuffers = (ALSOURCEQUEUEBUFFERS)GPA("alSourceQueueBuffers");
295 qalSourceRewind = (ALSOURCEREWIND)GPA("alSourceRewind");
296 qalSourceRewindv = (ALSOURCEREWINDV)GPA("alSourceRewindv");
297 qalSourceStop = (ALSOURCESTOP)GPA("alSourceStop");
298 qalSourceStopv = (ALSOURCESTOPV)GPA("alSourceStopv");
299 qalSourceUnqueueBuffers = (ALSOURCEUNQUEUEBUFFERS)GPA("alSourceUnqueueBuffers");
300
301 qalEAXGet = NULL;
302 qalEAXSet = NULL;
303
304 openal_active = true;
305
306 return true;
307 }
308 #endif
309