Skip to content

Instantly share code, notes, and snippets.

@DanielGibson
Last active April 10, 2018 15:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DanielGibson/c79dca997b1d9f708d31ca465ebf3432 to your computer and use it in GitHub Desktop.
Save DanielGibson/c79dca997b1d9f708d31ca465ebf3432 to your computer and use it in GitHub Desktop.
OpenAL function in X-Macros, can be used to define and load function pointers etc
/*
* All function names and corresponding pointer-to-function-types
* from the OpenAL headers, wrapped in a magic macro so it can be used for whatever.
*
* Idea for the magic X macro from Walter Bright:
* http://www.drdobbs.com/cpp/the-x-macro/228700289
*
* To use this, you have to #define the AL_X_MAGIC(fn, fnptrt)
* macro for the AL_H_FUNCS and ALC_H_FUNCS and the
* ALEXT_X_MAGIC(fn, fnptrt, ext) macro for the ALEXT_H_FUNCS and EFX_H_FUNCS
*
* Usage example:
*
* // define a list of (global?) function pointers like
* // LPALDOPPLERFACTOR qalDopplerFactor = NULL;
* // LPALDOPPLERVELOCITY qalDopplerVelocity = NULL;
* // etc:
* #define AL_X_MAGIC(fn, fnptrt) \
* fnptrt q##fn = NULL;
* AL_H_FUNCS
* #undef AL_X_MAGIC
*
* // the same to put in a header:
* #define AL_X_MAGIC(fn, fnptrt) \
* extern fnptrt q##fn;
* AL_H_FUNCS
* #undef AL_X_MAGIC
*
* // initialize them:
* void* openal_handle = dlopen("libopenal.so.1", RTLD_NOW);
* #define AL_X_MAGIC(fn, fnptrt) \
* q##fn = dlsym(openal_handle, #fn);
* AL_H_FUNCS
* #undef AL_X_MAGIC
*
* // NOTE: you should still check if q##fn is NULL, especially for extensions,
* // that is left out here just for brevity!
*
* // unload lib, reset to NULL:
* #define AL_X_MAGIC(fn, fnptrt) \
* q##fn = NULL;
* AL_H_FUNCS
* #undef AL_X_MAGIC
* dlclose(openal_handle);
*
* For extension functions you can use a
* #define ALEXT_X_MAGIC(fn, fnptrt, ext) \
* AL_X_MAGIC(fn, fnptrt)
*
* macro most of the time, for loading the functions however I'd suggest something like
* #undef ALEXT_X_MAGIC
* #define ALEXT_X_MAGIC(fn, fnptrt, ext) \
* q##fn = (fnptrt)loadExtFunc(myAlcDev, #fn, #ext );
* // TODO: this assumes a
* // void* loadExtFunc(ALCdevice* dev, const char* fnName, const char* extName)
* // function that checks with qalcIsExtensionPresent() and qalIsExtensionPresent()
* // (depending on whether extName[2] == 'C') if the extension is supported
* // and gets the function pointer with alcGetProcAddress() or alGetProcAddress()
* // (depending on whether fnName[2] == 'c')
* ALEXT_H_FUNCS
* EFX_H_FUNCS
* #undef ALEXT_X_MAGIC
*
* The AL_EXT_LIST can be used to create and set a struct indicating which
* OpenAL Extensions are supported (and possibly other things).
* Note that you can't use the extension name directly because it will be
* replaced with 1 by the preprocessor because of "#define AL_EXT_FOO 1" in alext.h
*
* Example:
*
* typedef struct {
* // just a struct with lots of bools in it.. one for each extension, in the format of
* // haveAL_EXT_FOO
* #define ALEXT_LIST_MAGIC(extname) \
* bool have##extname;
* // a prefix like "have" is needed because otherwise it would just extend AL_EXT_* from alext.h (to 1)
*
* AL_EXT_LIST
* #undef ALEXT_LIST_MAGIC
* } qalExtensions_t;
*
* qalExtensions_t qalExtensions;
*
* bool haveExtension(ALCdevice* dev, const char* ext) {
* if(!dev || !ext || strlen(ext) < 3)
* return false;
*
* if(ext[2] == 'C') { // ALC_* extension
* return qalcIsExtensionPresent(dev, ext);
* } else { // AL_* extension
* return qalIsExtensionPresent(ext);
* }
* }
*
* // make sure to call this after creating the device!
* void initExtensions(ALCdevice* dev) {
* #define ALEXT_LIST_MAGIC(extname) \
* qalExtensions.have##extname = haveExtension(dev, #extname);
*
* AL_EXT_LIST
* #undef AL_EXT_LIST_MAGIC
* }
*
* void* loadExtFunc(ALCdevice* dev, const char* fnName, const char* extName)
* {
* // we want at least 3 chars each to check for al*c* or AL*C*
* if(!dev || !fnName || !extName || strlen(fnName) < 3 || strlen(extName) < 3)
* {
* return NULL;
* }
*
* if(!haveExtension(dev, extName))
* {
* return NULL;
* }
*
* if(fnName[2] == 'c') // alc* function
* {
* return qalcGetProcAddress(dev, fnName);
* }
* else // al* function
* {
* return qalGetProcAddress(fnName);
* }
* }
*
*
* // later in code:
* if(qalExtensions.haveALC_EXT_EFX)
* qalGenEffects(...);
*
* (C) 2013-2018 Daniel Gibson
* This software is dual-licensed to the public domain and under the following
* license: you are granted a perpetual, irrevocable license to copy, modify,
* publish, and distribute this file as you see fit.
* No warranty implied; use at your own risk.
*/
#define AL_H_FUNCS \
AL_X_MAGIC(alDopplerFactor, LPALDOPPLERFACTOR) \
AL_X_MAGIC(alDopplerVelocity, LPALDOPPLERVELOCITY) \
AL_X_MAGIC(alSpeedOfSound, LPALSPEEDOFSOUND) \
AL_X_MAGIC(alDistanceModel, LPALDISTANCEMODEL) \
AL_X_MAGIC(alEnable, LPALENABLE) \
AL_X_MAGIC(alDisable, LPALDISABLE) \
AL_X_MAGIC(alIsEnabled, LPALISENABLED) \
AL_X_MAGIC(alGetString, LPALGETSTRING) \
AL_X_MAGIC(alGetBooleanv, LPALGETBOOLEANV) \
AL_X_MAGIC(alGetIntegerv, LPALGETINTEGERV) \
AL_X_MAGIC(alGetFloatv, LPALGETFLOATV) \
AL_X_MAGIC(alGetDoublev, LPALGETDOUBLEV) \
AL_X_MAGIC(alGetBoolean, LPALGETBOOLEAN) \
AL_X_MAGIC(alGetInteger, LPALGETINTEGER) \
AL_X_MAGIC(alGetFloat, LPALGETFLOAT) \
AL_X_MAGIC(alGetDouble, LPALGETDOUBLE) \
AL_X_MAGIC(alGetError, LPALGETERROR) \
AL_X_MAGIC(alIsExtensionPresent, LPALISEXTENSIONPRESENT) \
AL_X_MAGIC(alGetProcAddress, LPALGETPROCADDRESS) \
AL_X_MAGIC(alGetEnumValue, LPALGETENUMVALUE) \
AL_X_MAGIC(alListenerf, LPALLISTENERF) \
AL_X_MAGIC(alListener3f, LPALLISTENER3F) \
AL_X_MAGIC(alListenerfv, LPALLISTENERFV) \
AL_X_MAGIC(alListeneri, LPALLISTENERI) \
AL_X_MAGIC(alListener3i, LPALLISTENER3I) \
AL_X_MAGIC(alListeneriv, LPALLISTENERIV) \
AL_X_MAGIC(alGetListenerf, LPALGETLISTENERF) \
AL_X_MAGIC(alGetListener3f, LPALGETLISTENER3F) \
AL_X_MAGIC(alGetListenerfv, LPALGETLISTENERFV) \
AL_X_MAGIC(alGetListeneri, LPALGETLISTENERI) \
AL_X_MAGIC(alGetListener3i, LPALGETLISTENER3I) \
AL_X_MAGIC(alGetListeneriv, LPALGETLISTENERIV) \
AL_X_MAGIC(alGenSources, LPALGENSOURCES) \
AL_X_MAGIC(alDeleteSources, LPALDELETESOURCES) \
AL_X_MAGIC(alIsSource, LPALISSOURCE) \
AL_X_MAGIC(alSourcef, LPALSOURCEF) \
AL_X_MAGIC(alSource3f, LPALSOURCE3F) \
AL_X_MAGIC(alSourcefv, LPALSOURCEFV) \
AL_X_MAGIC(alSourcei, LPALSOURCEI) \
AL_X_MAGIC(alSource3i, LPALSOURCE3I) \
AL_X_MAGIC(alSourceiv, LPALSOURCEIV) \
AL_X_MAGIC(alGetSourcef, LPALGETSOURCEF) \
AL_X_MAGIC(alGetSource3f, LPALGETSOURCE3F) \
AL_X_MAGIC(alGetSourcefv, LPALGETSOURCEFV) \
AL_X_MAGIC(alGetSourcei, LPALGETSOURCEI) \
AL_X_MAGIC(alGetSource3i, LPALGETSOURCE3I) \
AL_X_MAGIC(alGetSourceiv, LPALGETSOURCEIV) \
AL_X_MAGIC(alSourcePlayv, LPALSOURCEPLAYV) \
AL_X_MAGIC(alSourceStopv, LPALSOURCESTOPV) \
AL_X_MAGIC(alSourceRewindv, LPALSOURCEREWINDV) \
AL_X_MAGIC(alSourcePausev, LPALSOURCEPAUSEV) \
AL_X_MAGIC(alSourcePlay, LPALSOURCEPLAY) \
AL_X_MAGIC(alSourceStop, LPALSOURCESTOP) \
AL_X_MAGIC(alSourceRewind, LPALSOURCEREWIND) \
AL_X_MAGIC(alSourcePause, LPALSOURCEPAUSE) \
AL_X_MAGIC(alSourceQueueBuffers, LPALSOURCEQUEUEBUFFERS) \
AL_X_MAGIC(alSourceUnqueueBuffers, LPALSOURCEUNQUEUEBUFFERS) \
AL_X_MAGIC(alGenBuffers, LPALGENBUFFERS) \
AL_X_MAGIC(alDeleteBuffers, LPALDELETEBUFFERS) \
AL_X_MAGIC(alIsBuffer, LPALISBUFFER) \
AL_X_MAGIC(alBufferData, LPALBUFFERDATA) \
AL_X_MAGIC(alBufferf, LPALBUFFERF) \
AL_X_MAGIC(alBuffer3f, LPALBUFFER3F) \
AL_X_MAGIC(alBufferfv, LPALBUFFERFV) \
AL_X_MAGIC(alBufferi, LPALBUFFERI) \
AL_X_MAGIC(alBuffer3i, LPALBUFFER3I) \
AL_X_MAGIC(alBufferiv, LPALBUFFERIV) \
AL_X_MAGIC(alGetBufferf, LPALGETBUFFERF) \
AL_X_MAGIC(alGetBuffer3f, LPALGETBUFFER3F) \
AL_X_MAGIC(alGetBufferfv, LPALGETBUFFERFV) \
AL_X_MAGIC(alGetBufferi, LPALGETBUFFERI) \
AL_X_MAGIC(alGetBuffer3i, LPALGETBUFFER3I) \
AL_X_MAGIC(alGetBufferiv, LPALGETBUFFERIV)
#define ALC_H_FUNCS \
AL_X_MAGIC(alcCreateContext, LPALCCREATECONTEXT) \
AL_X_MAGIC(alcMakeContextCurrent, LPALCMAKECONTEXTCURRENT) \
AL_X_MAGIC(alcProcessContext, LPALCPROCESSCONTEXT) \
AL_X_MAGIC(alcSuspendContext, LPALCSUSPENDCONTEXT) \
AL_X_MAGIC(alcDestroyContext, LPALCDESTROYCONTEXT) \
AL_X_MAGIC(alcGetCurrentContext, LPALCGETCURRENTCONTEXT) \
AL_X_MAGIC(alcGetContextsDevice, LPALCGETCONTEXTSDEVICE) \
AL_X_MAGIC(alcOpenDevice, LPALCOPENDEVICE) \
AL_X_MAGIC(alcCloseDevice, LPALCCLOSEDEVICE) \
AL_X_MAGIC(alcGetError, LPALCGETERROR) \
AL_X_MAGIC(alcIsExtensionPresent, LPALCISEXTENSIONPRESENT) \
AL_X_MAGIC(alcGetProcAddress, LPALCGETPROCADDRESS) \
AL_X_MAGIC(alcGetEnumValue, LPALCGETENUMVALUE) \
AL_X_MAGIC(alcGetString, LPALCGETSTRING) \
AL_X_MAGIC(alcGetIntegerv, LPALCGETINTEGERV) \
AL_X_MAGIC(alcCaptureOpenDevice, LPALCCAPTUREOPENDEVICE) \
AL_X_MAGIC(alcCaptureCloseDevice, LPALCCAPTURECLOSEDEVICE) \
AL_X_MAGIC(alcCaptureStart, LPALCCAPTURESTART) \
AL_X_MAGIC(alcCaptureStop, LPALCCAPTURESTOP) \
AL_X_MAGIC(alcCaptureSamples, LPALCCAPTURESAMPLES)
// make sure to only have functions from extensions our alext.h knows about in ALEXT_H_FUNCS
// by splitting it by extension and only generating entries if the extension is #defined as a macro (probably in alext.h)
#ifdef AL_EXT_STATIC_BUFFER
#define AL_EXT_STATIC_BUFFER_FUNCS \
ALEXT_X_MAGIC(alBufferDataStatic, PFNALBUFFERDATASTATICPROC, AL_EXT_STATIC_BUFFER)
#else // empty
#define AL_EXT_STATIC_BUFFER_FUNCS
#endif
#ifdef ALC_EXT_thread_local_context
#define ALC_EXT_thread_local_context_FUNCS \
ALEXT_X_MAGIC(alcSetThreadContext, PFNALCSETTHREADCONTEXTPROC, ALC_EXT_thread_local_context) \
ALEXT_X_MAGIC(alcGetThreadContext, PFNALCGETTHREADCONTEXTPROC, ALC_EXT_thread_local_context)
#else // empty
#define ALC_EXT_thread_local_context_FUNCS
#endif
#ifdef AL_SOFT_buffer_sub_data
#define AL_SOFT_buffer_sub_data_FUNCS \
ALEXT_X_MAGIC(alBufferSubDataSOFT, PFNALBUFFERSUBDATASOFTPROC, AL_SOFT_buffer_sub_data)
#else // empty
#define AL_SOFT_buffer_sub_data_FUNCS
#endif
#ifdef AL_EXT_FOLDBACK
#define AL_EXT_FOLDBACK_FUNCS \
ALEXT_X_MAGIC(alRequestFoldbackStart, LPALREQUESTFOLDBACKSTART, AL_EXT_FOLDBACK) \
ALEXT_X_MAGIC(alRequestFoldbackStop, LPALREQUESTFOLDBACKSTOP, AL_EXT_FOLDBACK)
#else // empty
#define AL_EXT_FOLDBACK_FUNCS
#endif
#ifdef AL_SOFT_buffer_samples
#define AL_SOFT_buffer_samples_FUNCS \
ALEXT_X_MAGIC(alBufferSamplesSOFT, LPALBUFFERSAMPLESSOFT, AL_SOFT_buffer_samples) \
ALEXT_X_MAGIC(alBufferSubSamplesSOFT, LPALBUFFERSUBSAMPLESSOFT, AL_SOFT_buffer_samples) \
ALEXT_X_MAGIC(alGetBufferSamplesSOFT, LPALGETBUFFERSAMPLESSOFT, AL_SOFT_buffer_samples) \
ALEXT_X_MAGIC(alIsBufferFormatSupportedSOFT, LPALISBUFFERFORMATSUPPORTEDSOFT, AL_SOFT_buffer_samples)
#else // empty
#define AL_SOFT_buffer_samples_FUNCS
#endif
#ifdef ALC_SOFT_loopback
#define ALC_SOFT_loopback_FUNCS \
ALEXT_X_MAGIC(alcLoopbackOpenDeviceSOFT, LPALCLOOPBACKOPENDEVICESOFT, ALC_SOFT_loopback) \
ALEXT_X_MAGIC(alcIsRenderFormatSupportedSOFT, LPALCISRENDERFORMATSUPPORTEDSOFT, ALC_SOFT_loopback) \
ALEXT_X_MAGIC(alcRenderSamplesSOFT, LPALCRENDERSAMPLESSOFT, ALC_SOFT_loopback)
#else // empty
#define ALC_SOFT_loopback_FUNCS
#endif
#ifdef AL_SOFT_source_latency
#define AL_SOFT_source_latency_FUNCS \
ALEXT_X_MAGIC(alSourcedSOFT, LPALSOURCEDSOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alSource3dSOFT, LPALSOURCE3DSOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alSourcedvSOFT, LPALSOURCEDVSOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alGetSourcedSOFT, LPALGETSOURCEDSOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alGetSource3dSOFT, LPALGETSOURCE3DSOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alGetSourcedvSOFT, LPALGETSOURCEDVSOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alSourcei64SOFT, LPALSOURCEI64SOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alSource3i64SOFT, LPALSOURCE3I64SOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alSourcei64vSOFT, LPALSOURCEI64VSOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alGetSourcei64SOFT, LPALGETSOURCEI64SOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alGetSource3i64SOFT, LPALGETSOURCE3I64SOFT, AL_SOFT_source_latency) \
ALEXT_X_MAGIC(alGetSourcei64vSOFT, LPALGETSOURCEI64VSOFT, AL_SOFT_source_latency)
#else // empty
#define AL_SOFT_source_latency_FUNCS
#endif
#ifdef AL_SOFT_deferred_updates
#define AL_SOFT_deferred_updates_FUNCS \
ALEXT_X_MAGIC(alDeferUpdatesSOFT, LPALDEFERUPDATESSOFT, AL_SOFT_deferred_updates) \
ALEXT_X_MAGIC(alProcessUpdatesSOFT, LPALPROCESSUPDATESSOFT, AL_SOFT_deferred_updates)
#else // empty
#define AL_SOFT_deferred_updates_FUNCS
#endif
// for this header, note that it contains both al* and alc* functions
// and that the pointer-to-function-types for some have the PFNAL...PROC pattern
// while most have the LPAL... pattern as used in the other headers
#define ALEXT_H_FUNCS \
AL_EXT_STATIC_BUFFER_FUNCS \
ALC_EXT_thread_local_context_FUNCS \
AL_SOFT_buffer_sub_data_FUNCS \
AL_EXT_FOLDBACK_FUNCS \
AL_SOFT_buffer_samples_FUNCS \
ALC_SOFT_loopback_FUNCS \
AL_SOFT_source_latency_FUNCS \
AL_SOFT_deferred_updates_FUNCS
#define EFX_H_FUNCS \
ALEXT_X_MAGIC(alGenEffects, LPALGENEFFECTS, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alDeleteEffects, LPALDELETEEFFECTS, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alIsEffect, LPALISEFFECT, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alEffecti, LPALEFFECTI, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alEffectiv, LPALEFFECTIV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alEffectf, LPALEFFECTF, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alEffectfv, LPALEFFECTFV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetEffecti, LPALGETEFFECTI, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetEffectiv, LPALGETEFFECTIV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetEffectf, LPALGETEFFECTF, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetEffectfv, LPALGETEFFECTFV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGenFilters, LPALGENFILTERS, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alDeleteFilters, LPALDELETEFILTERS, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alIsFilter, LPALISFILTER, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alFilteri, LPALFILTERI, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alFilteriv, LPALFILTERIV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alFilterf, LPALFILTERF, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alFilterfv, LPALFILTERFV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetFilteri, LPALGETFILTERI, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetFilteriv, LPALGETFILTERIV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetFilterf, LPALGETFILTERF, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetFilterfv, LPALGETFILTERFV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGenAuxiliaryEffectSlots, LPALGENAUXILIARYEFFECTSLOTS, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alDeleteAuxiliaryEffectSlots, LPALDELETEAUXILIARYEFFECTSLOTS, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alIsAuxiliaryEffectSlot, LPALISAUXILIARYEFFECTSLOT, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alAuxiliaryEffectSloti, LPALAUXILIARYEFFECTSLOTI, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alAuxiliaryEffectSlotiv, LPALAUXILIARYEFFECTSLOTIV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alAuxiliaryEffectSlotf, LPALAUXILIARYEFFECTSLOTF, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alAuxiliaryEffectSlotfv, LPALAUXILIARYEFFECTSLOTFV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetAuxiliaryEffectSloti, LPALGETAUXILIARYEFFECTSLOTI, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetAuxiliaryEffectSlotiv, LPALGETAUXILIARYEFFECTSLOTIV, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetAuxiliaryEffectSlotf, LPALGETAUXILIARYEFFECTSLOTF, ALC_EXT_EFX) \
ALEXT_X_MAGIC(alGetAuxiliaryEffectSlotfv, LPALGETAUXILIARYEFFECTSLOTFV, ALC_EXT_EFX)
// list of openal extensions supported by openal-soft or mentioned in its headers
// (does *not* mean that openal-soft supports all of those!)
#define AL_EXT_LIST \
ALEXT_LIST_MAGIC(AL_EXT_STATIC_BUFFER) \
ALEXT_LIST_MAGIC(AL_EXT_FOLDBACK) \
ALEXT_LIST_MAGIC(AL_SOFT_buffer_sub_data) \
ALEXT_LIST_MAGIC(AL_SOFT_buffer_samples) \
ALEXT_LIST_MAGIC(AL_SOFT_source_latency) \
ALEXT_LIST_MAGIC(AL_SOFT_deferred_updates) \
ALEXT_LIST_MAGIC(ALC_SOFT_loopback) \
ALEXT_LIST_MAGIC(ALC_EXT_thread_local_context) \
ALEXT_LIST_MAGIC(ALC_EXT_EFX) \
ALEXT_LIST_MAGIC(ALC_EXT_CAPTURE) \
ALEXT_LIST_MAGIC(AL_SOFT_direct_channels) \
ALEXT_LIST_MAGIC(AL_SOFT_loop_points) \
ALEXT_LIST_MAGIC(AL_EXT_vorbis) \
ALEXT_LIST_MAGIC(AL_EXT_FLOAT32) \
ALEXT_LIST_MAGIC(AL_EXT_DOUBLE) \
ALEXT_LIST_MAGIC(AL_EXT_MULAW) \
ALEXT_LIST_MAGIC(AL_EXT_ALAW) \
ALEXT_LIST_MAGIC(AL_EXT_MCFORMATS) \
ALEXT_LIST_MAGIC(AL_EXT_MULAW_MCFORMATS) \
ALEXT_LIST_MAGIC(AL_EXT_IMA4) \
ALEXT_LIST_MAGIC(AL_EXT_LINEAR_DISTANCE) \
ALEXT_LIST_MAGIC(AL_EXT_OFFSET) \
ALEXT_LIST_MAGIC(AL_EXT_source_distance_model) \
ALEXT_LIST_MAGIC(ALC_EXT_disconnect) \
ALEXT_LIST_MAGIC(ALC_EXT_DEDICATED) \
ALEXT_LIST_MAGIC(AL_EXT_STEREO_ANGLES) \
ALEXT_LIST_MAGIC(AL_EXT_SOURCE_RADIUS) \
ALEXT_LIST_MAGIC(ALC_EXT_DEFAULT_FILTER_ORDER) \
ALEXT_LIST_MAGIC(AL_LOKI_IMA_ADPCM_format) \
ALEXT_LIST_MAGIC(AL_LOKI_WAVE_format) \
ALEXT_LIST_MAGIC(AL_LOKI_quadriphonic) \
ALEXT_LIST_MAGIC(ALC_LOKI_audio_channel) \
ALEXT_LIST_MAGIC(ALC_ENUMERATION_EXT) \
ALEXT_LIST_MAGIC(ALC_ENUMERATE_ALL_EXT)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment