d3d8: Mark internal symbols hidden.
[wine] / dlls / openal32 / openal.c
1 /*
2  * OpenAL32.dll thunk. Wraps Win32 OpenAL function calls around a native
3  * implementation.
4  *
5  * Copyright 2007 Nick Burns (adger44@hotmail.com)
6  * Copyright 2007,2009 Chris Robinson
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21  */
22
23 #include "config.h"
24
25 #include <stdarg.h>
26 #include <string.h>
27
28 #include "windef.h"
29 #include "winbase.h"
30 #include "wine/debug.h"
31
32 #ifdef HAVE_AL_AL_H
33 #include <AL/al.h>
34 #include <AL/alc.h>
35 #elif defined(HAVE_OPENAL_AL_H)
36 #include <OpenAL/al.h>
37 #include <OpenAL/alc.h>
38 #endif
39
40 WINE_DEFAULT_DEBUG_CHANNEL(openal32);
41
42 typedef struct wine_ALCcontext {
43     ALCcontext *ctx;
44
45     ALboolean been_current;
46
47     ALvoid (CDECL*alGenFilters)(ALsizei n, ALuint* filters);
48     ALvoid (CDECL*alDeleteFilters)(ALsizei n, const ALuint* filters);
49     ALboolean (CDECL*alIsFilter)(ALuint fid);
50     ALvoid (CDECL*alFilterf)(ALuint fid, ALenum param, ALfloat value);
51     ALvoid (CDECL*alFilterfv)(ALuint fid, ALenum param, const ALfloat* values);
52     ALvoid (CDECL*alFilteri)(ALuint fid, ALenum param, ALint value);
53     ALvoid (CDECL*alFilteriv)(ALuint fid, ALenum param, const ALint* values);
54     ALvoid (CDECL*alGetFilterf)(ALuint fid, ALenum param, ALfloat* value);
55     ALvoid (CDECL*alGetFilterfv)(ALuint fid, ALenum param, ALfloat* values);
56     ALvoid (CDECL*alGetFilteri)(ALuint fid, ALenum param, ALint* value);
57     ALvoid (CDECL*alGetFilteriv)(ALuint fid, ALenum param, ALint* values);
58     ALvoid (CDECL*alGenEffects)(ALsizei n, ALuint* effects);
59     ALvoid (CDECL*alDeleteEffects)(ALsizei n, const ALuint* effects);
60     ALboolean (CDECL*alIsEffect)(ALuint eid);
61     ALvoid (CDECL*alEffectf)(ALuint eid, ALenum param, ALfloat value);
62     ALvoid (CDECL*alEffectfv)(ALuint eid, ALenum param, const ALfloat* values);
63     ALvoid (CDECL*alEffecti)(ALuint eid, ALenum param, ALint value);
64     ALvoid (CDECL*alEffectiv)(ALuint eid, ALenum param, const ALint* values);
65     ALvoid (CDECL*alGetEffectf)(ALuint eid, ALenum param, ALfloat* value);
66     ALvoid (CDECL*alGetEffectfv)(ALuint eid, ALenum param, ALfloat* values);
67     ALvoid (CDECL*alGetEffecti)(ALuint eid, ALenum param, ALint* value);
68     ALvoid (CDECL*alGetEffectiv)(ALuint eid, ALenum param, ALint* values);
69     ALvoid (CDECL*alGenAuxiliaryEffectSlots)(ALsizei n, ALuint* slots);
70     ALvoid (CDECL*alDeleteAuxiliaryEffectSlots)(ALsizei n, const ALuint* slots);
71     ALboolean (CDECL*alIsAuxiliaryEffectSlot)(ALuint sid);
72     ALvoid (CDECL*alAuxiliaryEffectSlotf)(ALuint sid, ALenum param, ALfloat value);
73     ALvoid (CDECL*alAuxiliaryEffectSlotfv)(ALuint sid, ALenum param, const ALfloat* values);
74     ALvoid (CDECL*alAuxiliaryEffectSloti)(ALuint sid, ALenum param, ALint value);
75     ALvoid (CDECL*alAuxiliaryEffectSlotiv)(ALuint sid, ALenum param, const ALint* values);
76     ALvoid (CDECL*alGetAuxiliaryEffectSlotf)(ALuint sid, ALenum param, ALfloat* value);
77     ALvoid (CDECL*alGetAuxiliaryEffectSlotfv)(ALuint sid, ALenum param, ALfloat* values);
78     ALvoid (CDECL*alGetAuxiliaryEffectSloti)(ALuint sid, ALenum param, ALint* value);
79     ALvoid (CDECL*alGetAuxiliaryEffectSlotiv)(ALuint sid, ALenum param, ALint* values);
80
81     struct wine_ALCcontext *next;
82 } wine_ALCcontext;
83
84 struct FuncList {
85     const char *name;
86     void *proc;
87 };
88
89 static const struct FuncList ALCFuncs[];
90 static const struct FuncList ALFuncs[];
91
92 static wine_ALCcontext *CtxList;
93 static wine_ALCcontext *CurrentCtx;
94
95 CRITICAL_SECTION openal_cs;
96 static CRITICAL_SECTION_DEBUG openal_cs_debug =
97 {
98     0, 0, &openal_cs,
99     {&openal_cs_debug.ProcessLocksList,
100     &openal_cs_debug.ProcessLocksList},
101     0, 0, {(DWORD_PTR)(__FILE__ ": openal_cs")}
102 };
103 CRITICAL_SECTION openal_cs = {&openal_cs_debug, -1, 0, 0, 0, 0};
104
105 /***********************************************************************
106  *           OpenAL initialisation routine
107  */
108 BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
109 {
110     switch(reason)
111     {
112     case DLL_PROCESS_ATTACH:
113         DisableThreadLibraryCalls(hinst);
114         break;
115     case DLL_PROCESS_DETACH:
116         while(CtxList)
117         {
118             wine_ALCcontext *next = CtxList->next;
119             HeapFree(GetProcessHeap(), 0, CtxList);
120             CtxList = next;
121         }
122     }
123
124     return TRUE;
125 }
126
127
128 /* Validates the given context */
129 static wine_ALCcontext *ValidateCtx(ALCcontext *ctx)
130 {
131     wine_ALCcontext *cur = CtxList;
132
133     while(cur != NULL && cur->ctx != ctx)
134         cur = cur->next;
135     return cur;
136 }
137
138
139 /***********************************************************************
140  *           OpenAL thunk routines
141  */
142
143 /* OpenAL ALC 1.0 functions */
144 ALCcontext* CDECL wine_alcCreateContext(ALCdevice *device, const ALCint* attrlist)
145 {
146     wine_ALCcontext *ctx;
147
148     ctx = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(wine_ALCcontext));
149     if(!ctx)
150     {
151         ERR("Out of memory!\n");
152         return NULL;
153     }
154
155     ctx->ctx = alcCreateContext(device, attrlist);
156     if(!ctx->ctx)
157     {
158         HeapFree(GetProcessHeap(), 0, ctx);
159         WARN("Failed to create new context\n");
160         return NULL;
161     }
162     TRACE("Created new context %p\n", ctx->ctx);
163
164     EnterCriticalSection(&openal_cs);
165     ctx->next = CtxList;
166     CtxList = ctx;
167     LeaveCriticalSection(&openal_cs);
168
169     return ctx->ctx;
170 }
171
172 ALCboolean CDECL wine_alcMakeContextCurrent(ALCcontext *context)
173 {
174     wine_ALCcontext *ctx = NULL;
175
176     EnterCriticalSection(&openal_cs);
177     if(context && !(ctx=ValidateCtx(context)))
178         WARN("Could not find context %p in context list\n", context);
179
180     if(alcMakeContextCurrent(context) == ALC_FALSE)
181     {
182         WARN("Failed to make context %p current\n", context);
183         LeaveCriticalSection(&openal_cs);
184         return ALC_FALSE;
185     }
186
187     CurrentCtx = ctx;
188     if(CurrentCtx && !CurrentCtx->been_current)
189     {
190         CurrentCtx->been_current = AL_TRUE;
191
192 #define LOADFUNC(x) CurrentCtx->x = alGetProcAddress(#x)
193         LOADFUNC(alGenFilters);
194         LOADFUNC(alDeleteFilters);
195         LOADFUNC(alIsFilter);
196         LOADFUNC(alFilterf);
197         LOADFUNC(alFilterfv);
198         LOADFUNC(alFilteri);
199         LOADFUNC(alFilteriv);
200         LOADFUNC(alGetFilterf);
201         LOADFUNC(alGetFilterfv);
202         LOADFUNC(alGetFilteri);
203         LOADFUNC(alGetFilteriv);
204         LOADFUNC(alGenEffects);
205         LOADFUNC(alDeleteEffects);
206         LOADFUNC(alIsEffect);
207         LOADFUNC(alEffectf);
208         LOADFUNC(alEffectfv);
209         LOADFUNC(alEffecti);
210         LOADFUNC(alEffectiv);
211         LOADFUNC(alGetEffectf);
212         LOADFUNC(alGetEffectfv);
213         LOADFUNC(alGetEffecti);
214         LOADFUNC(alGetEffectiv);
215         LOADFUNC(alGenAuxiliaryEffectSlots);
216         LOADFUNC(alDeleteAuxiliaryEffectSlots);
217         LOADFUNC(alIsAuxiliaryEffectSlot);
218         LOADFUNC(alAuxiliaryEffectSlotf);
219         LOADFUNC(alAuxiliaryEffectSlotfv);
220         LOADFUNC(alAuxiliaryEffectSloti);
221         LOADFUNC(alAuxiliaryEffectSlotiv);
222         LOADFUNC(alGetAuxiliaryEffectSlotf);
223         LOADFUNC(alGetAuxiliaryEffectSlotfv);
224         LOADFUNC(alGetAuxiliaryEffectSloti);
225         LOADFUNC(alGetAuxiliaryEffectSlotiv);
226 #undef LOADFUNC
227     }
228     LeaveCriticalSection(&openal_cs);
229
230     return ALC_TRUE;
231 }
232
233 ALvoid CDECL wine_alcProcessContext(ALCcontext *context)
234 {
235     alcProcessContext(context);
236 }
237
238 ALvoid CDECL wine_alcSuspendContext(ALCcontext *context)
239 {
240     alcSuspendContext(context);
241 }
242
243 ALvoid CDECL wine_alcDestroyContext(ALCcontext *context)
244 {
245     wine_ALCcontext **list, *ctx;
246
247     EnterCriticalSection(&openal_cs);
248
249     list = &CtxList;
250     while(*list && (*list)->ctx != context)
251         list = &(*list)->next;
252
253     if(!(*list))
254     {
255         WARN("Could not find context %p in context list\n", context);
256         alcDestroyContext(context);
257         LeaveCriticalSection(&openal_cs);
258         return;
259     }
260
261     ctx = *list;
262     *list = (*list)->next;
263
264     if(ctx == CurrentCtx)
265         CurrentCtx = NULL;
266
267     LeaveCriticalSection(&openal_cs);
268
269     HeapFree(GetProcessHeap(), 0, ctx);
270     alcDestroyContext(context);
271 }
272
273 ALCcontext* CDECL wine_alcGetCurrentContext(ALCvoid)
274 {
275     ALCcontext *ret = NULL;
276
277     EnterCriticalSection(&openal_cs);
278     if(CurrentCtx)
279         ret = CurrentCtx->ctx;
280     LeaveCriticalSection(&openal_cs);
281
282     return ret;
283 }
284
285 ALCdevice* CDECL wine_alcGetContextsDevice(ALCcontext *context)
286 {
287     return alcGetContextsDevice(context);
288 }
289
290 ALCdevice* CDECL wine_alcOpenDevice(const ALCchar *devicename)
291 {
292     return alcOpenDevice(devicename);
293 }
294
295 ALCboolean CDECL wine_alcCloseDevice(ALCdevice *device)
296 {
297     return alcCloseDevice(device);
298 }
299
300 ALCenum CDECL wine_alcGetError(ALCdevice *device)
301 {
302     return alcGetError(device);
303 }
304
305 ALCboolean CDECL wine_alcIsExtensionPresent(ALCdevice *device, const ALCchar *extname)
306 {
307     return alcIsExtensionPresent(device, extname);
308 }
309
310 ALCvoid* CDECL wine_alcGetProcAddress(ALCdevice *device, const ALCchar *funcname)
311 {
312     void *proc;
313     int i;
314
315     /* Make sure the host implementation has the requested function */
316     proc = alcGetProcAddress(device, funcname);
317     if(!proc)
318         return NULL;
319
320     for(i = 0;ALCFuncs[i].name;i++)
321     {
322         if(strcmp(funcname, ALCFuncs[i].name) == 0)
323             return ALCFuncs[i].proc;
324     }
325     FIXME("Could not find function in list: %s\n", funcname);
326     return NULL;
327 }
328
329 ALCenum CDECL wine_alcGetEnumValue(ALCdevice *device, const ALCchar *enumname)
330 {
331     return alcGetEnumValue(device, enumname);
332 }
333
334 const ALCchar* CDECL wine_alcGetString(ALCdevice *device, ALCenum param)
335 {
336     return alcGetString(device, param);
337 }
338
339 ALvoid CDECL wine_alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *dest)
340 {
341     return alcGetIntegerv(device, param, size, dest);
342 }
343
344
345 /* OpenAL 1.0 functions */
346 ALvoid CDECL wine_alEnable(ALenum capability)
347 {
348     alEnable(capability);
349 }
350
351 ALvoid CDECL wine_alDisable(ALenum capability)
352 {
353     alDisable(capability);
354 }
355
356 ALboolean CDECL wine_alIsEnabled(ALenum capability)
357 {
358     return alIsEnabled(capability);
359 }
360
361 const ALchar* CDECL wine_alGetString(ALenum param)
362 {
363     return alGetString(param);
364 }
365
366 ALvoid CDECL wine_alGetBooleanv(ALenum param, ALboolean* data)
367 {
368     alGetBooleanv(param, data);
369 }
370
371 ALvoid CDECL wine_alGetIntegerv(ALenum param, ALint* data)
372 {
373     alGetIntegerv(param, data);
374 }
375
376 ALvoid CDECL wine_alGetFloatv(ALenum param, ALfloat* data)
377 {
378     alGetFloatv(param, data);
379 }
380
381 ALvoid CDECL wine_alGetDoublev(ALenum param, ALdouble* data)
382 {
383     alGetDoublev(param, data);
384 }
385
386 ALboolean CDECL wine_alGetBoolean(ALenum param)
387 {
388     return alGetBoolean(param);
389 }
390
391 ALint CDECL wine_alGetInteger(ALenum param)
392 {
393     return alGetInteger(param);
394 }
395
396 ALfloat CDECL wine_alGetFloat(ALenum param)
397 {
398     return alGetFloat(param);
399 }
400
401 ALdouble CDECL wine_alGetDouble(ALenum param)
402 {
403     return alGetDouble(param);
404 }
405
406 ALenum CDECL wine_alGetError(ALvoid)
407 {
408     return alGetError();
409 }
410
411 ALboolean CDECL wine_alIsExtensionPresent(const ALchar* extname)
412 {
413     return alIsExtensionPresent(extname);
414 }
415
416 ALvoid* CDECL wine_alGetProcAddress(const ALchar* funcname)
417 {
418     void *proc;
419     int i;
420
421     /* Make sure the host implementation has the requested function. This will
422      * also set the last AL error properly if the function should not be
423      * returned (eg. no current context). */
424     proc = alGetProcAddress(funcname);
425     if(!proc)
426         return NULL;
427
428     for(i = 0;ALFuncs[i].name;i++)
429     {
430         if(strcmp(funcname, ALFuncs[i].name) == 0)
431             return ALFuncs[i].proc;
432     }
433     FIXME("Could not find function in list: %s\n", funcname);
434     return NULL;
435 }
436
437 ALenum CDECL wine_alGetEnumValue(const ALchar* ename)
438 {
439     return alGetEnumValue(ename);
440 }
441
442 ALvoid CDECL wine_alListenerf(ALenum param, ALfloat value)
443 {
444     alListenerf(param, value);
445 }
446
447 ALvoid CDECL wine_alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3)
448 {
449     alListener3f(param, value1, value2, value3);
450 }
451
452 ALvoid CDECL wine_alListenerfv(ALenum param, const ALfloat* values)
453 {
454     alListenerfv(param, values);
455 }
456
457 ALvoid CDECL wine_alListeneri(ALenum param, ALint value)
458 {
459     alListeneri(param, value);
460 }
461
462 ALvoid CDECL wine_alGetListenerf(ALenum param, ALfloat* value)
463 {
464     alGetListenerf(param, value);
465 }
466
467 ALvoid CDECL wine_alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3)
468 {
469     alGetListener3f(param, value1, value2, value3);
470 }
471
472 ALvoid CDECL wine_alGetListenerfv(ALenum param, ALfloat* values)
473 {
474     alGetListenerfv(param, values);
475 }
476
477 ALvoid CDECL wine_alGetListeneri(ALenum param, ALint* value)
478 {
479     alGetListeneri(param, value);
480 }
481
482 ALvoid CDECL wine_alGetListeneriv(ALenum param, ALint* values)
483 {
484     alGetListeneriv(param, values);
485 }
486
487 ALvoid CDECL wine_alGenSources(ALsizei n, ALuint* sources)
488 {
489     alGenSources(n, sources);
490 }
491
492 ALvoid CDECL wine_alDeleteSources(ALsizei n, const ALuint* sources)
493 {
494     alDeleteSources(n, sources);
495 }
496
497 ALboolean CDECL wine_alIsSource(ALuint sid)
498 {
499     return alIsSource(sid);
500 }
501
502 ALvoid CDECL wine_alSourcef(ALuint sid, ALenum param, ALfloat value)
503 {
504     alSourcef(sid, param, value);
505 }
506
507 ALvoid CDECL wine_alSource3f(ALuint sid, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3)
508 {
509     alSource3f(sid, param, value1, value2, value3);
510 }
511
512 ALvoid CDECL wine_alSourcefv(ALuint sid, ALenum param, const ALfloat* values)
513 {
514     alSourcefv(sid, param, values);
515 }
516
517 ALvoid CDECL wine_alSourcei(ALuint sid, ALenum param, ALint value)
518 {
519     alSourcei(sid, param, value);
520 }
521
522 ALvoid CDECL wine_alGetSourcef(ALuint sid, ALenum param, ALfloat* value)
523 {
524     alGetSourcef(sid, param, value);
525 }
526
527 ALvoid CDECL wine_alGetSource3f(ALuint sid, ALenum param, ALfloat* value1, ALfloat* value2, ALfloat* value3)
528 {
529     alGetSource3f(sid, param, value1, value2, value3);
530 }
531
532 ALvoid CDECL wine_alGetSourcefv(ALuint sid, ALenum param, ALfloat* values)
533 {
534     alGetSourcefv(sid, param, values);
535 }
536
537 ALvoid CDECL wine_alGetSourcei(ALuint sid, ALenum param, ALint* value)
538 {
539     alGetSourcei(sid, param, value);
540 }
541
542 ALvoid CDECL wine_alGetSourceiv(ALuint sid, ALenum param, ALint* values)
543 {
544     alGetSourceiv(sid, param, values);
545 }
546
547 ALvoid CDECL wine_alSourcePlayv(ALsizei ns, const ALuint *sids)
548 {
549     alSourcePlayv(ns, sids);
550 }
551
552 ALvoid CDECL wine_alSourceStopv(ALsizei ns, const ALuint *sids)
553 {
554     alSourceStopv(ns, sids);
555 }
556
557 ALvoid CDECL wine_alSourceRewindv(ALsizei ns, const ALuint *sids)
558 {
559     alSourceRewindv(ns, sids);
560 }
561
562 ALvoid CDECL wine_alSourcePausev(ALsizei ns, const ALuint *sids)
563 {
564     alSourcePausev(ns, sids);
565 }
566
567 ALvoid CDECL wine_alSourcePlay(ALuint sid)
568 {
569     alSourcePlay(sid);
570 }
571
572 ALvoid CDECL wine_alSourceStop(ALuint sid)
573 {
574     alSourceStop(sid);
575 }
576
577 ALvoid CDECL wine_alSourceRewind(ALuint sid)
578 {
579     alSourceRewind(sid);
580 }
581
582 ALvoid CDECL wine_alSourcePause(ALuint sid)
583 {
584     alSourcePause(sid);
585 }
586
587 ALvoid CDECL wine_alSourceQueueBuffers(ALuint sid, ALsizei numEntries, const ALuint *bids)
588 {
589     alSourceQueueBuffers(sid, numEntries, bids);
590 }
591
592 ALvoid CDECL wine_alSourceUnqueueBuffers(ALuint sid, ALsizei numEntries, ALuint *bids)
593 {
594     alSourceUnqueueBuffers(sid, numEntries, bids);
595 }
596
597 ALvoid CDECL wine_alGenBuffers(ALsizei n, ALuint* buffers)
598 {
599     alGenBuffers(n, buffers);
600 }
601
602 ALvoid CDECL wine_alDeleteBuffers(ALsizei n, const ALuint* buffers)
603 {
604     alDeleteBuffers(n, buffers);
605 }
606
607 ALboolean CDECL wine_alIsBuffer(ALuint bid)
608 {
609     return alIsBuffer(bid);
610 }
611
612 ALvoid CDECL wine_alBufferData(ALuint bid, ALenum format, const ALvoid* data, ALsizei size, ALsizei freq)
613 {
614     alBufferData(bid, format, data, size, freq);
615 }
616
617 ALvoid CDECL wine_alGetBufferf(ALuint bid, ALenum param, ALfloat* value)
618 {
619     alGetBufferf(bid, param, value);
620 }
621
622 ALvoid CDECL wine_alGetBufferfv(ALuint bid, ALenum param, ALfloat* values)
623 {
624     alGetBufferfv(bid, param, values);
625 }
626
627 ALvoid CDECL wine_alGetBufferi(ALuint bid, ALenum param, ALint* value)
628 {
629     alGetBufferi(bid, param, value);
630 }
631
632 ALvoid CDECL wine_alGetBufferiv(ALuint bid, ALenum param, ALint* values)
633 {
634     alGetBufferiv(bid, param, values);
635 }
636
637 ALvoid CDECL wine_alDopplerFactor(ALfloat value)
638 {
639     alDopplerFactor(value);
640 }
641
642 ALvoid CDECL wine_alDopplerVelocity(ALfloat value)
643 {
644     alDopplerVelocity(value);
645 }
646
647 ALvoid CDECL wine_alDistanceModel(ALenum distanceModel)
648 {
649     alDistanceModel(distanceModel);
650 }
651
652
653 /* OpenAL ALC 1.1 functions */
654 ALCdevice* CDECL wine_alcCaptureOpenDevice(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize)
655 {
656      return alcCaptureOpenDevice(devicename, frequency, format, buffersize);
657 }
658
659 ALCboolean CDECL wine_alcCaptureCloseDevice(ALCdevice *device)
660 {
661     return alcCaptureCloseDevice(device);
662 }
663
664 ALCvoid CDECL wine_alcCaptureStart(ALCdevice *device)
665 {
666     alcCaptureStart(device);
667 }
668
669 ALCvoid CDECL wine_alcCaptureStop(ALCdevice *device)
670 {
671     alcCaptureStop(device);
672 }
673
674 ALCvoid CDECL wine_alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples)
675 {
676     alcCaptureSamples(device, buffer, samples);
677 }
678
679 /* OpenAL 1.1 functions */
680 ALvoid CDECL wine_alListener3i(ALenum param, ALint value1, ALint value2, ALint value3)
681 {
682     alListener3i(param, value1, value2, value3);
683 }
684
685 ALvoid CDECL wine_alListeneriv(ALenum param, const ALint* values)
686 {
687     alListeneriv(param, values);
688 }
689
690 ALvoid CDECL wine_alGetListener3i(ALenum param, ALint *value1, ALint *value2, ALint *value3)
691 {
692     alGetListener3i(param, value1, value2, value3);
693 }
694
695 ALvoid CDECL wine_alSource3i(ALuint sid, ALenum param, ALint value1, ALint value2, ALint value3)
696 {
697     alSource3i(sid, param, value1, value2, value3);
698 }
699
700 ALvoid CDECL wine_alSourceiv(ALuint sid, ALenum param, const ALint* values)
701 {
702     alSourceiv(sid, param, values);
703 }
704
705 ALvoid CDECL wine_alGetSource3i(ALuint sid, ALenum param, ALint* value1, ALint* value2, ALint* value3)
706 {
707     alGetSource3i(sid, param, value1, value2, value3);
708 }
709
710 ALvoid CDECL wine_alBufferf(ALuint bid, ALenum param, ALfloat value)
711 {
712     alBufferf(bid, param, value);
713 }
714
715 ALvoid CDECL wine_alBuffer3f(ALuint bid, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3)
716 {
717     alBuffer3f(bid, param, value1, value2, value3);
718 }
719
720 ALvoid CDECL wine_alBufferfv(ALuint bid, ALenum param, const ALfloat* values)
721 {
722     alBufferfv(bid, param, values);
723 }
724
725 ALvoid CDECL wine_alBufferi(ALuint bid, ALenum param, ALint value)
726 {
727     alBufferi(bid, param, value);
728 }
729
730 ALvoid CDECL wine_alBuffer3i(ALuint bid, ALenum param, ALint value1, ALint value2, ALint value3)
731 {
732     alBuffer3i(bid, param, value1, value2, value3);
733 }
734
735 ALvoid CDECL wine_alBufferiv(ALuint bid, ALenum param, const ALint* values)
736 {
737     alBufferiv(bid, param, values);
738 }
739
740 ALvoid CDECL wine_alGetBuffer3f(ALuint bid, ALenum param, ALfloat* value1, ALfloat* value2, ALfloat* value3)
741 {
742     alGetBuffer3f(bid, param, value1, value2, value3);
743 }
744
745 ALvoid CDECL wine_alGetBuffer3i(ALuint bid, ALenum param, ALint* value1, ALint* value2, ALint* value3)
746 {
747     alGetBuffer3i(bid, param, value1, value2, value3);
748 }
749
750 ALvoid CDECL wine_alSpeedOfSound(ALfloat value)
751 {
752     alSpeedOfSound(value);
753 }
754
755 /* OpenAL EFX extension functions */
756 ALvoid CDECL wine_alGenFilters(ALsizei n, ALuint* filters)
757 {
758     CurrentCtx->alGenFilters(n, filters);
759 }
760
761 ALvoid CDECL wine_alDeleteFilters(ALsizei n, const ALuint* filters)
762 {
763     CurrentCtx->alDeleteFilters(n, filters);
764 }
765
766 ALboolean CDECL wine_alIsFilter(ALuint fid)
767 {
768     return CurrentCtx->alIsFilter(fid);
769 }
770
771 ALvoid CDECL wine_alFilterf(ALuint fid, ALenum param, ALfloat value)
772 {
773     CurrentCtx->alFilterf(fid, param, value);
774 }
775
776 ALvoid CDECL wine_alFilterfv(ALuint fid, ALenum param, const ALfloat* values)
777 {
778     CurrentCtx->alFilterfv(fid, param, values);
779 }
780
781 ALvoid CDECL wine_alFilteri(ALuint fid, ALenum param, ALint value)
782 {
783     CurrentCtx->alFilteri(fid, param, value);
784 }
785
786 ALvoid CDECL wine_alFilteriv(ALuint fid, ALenum param, const ALint* values)
787 {
788     CurrentCtx->alFilteriv(fid, param, values);
789 }
790
791 ALvoid CDECL wine_alGetFilterf(ALuint fid, ALenum param, ALfloat* value)
792 {
793     CurrentCtx->alGetFilterf(fid, param, value);
794 }
795
796 ALvoid CDECL wine_alGetFilterfv(ALuint fid, ALenum param, ALfloat* values)
797 {
798     CurrentCtx->alGetFilterfv(fid, param, values);
799 }
800
801 ALvoid CDECL wine_alGetFilteri(ALuint fid, ALenum param, ALint* value)
802 {
803     CurrentCtx->alGetFilteri(fid, param, value);
804 }
805
806 ALvoid CDECL wine_alGetFilteriv(ALuint fid, ALenum param, ALint* values)
807 {
808     CurrentCtx->alGetFilteriv(fid, param, values);
809 }
810
811
812 ALvoid CDECL wine_alGenEffects(ALsizei n, ALuint* effects)
813 {
814     CurrentCtx->alGenEffects(n, effects);
815 }
816
817 ALvoid CDECL wine_alDeleteEffects(ALsizei n, const ALuint* effects)
818 {
819     CurrentCtx->alDeleteEffects(n, effects);
820 }
821
822 ALboolean CDECL wine_alIsEffect(ALuint eid)
823 {
824     return CurrentCtx->alIsEffect(eid);
825 }
826
827 ALvoid CDECL wine_alEffectf(ALuint eid, ALenum param, ALfloat value)
828 {
829     CurrentCtx->alEffectf(eid, param, value);
830 }
831
832 ALvoid CDECL wine_alEffectfv(ALuint eid, ALenum param, const ALfloat* values)
833 {
834     CurrentCtx->alEffectfv(eid, param, values);
835 }
836
837 ALvoid CDECL wine_alEffecti(ALuint eid, ALenum param, ALint value)
838 {
839     CurrentCtx->alEffecti(eid, param, value);
840 }
841
842 ALvoid CDECL wine_alEffectiv(ALuint eid, ALenum param, const ALint* values)
843 {
844     CurrentCtx->alEffectiv(eid, param, values);
845 }
846
847 ALvoid CDECL wine_alGetEffectf(ALuint eid, ALenum param, ALfloat* value)
848 {
849     CurrentCtx->alGetEffectf(eid, param, value);
850 }
851
852 ALvoid CDECL wine_alGetEffectfv(ALuint eid, ALenum param, ALfloat* values)
853 {
854     CurrentCtx->alGetEffectfv(eid, param, values);
855 }
856
857 ALvoid CDECL wine_alGetEffecti(ALuint eid, ALenum param, ALint* value)
858 {
859     CurrentCtx->alGetEffecti(eid, param, value);
860 }
861
862 ALvoid CDECL wine_alGetEffectiv(ALuint eid, ALenum param, ALint* values)
863 {
864     CurrentCtx->alGetEffectiv(eid, param, values);
865 }
866
867
868 ALvoid CDECL wine_alGenAuxiliaryEffectSlots(ALsizei n, ALuint* slots)
869 {
870     CurrentCtx->alGenAuxiliaryEffectSlots(n, slots);
871 }
872
873 ALvoid CDECL wine_alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint* slots)
874 {
875     CurrentCtx->alDeleteAuxiliaryEffectSlots(n, slots);
876 }
877
878 ALboolean CDECL wine_alIsAuxiliaryEffectSlot(ALuint sid)
879 {
880     return CurrentCtx->alIsAuxiliaryEffectSlot(sid);
881 }
882
883 ALvoid CDECL wine_alAuxiliaryEffectSlotf(ALuint sid, ALenum param, ALfloat value)
884 {
885     CurrentCtx->alAuxiliaryEffectSlotf(sid, param, value);
886 }
887
888 ALvoid CDECL wine_alAuxiliaryEffectSlotfv(ALuint sid, ALenum param, const ALfloat* values)
889 {
890     CurrentCtx->alAuxiliaryEffectSlotfv(sid, param, values);
891 }
892
893 ALvoid CDECL wine_alAuxiliaryEffectSloti(ALuint sid, ALenum param, ALint value)
894 {
895     CurrentCtx->alAuxiliaryEffectSloti(sid, param, value);
896 }
897
898 ALvoid CDECL wine_alAuxiliaryEffectSlotiv(ALuint sid, ALenum param, const ALint* values)
899 {
900     CurrentCtx->alAuxiliaryEffectSlotiv(sid, param, values);
901 }
902
903 ALvoid CDECL wine_alGetAuxiliaryEffectSlotf(ALuint sid, ALenum param, ALfloat* value)
904 {
905     CurrentCtx->alGetAuxiliaryEffectSlotf(sid, param, value);
906 }
907
908 ALvoid CDECL wine_alGetAuxiliaryEffectSlotfv(ALuint sid, ALenum param, ALfloat* values)
909 {
910     CurrentCtx->alGetAuxiliaryEffectSlotfv(sid, param, values);
911 }
912
913 ALvoid CDECL wine_alGetAuxiliaryEffectSloti(ALuint sid, ALenum param, ALint* value)
914 {
915     CurrentCtx->alGetAuxiliaryEffectSloti(sid, param, value);
916 }
917
918 ALvoid CDECL wine_alGetAuxiliaryEffectSlotiv(ALuint sid, ALenum param, ALint* values)
919 {
920     CurrentCtx->alGetAuxiliaryEffectSlotiv(sid, param, values);
921 }
922
923
924 static const struct FuncList ALCFuncs[] = {
925     { "alcCreateContext",           wine_alcCreateContext        },
926     { "alcMakeContextCurrent",      wine_alcMakeContextCurrent   },
927     { "alcProcessContext",          wine_alcProcessContext       },
928     { "alcSuspendContext",          wine_alcSuspendContext       },
929     { "alcDestroyContext",          wine_alcDestroyContext       },
930     { "alcGetCurrentContext",       wine_alcGetCurrentContext    },
931     { "alcGetContextsDevice",       wine_alcGetContextsDevice    },
932     { "alcOpenDevice",              wine_alcOpenDevice           },
933     { "alcCloseDevice",             wine_alcCloseDevice          },
934     { "alcGetError",                wine_alcGetError             },
935     { "alcIsExtensionPresent",      wine_alcIsExtensionPresent   },
936     { "alcGetProcAddress",          wine_alcGetProcAddress       },
937     { "alcGetEnumValue",            wine_alcGetEnumValue         },
938     { "alcGetString",               wine_alcGetString            },
939     { "alcGetIntegerv",             wine_alcGetIntegerv          },
940     { "alcCaptureOpenDevice",       wine_alcCaptureOpenDevice    },
941     { "alcCaptureCloseDevice",      wine_alcCaptureCloseDevice   },
942     { "alcCaptureStart",            wine_alcCaptureStart         },
943     { "alcCaptureStop",             wine_alcCaptureStop          },
944     { "alcCaptureSamples",          wine_alcCaptureSamples       },
945     { NULL,                         NULL                         }
946 };
947 static const struct FuncList ALFuncs[] = {
948     { "alEnable",                   wine_alEnable                },
949     { "alDisable",                  wine_alDisable               },
950     { "alIsEnabled",                wine_alIsEnabled             },
951     { "alGetString",                wine_alGetString             },
952     { "alGetBooleanv",              wine_alGetBooleanv           },
953     { "alGetIntegerv",              wine_alGetIntegerv           },
954     { "alGetFloatv",                wine_alGetFloatv             },
955     { "alGetDoublev",               wine_alGetDoublev            },
956     { "alGetBoolean",               wine_alGetBoolean            },
957     { "alGetInteger",               wine_alGetInteger            },
958     { "alGetFloat",                 wine_alGetFloat              },
959     { "alGetDouble",                wine_alGetDouble             },
960     { "alGetError",                 wine_alGetError              },
961     { "alIsExtensionPresent",       wine_alIsExtensionPresent    },
962     { "alGetProcAddress",           wine_alGetProcAddress        },
963     { "alGetEnumValue",             wine_alGetEnumValue          },
964     { "alListenerf",                wine_alListenerf             },
965     { "alListener3f",               wine_alListener3f            },
966     { "alListenerfv",               wine_alListenerfv            },
967     { "alListeneri",                wine_alListeneri             },
968     { "alListener3i",               wine_alListener3i            },
969     { "alListeneriv",               wine_alListeneriv            },
970     { "alGetListenerf",             wine_alGetListenerf          },
971     { "alGetListener3f",            wine_alGetListener3f         },
972     { "alGetListenerfv",            wine_alGetListenerfv         },
973     { "alGetListeneri",             wine_alGetListeneri          },
974     { "alGetListener3i",            wine_alGetListener3i         },
975     { "alGetListeneriv",            wine_alGetListeneriv         },
976     { "alGenSources",               wine_alGenSources            },
977     { "alDeleteSources",            wine_alDeleteSources         },
978     { "alIsSource",                 wine_alIsSource              },
979     { "alSourcef",                  wine_alSourcef               },
980     { "alSource3f",                 wine_alSource3f              },
981     { "alSourcefv",                 wine_alSourcefv              },
982     { "alSourcei",                  wine_alSourcei               },
983     { "alSource3i",                 wine_alSource3i              },
984     { "alSourceiv",                 wine_alSourceiv              },
985     { "alGetSourcef",               wine_alGetSourcef            },
986     { "alGetSource3f",              wine_alGetSource3f           },
987     { "alGetSourcefv",              wine_alGetSourcefv           },
988     { "alGetSourcei",               wine_alGetSourcei            },
989     { "alGetSource3i",              wine_alGetSource3i           },
990     { "alGetSourceiv",              wine_alGetSourceiv           },
991     { "alSourcePlayv",              wine_alSourcePlayv           },
992     { "alSourceStopv",              wine_alSourceStopv           },
993     { "alSourceRewindv",            wine_alSourceRewindv         },
994     { "alSourcePausev",             wine_alSourcePausev          },
995     { "alSourcePlay",               wine_alSourcePlay            },
996     { "alSourceStop",               wine_alSourceStop            },
997     { "alSourceRewind",             wine_alSourceRewind          },
998     { "alSourcePause",              wine_alSourcePause           },
999     { "alSourceQueueBuffers",       wine_alSourceQueueBuffers    },
1000     { "alSourceUnqueueBuffers",     wine_alSourceUnqueueBuffers  },
1001     { "alGenBuffers",               wine_alGenBuffers            },
1002     { "alDeleteBuffers",            wine_alDeleteBuffers         },
1003     { "alIsBuffer",                 wine_alIsBuffer              },
1004     { "alBufferData",               wine_alBufferData            },
1005     { "alBufferf",                  wine_alBufferf               },
1006     { "alBuffer3f",                 wine_alBuffer3f              },
1007     { "alBufferfv",                 wine_alBufferfv              },
1008     { "alBufferi",                  wine_alBufferi               },
1009     { "alBuffer3i",                 wine_alBuffer3i              },
1010     { "alBufferiv",                 wine_alBufferiv              },
1011     { "alGetBufferf",               wine_alGetBufferf            },
1012     { "alGetBuffer3f",              wine_alGetBuffer3f           },
1013     { "alGetBufferfv",              wine_alGetBufferfv           },
1014     { "alGetBufferi",               wine_alGetBufferi            },
1015     { "alGetBuffer3i",              wine_alGetBuffer3i           },
1016     { "alGetBufferiv",              wine_alGetBufferiv           },
1017     { "alDopplerFactor",            wine_alDopplerFactor         },
1018     { "alDopplerVelocity",          wine_alDopplerVelocity       },
1019     { "alSpeedOfSound",             wine_alSpeedOfSound          },
1020     { "alDistanceModel",            wine_alDistanceModel         },
1021
1022     { "alGenFilters",               wine_alGenFilters            },
1023     { "alDeleteFilters",            wine_alDeleteFilters         },
1024     { "alIsFilter",                 wine_alIsFilter              },
1025     { "alFilterf",                  wine_alFilterf               },
1026     { "alFilterfv",                 wine_alFilterfv              },
1027     { "alFilteri",                  wine_alFilteri               },
1028     { "alFilteriv",                 wine_alFilteriv              },
1029     { "alGetFilterf",               wine_alGetFilterf            },
1030     { "alGetFilterfv",              wine_alGetFilterfv           },
1031     { "alGetFilteri",               wine_alGetFilteri            },
1032     { "alGetFilteriv",              wine_alGetFilteriv           },
1033
1034     { "alGenEffects",               wine_alGenEffects            },
1035     { "alDeleteEffects",            wine_alDeleteEffects         },
1036     { "alIsEffect",                 wine_alIsEffect              },
1037     { "alEffectf",                  wine_alEffectf               },
1038     { "alEffectfv",                 wine_alEffectfv              },
1039     { "alEffecti",                  wine_alEffecti               },
1040     { "alEffectiv",                 wine_alEffectiv              },
1041     { "alGetEffectf",               wine_alGetEffectf            },
1042     { "alGetEffectfv",              wine_alGetEffectfv           },
1043     { "alGetEffecti",               wine_alGetEffecti            },
1044     { "alGetEffectiv",              wine_alGetEffectiv           },
1045
1046     { "alGenAuxiliaryEffectSlots",  wine_alGenAuxiliaryEffectSlots},
1047     { "alDeleteAuxiliaryEffectSlots",wine_alDeleteAuxiliaryEffectSlots},
1048     { "alIsAuxiliaryEffectSlot",    wine_alIsAuxiliaryEffectSlot },
1049     { "alAuxiliaryEffectSlotf",     wine_alAuxiliaryEffectSlotf  },
1050     { "alAuxiliaryEffectSlotfv",    wine_alAuxiliaryEffectSlotfv },
1051     { "alAuxiliaryEffectSloti",     wine_alAuxiliaryEffectSloti  },
1052     { "alAuxiliaryEffectSlotiv",    wine_alAuxiliaryEffectSlotiv },
1053     { "alGetAuxiliaryEffectSlotf",  wine_alGetAuxiliaryEffectSlotf},
1054     { "alGetAuxiliaryEffectSlotfv", wine_alGetAuxiliaryEffectSlotfv},
1055     { "alGetAuxiliaryEffectSloti",  wine_alGetAuxiliaryEffectSloti},
1056     { "alGetAuxiliaryEffectSlotiv", wine_alGetAuxiliaryEffectSlotiv},
1057
1058     { NULL,                         NULL                         }
1059 };