diff --git a/cmake/FindAudio.cmake b/cmake/FindAudio.cmake index 7dba9fcc0..140a509bd 100644 --- a/cmake/FindAudio.cmake +++ b/cmake/FindAudio.cmake @@ -14,6 +14,7 @@ # This module chooses an audio provider for use in OpenClonk. macro(__FINDAUDIO_FINDOPENAL) + set(HAVE_ALEXT FALSE) find_package(PkgConfig QUIET) if(PKG_CONFIG_FOUND AND NOT(APPLE)) pkg_check_modules(OpenAL "openal>=1.13") @@ -23,6 +24,8 @@ macro(__FINDAUDIO_FINDOPENAL) # of directories that pkg_check_modules returned, and if not, add it to # the include path. if (OpenAL_FOUND) + # OpenAL pkg-config data always includes alext.h + set(HAVE_ALEXT TRUE) find_path(__findaudio_al_h NAMES al.h PATHS ${OpenAL_INCLUDE_DIRS}) if (NOT __findaudio_al_h) find_path(__findaudio_al_h NAMES al.h PATHS ${OpenAL_INCLUDE_DIRS} PATH_SUFFIXES OpenAL AL) @@ -37,7 +40,16 @@ macro(__FINDAUDIO_FINDOPENAL) pkg_check_modules(OggVorbis "vorbisfile>=1.3.2" "vorbis>=1.3.2" "ogg>=1.2.2") else() if(MSVC OR APPLE) - find_path(OpenAL_INCLUDE_DIRS al.h PATH_SUFFIXES include/AL include/OpenAL include OpenAL) + # We need OpenAL preferrably with alext.h. + find_path(OpenALExt_INCLUDE_DIRS alext.h PATH_SUFFIXES include/AL include/OpenAL include OpenAL) + if(OpenALExt_INCLUDE_DIRS) + set(HAVE_ALEXT TRUE) + set(OpenAL_INCLUDE_DIRS ${OpenALExt_INCLUDE_DIRS}) + else() + set(HAVE_ALEXT FALSE) + # Maybe only al.h can be found without alext.h? + find_path(OpenAL_INCLUDE_DIRS al.h PATH_SUFFIXES include/AL include/OpenAL include OpenAL) + endif() find_path(Vorbis_INCLUDE_DIRS vorbis/codec.h vorbis/vorbisfile.h PATH_SUFFIXES include) find_library(Ogg_LIBRARY NAMES libogg_static libogg ogg) find_library(Vorbis_LIBRARY NAMES libvorbis_static libvorbis vorbis) @@ -92,6 +104,9 @@ else() if(OpenAL_FOUND AND Alut_FOUND AND OggVorbis_FOUND) # Prefer OpenAL set(Audio_TK "OpenAL") + if (NOT HAVE_ALEXT) + message(STATUS "Warning: Found OpenAL but no extensions (alext.h). Sound modifiers will be disabled.") + endif() elseif(SDLMixer_FOUND) set(Audio_TK "SDL_Mixer") elseif(FMOD_FOUND) diff --git a/config.h.cmake b/config.h.cmake index b415756fe..ce3cf50c7 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -194,3 +194,6 @@ #define AUDIO_TK_FMOD 2 #define AUDIO_TK_SDL_MIXER 3 #define AUDIO_TK AUDIO_TK_${Audio_TK_UPPER} + +/* Include OpenAL extensions (alext.h) for sound modifiers */ +#cmakedefine HAVE_ALEXT 1 diff --git a/src/platform/C4SoundIncludes.h b/src/platform/C4SoundIncludes.h index 940649615..ca563c1f6 100644 --- a/src/platform/C4SoundIncludes.h +++ b/src/platform/C4SoundIncludes.h @@ -29,16 +29,11 @@ typedef struct Mix_Chunk* C4SoundHandle; # include #elif AUDIO_TK == AUDIO_TK_OPENAL -# ifdef __APPLE__ -# include -# include -# include -# include -# else -# include -# include -# include -# endif +# include +# include +# ifdef HAVE_ALEXT +# include +# endif typedef ALuint C4SoundHandle; # ifdef _WIN32 // This is an ugly hack to make FreeALUT not dllimport everything. diff --git a/src/platform/C4SoundInstance.cpp b/src/platform/C4SoundInstance.cpp index f53a60ef2..fbb6b6e55 100644 --- a/src/platform/C4SoundInstance.cpp +++ b/src/platform/C4SoundInstance.cpp @@ -471,7 +471,7 @@ void C4SoundInstance::SetModifier(C4SoundModifier *new_modifier, bool is_global) } else { -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) alSource3i(iChannel, AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, 0, AL_FILTER_NULL); #endif } diff --git a/src/platform/C4SoundModifiers.cpp b/src/platform/C4SoundModifiers.cpp index ca66f7464..5ed131561 100644 --- a/src/platform/C4SoundModifiers.cpp +++ b/src/platform/C4SoundModifiers.cpp @@ -25,7 +25,7 @@ #include #include -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) static LPALGENEFFECTS alGenEffects; static LPALDELETEEFFECTS alDeleteEffects; static LPALISEFFECT alIsEffect; @@ -51,13 +51,13 @@ static LPALGETAUXILIARYEFFECTSLOTFV alGetAuxiliaryEffectSlotfv; #endif C4SoundModifier::C4SoundModifier(C4PropList *in_props) : instance_count(0) -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) , effect(0u), slot(0u) #endif { props.SetPropList(in_props); Application.SoundSystem.Modifiers.Add(this); -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) Application.MusicSystem.SelectContext(); alGenEffects(1, &effect); alGenAuxiliaryEffectSlots(1, &slot); @@ -66,7 +66,7 @@ C4SoundModifier::C4SoundModifier(C4PropList *in_props) : instance_count(0) C4SoundModifier::~C4SoundModifier() { -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) // failsafe effect removal if (alIsEffect(effect)) alDeleteEffects(1, &effect); @@ -78,7 +78,7 @@ C4SoundModifier::~C4SoundModifier() void C4SoundModifier::Update() { -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) // update AL effect slot if (slot) { @@ -92,7 +92,9 @@ void C4SoundModifier::Update() void C4SoundModifier::ApplyTo(ALuint source) { // apply slot to source if valid +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) if (slot) alSource3i(source, AL_AUXILIARY_SEND_FILTER, slot, 0, AL_FILTER_NULL); +#endif } float C4SoundModifier::GetFloatProp(C4PropertyName key, float ratio, float default_value) @@ -112,14 +114,14 @@ bool C4SoundModifier::GetBoolProp(C4PropertyName key, bool default_value) C4SoundModifierReverb::C4SoundModifierReverb(C4PropList *in_props) : C4SoundModifier(in_props) { -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_REVERB); #endif } void C4SoundModifierReverb::Update() { -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) // use the cave preset as default for the reverb modifier Application.MusicSystem.SelectContext(); alEffectf(effect, AL_REVERB_DENSITY, GetFloatProp(P_Reverb_Density, 1000, 1.0f)); @@ -142,14 +144,14 @@ void C4SoundModifierReverb::Update() C4SoundModifierEcho::C4SoundModifierEcho(C4PropList *in_props) : C4SoundModifier(in_props) { -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_ECHO); #endif } void C4SoundModifierEcho::Update() { -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) // use default OpenAL echo preset Application.MusicSystem.SelectContext(); alEffectf(effect, AL_ECHO_DELAY, GetFloatProp(P_Echo_Delay, 1000, 0.1f)); @@ -164,14 +166,14 @@ void C4SoundModifierEcho::Update() C4SoundModifierEqualizer::C4SoundModifierEqualizer(C4PropList *in_props) : C4SoundModifier(in_props) { -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) alEffecti(effect, AL_EFFECT_TYPE, AL_EFFECT_EQUALIZER); #endif } void C4SoundModifierEqualizer::Update() { -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) // use default OpenAL equalizer preset Application.MusicSystem.SelectContext(); alEffectf(effect, AL_EQUALIZER_LOW_GAIN, GetFloatProp(P_Equalizer_Low_Gain, 1000, 1.0f)); @@ -197,7 +199,7 @@ C4SoundModifierList::C4SoundModifierList() void C4SoundModifierList::Init() { is_initialized = false; -#if AUDIO_TK == AUDIO_TK_OPENAL +#if (AUDIO_TK == AUDIO_TK_OPENAL) && defined(HAVE_ALEXT) #define LOAD_ALPROC(x) ((void *&)(x) = alGetProcAddress(#x)) Application.MusicSystem.SelectContext(); if (!alcIsExtensionPresent(Application.MusicSystem.GetDevice(), "ALC_EXT_EFX"))