1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-01-21 08:53:52 +00:00

Merge pull request #2949 from elsid/sound_water_action

Choose next action for water sound in a separate function
This commit is contained in:
Bret Curtis 2020-07-04 00:03:17 +02:00 committed by GitHub
commit c7a612a891
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 65 additions and 35 deletions

View file

@ -885,32 +885,55 @@ namespace MWSound
playSound(*next, 1.0f, 1.0f); playSound(*next, 1.0f, 1.0f);
} }
void SoundManager::updateWaterSound(float /*duration*/) void SoundManager::updateWaterSound()
{ {
MWBase::World* world = MWBase::Environment::get().getWorld(); MWBase::World* world = MWBase::Environment::get().getWorld();
const MWWorld::ConstPtr player = world->getPlayerPtr(); const MWWorld::ConstPtr player = world->getPlayerPtr();
const ESM::Cell *curcell = player.getCell()->getCell(); const ESM::Cell *curcell = player.getCell()->getCell();
const auto update = mWaterSoundUpdater.update(player, *world); 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::WaterSoundAction, Sound_Buffer*> SoundManager::getWaterSoundAction(
const WaterSoundUpdate& update, const ESM::Cell* cell) const
{
if (mNearWaterSound) if (mNearWaterSound)
{ {
if (update.mVolume == 0.0f) if (update.mVolume == 0.0f)
{ return {WaterSoundAction::FinishSound, nullptr};
mOutput->finishSound(mNearWaterSound);
mNearWaterSound = nullptr;
}
else
{
bool soundIdChanged = false; bool soundIdChanged = false;
Sound_Buffer *sfx = lookupSound(update.mId); Sound_Buffer* sfx = lookupSound(update.mId);
if (mLastCell != curcell) if (mLastCell != cell)
{ {
mLastCell = curcell; const auto snditer = mActiveSounds.find(MWWorld::ConstPtr());
SoundMap::const_iterator snditer = mActiveSounds.find(MWWorld::Ptr()); if (snditer != mActiveSounds.end())
if(snditer != mActiveSounds.end())
{ {
SoundBufferRefPairList::const_iterator pairiter = std::find_if( const auto pairiter = std::find_if(
snditer->second.begin(), snditer->second.end(), snditer->second.begin(), snditer->second.end(),
[this](const SoundBufferRefPairList::value_type &item) -> bool [this](const SoundBufferRefPairList::value_type &item) -> bool
{ return mNearWaterSound == item.first; } { return mNearWaterSound == item.first; }
@ -920,20 +943,16 @@ namespace MWSound
} }
} }
if(soundIdChanged) if (soundIdChanged)
{ return {WaterSoundAction::PlaySound, nullptr};
mOutput->finishSound(mNearWaterSound);
mNearWaterSound = playSound(update.mId, update.mVolume, 1.0f, Type::Sfx, PlayMode::Loop); if (sfx)
} return {WaterSoundAction::SetVolume, sfx};
else if (sfx)
mNearWaterSound->setVolume(update.mVolume * sfx->mVolume);
}
} }
else if (update.mVolume > 0.0f) else if (update.mVolume > 0.0f)
{ return {WaterSoundAction::PlaySound, nullptr};
mLastCell = curcell;
mNearWaterSound = playSound(update.mId, update.mVolume, 1.0f, Type::Sfx, PlayMode::Loop); return {WaterSoundAction::DoNothing, nullptr};
}
} }
void SoundManager::updateSounds(float duration) void SoundManager::updateSounds(float duration)
@ -1115,7 +1134,7 @@ namespace MWSound
MWBase::StateManager::State_NoGame) MWBase::StateManager::State_NoGame)
{ {
updateRegionSound(duration); updateRegionSound(duration);
updateWaterSound(duration); updateWaterSound();
} }
} }

View file

@ -138,11 +138,22 @@ namespace MWSound
void updateSounds(float duration); void updateSounds(float duration);
void updateRegionSound(float duration); void updateRegionSound(float duration);
void updateWaterSound(float duration); void updateWaterSound();
void updateMusic(float duration); void updateMusic(float duration);
float volumeFromType(Type type) const; float volumeFromType(Type type) const;
enum class WaterSoundAction
{
DoNothing,
SetVolume,
FinishSound,
PlaySound,
};
std::pair<WaterSoundAction, Sound_Buffer*> getWaterSoundAction(const WaterSoundUpdate& update,
const ESM::Cell* cell) const;
SoundManager(const SoundManager &rhs); SoundManager(const SoundManager &rhs);
SoundManager& operator=(const SoundManager &rhs); SoundManager& operator=(const SoundManager &rhs);