From caae305dddde434ca79f89a20d40416da43b4462 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Tue, 24 Nov 2015 21:40:15 -0800 Subject: [PATCH] Use a sorted list for unused buffers Helps ensure the buffers being unloaded due to cache limits are not likely to be needed anytime soon. --- apps/openmw/mwsound/soundmanagerimp.cpp | 29 +++++++++++++++++-------- apps/openmw/mwsound/soundmanagerimp.hpp | 6 +++-- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/apps/openmw/mwsound/soundmanagerimp.cpp b/apps/openmw/mwsound/soundmanagerimp.cpp index 3ccc1c715a..9183378f74 100644 --- a/apps/openmw/mwsound/soundmanagerimp.cpp +++ b/apps/openmw/mwsound/soundmanagerimp.cpp @@ -223,16 +223,15 @@ namespace MWSound std::cerr<< "No unused sound buffers to free, using "<getSoundDataSize(unused->mHandle); mOutput->unloadSound(unused->mHandle); unused->mHandle = 0; - mUnusedBuffers.erase(iter); + mUnusedBuffers.pop_back(); } - mUnusedBuffers.insert(sfxid); + mUnusedBuffers.push_front(sfxid); } return sfx; @@ -520,7 +519,11 @@ namespace MWSound volume * sfx->mVolume, basevol, pitch, mode|type, offset ); if(sfx->mReferences++ == 0) - mUnusedBuffers.erase(sfxid); + { + SoundList::iterator iter = std::find(mUnusedBuffers.begin(), mUnusedBuffers.end(), sfxid); + if(iter != mUnusedBuffers.end()) + mUnusedBuffers.erase(iter); + } mActiveSounds[MWWorld::Ptr()].push_back(std::make_pair(sound, sfxid)); } catch(std::exception&) @@ -552,7 +555,11 @@ namespace MWSound objpos, volume * sfx->mVolume, basevol, pitch, sfx->mMinDist, sfx->mMaxDist, mode|type, offset ); if(sfx->mReferences++ == 0) - mUnusedBuffers.erase(sfxid); + { + SoundList::iterator iter = std::find(mUnusedBuffers.begin(), mUnusedBuffers.end(), sfxid); + if(iter != mUnusedBuffers.end()) + mUnusedBuffers.erase(iter); + } if((mode&Play_NoTrack)) mActiveSounds[MWWorld::Ptr()].push_back(std::make_pair(sound, sfxid)); else @@ -582,7 +589,11 @@ namespace MWSound initialPos, volume * sfx->mVolume, basevol, pitch, sfx->mMinDist, sfx->mMaxDist, mode|type, offset ); if(sfx->mReferences++ == 0) - mUnusedBuffers.erase(sfxid); + { + SoundList::iterator iter = std::find(mUnusedBuffers.begin(), mUnusedBuffers.end(), sfxid); + if(iter != mUnusedBuffers.end()) + mUnusedBuffers.erase(iter); + } mActiveSounds[MWWorld::Ptr()].push_back(std::make_pair(sound, sfxid)); } catch(std::exception &) @@ -829,7 +840,7 @@ namespace MWSound { Sound_Buffer *sfx = &mSoundBuffers[sndidx->second]; if(sfx->mReferences-- == 1) - mUnusedBuffers.insert(sndidx->second); + mUnusedBuffers.push_front(sndidx->second); sndidx = snditer->second.erase(sndidx); } else @@ -1042,7 +1053,7 @@ namespace MWSound sndidx->first->stop(); Sound_Buffer *sfx = &mSoundBuffers[sndidx->second]; if(sfx->mReferences-- == 1) - mUnusedBuffers.insert(sndidx->second); + mUnusedBuffers.push_front(sndidx->second); } } mActiveSounds.clear(); diff --git a/apps/openmw/mwsound/soundmanagerimp.hpp b/apps/openmw/mwsound/soundmanagerimp.hpp index 9fc9084ee7..d5c9a881ea 100644 --- a/apps/openmw/mwsound/soundmanagerimp.hpp +++ b/apps/openmw/mwsound/soundmanagerimp.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -62,8 +63,9 @@ namespace MWSound typedef std::map NameLoudnessMap; NameLoudnessMap mVoiceLipBuffers; - typedef std::set SoundSet; - SoundSet mUnusedBuffers; + // NOTE: unused buffers are stored in front-newest order. + typedef std::deque SoundList; + SoundList mUnusedBuffers; boost::shared_ptr mMusic; std::string mCurrentPlaylist;