-
Notifications
You must be signed in to change notification settings - Fork 0
/
alad.h
1351 lines (1306 loc) · 93.8 KB
/
alad.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* alad - a glad-like header-only C/C++ OpenAL-loader by Hypatia of Sva. Look for the current version at: https://github.com/hypatia-of-sva/alad
*
* Dependencies for compilation:
* - Kernel32.dll on Windows and -ldl on Unix for loading DLLs / shared libraries.
* - Current OpenAL header files; download here: https://github.com/kcat/openal-soft/tree/master/include
*
* Usage:
*
* Include this file once with
*
* #define ALAD_IMPLEMENTATION
*
* to define the functions and global function pointers, and include this file without this symbol defined in all other translation units.
*
* This header loads in all OpenAL symbols except the functions, by loading in the AL headers with AL_NO_PROTOTYPES and ALC_NO_PROTOTYPES defined.
* In order for this to work, you need up to date header files, download them from the master branch of openal-soft:
* https://github.com/kcat/openal-soft/tree/master/include
* (Currently to 1.23.1)
* alad can't currently check on whether or not the headers work properly, but compilation will fail due to undefined types.
* Keep that in mind if you have compilation issues and put those headers under <AL/alext.h> and <AL/efx-presets.h> (the others are included in alext.h).
*
* There are three interfaces to initialize the API, the (recommended) simplified interface, the manual interface for explicit function loading and the legacy manual interface.
*
*
*
* Simplified Interface (generally recommended):
*
* The simplified interface initializes the library first with
*
* aladLoadAL();
*
* which loads in all the core functions from the shared library. This should be enough to select a device and create a context. Once you've done that, call
*
* aladUpdateAL();
*
* which will load all extensions, except AL_EXT_direct_context, with the current context and its device. If an extension is not present, its functions will be NULL, check for that.
* The ALC functions are only valid for the current context's device (and technically the AL functions also for the context). If you change the device,
* call aladUpdateAL(); again. (If you make another context current, you can also do that, but most implementations of OpenAL will not differentiate
* between contexts on the same device for functionality, although it is allowed by the specification.)
*
* Once you're done using OpenAL, terminate the library with
*
* aladTerminate();
*
* this will unload the shared library.
* The library should be named
* - OpenAL32.dll / soft_oal.dll on Windows
* - libopenal.so.1 / libopenal.so on Linux/BSD
* - libopenal.1.dylib / libopenal.dylib on Mac OS.
* and should be on path for LoadLibraryA / dlopen.
*
*
*
* Manual Interface (only recommended for working with AL_EXT_direct_context):
*
* In this Interface, you will directly be working with function pointers, and you will have to provide the loader yourself. There are three struct types:
* aladALFunctions, aladALCFunctions and aladDirectFunctions, which provide members for al and alc functions except AL_EXT_direct_context, and for the pointers of
* AL_EXT_direct_context respectively, where for the first two the common prexix al and alc is missing. The functions are loaded by the following utility functions:
*
* typedef void (*aladFunction) (void);
* typedef aladFunction (*aladLoader) (const char *name);
* void aladLoadALCoreMinimal(aladALFunctions* functions, aladLoader loader);
* void aladLoadALCoreRest(aladALFunctions* functions, aladLoader loader);
* void aladLoadEFX(aladALFunctions* functions, aladLoader loader);
* void aladLoadALExtensions(aladALFunctions* functions, aladLoader loader);
* void aladLoadALCCore(aladALFunctions* functions, aladLoader loader);
* void aladLoadALCExtensions(aladALFunctions* functions, aladLoader loader);
* void aladLoadDirectExtension(aladDirectFunctions* functions, aladLoader loader);
*
* which together load all function pointers except alGetProcAddress and alcGetProcAddress (as the GetProcAddress member of aladALFunctions and aladALCFunctions respectively).
* These functions, unlike those of the legacy interface, can be intermixed with those loaded by the simplified interface. This means that one option is to first use the
* simplified interface to load the function pointers from the DLL, and then use these functions to optain explicit function pointers by functions like alcGetProcAddress2.
* The wrapping to get those functions to fir the aladLoader type, such as currying the device handle, is something that you will have to do yourself.
*
* You might also want to consider defining the macro ALAD_NO_SHORT_NAMES, this will then not define names such as alGetInteger. Instead, after the default intialization aladLoadAL();,
* you will have to call aladAL.GetInteger. However, this also means you can define these names yourself without the use of #undef.
*
*
*
* Legacy Manual interface (not recommended, description will not be updated):
*
* The manual interface initializes the function pointers first with
*
* aladLoadALFromLoaderFunction(NULL);
*
* for default initialization, or with
*
* aladLoadALFromLoaderFunction(my_alGetProcAddress);
*
* where my_alGetProcAddress is a loader function of type LPALGETPROCADDRESS for custom initalization, to load all the function via alGetProcAddress.
*
* Default initialization will pull in OpenAL32.dll / soft_oal.dll on Windows or libopenal.so.1 / libopenal.so on Unix respectively,
* and libopenal.1.dylib / libopenal.dylib on Mac OS (yet untested).
* Make sure one of these dynamic libraries are on path for LoadLibraryA / dlopen, change the code below in alad_open_ or provide your own function loader.
* The shared library will only be loaded once, you can call "aladLoadALFromLoaderFunction(NULL)" as often as you want
* to reload the pointers from the loaded shared library.
*
* If you're unsure about loading with a function loader, intialize with
*
* aladLoadALContextFree(AL_FALSE);
*
* to load function pointers directly from the shared library. This only works for default initialization.
* This will however not load all function pointers, but only those necessary to create a context.
* Those are the core ALC functions and all Core AL functions not relating to buffers, listeners, sources,
* and also not alDopplerFactor, alDopplerVelocity, alSpeedOfSound and alDistanceModel.
* However, if you change the parameter to anything else (like AL_TRUE), all core AL and ALC functions will be loaded from the shared library.
*
* If you want to use your own library, not available in default initialization, and want to load directly from it, you need to write a wrapper of type
* LPALGETPROCADDRESS of the form my_alGetProcAddress("[al-function]") = dlsym(my_lib, "[al-function]"). aladLoadALContextFree is not used here.
*
* These aladLoad functions only initialize the Core API. To load the extensions you have to update the function pointers.
*
* You can update those via the ALCcontext* context through
*
* aladUpdateALPointers(context, AL_FALSE);
* aladUpdateALCPointersFromContext(context, AL_FALSE);
*
* which will load all AL and ALC functions, including extensions, via alGetProcAddress for the specific context
* by switching the current context temporarily. It will just use the current context, if the parameter is NULL.
* If you replace AL_FALSE with anything else (AL_TRUE makes the most sense) this will only load the extensions,
* and the core function pointers will remain unchanged
*
* Update ALC pointers to those loaded with a specific ALCdevice* device with
*
* aladUpdateALCPointersFromDevice(device, AL_FALSE);
*
* If you want to remove this reference to the device, reload them to the nonspecific pointers by calling "aladUpdateALCPointersFromContext" again.
* or by calling "aladLoadALContextFree()" if you need them without reference to any context.
* Calling "aladLoadALFromLoaderFunction" again won't do anything different from "aladUpdateALCPointersFromContext",
* since both call alGetProcAddress and are therefore just dependent on driver state.
* The last parameter again makes sure to reload the core, change the value to disable that.
*
* Unload the library loaded with default initalization with
*
* aladTerminate();
*
* This will not unload the function pointers or set them to NULL, but they will be probably invalid after unloading the shared library.
*
*
* alad will attempt to load all function pointers in all extensions as currently described in the openal-soft headers
* (repo version from 24.12.2022, commit https://github.com/kcat/openal-soft/commit/4fe6eba8c79a4c9cad91d6f6835506cde96a48c4),
* the ones not available will be NULL, you have to check all functions you want to use for that. you have to check all functions you want to use for that.
* The ALC_INVALID_VALUE-Error-State of alcGetProcAddress is not being checked.
* If a functionality you expect to be present isn't working, you might want to check the spelling of the
* strings in the internal alad_load_alc_functions_ function.
*
*/
#pragma once
/* only include alad if the OpenAL headers are not used, because we include them again, and they may have been included with prototypes */
#if !(defined(ALAD_H)) && !(defined(AL_AL_H)) && !(defined(AL_ALC_H)) && !(defined(AL_ALEXT_H)) && !(defined(AL_EFX_H)) && !(defined(EFX_PRESETS_H))
#define ALAD_H
/* revision date */
#define ALAD_HEADER_REVISION 0x20240503
#ifndef __cplusplus
#ifndef nullptr
#define nullptr NULL
#endif
#endif
#ifdef __cplusplus
#define REINTERPRET_CAST(X,Y) reinterpret_cast<X>(Y)
#else
#define REINTERPRET_CAST(X,Y) ((X) Y)
#endif
#if defined(__cplusplus)
extern "C" {
#endif
#define AL_NO_PROTOTYPES
#define ALC_NO_PROTOTYPES
#include <AL/alext.h>
#include <AL/efx-presets.h>
/* currently it can't be checked whether or not the headers work properly. the old prototypes will be shadowed if present */
/* function definitions, referring to the new manual interface view of the simiplified and old manual interface */
#ifndef ALAD_NO_SHORT_NAMES
/* Core AL */
#define alDopplerFactor aladAL.DopplerFactor
#define alDopplerVelocity aladAL.DopplerVelocity
#define alSpeedOfSound aladAL.SpeedOfSound
#define alDistanceModel aladAL.DistanceModel
#define alEnable aladAL.Enable
#define alDisable aladAL.Disable
#define alIsEnabled aladAL.IsEnabled
#define alGetString aladAL.GetString
#define alGetBooleanv aladAL.GetBooleanv
#define alGetIntegerv aladAL.GetIntegerv
#define alGetFloatv aladAL.GetFloatv
#define alGetDoublev aladAL.GetDoublev
#define alGetBoolean aladAL.GetBoolean
#define alGetInteger aladAL.GetInteger
#define alGetFloat aladAL.GetFloat
#define alGetDouble aladAL.GetDouble
#define alGetError aladAL.GetError
#define alIsExtensionPresent aladAL.IsExtensionPresent
#define alGetProcAddress aladAL.GetProcAddress
#define alGetEnumValue aladAL.GetEnumValue
#define alListenerf aladAL.Listenerf
#define alListener3f aladAL.Listener3f
#define alListenerfv aladAL.Listenerfv
#define alListeneri aladAL.Listeneri
#define alListener3i aladAL.Listener3i
#define alListeneriv aladAL.Listeneriv
#define alGetListenerf aladAL.GetListenerf
#define alGetListener3f aladAL.GetListener3f
#define alGetListenerfv aladAL.GetListenerfv
#define alGetListeneri aladAL.GetListeneri
#define alGetListener3i aladAL.GetListener3i
#define alGetListeneriv aladAL.GetListeneriv
#define alGenSources aladAL.GenSources
#define alDeleteSources aladAL.DeleteSources
#define alIsSource aladAL.IsSource
#define alSourcef aladAL.Sourcef
#define alSource3f aladAL.Source3f
#define alSourcefv aladAL.Sourcefv
#define alSourcei aladAL.Sourcei
#define alSource3i aladAL.Source3i
#define alSourceiv aladAL.Sourceiv
#define alGetSourcef aladAL.GetSourcef
#define alGetSource3f aladAL.GetSource3f
#define alGetSourcefv aladAL.GetSourcefv
#define alGetSourcei aladAL.GetSourcei
#define alGetSource3i aladAL.GetSource3i
#define alGetSourceiv aladAL.GetSourceiv
#define alSourcePlayv aladAL.SourcePlayv
#define alSourceStopv aladAL.SourceStopv
#define alSourceRewindv aladAL.SourceRewindv
#define alSourcePausev aladAL.SourcePausev
#define alSourcePlay aladAL.SourcePlay
#define alSourceStop aladAL.SourceStop
#define alSourceRewind aladAL.SourceRewind
#define alSourcePause aladAL.SourcePause
#define alSourceQueueBuffers aladAL.SourceQueueBuffers
#define alSourceUnqueueBuffers aladAL.SourceUnqueueBuffers
#define alGenBuffers aladAL.GenBuffers
#define alDeleteBuffers aladAL.DeleteBuffers
#define alIsBuffer aladAL.IsBuffer
#define alBufferData aladAL.BufferData
#define alBufferf aladAL.Bufferf
#define alBuffer3f aladAL.Buffer3f
#define alBufferfv aladAL.Bufferfv
#define alBufferi aladAL.Bufferi
#define alBuffer3i aladAL.Buffer3i
#define alBufferiv aladAL.Bufferiv
#define alGetBufferf aladAL.GetBufferf
#define alGetBuffer3f aladAL.GetBuffer3f
#define alGetBufferfv aladAL.GetBufferfv
#define alGetBufferi aladAL.GetBufferi
#define alGetBuffer3i aladAL.GetBuffer3i
#define alGetBufferiv aladAL.GetBufferiv
/* EFX */
#define alGenEffects aladAL.GenEffects
#define alDeleteEffects aladAL.DeleteEffects
#define alIsEffect aladAL.IsEffect
#define alEffecti aladAL.Effecti
#define alEffectiv aladAL.Effectiv
#define alEffectf aladAL.Effectf
#define alEffectfv aladAL.Effectfv
#define alGetEffecti aladAL.GetEffecti
#define alGetEffectiv aladAL.GetEffectiv
#define alGetEffectf aladAL.GetEffectf
#define alGetEffectfv aladAL.GetEffectfv
#define alGenFilters aladAL.GenFilters
#define alDeleteFilters aladAL.DeleteFilters
#define alIsFilter aladAL.IsFilter
#define alFilteri aladAL.Filteri
#define alFilteriv aladAL.Filteriv
#define alFilterf aladAL.Filterf
#define alFilterfv aladAL.Filterfv
#define alGetFilteri aladAL.GetFilteri
#define alGetFilteriv aladAL.GetFilteriv
#define alGetFilterf aladAL.GetFilterf
#define alGetFilterfv aladAL.GetFilterfv
#define alGenAuxiliaryEffectSlots aladAL.GenAuxiliaryEffectSlots
#define alDeleteAuxiliaryEffectSlots aladAL.DeleteAuxiliaryEffectSlots
#define alIsAuxiliaryEffectSlot aladAL.IsAuxiliaryEffectSlot
#define alAuxiliaryEffectSloti aladAL.AuxiliaryEffectSloti
#define alAuxiliaryEffectSlotiv aladAL.AuxiliaryEffectSlotiv
#define alAuxiliaryEffectSlotf aladAL.AuxiliaryEffectSlotf
#define alAuxiliaryEffectSlotfv aladAL.AuxiliaryEffectSlotfv
#define alGetAuxiliaryEffectSloti aladAL.GetAuxiliaryEffectSloti
#define alGetAuxiliaryEffectSlotiv aladAL.GetAuxiliaryEffectSlotiv
#define alGetAuxiliaryEffectSlotf aladAL.GetAuxiliaryEffectSlotf
#define alGetAuxiliaryEffectSlotfv aladAL.GetAuxiliaryEffectSlotfv
/* AL extensions */
/* AL_EXT_STATIC_BUFFER */
#define alBufferDataStatic aladAL.BufferDataStatic
/* AL_SOFT_buffer_sub_data */
#define alBufferSubDataSOFT aladAL.BufferSubDataSOFT
/* AL_EXT_FOLDBACK */
#define alRequestFoldbackStart aladAL.RequestFoldbackStart
#define alRequestFoldbackStop aladAL.RequestFoldbackStop
/* AL_SOFT_buffer_samples */
#define alBufferSamplesSOFT aladAL.BufferSamplesSOFT
#define alBufferSubSamplesSOFT aladAL.BufferSubSamplesSOFT
#define alGetBufferSamplesSOFT aladAL.GetBufferSamplesSOFT
#define alIsBufferFormatSupportedSOFT aladAL.IsBufferFormatSupportedSOFT
/* AL_SOFT_source_latency */
#define alSourcedSOFT aladAL.SourcedSOFT
#define alSource3dSOFT aladAL.Source3dSOFT
#define alSourcedvSOFT aladAL.SourcedvSOFT
#define alGetSourcedSOFT aladAL.GetSourcedSOFT
#define alGetSource3dSOFT aladAL.GetSource3dSOFT
#define alGetSourcedvSOFT aladAL.GetSourcedvSOFT
#define alSourcei64SOFT aladAL.Sourcei64SOFT
#define alSource3i64SOFT aladAL.Source3i64SOFT
#define alSourcei64vSOFT aladAL.Sourcei64vSOFT
#define alGetSourcei64SOFT aladAL.GetSourcei64SOFT
#define alGetSource3i64SOFT aladAL.GetSource3i64SOFT
#define alGetSourcei64vSOFT aladAL.GetSourcei64vSOFT
/* AL_SOFT_deferred_updates */
#define alDeferUpdatesSOFT aladAL.DeferUpdatesSOFT
#define alProcessUpdatesSOFT aladAL.ProcessUpdatesSOFT
/* AL_SOFT_source_resampler */
#define alGetStringiSOFT aladAL.GetStringiSOFT
/* AL_SOFT_events */
#define alEventControlSOFT aladAL.EventControlSOFT
#define alEventCallbackSOFT aladAL.EventCallbackSOFT
#define alGetPointerSOFT aladAL.GetPointerSOFT
#define alGetPointervSOFT aladAL.GetPointervSOFT
/* AL_SOFT_callback_buffer */
#define alBufferCallbackSOFT aladAL.BufferCallbackSOFT
#define alGetBufferPtrSOFT aladAL.GetBufferPtrSOFT
#define alGetBuffer3PtrSOFT aladAL.GetBuffer3PtrSOFT
#define alGetBufferPtrvSOFT aladAL.GetBufferPtrvSOFT
/* AL_SOFT_source_start_delay */
#define alSourcePlayAtTimeSOFT aladAL.SourcePlayAtTimeSOFT
#define alSourcePlayAtTimevSOFT aladAL.SourcePlayAtTimevSOFT
/* AL_EXT_debug */
#define alDebugMessageCallbackEXT aladAL.DebugMessageCallbackEXT;
#define alDebugMessageInsertEXT aladAL.DebugMessageInsertEXT;
#define alDebugMessageControlEXT aladAL.DebugMessageControlEXT;
#define alPushDebugGroupEXT aladAL.PushDebugGroupEXT;
#define alPopDebugGroupEXT aladAL.PopDebugGroupEXT;
#define alGetDebugMessageLogEXT aladAL.GetDebugMessageLogEXT;
#define alObjectLabelEXT aladAL.ObjectLabelEXT;
#define alGetObjectLabelEXT aladAL.GetObjectLabelEXT;
/* Core ALC */
#define alcCreateContext aladALC.CreateContext
#define alcMakeContextCurrent aladALC.MakeContextCurrent
#define alcProcessContext aladALC.ProcessContext
#define alcSuspendContext aladALC.SuspendContext
#define alcDestroyContext aladALC.DestroyContext
#define alcGetCurrentContext aladALC.GetCurrentContext
#define alcGetContextsDevice aladALC.GetContextsDevice
#define alcOpenDevice aladALC.OpenDevice
#define alcCloseDevice aladALC.CloseDevice
#define alcGetError aladALC.GetError
#define alcIsExtensionPresent aladALC.IsExtensionPresent
#define alcGetProcAddress aladALC.GetProcAddress
#define alcGetEnumValue aladALC.GetEnumValue
#define alcGetString aladALC.GetString
#define alcGetIntegerv aladALC.GetIntegerv
#define alcCaptureOpenDevice aladALC.CaptureOpenDevice
#define alcCaptureCloseDevice aladALC.CaptureCloseDevice
#define alcCaptureStart aladALC.CaptureStart
#define alcCaptureStop aladALC.CaptureStop
#define alcCaptureSamples aladALC.CaptureSamples
/* ALC extensions */
/* ALC_EXT_thread_local_context */
#define alcSetThreadContext aladALC.SetThreadContext
#define alcGetThreadContext aladALC.GetThreadContext
/* ALC_SOFT_loopback */
#define alcLoopbackOpenDeviceSOFT aladALC.LoopbackOpenDeviceSOFT
#define alcIsRenderFormatSupportedSOFT aladALC.IsRenderFormatSupportedSOFT
#define alcRenderSamplesSOFT aladALC.RenderSamplesSOFT
/* ALC_SOFT_pause_device */
#define alcDevicePauseSOFT aladALC.DevicePauseSOFT
#define alcDeviceResumeSOFT aladALC.DeviceResumeSOFT
/* ALC_SOFT_HRTF */
#define alcGetStringiSOFT aladALC.GetStringiSOFT
#define alcResetDeviceSOFT aladALC.ResetDeviceSOFT
/* ALC_SOFT_device_clock */
#define alcGetInteger64vSOFT aladALC.GetInteger64vSOFT
/* ALC_SOFT_reopen_device */
#define alcReopenDeviceSOFT aladALC.ReopenDeviceSOFT
/* ALC_SOFT_system_events */
#define alcEventIsSupportedSOFT aladALC.EventIsSupportedSOFT;
#define alcEventControlSOFT aladALC.EventControlSOFT;
#define alcEventCallbackSOFT aladALC.EventCallbackSOFT;
#endif
/* Public Interface: */
/* simplified Interface */
extern void aladLoadAL();
extern void aladUpdateAL();
extern void aladTerminate();
/* old manual interface */
extern void aladLoadALContextFree (ALboolean loadAll);
extern void aladLoadALFromLoaderFunction (LPALGETPROCADDRESS inital_loader);
extern void aladUpdateALPointers (ALCcontext *context, ALboolean extensionsOnly);
extern void aladUpdateALCPointersFromContext (ALCcontext *context, ALboolean extensionsOnly);
extern void aladUpdateALCPointersFromDevice (ALCdevice *device, ALboolean extensionsOnly);
/* new manual interface */
typedef void (*aladFunction) (void);
typedef aladFunction (*aladLoader) (const char *name);
typedef struct aladALFunctions {
/* Function Loader */
LPALGETPROCADDRESS GetProcAddress;
/* Minimal Core AL */
LPALENABLE Enable;
LPALDISABLE Disable;
LPALISENABLED IsEnabled;
LPALGETSTRING GetString;
LPALGETBOOLEANV GetBooleanv;
LPALGETINTEGERV GetIntegerv;
LPALGETFLOATV GetFloatv;
LPALGETDOUBLEV GetDoublev;
LPALGETBOOLEAN GetBoolean;
LPALGETINTEGER GetInteger;
LPALGETFLOAT GetFloat;
LPALGETDOUBLE GetDouble;
LPALGETERROR GetError;
LPALISEXTENSIONPRESENT IsExtensionPresent;
LPALGETENUMVALUE GetEnumValue;
/* Rest of Core AL */
LPALDOPPLERFACTOR DopplerFactor;
LPALDOPPLERVELOCITY DopplerVelocity;
LPALSPEEDOFSOUND SpeedOfSound;
LPALDISTANCEMODEL DistanceModel;
LPALLISTENERF Listenerf;
LPALLISTENER3F Listener3f;
LPALLISTENERFV Listenerfv;
LPALLISTENERI Listeneri;
LPALLISTENER3I Listener3i;
LPALLISTENERIV Listeneriv;
LPALGETLISTENERF GetListenerf;
LPALGETLISTENER3F GetListener3f;
LPALGETLISTENERFV GetListenerfv;
LPALGETLISTENERI GetListeneri;
LPALGETLISTENER3I GetListener3i;
LPALGETLISTENERIV GetListeneriv;
LPALGENSOURCES GenSources;
LPALDELETESOURCES DeleteSources;
LPALISSOURCE IsSource;
LPALSOURCEF Sourcef;
LPALSOURCE3F Source3f;
LPALSOURCEFV Sourcefv;
LPALSOURCEI Sourcei;
LPALSOURCE3I Source3i;
LPALSOURCEIV Sourceiv;
LPALGETSOURCEF GetSourcef;
LPALGETSOURCE3F GetSource3f;
LPALGETSOURCEFV GetSourcefv;
LPALGETSOURCEI GetSourcei;
LPALGETSOURCE3I GetSource3i;
LPALGETSOURCEIV GetSourceiv;
LPALSOURCEPLAYV SourcePlayv;
LPALSOURCESTOPV SourceStopv;
LPALSOURCEREWINDV SourceRewindv;
LPALSOURCEPAUSEV SourcePausev;
LPALSOURCEPLAY SourcePlay;
LPALSOURCESTOP SourceStop;
LPALSOURCEREWIND SourceRewind;
LPALSOURCEPAUSE SourcePause;
LPALSOURCEQUEUEBUFFERS SourceQueueBuffers;
LPALSOURCEUNQUEUEBUFFERS SourceUnqueueBuffers;
LPALGENBUFFERS GenBuffers;
LPALDELETEBUFFERS DeleteBuffers;
LPALISBUFFER IsBuffer;
LPALBUFFERDATA BufferData;
LPALBUFFERF Bufferf;
LPALBUFFER3F Buffer3f;
LPALBUFFERFV Bufferfv;
LPALBUFFERI Bufferi;
LPALBUFFER3I Buffer3i;
LPALBUFFERIV Bufferiv;
LPALGETBUFFERF GetBufferf;
LPALGETBUFFER3F GetBuffer3f;
LPALGETBUFFERFV GetBufferfv;
LPALGETBUFFERI GetBufferi;
LPALGETBUFFER3I GetBuffer3i;
LPALGETBUFFERIV GetBufferiv;
/* EFX */
LPALGENEFFECTS GenEffects;
LPALDELETEEFFECTS DeleteEffects;
LPALISEFFECT IsEffect;
LPALEFFECTI Effecti;
LPALEFFECTIV Effectiv;
LPALEFFECTF Effectf;
LPALEFFECTFV Effectfv;
LPALGETEFFECTI GetEffecti;
LPALGETEFFECTIV GetEffectiv;
LPALGETEFFECTF GetEffectf;
LPALGETEFFECTFV GetEffectfv;
LPALGENFILTERS GenFilters;
LPALDELETEFILTERS DeleteFilters;
LPALISFILTER IsFilter;
LPALFILTERI Filteri;
LPALFILTERIV Filteriv;
LPALFILTERF Filterf;
LPALFILTERFV Filterfv;
LPALGETFILTERI GetFilteri;
LPALGETFILTERIV GetFilteriv;
LPALGETFILTERF GetFilterf;
LPALGETFILTERFV GetFilterfv;
LPALGENAUXILIARYEFFECTSLOTS GenAuxiliaryEffectSlots;
LPALDELETEAUXILIARYEFFECTSLOTS DeleteAuxiliaryEffectSlots;
LPALISAUXILIARYEFFECTSLOT IsAuxiliaryEffectSlot;
LPALAUXILIARYEFFECTSLOTI AuxiliaryEffectSloti;
LPALAUXILIARYEFFECTSLOTIV AuxiliaryEffectSlotiv;
LPALAUXILIARYEFFECTSLOTF AuxiliaryEffectSlotf;
LPALAUXILIARYEFFECTSLOTFV AuxiliaryEffectSlotfv;
LPALGETAUXILIARYEFFECTSLOTI GetAuxiliaryEffectSloti;
LPALGETAUXILIARYEFFECTSLOTIV GetAuxiliaryEffectSlotiv;
LPALGETAUXILIARYEFFECTSLOTF GetAuxiliaryEffectSlotf;
LPALGETAUXILIARYEFFECTSLOTFV GetAuxiliaryEffectSlotfv;
/* AL extensions */
/* AL_EXT_STATIC_BUFFER */
PFNALBUFFERDATASTATICPROC BufferDataStatic;
/* AL_SOFT_buffer_sub_data */
PFNALBUFFERSUBDATASOFTPROC BufferSubDataSOFT;
/* AL_EXT_FOLDBACK */
LPALREQUESTFOLDBACKSTART RequestFoldbackStart;
LPALREQUESTFOLDBACKSTOP RequestFoldbackStop;
/* AL_SOFT_buffer_samples */
LPALBUFFERSAMPLESSOFT BufferSamplesSOFT;
LPALBUFFERSUBSAMPLESSOFT BufferSubSamplesSOFT;
LPALGETBUFFERSAMPLESSOFT GetBufferSamplesSOFT;
LPALISBUFFERFORMATSUPPORTEDSOFT IsBufferFormatSupportedSOFT;
/* AL_SOFT_source_latency */
LPALSOURCEDSOFT SourcedSOFT;
LPALSOURCE3DSOFT Source3dSOFT;
LPALSOURCEDVSOFT SourcedvSOFT;
LPALGETSOURCEDSOFT GetSourcedSOFT;
LPALGETSOURCE3DSOFT GetSource3dSOFT;
LPALGETSOURCEDVSOFT GetSourcedvSOFT;
LPALSOURCEI64SOFT Sourcei64SOFT;
LPALSOURCE3I64SOFT Source3i64SOFT;
LPALSOURCEI64VSOFT Sourcei64vSOFT;
LPALGETSOURCEI64SOFT GetSourcei64SOFT;
LPALGETSOURCE3I64SOFT GetSource3i64SOFT;
LPALGETSOURCEI64VSOFT GetSourcei64vSOFT;
/* AL_SOFT_deferred_updates */
LPALDEFERUPDATESSOFT DeferUpdatesSOFT;
LPALPROCESSUPDATESSOFT ProcessUpdatesSOFT;
/* AL_SOFT_source_resampler */
LPALGETSTRINGISOFT GetStringiSOFT;
/* AL_SOFT_events */
LPALEVENTCONTROLSOFT EventControlSOFT;
LPALEVENTCALLBACKSOFT EventCallbackSOFT;
LPALGETPOINTERSOFT GetPointerSOFT;
LPALGETPOINTERVSOFT GetPointervSOFT;
/* AL_SOFT_callback_buffer */
LPALBUFFERCALLBACKSOFT BufferCallbackSOFT;
LPALGETBUFFERPTRSOFT GetBufferPtrSOFT;
LPALGETBUFFER3PTRSOFT GetBuffer3PtrSOFT;
LPALGETBUFFERPTRVSOFT GetBufferPtrvSOFT;
/* AL_SOFT_source_start_delay */
LPALSOURCEPLAYATTIMESOFT SourcePlayAtTimeSOFT;
LPALSOURCEPLAYATTIMEVSOFT SourcePlayAtTimevSOFT;
/* AL_EXT_debug */
LPALDEBUGMESSAGECALLBACKEXT DebugMessageCallbackEXT;
LPALDEBUGMESSAGEINSERTEXT DebugMessageInsertEXT;
LPALDEBUGMESSAGECONTROLEXT DebugMessageControlEXT;
LPALPUSHDEBUGGROUPEXT PushDebugGroupEXT;
LPALPOPDEBUGGROUPEXT PopDebugGroupEXT;
LPALGETDEBUGMESSAGELOGEXT GetDebugMessageLogEXT;
LPALOBJECTLABELEXT ObjectLabelEXT;
LPALGETOBJECTLABELEXT GetObjectLabelEXT;
} aladALFunctions;
typedef struct aladALCFunctions {
/* Function Loader */
LPALCGETPROCADDRESS GetProcAddress;
/* Rest of Core ALC */
LPALCCREATECONTEXT CreateContext;
LPALCMAKECONTEXTCURRENT MakeContextCurrent;
LPALCPROCESSCONTEXT ProcessContext;
LPALCSUSPENDCONTEXT SuspendContext;
LPALCDESTROYCONTEXT DestroyContext;
LPALCGETCURRENTCONTEXT GetCurrentContext;
LPALCGETCONTEXTSDEVICE GetContextsDevice;
LPALCOPENDEVICE OpenDevice;
LPALCCLOSEDEVICE CloseDevice;
LPALCGETERROR GetError;
LPALCISEXTENSIONPRESENT IsExtensionPresent;
LPALCGETENUMVALUE GetEnumValue;
LPALCGETSTRING GetString;
LPALCGETINTEGERV GetIntegerv;
LPALCCAPTUREOPENDEVICE CaptureOpenDevice;
LPALCCAPTURECLOSEDEVICE CaptureCloseDevice;
LPALCCAPTURESTART CaptureStart;
LPALCCAPTURESTOP CaptureStop;
LPALCCAPTURESAMPLES CaptureSamples;
/* ALC extensions */
/* ALC_EXT_thread_local_context */
PFNALCSETTHREADCONTEXTPROC SetThreadContext;
PFNALCGETTHREADCONTEXTPROC GetThreadContext;
/* ALC_SOFT_loopback */
LPALCLOOPBACKOPENDEVICESOFT LoopbackOpenDeviceSOFT;
LPALCISRENDERFORMATSUPPORTEDSOFT IsRenderFormatSupportedSOFT;
LPALCRENDERSAMPLESSOFT RenderSamplesSOFT;
/* ALC_SOFT_pause_device */
LPALCDEVICEPAUSESOFT DevicePauseSOFT;
LPALCDEVICERESUMESOFT DeviceResumeSOFT;
/* ALC_SOFT_HRTF */
LPALCGETSTRINGISOFT GetStringiSOFT;
LPALCRESETDEVICESOFT ResetDeviceSOFT;
/* ALC_SOFT_device_clock */
LPALCGETINTEGER64VSOFT GetInteger64vSOFT;
/* ALC_SOFT_reopen_device */
LPALCREOPENDEVICESOFT ReopenDeviceSOFT;
/* ALC_SOFT_system_events */
LPALCEVENTISSUPPORTEDSOFT EventIsSupportedSOFT;
LPALCEVENTCONTROLSOFT EventControlSOFT;
LPALCEVENTCALLBACKSOFT EventCallbackSOFT;
} aladALCFunctions;
typedef struct aladDirectFunctions {
/* AL_EXT_direct_context */
LPALCGETPROCADDRESS2 alcGetProcAddress2;
LPALENABLEDIRECT alEnableDirect;
LPALDISABLEDIRECT alDisableDirect;
LPALISENABLEDDIRECT alIsEnabledDirect;
LPALDOPPLERFACTORDIRECT alDopplerFactorDirect;
LPALSPEEDOFSOUNDDIRECT alSpeedOfSoundDirect;
LPALDISTANCEMODELDIRECT alDistanceModelDirect;
LPALGETSTRINGDIRECT alGetStringDirect;
LPALGETBOOLEANVDIRECT alGetBooleanvDirect;
LPALGETINTEGERVDIRECT alGetIntegervDirect;
LPALGETFLOATVDIRECT alGetFloatvDirect;
LPALGETDOUBLEVDIRECT alGetDoublevDirect;
LPALGETBOOLEANDIRECT alGetBooleanDirect;
LPALGETINTEGERDIRECT alGetIntegerDirect;
LPALGETFLOATDIRECT alGetFloatDirect;
LPALGETDOUBLEDIRECT alGetDoubleDirect;
LPALGETERRORDIRECT alGetErrorDirect;
LPALISEXTENSIONPRESENTDIRECT alIsExtensionPresentDirect;
LPALGETPROCADDRESSDIRECT alGetProcAddressDirect;
LPALGETENUMVALUEDIRECT alGetEnumValueDirect;
LPALLISTENERFDIRECT alListenerfDirect;
LPALLISTENER3FDIRECT alListener3fDirect;
LPALLISTENERFVDIRECT alListenerfvDirect;
LPALLISTENERIDIRECT alListeneriDirect;
LPALLISTENER3IDIRECT alListener3iDirect;
LPALLISTENERIVDIRECT alListenerivDirect;
LPALGETLISTENERFDIRECT alGetListenerfDirect;
LPALGETLISTENER3FDIRECT alGetListener3fDirect;
LPALGETLISTENERFVDIRECT alGetListenerfvDirect;
LPALGETLISTENERIDIRECT alGetListeneriDirect;
LPALGETLISTENER3IDIRECT alGetListener3iDirect;
LPALGETLISTENERIVDIRECT alGetListenerivDirect;
LPALGENSOURCESDIRECT alGenSourcesDirect;
LPALDELETESOURCESDIRECT alDeleteSourcesDirect;
LPALISSOURCEDIRECT alIsSourceDirect;
LPALSOURCEFDIRECT alSourcefDirect;
LPALSOURCE3FDIRECT alSource3fDirect;
LPALSOURCEFVDIRECT alSourcefvDirect;
LPALSOURCEIDIRECT alSourceiDirect;
LPALSOURCE3IDIRECT alSource3iDirect;
LPALSOURCEIVDIRECT alSourceivDirect;
LPALGETSOURCEFDIRECT alGetSourcefDirect;
LPALGETSOURCE3FDIRECT alGetSource3fDirect;
LPALGETSOURCEFVDIRECT alGetSourcefvDirect;
LPALGETSOURCEIDIRECT alGetSourceiDirect;
LPALGETSOURCE3IDIRECT alGetSource3iDirect;
LPALGETSOURCEIVDIRECT alGetSourceivDirect;
LPALSOURCEPLAYVDIRECT alSourcePlayDirect;
LPALSOURCESTOPVDIRECT alSourceStopDirect;
LPALSOURCEREWINDVDIRECT alSourceRewindvDirect;
LPALSOURCEPAUSEVDIRECT alSourcePausevDirect;
LPALSOURCEPLAYDIRECT alSourcePlayvDirect;
LPALSOURCESTOPDIRECT alSourceStopvDirect;
LPALSOURCEREWINDDIRECT alSourceRewindDirect;
LPALSOURCEPAUSEDIRECT alSourcePauseDirect;
LPALSOURCEQUEUEBUFFERSDIRECT alSourceQueueBuffersDirect;
LPALSOURCEUNQUEUEBUFFERSDIRECT alSourceUnqueueBuffersDirect;
LPALGENBUFFERSDIRECT alGenBuffersDirect;
LPALDELETEBUFFERSDIRECT alDeleteBuffersDirect;
LPALISBUFFERDIRECT alIsBufferDirect;
LPALBUFFERDATADIRECT alBufferDataDirect;
LPALBUFFERFDIRECT alBufferfDirect;
LPALBUFFER3FDIRECT alBuffer3fDirect;
LPALBUFFERFVDIRECT alBufferfvDirect;
LPALBUFFERIDIRECT alBufferiDirect;
LPALBUFFER3IDIRECT alBuffer3iDirect;
LPALBUFFERIVDIRECT alBufferivDirect;
LPALGETBUFFERFDIRECT alGetBufferfDirect;
LPALGETBUFFER3FDIRECT alGetBuffer3fDirect;
LPALGETBUFFERFVDIRECT alGetBufferfvDirect;
LPALGETBUFFERIDIRECT alGetBufferiDirect;
LPALGETBUFFER3IDIRECT alGetBuffer3iDirect;
LPALGETBUFFERIVDIRECT alGetBufferivDirect;
/* ALC_EXT_EFX */
LPALGENEFFECTSDIRECT alGenEffectsDirect;
LPALDELETEEFFECTSDIRECT alDeleteEffectsDirect;
LPALISEFFECTDIRECT alIsEffectDirect;
LPALEFFECTIDIRECT alEffectiDirect;
LPALEFFECTIVDIRECT alEffectivDirect;
LPALEFFECTFDIRECT alEffectfDirect;
LPALEFFECTFVDIRECT alEffectfvDirect;
LPALGETEFFECTIDIRECT alGetEffectiDirect;
LPALGETEFFECTIVDIRECT alGetEffectivDirect;
LPALGETEFFECTFDIRECT alGetEffectfDirect;
LPALGETEFFECTFVDIRECT alGetEffectfvDirect;
LPALGENFILTERSDIRECT alGenFiltersDirect;
LPALDELETEFILTERSDIRECT alDeleteFiltersDirect;
LPALISFILTERDIRECT alIsFilterDirect;
LPALFILTERIDIRECT alFilteriDirect;
LPALFILTERIVDIRECT alFilterivDirect;
LPALFILTERFDIRECT alFilterfDirect;
LPALFILTERFVDIRECT alFilterfvDirect;
LPALGETFILTERIDIRECT alGetFilteriDirect;
LPALGETFILTERIVDIRECT alGetFilterivDirect;
LPALGETFILTERFDIRECT alGetFilterfDirect;
LPALGETFILTERFVDIRECT alGetFilterfvDirect;
LPALGENAUXILIARYEFFECTSLOTSDIRECT alGenAuxiliaryEffectSlotsDirect;
LPALDELETEAUXILIARYEFFECTSLOTSDIRECT alDeleteAuxiliaryEffectSlotsDirect;
LPALISAUXILIARYEFFECTSLOTDIRECT alIsAuxiliaryEffectSlotDirect;
LPALAUXILIARYEFFECTSLOTIDIRECT alAuxiliaryEffectSlotiDirect;
LPALAUXILIARYEFFECTSLOTIVDIRECT alAuxiliaryEffectSlotivDirect;
LPALAUXILIARYEFFECTSLOTFDIRECT alAuxiliaryEffectSlotfDirect;
LPALAUXILIARYEFFECTSLOTFVDIRECT alAuxiliaryEffectSlotfvDirect;
LPALGETAUXILIARYEFFECTSLOTIDIRECT alGetAuxiliaryEffectSlotiDirect;
LPALGETAUXILIARYEFFECTSLOTIVDIRECT alGetAuxiliaryEffectSlotivDirect;
LPALGETAUXILIARYEFFECTSLOTFDIRECT alGetAuxiliaryEffectSlotfDirect;
LPALGETAUXILIARYEFFECTSLOTFVDIRECT alGetAuxiliaryEffectSlotfvDirect;
/* AL_EXT_BUFFER_DATA_STATIC */
LPALBUFFERDATASTATICDIRECT alBufferDataStaticDirect;
/* AL_EXT_debug */
LPALDEBUGMESSAGECALLBACKDIRECTEXT alDebugMessageCallbackDirectEXT;
LPALDEBUGMESSAGEINSERTDIRECTEXT alDebugMessageInsertDirectEXT;
LPALDEBUGMESSAGECONTROLDIRECTEXT alDebugMessageControlDirectEXT;
LPALPUSHDEBUGGROUPDIRECTEXT alPushDebugGroupDirectEXT;
LPALPOPDEBUGGROUPDIRECTEXT alPopDebugGroupDirectEXT;
LPALGETDEBUGMESSAGELOGDIRECTEXT alGetDebugMessageLogDirectEXT;
LPALOBJECTLABELDIRECTEXT alObjectLabelDirectEXT;
LPALGETOBJECTLABELDIRECTEXT alGetObjectLabelDirectEXT;
/* AL_EXT_FOLDBACK */
LPALREQUESTFOLDBACKSTARTDIRECT alRequestFoldbackStartDirect;
LPALREQUESTFOLDBACKSTOPDIRECT alRequestFoldbackStopDirect;
/* AL_SOFT_buffer_sub_data */
LPALBUFFERSUBDATADIRECTSOFT alBufferSubDataDirectSOFT;
/* AL_SOFT_source_latency */
LPALSOURCEDDIRECTSOFT alSourcedDirectSOFT;
LPALSOURCE3DDIRECTSOFT alSource3dDirectSOFT;
LPALSOURCEDVDIRECTSOFT alSourcedvDirectSOFT;
LPALGETSOURCEDDIRECTSOFT alGetSourcedDirectSOFT;
LPALGETSOURCE3DDIRECTSOFT alGetSource3dDirectSOFT;
LPALGETSOURCEDVDIRECTSOFT alGetSourcedvDirectSOFT;
LPALSOURCEI64DIRECTSOFT alSourcei64DirectSOFT;
LPALSOURCE3I64DIRECTSOFT alSource3i64DirectSOFT;
LPALSOURCEI64VDIRECTSOFT alSourcei64vDirectSOFT;
LPALGETSOURCEI64DIRECTSOFT alGetSourcei64DirectSOFT;
LPALGETSOURCE3I64DIRECTSOFT alGetSource3i64DirectSOFT;
LPALGETSOURCEI64VDIRECTSOFT alGetSourcei64vDirectSOFT;
/* AL_SOFT_deferred_updates */
LPALDEFERUPDATESDIRECTSOFT alDeferUpdatesDirectSOFT;
LPALPROCESSUPDATESDIRECTSOFT alProcessUpdatesDirectSOFT;
/* AL_SOFT_source_resampler */
LPALGETSTRINGIDIRECTSOFT alGetStringiDirectSOFT;
/* AL_SOFT_events */
LPALEVENTCONTROLDIRECTSOFT alEventControlDirectSOFT;
LPALEVENTCALLBACKDIRECTSOFT alEventCallbackDirectSOFT;
LPALGETPOINTERDIRECTSOFT alGetPointerDirectSOFT;
LPALGETPOINTERVDIRECTSOFT alGetPointervDirectSOFT;
/* AL_SOFT_callback_buffer */
LPALBUFFERCALLBACKDIRECTSOFT alBufferCallbackDirectSOFT;
LPALGETBUFFERPTRDIRECTSOFT alGetBufferPtrDirectSOFT;
LPALGETBUFFER3PTRDIRECTSOFT alGetBuffer3PtrDirectSOFT;
LPALGETBUFFERPTRVDIRECTSOFT alGetBufferPtrvDirectSOFT;
/* AL_SOFT_source_start_delay */
LPALSOURCEPLAYATTIMEDIRECTSOFT alSourcePlayAtTimeDirectSOFT;
LPALSOURCEPLAYATTIMEVDIRECTSOFT alSourcePlayAtTimevDirectSOFT;
/* EAX */
LPEAXSETDIRECT EAXSetDirect;
LPEAXGETDIRECT EAXGetDirect;
LPEAXSETBUFFERMODEDIRECT EAXSetBufferModeDirect;
LPEAXGETBUFFERMODEDIRECT EAXGetBufferModeDirect;
} aladDirectFunctions;
extern void aladLoadALCoreMinimal(aladALFunctions* functions, aladLoader loader);
extern void aladLoadALCoreRest(aladALFunctions* functions, aladLoader loader);
extern void aladLoadEFX(aladALFunctions* functions, aladLoader loader);
extern void aladLoadALExtensions(aladALFunctions* functions, aladLoader loader);
extern void aladLoadALCCore(aladALFunctions* functions, aladLoader loader);
extern void aladLoadALCExtensions(aladALFunctions* functions, aladLoader loader);
extern void aladLoadDirectExtension(aladDirectFunctions* functions, aladLoader loader);
/* global function pointers used by the other interfaces */
extern aladALFunctions aladAL;
extern aladALCFunctions aladALC;
#ifdef ALAD_IMPLEMENTATION
aladALFunctions aladAL = {0};
aladALCFunctions aladALC = {0};
/* new manual interface */
void aladLoadALCoreMinimal(aladALFunctions* functions, aladLoader loader) {
functions[0].Enable = REINTERPRET_CAST(LPALENABLE, loader("alEnable"));
functions[0].Disable = REINTERPRET_CAST(LPALDISABLE, loader("alDisable"));
functions[0].IsEnabled = REINTERPRET_CAST(LPALISENABLED, loader("alIsEnabled"));
functions[0].GetString = REINTERPRET_CAST(LPALGETSTRING, loader("alGetString"));
functions[0].GetBooleanv = REINTERPRET_CAST(LPALGETBOOLEANV, loader("alGetBooleanv"));
functions[0].GetIntegerv = REINTERPRET_CAST(LPALGETINTEGERV, loader("alGetIntegerv"));
functions[0].GetFloatv = REINTERPRET_CAST(LPALGETFLOATV, loader("alGetFloatv"));
functions[0].GetDoublev = REINTERPRET_CAST(LPALGETDOUBLEV, loader("alGetDoublev"));
functions[0].GetBoolean = REINTERPRET_CAST(LPALGETBOOLEAN, loader("alGetBoolean"));
functions[0].GetInteger = REINTERPRET_CAST(LPALGETINTEGER, loader("alGetInteger"));
functions[0].GetFloat = REINTERPRET_CAST(LPALGETFLOAT, loader("alGetFloat"));
functions[0].GetDouble = REINTERPRET_CAST(LPALGETDOUBLE, loader("alGetDouble"));
functions[0].GetError = REINTERPRET_CAST(LPALGETERROR, loader("alGetError"));
functions[0].IsExtensionPresent = REINTERPRET_CAST(LPALISEXTENSIONPRESENT, loader("alIsExtensionPresent"));
functions[0].GetEnumValue = REINTERPRET_CAST(LPALGETENUMVALUE, loader("alGetEnumValue"));
}
void aladLoadALCoreRest(aladALFunctions* functions, aladLoader loader) {
functions[0].DopplerFactor = REINTERPRET_CAST(LPALDOPPLERFACTOR, loader("alDopplerFactor"));
functions[0].DopplerVelocity = REINTERPRET_CAST(LPALDOPPLERVELOCITY, loader("alDopplerVelocity"));
functions[0].SpeedOfSound = REINTERPRET_CAST(LPALSPEEDOFSOUND, loader("alSpeedOfSound"));
functions[0].DistanceModel = REINTERPRET_CAST(LPALDISTANCEMODEL, loader("alDistanceModel"));
functions[0].Listenerf = REINTERPRET_CAST(LPALLISTENERF, loader("alListenerf"));
functions[0].Listener3f = REINTERPRET_CAST(LPALLISTENER3F, loader("alListener3f"));
functions[0].Listenerfv = REINTERPRET_CAST(LPALLISTENERFV, loader("alListenerfv"));
functions[0].Listeneri = REINTERPRET_CAST(LPALLISTENERI, loader("alListeneri"));
functions[0].Listener3i = REINTERPRET_CAST(LPALLISTENER3I, loader("alListener3i"));
functions[0].Listeneriv = REINTERPRET_CAST(LPALLISTENERIV, loader("alListeneriv"));
functions[0].GetListenerf = REINTERPRET_CAST(LPALGETLISTENERF, loader("alGetListenerf"));
functions[0].GetListener3f = REINTERPRET_CAST(LPALGETLISTENER3F, loader("alGetListener3f"));
functions[0].GetListenerfv = REINTERPRET_CAST(LPALGETLISTENERFV, loader("alGetListenerfv"));
functions[0].GetListeneri = REINTERPRET_CAST(LPALGETLISTENERI, loader("alGetListeneri"));
functions[0].GetListener3i = REINTERPRET_CAST(LPALGETLISTENER3I, loader("alGetListener3i"));
functions[0].GetListeneriv = REINTERPRET_CAST(LPALGETLISTENERIV, loader("alGetListeneriv"));
functions[0].GenSources = REINTERPRET_CAST(LPALGENSOURCES, loader("alGenSources"));
functions[0].DeleteSources = REINTERPRET_CAST(LPALDELETESOURCES, loader("alDeleteSources"));
functions[0].IsSource = REINTERPRET_CAST(LPALISSOURCE, loader("alIsSource"));
functions[0].Sourcef = REINTERPRET_CAST(LPALSOURCEF, loader("alSourcef"));
functions[0].Source3f = REINTERPRET_CAST(LPALSOURCE3F, loader("alSource3f"));
functions[0].Sourcefv = REINTERPRET_CAST(LPALSOURCEFV, loader("alSourcefv"));
functions[0].Sourcei = REINTERPRET_CAST(LPALSOURCEI, loader("alSourcei"));
functions[0].Source3i = REINTERPRET_CAST(LPALSOURCE3I, loader("alSource3i"));
functions[0].Sourceiv = REINTERPRET_CAST(LPALSOURCEIV, loader("alSourceiv"));
functions[0].GetSourcef = REINTERPRET_CAST(LPALGETSOURCEF, loader("alGetSourcef"));
functions[0].GetSource3f = REINTERPRET_CAST(LPALGETSOURCE3F, loader("alGetSource3f"));
functions[0].GetSourcefv = REINTERPRET_CAST(LPALGETSOURCEFV, loader("alGetSourcefv"));
functions[0].GetSourcei = REINTERPRET_CAST(LPALGETSOURCEI, loader("alGetSourcei"));
functions[0].GetSource3i = REINTERPRET_CAST(LPALGETSOURCE3I, loader("alGetSource3i"));
functions[0].GetSourceiv = REINTERPRET_CAST(LPALGETSOURCEIV, loader("alGetSourceiv"));
functions[0].SourcePlayv = REINTERPRET_CAST(LPALSOURCEPLAYV, loader("alSourcePlayv"));
functions[0].SourceStopv = REINTERPRET_CAST(LPALSOURCESTOPV, loader("alSourceStopv"));
functions[0].SourceRewindv = REINTERPRET_CAST(LPALSOURCEREWINDV, loader("alSourceRewindv"));
functions[0].SourcePausev = REINTERPRET_CAST(LPALSOURCEPAUSEV, loader("alSourcePausev"));
functions[0].SourcePlay = REINTERPRET_CAST(LPALSOURCEPLAY, loader("alSourcePlay"));
functions[0].SourceStop = REINTERPRET_CAST(LPALSOURCESTOP, loader("alSourceStop"));
functions[0].SourceRewind = REINTERPRET_CAST(LPALSOURCEREWIND, loader("alSourceRewind"));
functions[0].SourcePause = REINTERPRET_CAST(LPALSOURCEPAUSE, loader("alSourcePause"));
functions[0].SourceQueueBuffers = REINTERPRET_CAST(LPALSOURCEQUEUEBUFFERS, loader("alSourceQueueBuffers"));
functions[0].SourceUnqueueBuffers = REINTERPRET_CAST(LPALSOURCEUNQUEUEBUFFERS, loader("alSourceUnqueueBuffers"));
functions[0].GenBuffers = REINTERPRET_CAST(LPALGENBUFFERS, loader("alGenBuffers"));
functions[0].DeleteBuffers = REINTERPRET_CAST(LPALDELETEBUFFERS, loader("alDeleteBuffers"));
functions[0].IsBuffer = REINTERPRET_CAST(LPALISBUFFER, loader("alIsBuffer"));
functions[0].BufferData = REINTERPRET_CAST(LPALBUFFERDATA, loader("alBufferData"));
functions[0].Bufferf = REINTERPRET_CAST(LPALBUFFERF, loader("alBufferf"));
functions[0].Buffer3f = REINTERPRET_CAST(LPALBUFFER3F, loader("alBuffer3f"));
functions[0].Bufferfv = REINTERPRET_CAST(LPALBUFFERFV, loader("alBufferfv"));
functions[0].Bufferi = REINTERPRET_CAST(LPALBUFFERI, loader("alBufferi"));
functions[0].Buffer3i = REINTERPRET_CAST(LPALBUFFER3I, loader("alBuffer3i"));
functions[0].Bufferiv = REINTERPRET_CAST(LPALBUFFERIV, loader("alBufferiv"));
functions[0].GetBufferf = REINTERPRET_CAST(LPALGETBUFFERF, loader("alGetBufferf"));
functions[0].GetBuffer3f = REINTERPRET_CAST(LPALGETBUFFER3F, loader("alGetBuffer3f"));
functions[0].GetBufferfv = REINTERPRET_CAST(LPALGETBUFFERFV, loader("alGetBufferfv"));
functions[0].GetBufferi = REINTERPRET_CAST(LPALGETBUFFERI, loader("alGetBufferi"));
functions[0].GetBuffer3i = REINTERPRET_CAST(LPALGETBUFFER3I, loader("alGetBuffer3i"));
functions[0].GetBufferiv = REINTERPRET_CAST(LPALGETBUFFERIV, loader("alGetBufferiv"));
}
void aladLoadEFX(aladALFunctions* functions, aladLoader loader) {
functions[0].GenEffects = REINTERPRET_CAST(LPALGENEFFECTS, loader("alGenEffects"));
functions[0].DeleteEffects = REINTERPRET_CAST(LPALDELETEEFFECTS, loader("alDeleteEffects"));
functions[0].IsEffect = REINTERPRET_CAST(LPALISEFFECT, loader("alIsEffect"));
functions[0].Effecti = REINTERPRET_CAST(LPALEFFECTI, loader("alEffecti"));
functions[0].Effectiv = REINTERPRET_CAST(LPALEFFECTIV, loader("alEffectiv"));
functions[0].Effectf = REINTERPRET_CAST(LPALEFFECTF, loader("alEffectf"));
functions[0].Effectfv = REINTERPRET_CAST(LPALEFFECTFV, loader("alEffectfv"));
functions[0].GetEffecti = REINTERPRET_CAST(LPALGETEFFECTI, loader("alGetEffecti"));
functions[0].GetEffectiv = REINTERPRET_CAST(LPALGETEFFECTIV, loader("alGetEffectiv"));
functions[0].GetEffectf = REINTERPRET_CAST(LPALGETEFFECTF, loader("alGetEffectf"));
functions[0].GetEffectfv = REINTERPRET_CAST(LPALGETEFFECTFV, loader("alGetEffectfv"));
functions[0].GenFilters = REINTERPRET_CAST(LPALGENFILTERS, loader("alGenFilters"));
functions[0].DeleteFilters = REINTERPRET_CAST(LPALDELETEFILTERS, loader("alDeleteFilters"));
functions[0].IsFilter = REINTERPRET_CAST(LPALISFILTER, loader("alIsFilter"));
functions[0].Filteri = REINTERPRET_CAST(LPALFILTERI, loader("alFilteri"));
functions[0].Filteriv = REINTERPRET_CAST(LPALFILTERIV, loader("alFilteriv"));
functions[0].Filterf = REINTERPRET_CAST(LPALFILTERF, loader("alFilterf"));
functions[0].Filterfv = REINTERPRET_CAST(LPALFILTERFV, loader("alFilterfv"));
functions[0].GetFilteri = REINTERPRET_CAST(LPALGETFILTERI, loader("alGetFilteri"));
functions[0].GetFilteriv = REINTERPRET_CAST(LPALGETFILTERIV, loader("alGetFilteriv"));
functions[0].GetFilterf = REINTERPRET_CAST(LPALGETFILTERF, loader("alGetFilterf"));
functions[0].GetFilterfv = REINTERPRET_CAST(LPALGETFILTERFV, loader("alGetFilterfv"));
functions[0].GenAuxiliaryEffectSlots = REINTERPRET_CAST(LPALGENAUXILIARYEFFECTSLOTS, loader("alGenAuxiliaryEffectSlots"));
functions[0].DeleteAuxiliaryEffectSlots = REINTERPRET_CAST(LPALDELETEAUXILIARYEFFECTSLOTS, loader("alDeleteAuxiliaryEffectSlots"));
functions[0].IsAuxiliaryEffectSlot = REINTERPRET_CAST(LPALISAUXILIARYEFFECTSLOT, loader("alIsAuxiliaryEffectSlot"));
functions[0].AuxiliaryEffectSloti = REINTERPRET_CAST(LPALAUXILIARYEFFECTSLOTI, loader("alAuxiliaryEffectSloti"));
functions[0].AuxiliaryEffectSlotiv = REINTERPRET_CAST(LPALAUXILIARYEFFECTSLOTIV, loader("alAuxiliaryEffectSlotiv"));
functions[0].AuxiliaryEffectSlotf = REINTERPRET_CAST(LPALAUXILIARYEFFECTSLOTF, loader("alAuxiliaryEffectSlotf"));
functions[0].AuxiliaryEffectSlotfv = REINTERPRET_CAST(LPALAUXILIARYEFFECTSLOTFV, loader("alAuxiliaryEffectSlotfv"));
functions[0].GetAuxiliaryEffectSloti = REINTERPRET_CAST(LPALGETAUXILIARYEFFECTSLOTI, loader("alGetAuxiliaryEffectSloti"));
functions[0].GetAuxiliaryEffectSlotiv = REINTERPRET_CAST(LPALGETAUXILIARYEFFECTSLOTIV, loader("alGetAuxiliaryEffectSlotiv"));
functions[0].GetAuxiliaryEffectSlotf = REINTERPRET_CAST(LPALGETAUXILIARYEFFECTSLOTF, loader("alGetAuxiliaryEffectSlotf"));
functions[0].GetAuxiliaryEffectSlotfv = REINTERPRET_CAST(LPALGETAUXILIARYEFFECTSLOTFV, loader("alGetAuxiliaryEffectSlotfv"));
}
void aladLoadALExtensions(aladALFunctions* functions, aladLoader loader) {
/* AL_EXT_STATIC_BUFFER */
functions[0].BufferDataStatic = REINTERPRET_CAST(PFNALBUFFERDATASTATICPROC, loader("alBufferDataStatic"));
/* AL_SOFT_buffer_sub_data */
functions[0].BufferSubDataSOFT = REINTERPRET_CAST(PFNALBUFFERSUBDATASOFTPROC, loader("alBufferSubDataSOFT"));
/* AL_EXT_FOLDBACK */
functions[0].RequestFoldbackStart = REINTERPRET_CAST(LPALREQUESTFOLDBACKSTART, loader("alRequestFoldbackStart"));
functions[0].RequestFoldbackStop = REINTERPRET_CAST(LPALREQUESTFOLDBACKSTOP, loader("alRequestFoldbackStop"));
/* AL_SOFT_buffer_samples */
functions[0].BufferSamplesSOFT = REINTERPRET_CAST(LPALBUFFERSAMPLESSOFT, loader("alBufferSamplesSOFT"));
functions[0].BufferSubSamplesSOFT = REINTERPRET_CAST(LPALBUFFERSUBSAMPLESSOFT, loader("alBufferSubSamplesSOFT"));
functions[0].GetBufferSamplesSOFT = REINTERPRET_CAST(LPALGETBUFFERSAMPLESSOFT, loader("alGetBufferSamplesSOFT"));
functions[0].IsBufferFormatSupportedSOFT = REINTERPRET_CAST(LPALISBUFFERFORMATSUPPORTEDSOFT, loader("alIsBufferFormatSupportedSOFT"));
/* AL_SOFT_source_latency */
functions[0].SourcedSOFT = REINTERPRET_CAST(LPALSOURCEDSOFT, loader("alSourcedSOFT"));
functions[0].Source3dSOFT = REINTERPRET_CAST(LPALSOURCE3DSOFT, loader("alSource3dSOFT"));
functions[0].SourcedvSOFT = REINTERPRET_CAST(LPALSOURCEDVSOFT, loader("alSourcedvSOFT"));
functions[0].GetSourcedSOFT = REINTERPRET_CAST(LPALGETSOURCEDSOFT, loader("alGetSourcedSOFT"));
functions[0].GetSource3dSOFT = REINTERPRET_CAST(LPALGETSOURCE3DSOFT, loader("alGetSource3dSOFT"));
functions[0].GetSourcedvSOFT = REINTERPRET_CAST(LPALGETSOURCEDVSOFT, loader("alGetSourcedvSOFT"));
functions[0].Sourcei64SOFT = REINTERPRET_CAST(LPALSOURCEI64SOFT, loader("alSourcei64SOFT"));
functions[0].Source3i64SOFT = REINTERPRET_CAST(LPALSOURCE3I64SOFT, loader("alSource3i64SOFT"));
functions[0].Sourcei64vSOFT = REINTERPRET_CAST(LPALSOURCEI64VSOFT, loader("alSourcei64vSOFT"));
functions[0].GetSourcei64SOFT = REINTERPRET_CAST(LPALGETSOURCEI64SOFT, loader("alGetSourcei64SOFT"));
functions[0].GetSource3i64SOFT = REINTERPRET_CAST(LPALGETSOURCE3I64SOFT, loader("alGetSource3i64SOFT"));
functions[0].GetSourcei64vSOFT = REINTERPRET_CAST(LPALGETSOURCEI64VSOFT, loader("alGetSourcei64vSOFT"));
/* AL_SOFT_deferred_updates */
functions[0].DeferUpdatesSOFT = REINTERPRET_CAST(LPALDEFERUPDATESSOFT, loader("alDeferUpdatesSOFT"));
functions[0].ProcessUpdatesSOFT = REINTERPRET_CAST(LPALPROCESSUPDATESSOFT, loader("alProcessUpdatesSOFT"));
/* AL_SOFT_source_resampler */
functions[0].GetStringiSOFT = REINTERPRET_CAST(LPALGETSTRINGISOFT, loader("alGetStringiSOFT"));
/* AL_SOFT_events */
functions[0].EventControlSOFT = REINTERPRET_CAST(LPALEVENTCONTROLSOFT, loader("alEventControlSOFT"));
functions[0].EventCallbackSOFT = REINTERPRET_CAST(LPALEVENTCALLBACKSOFT, loader("alEventCallbackSOFT"));
functions[0].GetPointerSOFT = REINTERPRET_CAST(LPALGETPOINTERSOFT, loader("alGetPointerSOFT"));
functions[0].GetPointervSOFT = REINTERPRET_CAST(LPALGETPOINTERVSOFT, loader("alGetPointervSOFT"));
/* AL_SOFT_callback_buffer */
functions[0].BufferCallbackSOFT = REINTERPRET_CAST(LPALBUFFERCALLBACKSOFT, loader("alBufferCallbackSOFT"));
functions[0].GetBufferPtrSOFT = REINTERPRET_CAST(LPALGETBUFFERPTRSOFT, loader("alGetBufferPtrSOFT"));
functions[0].GetBuffer3PtrSOFT = REINTERPRET_CAST(LPALGETBUFFER3PTRSOFT, loader("alGetBuffer3PtrSOFT"));
functions[0].GetBufferPtrvSOFT = REINTERPRET_CAST(LPALGETBUFFERPTRVSOFT, loader("alGetBufferPtrvSOFT"));
/* AL_SOFT_source_start_delay */
functions[0].SourcePlayAtTimeSOFT = REINTERPRET_CAST(LPALSOURCEPLAYATTIMESOFT, loader("alSourcePlayAtTimeSOFT"));
functions[0].SourcePlayAtTimevSOFT = REINTERPRET_CAST(LPALSOURCEPLAYATTIMEVSOFT, loader("alSourcePlayAtTimevSOFT"));
/* AL_EXT_debug */
functions[0].DebugMessageCallbackEXT = REINTERPRET_CAST(LPALDEBUGMESSAGECALLBACKEXT, loader("alDebugMessageCallbackEXT"));
functions[0].DebugMessageInsertEXT = REINTERPRET_CAST(LPALDEBUGMESSAGEINSERTEXT, loader("alDebugMessageInsertEXT"));
functions[0].DebugMessageControlEXT = REINTERPRET_CAST(LPALDEBUGMESSAGECONTROLEXT, loader("alDebugMessageControlEXT"));
functions[0].PushDebugGroupEXT = REINTERPRET_CAST(LPALPUSHDEBUGGROUPEXT, loader("alPushDebugGroupEXT"));
functions[0].PopDebugGroupEXT = REINTERPRET_CAST(LPALPOPDEBUGGROUPEXT, loader("alPopDebugGroupEXT"));
functions[0].GetDebugMessageLogEXT = REINTERPRET_CAST(LPALGETDEBUGMESSAGELOGEXT, loader("alGetDebugMessageLogEXT"));
functions[0].ObjectLabelEXT = REINTERPRET_CAST(LPALOBJECTLABELEXT, loader("alObjectLabelEXT"));
functions[0].GetObjectLabelEXT = REINTERPRET_CAST(LPALGETOBJECTLABELEXT, loader("alGetObjectLabelEXT"));
}
void aladLoadALCCore(aladALFunctions* functions, aladLoader loader) {
functions[0].CreateContext = REINTERPRET_CAST(LPALCCREATECONTEXT, loader("alcCreateContext"));
functions[0].MakeContextCurrent = REINTERPRET_CAST(LPALCMAKECONTEXTCURRENT, loader("alcMakeContextCurrent"));
functions[0].ProcessContext = REINTERPRET_CAST(LPALCPROCESSCONTEXT, loader("alcProcessContext"));
functions[0].SuspendContext = REINTERPRET_CAST(LPALCSUSPENDCONTEXT, loader("alcSuspendContext"));
functions[0].DestroyContext = REINTERPRET_CAST(LPALCDESTROYCONTEXT, loader("alcDestroyContext"));
functions[0].GetCurrentContext = REINTERPRET_CAST(LPALCGETCURRENTCONTEXT, loader("alcGetCurrentContext"));
functions[0].GetContextsDevice = REINTERPRET_CAST(LPALCGETCONTEXTSDEVICE, loader("alcGetContextsDevice"));
functions[0].OpenDevice = REINTERPRET_CAST(LPALCOPENDEVICE, loader("alcOpenDevice"));
functions[0].CloseDevice = REINTERPRET_CAST(LPALCCLOSEDEVICE, loader("alcCloseDevice"));
functions[0].GetError = REINTERPRET_CAST(LPALCGETERROR, loader("alcGetError"));
functions[0].IsExtensionPresent = REINTERPRET_CAST(LPALCISEXTENSIONPRESENT, loader("alcIsExtensionPresent"));
functions[0].GetEnumValue = REINTERPRET_CAST(LPALCGETENUMVALUE, loader("alcGetEnumValue"));
functions[0].GetString = REINTERPRET_CAST(LPALCGETSTRING, loader("alcGetString"));
functions[0].GetIntegerv = REINTERPRET_CAST(LPALCGETINTEGERV, loader("alcGetIntegerv"));
functions[0].CaptureOpenDevice = REINTERPRET_CAST(LPALCCAPTUREOPENDEVICE, loader("alcCaptureOpenDevice"));
functions[0].CaptureCloseDevice = REINTERPRET_CAST(LPALCCAPTURECLOSEDEVICE, loader("alcCaptureCloseDevice"));
functions[0].CaptureStart = REINTERPRET_CAST(LPALCCAPTURESTART, loader("alcCaptureStart"));
functions[0].CaptureStop = REINTERPRET_CAST(LPALCCAPTURESTOP, loader("alcCaptureStop"));
functions[0].CaptureSamples = REINTERPRET_CAST(LPALCCAPTURESAMPLES, loader("alcCaptureSamples"));
}
void aladLoadALCExtensions(aladALFunctions* functions, aladLoader loader) {
/* ALC_EXT_thread_local_context */
functions[0].SetThreadContext = REINTERPRET_CAST(PFNALCSETTHREADCONTEXTPROC, loader("alcSetThreadContext"));
functions[0].GetThreadContext = REINTERPRET_CAST(PFNALCGETTHREADCONTEXTPROC, loader("alcGetThreadContext"));