From a69a06c249d22a88634cefbf3c8a905fce34a067 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Thu, 26 Feb 2015 21:52:03 -0600 Subject: [PATCH] Enable underwater effect for FMOD 4.36+ - The FMOD_DSP_TYPE_REVERB unit was removed in FMOD 4.36. It has been replaced by a FMOD_DSP_TYPE_SFXREVERB unit, which is what should have been used in the first place. --- src/sound/fmodsound.cpp | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/sound/fmodsound.cpp b/src/sound/fmodsound.cpp index d23a2d710..706c8aeaa 100644 --- a/src/sound/fmodsound.cpp +++ b/src/sound/fmodsound.cpp @@ -1046,7 +1046,6 @@ bool FMODSoundRenderer::Init() } // Create DSP units for underwater effect -#if FMOD_VERSION < 0x43600 result = Sys->createDSPByType(FMOD_DSP_TYPE_LOWPASS, &WaterLP); if (result != FMOD_OK) { @@ -1054,15 +1053,12 @@ bool FMODSoundRenderer::Init() } else { - result = Sys->createDSPByType(FMOD_DSP_TYPE_REVERB, &WaterReverb); + result = Sys->createDSPByType(FMOD_DSP_TYPE_SFXREVERB, &WaterReverb); if (result != FMOD_OK) { Printf(TEXTCOLOR_BLUE" Could not create underwater reverb unit. (Error %d)\n", result); } } -#else - result = FMOD_ERR_UNSUPPORTED; -#endif // Connect underwater DSP unit between PausableSFX and SFX groups, while // retaining the connection established by SfxGroup->addGroup(). @@ -1109,32 +1105,35 @@ bool FMODSoundRenderer::Init() WaterLP->setActive(false); WaterLP->setParameter(FMOD_DSP_LOWPASS_CUTOFF, snd_waterlp); WaterLP->setParameter(FMOD_DSP_LOWPASS_RESONANCE, 2); -#if FMOD_VERSION < 0x43600 + if (WaterReverb != NULL) { - FMOD::DSPConnection *dry; - result = WaterReverb->addInput(pausable_head, &dry); + result = WaterReverb->addInput(WaterLP, NULL); if (result == FMOD_OK) { - result = dry->setMix(0.1f); + result = sfx_head->addInput(WaterReverb, NULL); if (result == FMOD_OK) { - result = WaterReverb->addInput(WaterLP, NULL); - if (result == FMOD_OK) - { - result = sfx_head->addInput(WaterReverb, NULL); - if (result == FMOD_OK) - { - WaterReverb->setParameter(FMOD_DSP_REVERB_ROOMSIZE, 0.001f); - WaterReverb->setParameter(FMOD_DSP_REVERB_DAMP, 0.2f); - WaterReverb->setActive(false); - } - } +// WaterReverb->setParameter(FMOD_DSP_REVERB_ROOMSIZE, 0.001f); +// WaterReverb->setParameter(FMOD_DSP_REVERB_DAMP, 0.2f); + + // These parameters are entirely empirical and can probably + // stand some improvement, but it sounds remarkably close + // to the old reverb unit's output. + WaterReverb->setParameter(FMOD_DSP_SFXREVERB_LFREFERENCE, 150); + WaterReverb->setParameter(FMOD_DSP_SFXREVERB_HFREFERENCE, 10000); + WaterReverb->setParameter(FMOD_DSP_SFXREVERB_ROOM, 0); + WaterReverb->setParameter(FMOD_DSP_SFXREVERB_ROOMHF, -5000); + WaterReverb->setParameter(FMOD_DSP_SFXREVERB_DRYLEVEL, 0); + WaterReverb->setParameter(FMOD_DSP_SFXREVERB_DECAYHFRATIO, 1); + WaterReverb->setParameter(FMOD_DSP_SFXREVERB_DECAYTIME, 0.25f); + WaterReverb->setParameter(FMOD_DSP_SFXREVERB_DENSITY, 100); + WaterReverb->setParameter(FMOD_DSP_SFXREVERB_DIFFUSION, 100); + WaterReverb->setActive(false); } } } else -#endif { result = sfx_head->addInput(WaterLP, NULL); }