diff options
author | Chris Robinson <[email protected]> | 2022-02-26 07:38:36 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2022-02-26 07:38:36 -0800 |
commit | f9c45eac1a52b85cd8dbbf46ecf4f4a9b7918674 (patch) | |
tree | 38fdc7ae64396d02de4c43a0784288af61e54e85 /utils | |
parent | 843a5aac6b0be0e9f17bd73b9036d4c0c1e2c227 (diff) |
Use a more compatible method to check for EFX effects
Creative's wrapper driver doesn't seem to handle EFX enums for alGetEnumValue,
let alone return values only for what's supported. The only way to check which
filter and effect types it supports is try to set them and check for errors.
Diffstat (limited to 'utils')
-rw-r--r-- | utils/openal-info.c | 109 |
1 files changed, 68 insertions, 41 deletions
diff --git a/utils/openal-info.c b/utils/openal-info.c index 4bb73e76..0a099144 100644 --- a/utils/openal-info.c +++ b/utils/openal-info.c @@ -22,6 +22,7 @@ * THE SOFTWARE. */ +#include <assert.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> @@ -33,19 +34,17 @@ #include "win_main_utf8.h" - -#ifndef ALC_ENUMERATE_ALL_EXT -#define ALC_DEFAULT_ALL_DEVICES_SPECIFIER 0x1012 -#define ALC_ALL_DEVICES_SPECIFIER 0x1013 -#endif - -#ifndef ALC_EXT_EFX -#define ALC_EFX_MAJOR_VERSION 0x20001 -#define ALC_EFX_MINOR_VERSION 0x20002 -#define ALC_MAX_AUXILIARY_SENDS 0x20003 +/* C doesn't allow casting between function and non-function pointer types, so + * with C99 we need to use a union to reinterpret the pointer type. Pre-C99 + * still needs to use a normal cast and live with the warning (C++ is fine with + * a regular reinterpret_cast). + */ +#if __STDC_VERSION__ >= 199901L +#define FUNCTION_CAST(T, ptr) (union{void *p; T f;}){ptr}.f +#else +#define FUNCTION_CAST(T, ptr) (T)(ptr) #endif - #define MAX_WIDTH 80 static void printList(const char *list, char separator) @@ -163,7 +162,8 @@ static void printHRTFInfo(ALCdevice *device) return; } - alcGetStringiSOFT = (LPALCGETSTRINGISOFT)alcGetProcAddress(device, "alcGetStringiSOFT"); + alcGetStringiSOFT = FUNCTION_CAST(LPALCGETSTRINGISOFT, + alcGetProcAddress(device, "alcGetStringiSOFT")); alcGetIntegerv(device, ALC_NUM_HRTF_SPECIFIERS_SOFT, 1, &num_hrtfs); if(!num_hrtfs) @@ -203,7 +203,7 @@ static void printResamplerInfo(void) return; } - alGetStringiSOFT = (LPALGETSTRINGISOFT)alGetProcAddress("alGetStringiSOFT"); + alGetStringiSOFT = FUNCTION_CAST(LPALGETSTRINGISOFT, alGetProcAddress("alGetStringiSOFT")); num_resamplers = alGetInteger(AL_NUM_RESAMPLERS_SOFT); def_resampler = alGetInteger(AL_DEFAULT_RESAMPLER_SOFT); @@ -225,26 +225,35 @@ static void printResamplerInfo(void) static void printEFXInfo(ALCdevice *device) { - ALCint major, minor, sends; - static const ALchar filters[][32] = { - "AL_FILTER_LOWPASS", "AL_FILTER_HIGHPASS", "AL_FILTER_BANDPASS", "" + static LPALGENFILTERS palGenFilters; + static LPALDELETEFILTERS palDeleteFilters; + static LPALFILTERI palFilteri; + static LPALGENEFFECTS palGenEffects; + static LPALDELETEEFFECTS palDeleteEffects; + static LPALEFFECTI palEffecti; + + static const ALint filters[] = { + AL_FILTER_LOWPASS, AL_FILTER_HIGHPASS, AL_FILTER_BANDPASS, + AL_FILTER_NULL }; char filterNames[] = "Low-pass,High-pass,Band-pass,"; - static const ALchar effects[][32] = { - "AL_EFFECT_EAXREVERB", "AL_EFFECT_REVERB", "AL_EFFECT_CHORUS", - "AL_EFFECT_DISTORTION", "AL_EFFECT_ECHO", "AL_EFFECT_FLANGER", - "AL_EFFECT_FREQUENCY_SHIFTER", "AL_EFFECT_VOCAL_MORPHER", - "AL_EFFECT_PITCH_SHIFTER", "AL_EFFECT_RING_MODULATOR", - "AL_EFFECT_AUTOWAH", "AL_EFFECT_COMPRESSOR", "AL_EFFECT_EQUALIZER", "" + static const ALint effects[] = { + AL_EFFECT_EAXREVERB, AL_EFFECT_REVERB, AL_EFFECT_CHORUS, + AL_EFFECT_DISTORTION, AL_EFFECT_ECHO, AL_EFFECT_FLANGER, + AL_EFFECT_FREQUENCY_SHIFTER, AL_EFFECT_VOCAL_MORPHER, + AL_EFFECT_PITCH_SHIFTER, AL_EFFECT_RING_MODULATOR, + AL_EFFECT_AUTOWAH, AL_EFFECT_COMPRESSOR, AL_EFFECT_EQUALIZER, + AL_EFFECT_NULL }; - static const ALchar dedeffects[][64] = { - "AL_EFFECT_DEDICATED_DIALOGUE", - "AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT", "" + static const ALint dedeffects[] = { + AL_EFFECT_DEDICATED_DIALOGUE, AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT, + AL_EFFECT_NULL }; char effectNames[] = "EAX Reverb,Reverb,Chorus,Distortion,Echo,Flanger," - "Frequency Shifter,Vocal Morpher,Pitch Shifter," - "Ring Modulator,Autowah,Compressor,Equalizer," - "Dedicated Dialog,Dedicated LFE,"; + "Frequency Shifter,Vocal Morpher,Pitch Shifter,Ring Modulator,Autowah," + "Compressor,Equalizer,Dedicated Dialog,Dedicated LFE,"; + ALCint major, minor, sends; + ALuint object; char *current; int i; @@ -254,6 +263,13 @@ static void printEFXInfo(ALCdevice *device) return; } + palGenFilters = FUNCTION_CAST(LPALGENFILTERS, alGetProcAddress("alGenFilters")); + palDeleteFilters = FUNCTION_CAST(LPALDELETEFILTERS, alGetProcAddress("alDeleteFilters")); + palFilteri = FUNCTION_CAST(LPALFILTERI, alGetProcAddress("alFilteri")); + palGenEffects = FUNCTION_CAST(LPALGENEFFECTS, alGetProcAddress("alGenEffects")); + palDeleteEffects = FUNCTION_CAST(LPALDELETEEFFECTS, alGetProcAddress("alDeleteEffects")); + palEffecti = FUNCTION_CAST(LPALEFFECTI, alGetProcAddress("alEffecti")); + alcGetIntegerv(device, ALC_EFX_MAJOR_VERSION, 1, &major); alcGetIntegerv(device, ALC_EFX_MINOR_VERSION, 1, &minor); if(checkALCErrors(device) == ALC_NO_ERROR) @@ -262,14 +278,17 @@ static void printEFXInfo(ALCdevice *device) if(checkALCErrors(device) == ALC_NO_ERROR) printf("Max auxiliary sends: %d\n", sends); + palGenFilters(1, &object); + checkALErrors(); + current = filterNames; - for(i = 0;filters[i][0];i++) + for(i = 0;filters[i] != AL_FILTER_NULL;i++) { char *next = strchr(current, ','); - ALenum val; + assert(next != NULL); - val = alGetEnumValue(filters[i]); - if(alGetError() != AL_NO_ERROR || val == 0 || val == -1) + palFilteri(object, AL_FILTER_TYPE, filters[i]); + if(alGetError() != AL_NO_ERROR) memmove(current, next+1, strlen(next)); else current = next+1; @@ -277,27 +296,31 @@ static void printEFXInfo(ALCdevice *device) printf("Supported filters:"); printList(filterNames, ','); + palDeleteFilters(1, &object); + palGenEffects(1, &object); + checkALErrors(); + current = effectNames; - for(i = 0;effects[i][0];i++) + for(i = 0;effects[i] != AL_EFFECT_NULL;i++) { char *next = strchr(current, ','); - ALenum val; + assert(next != NULL); - val = alGetEnumValue(effects[i]); - if(alGetError() != AL_NO_ERROR || val == 0 || val == -1) + palEffecti(object, AL_EFFECT_TYPE, effects[i]); + if(alGetError() != AL_NO_ERROR) memmove(current, next+1, strlen(next)); else current = next+1; } if(alcIsExtensionPresent(device, "ALC_EXT_DEDICATED")) { - for(i = 0;dedeffects[i][0];i++) + for(i = 0;dedeffects[i] != AL_EFFECT_NULL;i++) { char *next = strchr(current, ','); - ALenum val; + assert(next != NULL); - val = alGetEnumValue(dedeffects[i]); - if(alGetError() != AL_NO_ERROR || val == 0 || val == -1) + palEffecti(object, AL_EFFECT_TYPE, dedeffects[i]); + if(alGetError() != AL_NO_ERROR) memmove(current, next+1, strlen(next)); else current = next+1; @@ -305,14 +328,18 @@ static void printEFXInfo(ALCdevice *device) } else { - for(i = 0;dedeffects[i][0];i++) + for(i = 0;dedeffects[i] != AL_EFFECT_NULL;i++) { char *next = strchr(current, ','); + assert(next != NULL); memmove(current, next+1, strlen(next)); } } printf("Supported effects:"); printList(effectNames, ','); + + palDeleteEffects(1, &object); + checkALErrors(); } int main(int argc, char *argv[]) |