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:
commit
c7a612a891
2 changed files with 65 additions and 35 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue