diff --git a/neo/sound/snd_local.h b/neo/sound/snd_local.h index 8705c7bd..ccb1125b 100644 --- a/neo/sound/snd_local.h +++ b/neo/sound/snd_local.h @@ -593,7 +593,8 @@ public: idStr listenerAreaName; ALuint listenerEffect; ALuint listenerSlot; - ALuint listenerFilter; + bool listenerAreFiltersInitialized; + ALuint listenerFilters[2]; // 0 - direct; 1 - send. int gameMsec; int game44kHz; diff --git a/neo/sound/snd_world.cpp b/neo/sound/snd_world.cpp index b79317a6..5ef70947 100644 --- a/neo/sound/snd_world.cpp +++ b/neo/sound/snd_world.cpp @@ -61,23 +61,37 @@ void idSoundWorldLocal::Init( idRenderWorld *renderWorld ) { } } - if (!soundSystemLocal.alIsFilter(listenerFilter)) { - alGetError(); + if (!listenerAreFiltersInitialized) { + listenerAreFiltersInitialized = true; - soundSystemLocal.alGenFilters(1, &listenerFilter); + alGetError(); + soundSystemLocal.alGenFilters(2, listenerFilters); ALuint e = alGetError(); if (e != AL_NO_ERROR) { common->Warning("idSoundWorldLocal::Init: alGenFilters failed: 0x%x", e); - listenerFilter = AL_FILTER_NULL; + listenerFilters[0] = AL_FILTER_NULL; + listenerFilters[1] = AL_FILTER_NULL; } else { - soundSystemLocal.alFilteri(listenerFilter, AL_FILTER_TYPE, AL_FILTER_LOWPASS); + soundSystemLocal.alFilteri(listenerFilters[0], AL_FILTER_TYPE, AL_FILTER_LOWPASS); // original EAX occusion value was -1150 // default OCCLUSIONLFRATIO is 0.25 + // default OCCLUSIONDIRECTRATIO is 1.0 - // pow(10.0, (-1150*0.25)/2000.0) - soundSystemLocal.alFilterf(listenerFilter, AL_LOWPASS_GAIN, 0.718208f); - // pow(10.0, -1150/2000.0) - soundSystemLocal.alFilterf(listenerFilter, AL_LOWPASS_GAINHF, 0.266073f); + // pow(10.0, (-1150*0.25*1.0)/2000.0) + soundSystemLocal.alFilterf(listenerFilters[0], AL_LOWPASS_GAIN, 0.718208f); + // pow(10.0, (-1150*1.0)/2000.0) + soundSystemLocal.alFilterf(listenerFilters[0], AL_LOWPASS_GAINHF, 0.266073f); + + + soundSystemLocal.alFilteri(listenerFilters[1], AL_FILTER_TYPE, AL_FILTER_LOWPASS); + // original EAX occusion value was -1150 + // default OCCLUSIONLFRATIO is 0.25 + // default OCCLUSIONROOMRATIO is 1.5 + + // pow(10.0, (-1150*(0.25+1.5-1.0))/2000.0) + soundSystemLocal.alFilterf(listenerFilters[1], AL_LOWPASS_GAIN, 0.370467f); + // pow(10.0, (-1150*1.5)/2000.0) + soundSystemLocal.alFilterf(listenerFilters[1], AL_LOWPASS_GAINHF, 0.137246f); } } } @@ -113,6 +127,7 @@ idSoundWorldLocal::idSoundWorldLocal =============== */ idSoundWorldLocal::idSoundWorldLocal() { + listenerAreFiltersInitialized = false; } /* @@ -147,9 +162,14 @@ void idSoundWorldLocal::Shutdown() { listenerSlot = AL_EFFECTSLOT_NULL; } - if (soundSystemLocal.alIsFilter(listenerFilter)) { - soundSystemLocal.alDeleteFilters(1, &listenerFilter); - listenerFilter = AL_FILTER_NULL; + if (listenerAreFiltersInitialized) { + listenerAreFiltersInitialized = false; + + if (listenerFilters[0] != AL_FILTER_NULL && listenerFilters[1] != AL_FILTER_NULL) { + soundSystemLocal.alDeleteFilters(2, listenerFilters); + listenerFilters[0] = AL_FILTER_NULL; + listenerFilters[1] = AL_FILTER_NULL; + } } } @@ -1792,9 +1812,10 @@ void idSoundWorldLocal::AddChannelContribution( idSoundEmitterLocal *sound, idSo if (idSoundSystemLocal::useEFXReverb) { if (enviroSuitActive) { - alSourcei(chan->openalSource, AL_DIRECT_FILTER, listenerFilter); - alSource3i(chan->openalSource, AL_AUXILIARY_SEND_FILTER, listenerSlot, 0, listenerFilter); + alSourcei(chan->openalSource, AL_DIRECT_FILTER, listenerFilters[0]); + alSource3i(chan->openalSource, AL_AUXILIARY_SEND_FILTER, listenerSlot, 0, listenerFilters[1]); } else { + alSourcei(chan->openalSource, AL_DIRECT_FILTER, AL_FILTER_NULL); alSource3i(chan->openalSource, AL_AUXILIARY_SEND_FILTER, listenerSlot, 0, AL_FILTER_NULL); } }