From 22a681142599f266986b6f89e8f5d0e743fec0f3 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Mon, 23 Nov 2015 06:52:37 -0800 Subject: [PATCH] Limit the sound buffer cache to 15MB --- apps/openmw/mwsound/openal_output.cpp | 11 +++++++++++ apps/openmw/mwsound/openal_output.hpp | 1 + apps/openmw/mwsound/sound_output.hpp | 1 + apps/openmw/mwsound/soundmanagerimp.cpp | 14 ++++++++++++++ apps/openmw/mwsound/soundmanagerimp.hpp | 1 + 5 files changed, 28 insertions(+) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index 82d56ffa0..47acb414e 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -813,6 +813,17 @@ void OpenAL_Output::unloadSound(Sound_Handle data) alDeleteBuffers(1, &buffer); } +size_t OpenAL_Output::getSoundDataSize(Sound_Handle data) const +{ + ALuint buffer = GET_PTRID(data); + ALint size = 0; + + alGetBufferi(buffer, AL_SIZE, &size); + throwALerror(); + + return (ALuint)size; +} + MWBase::SoundPtr OpenAL_Output::playSound(Sound_Handle data, float vol, float basevol, float pitch, int flags,float offset) { diff --git a/apps/openmw/mwsound/openal_output.hpp b/apps/openmw/mwsound/openal_output.hpp index b4c788faa..3186706a3 100644 --- a/apps/openmw/mwsound/openal_output.hpp +++ b/apps/openmw/mwsound/openal_output.hpp @@ -35,6 +35,7 @@ namespace MWSound virtual Sound_Handle loadSound(const std::string &fname, Sound_Loudness *loudness); virtual void unloadSound(Sound_Handle data); + virtual size_t getSoundDataSize(Sound_Handle data) const; /// @param offset Value from [0,1] meaning from which fraction the sound the playback starts. virtual MWBase::SoundPtr playSound(Sound_Handle data, float vol, float basevol, float pitch, int flags, float offset); diff --git a/apps/openmw/mwsound/sound_output.hpp b/apps/openmw/mwsound/sound_output.hpp index 4c1691ed1..f0b3fc465 100644 --- a/apps/openmw/mwsound/sound_output.hpp +++ b/apps/openmw/mwsound/sound_output.hpp @@ -25,6 +25,7 @@ namespace MWSound virtual Sound_Handle loadSound(const std::string &fname, Sound_Loudness *loudness=0) = 0; virtual void unloadSound(Sound_Handle data) = 0; + virtual size_t getSoundDataSize(Sound_Handle data) const = 0; /// @param offset Value from [0,1] meaning from which fraction the sound the playback starts. virtual MWBase::SoundPtr playSound(Sound_Handle data, float vol, float basevol, float pitch, int flags, float offset) = 0; diff --git a/apps/openmw/mwsound/soundmanagerimp.cpp b/apps/openmw/mwsound/soundmanagerimp.cpp index 7f0a11817..b758ef7d6 100644 --- a/apps/openmw/mwsound/soundmanagerimp.cpp +++ b/apps/openmw/mwsound/soundmanagerimp.cpp @@ -40,6 +40,7 @@ namespace MWSound , mMusicVolume(1.0f) , mVoiceVolume(1.0f) , mFootstepsVolume(1.0f) + , mBufferCacheSize(0) , mListenerUnderwater(false) , mListenerPos(0,0,0) , mListenerDir(1,0,0) @@ -165,6 +166,19 @@ namespace MWSound } sfxiter->second.mHandle = mOutput->loadSound(sfxiter->second.mResourceName); + mBufferCacheSize += mOutput->getSoundDataSize(sfxiter->second.mHandle); + // NOTE: Max sound buffer cache size is 15MB. Make configurable? + while(mBufferCacheSize > 15*1024*1024) + { + if(mUnusedBuffers.empty()) + { + std::cerr<< "No unused sound buffers to free, using "<getSoundDataSize(*iter); + mUnusedBuffers.erase(iter); + } mUnusedBuffers.insert(sfxiter->second.mHandle); return &sfxiter->second; diff --git a/apps/openmw/mwsound/soundmanagerimp.hpp b/apps/openmw/mwsound/soundmanagerimp.hpp index cb6c93044..ff0ff28b4 100644 --- a/apps/openmw/mwsound/soundmanagerimp.hpp +++ b/apps/openmw/mwsound/soundmanagerimp.hpp @@ -49,6 +49,7 @@ namespace MWSound typedef std::map NameBufferMap; NameBufferMap mSoundBuffers; + size_t mBufferCacheSize; // Should stream voices, but that requires handling the "lip" data // separately from buffer loading. NameBufferMap mVoiceSoundBuffers;