mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 09:35:28 +00:00
Choose next action for water sound in a separate function
This commit is contained in:
parent
080b0d6319
commit
b424aac25e
@ -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::WaterSoundAction, Sound_Buffer*> 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)
|
||||
|
@ -143,6 +143,17 @@ namespace MWSound
|
||||
|
||||
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& operator=(const SoundManager &rhs);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user