Last active
April 10, 2018 15:10
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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