aboutsummaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2022-02-26 07:38:36 -0800
committerChris Robinson <[email protected]>2022-02-26 07:38:36 -0800
commitf9c45eac1a52b85cd8dbbf46ecf4f4a9b7918674 (patch)
tree38fdc7ae64396d02de4c43a0784288af61e54e85 /utils
parent843a5aac6b0be0e9f17bd73b9036d4c0c1e2c227 (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.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[])