aboutsummaryrefslogtreecommitdiffstats
path: root/utils/openal-info.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/openal-info.c')
-rw-r--r--utils/openal-info.c109
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[])