From be3f759534a2a65fd97b6a7161a938601866929c Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 27 Jan 2026 09:46:02 -0500 Subject: [PATCH 1/2] Mostly Port my OpenAL EFX patch Based on some stuff from https://github.com/kcat/openal-soft/blob/master/examples/alreverb.c --- src/sdl/al_sound.c | 87 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/src/sdl/al_sound.c b/src/sdl/al_sound.c index e6f6ddf12..a4459e5b1 100644 --- a/src/sdl/al_sound.c +++ b/src/sdl/al_sound.c @@ -35,9 +35,11 @@ #endif // HAVE_ZLIB #endif // HAVE_GME -#include -#include -#include +#include "AL/al.h" +#include "AL/alc.h" +#include "AL/alext.h" +#include "AL/efx.h" +#include "AL/efx-presets.h" #include @@ -90,6 +92,45 @@ UINT8 sound_started = false; static float music_volume, sfx_volume, internal_volume = 1.0f; +/* 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 defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#define FUNCTION_CAST(T, ptr) (union{void *p; T f;}){ptr}.f +#elif defined(__cplusplus) +#define FUNCTION_CAST(T, ptr) reinterpret_cast(ptr) +#else +#define FUNCTION_CAST(T, ptr) (T)(ptr) +#endif + +// EFX +static LPALGENEFFECTS alGenEffects; +static LPALDELETEEFFECTS alDeleteEffects; +static LPALISEFFECT alIsEffect; +static LPALEFFECTI alEffecti; +static LPALEFFECTIV alEffectiv; +static LPALEFFECTF alEffectf; +static LPALEFFECTFV alEffectfv; +static LPALGETEFFECTI alGetEffecti; +static LPALGETEFFECTIV alGetEffectiv; +static LPALGETEFFECTF alGetEffectf; +static LPALGETEFFECTFV alGetEffectfv; + +/* Auxiliary Effect Slot object functions */ +static LPALGENAUXILIARYEFFECTSLOTS alGenAuxiliaryEffectSlots; +static LPALDELETEAUXILIARYEFFECTSLOTS alDeleteAuxiliaryEffectSlots; +static LPALISAUXILIARYEFFECTSLOT alIsAuxiliaryEffectSlot; +static LPALAUXILIARYEFFECTSLOTI alAuxiliaryEffectSloti; +static LPALAUXILIARYEFFECTSLOTIV alAuxiliaryEffectSlotiv; +static LPALAUXILIARYEFFECTSLOTF alAuxiliaryEffectSlotf; +static LPALAUXILIARYEFFECTSLOTFV alAuxiliaryEffectSlotfv; +static LPALGETAUXILIARYEFFECTSLOTI alGetAuxiliaryEffectSloti; +static LPALGETAUXILIARYEFFECTSLOTIV alGetAuxiliaryEffectSlotiv; +static LPALGETAUXILIARYEFFECTSLOTF alGetAuxiliaryEffectSlotf; +static LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv; + // fading static boolean is_fading; static float fading_source; @@ -305,6 +346,46 @@ void I_StartupSound(void) alcMakeContextCurrent(audio.context); + if(!alcIsExtensionPresent(alcGetContextsDevice(alcGetCurrentContext()), "ALC_EXT_EFX")) + { + I_ShutdownSound(); + I_Error("OpenAL: You do not seem to be using OpenAL-Soft.\n"); + } + +#define LOAD_PROC(T, x) ((x) = FUNCTION_CAST(T, alGetProcAddress(#x))) + LOAD_PROC(LPALGENEFFECTS, alGenEffects); + LOAD_PROC(LPALDELETEEFFECTS, alDeleteEffects); + LOAD_PROC(LPALISEFFECT, alIsEffect); + LOAD_PROC(LPALEFFECTI, alEffecti); + LOAD_PROC(LPALEFFECTIV, alEffectiv); + LOAD_PROC(LPALEFFECTF, alEffectf); + LOAD_PROC(LPALEFFECTFV, alEffectfv); + LOAD_PROC(LPALGETEFFECTI, alGetEffecti); + LOAD_PROC(LPALGETEFFECTIV, alGetEffectiv); + LOAD_PROC(LPALGETEFFECTF, alGetEffectf); + LOAD_PROC(LPALGETEFFECTFV, alGetEffectfv); + + LOAD_PROC(LPALGENAUXILIARYEFFECTSLOTS, alGenAuxiliaryEffectSlots); + LOAD_PROC(LPALDELETEAUXILIARYEFFECTSLOTS, alDeleteAuxiliaryEffectSlots); + LOAD_PROC(LPALISAUXILIARYEFFECTSLOT, alIsAuxiliaryEffectSlot); + LOAD_PROC(LPALAUXILIARYEFFECTSLOTI, alAuxiliaryEffectSloti); + LOAD_PROC(LPALAUXILIARYEFFECTSLOTIV, alAuxiliaryEffectSlotiv); + LOAD_PROC(LPALAUXILIARYEFFECTSLOTF, alAuxiliaryEffectSlotf); + LOAD_PROC(LPALAUXILIARYEFFECTSLOTFV, alAuxiliaryEffectSlotfv); + LOAD_PROC(LPALGETAUXILIARYEFFECTSLOTI, alGetAuxiliaryEffectSloti); + LOAD_PROC(LPALGETAUXILIARYEFFECTSLOTIV, alGetAuxiliaryEffectSlotiv); + LOAD_PROC(LPALGETAUXILIARYEFFECTSLOTF, alGetAuxiliaryEffectSlotf); + LOAD_PROC(LPALGETAUXILIARYEFFECTSLOTFV, alGetAuxiliaryEffectSlotfv); +#undef LOAD_PROC + + // Start EFX + // TODO: Discuss and see if we even want EFX flags for sounds and implement system if so. + //alGenEffects(1, &audio.effect); + //TRY(alEffecti, audio.effect, AL_EFFECT_TYPE, AL_EFFECT_DISTORTION); + //TRY(alEffectf, audio.effect, AL_DISTORTION_EDGE, AL_DISTORTION_MAX_EDGE); + //alGenAuxiliaryEffectSlots(1, &audio.effectslot); + //alAuxiliaryEffectSloti(audio.effectslot, AL_EFFECTSLOT_EFFECT, audio.effect); + audio.music = INVALID_HANDLE; audio.bufferindex = 0; From 9ac1edb6812aebb50fb849a51a0c991289c2a828 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 27 Jan 2026 10:13:30 -0500 Subject: [PATCH 2/2] Properly block off creative's DLL from loading --- src/sdl/al_sound.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/sdl/al_sound.c b/src/sdl/al_sound.c index a4459e5b1..e5083e510 100644 --- a/src/sdl/al_sound.c +++ b/src/sdl/al_sound.c @@ -78,6 +78,7 @@ typedef enum #include "../w_wad.h" #include "../i_threads.h" #include "../i_system.h" // I_Sleep +#include "../fastcmp.h" #include @@ -346,12 +347,24 @@ void I_StartupSound(void) alcMakeContextCurrent(audio.context); - if(!alcIsExtensionPresent(alcGetContextsDevice(alcGetCurrentContext()), "ALC_EXT_EFX")) + const char *vendor = alGetString(AL_VENDOR); + const char *renderer = alGetString(AL_RENDERER); + CONS_Printf("OpenAL Vendor: %s\n", vendor); + CONS_Printf("OpenAL Renderer: %s\n", renderer); + + + if (!fastcmp("OpenAL Soft", renderer)) { I_ShutdownSound(); I_Error("OpenAL: You do not seem to be using OpenAL-Soft.\n"); } + if(!alcIsExtensionPresent(alcGetContextsDevice(alcGetCurrentContext()), "ALC_EXT_EFX")) + { + I_ShutdownSound(); + I_Error("OpenAL: Your OpenAL version does not seem to support EFX .\n"); + } + #define LOAD_PROC(T, x) ((x) = FUNCTION_CAST(T, alGetProcAddress(#x))) LOAD_PROC(LPALGENEFFECTS, alGenEffects); LOAD_PROC(LPALDELETEEFFECTS, alDeleteEffects);