diff options
Diffstat (limited to 'utils/openal-info.c')
-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[]) |