diff --git a/apps/openmw/mwsound/soundmanagerimp.cpp b/apps/openmw/mwsound/soundmanagerimp.cpp index e340138c6..3f21487bc 100644 --- a/apps/openmw/mwsound/soundmanagerimp.cpp +++ b/apps/openmw/mwsound/soundmanagerimp.cpp @@ -892,48 +892,67 @@ namespace MWSound const ESM::Cell *curcell = player.getCell()->getCell(); const auto update = mWaterSoundUpdater.update(player, *world); + WaterSoundAction action; + Sound_Buffer* sfx; + std::tie(action, sfx) = getWaterSoundAction(update, curcell); + + switch (action) + { + case WaterSoundAction::DoNothing: + break; + case WaterSoundAction::SetVolume: + mNearWaterSound->setVolume(update.mVolume * sfx->mVolume); + break; + case WaterSoundAction::FinishSound: + mOutput->finishSound(mNearWaterSound); + mNearWaterSound = nullptr; + break; + case WaterSoundAction::PlaySound: + if (mNearWaterSound) + mOutput->finishSound(mNearWaterSound); + mNearWaterSound = playSound(update.mId, update.mVolume, 1.0f, Type::Sfx, PlayMode::Loop); + break; + } + + mLastCell = curcell; + } + + std::pair SoundManager::getWaterSoundAction( + const WaterSoundUpdate& update, const ESM::Cell* cell) const + { if (mNearWaterSound) { if (update.mVolume == 0.0f) - { - mOutput->finishSound(mNearWaterSound); - mNearWaterSound = nullptr; - } - else - { - bool soundIdChanged = false; + return {WaterSoundAction::FinishSound, nullptr}; - Sound_Buffer *sfx = lookupSound(update.mId); - if (mLastCell != curcell) - { - mLastCell = curcell; - SoundMap::const_iterator snditer = mActiveSounds.find(MWWorld::Ptr()); - if(snditer != mActiveSounds.end()) - { - SoundBufferRefPairList::const_iterator pairiter = std::find_if( - snditer->second.begin(), snditer->second.end(), - [this](const SoundBufferRefPairList::value_type &item) -> bool - { return mNearWaterSound == item.first; } - ); - if (pairiter != snditer->second.end() && pairiter->second != sfx) - soundIdChanged = true; - } - } + bool soundIdChanged = false; - if(soundIdChanged) + Sound_Buffer* sfx = lookupSound(update.mId); + if (mLastCell != cell) + { + const auto snditer = mActiveSounds.find(MWWorld::ConstPtr()); + if (snditer != mActiveSounds.end()) { - mOutput->finishSound(mNearWaterSound); - mNearWaterSound = playSound(update.mId, update.mVolume, 1.0f, Type::Sfx, PlayMode::Loop); + const auto pairiter = std::find_if( + snditer->second.begin(), snditer->second.end(), + [this](const SoundBufferRefPairList::value_type &item) -> bool + { return mNearWaterSound == item.first; } + ); + if (pairiter != snditer->second.end() && pairiter->second != sfx) + soundIdChanged = true; } - else if (sfx) - mNearWaterSound->setVolume(update.mVolume * sfx->mVolume); } + + if (soundIdChanged) + return {WaterSoundAction::PlaySound, nullptr}; + + if (sfx) + return {WaterSoundAction::SetVolume, sfx}; } else if (update.mVolume > 0.0f) - { - mLastCell = curcell; - mNearWaterSound = playSound(update.mId, update.mVolume, 1.0f, Type::Sfx, PlayMode::Loop); - } + return {WaterSoundAction::PlaySound, nullptr}; + + return {WaterSoundAction::DoNothing, nullptr}; } void SoundManager::updateSounds(float duration) diff --git a/apps/openmw/mwsound/soundmanagerimp.hpp b/apps/openmw/mwsound/soundmanagerimp.hpp index fc1687386..90bf4b12c 100644 --- a/apps/openmw/mwsound/soundmanagerimp.hpp +++ b/apps/openmw/mwsound/soundmanagerimp.hpp @@ -143,6 +143,17 @@ namespace MWSound float volumeFromType(Type type) const; + enum class WaterSoundAction + { + DoNothing, + SetVolume, + FinishSound, + PlaySound, + }; + + std::pair getWaterSoundAction(const WaterSoundUpdate& update, + const ESM::Cell* cell) const; + SoundManager(const SoundManager &rhs); SoundManager& operator=(const SoundManager &rhs);