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