From fd37a4827c1d993b719abf2f8ada23153144c04a Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Mon, 19 Mar 2012 13:19:22 -0700 Subject: [PATCH] Enforce a 15MB limit on the sound buffer cache --- apps/openmw/mwsound/openal_output.cpp | 36 ++++++++++++++++++++++++++- apps/openmw/mwsound/openal_output.hpp | 2 ++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwsound/openal_output.cpp b/apps/openmw/mwsound/openal_output.cpp index a0884fb40..7768119b6 100644 --- a/apps/openmw/mwsound/openal_output.cpp +++ b/apps/openmw/mwsound/openal_output.cpp @@ -469,13 +469,46 @@ ALuint OpenAL_Output::getBuffer(const std::string &fname) mBufferCache[fname] = buf; mBufferRefs[buf] = 1; + ALint bufsize = 0; + alGetBufferi(buf, AL_SIZE, &bufsize); + mBufferCacheMemSize += bufsize; + + // NOTE: Max buffer cache: 15MB + while(mBufferCacheMemSize > 15*1024*1024) + { + if(mUnusedBuffers.empty()) + { + std::cout <<"No more unused buffers to clear!"<< std::endl; + break; + } + + ALuint oldbuf = mUnusedBuffers.front(); + mUnusedBuffers.pop_front(); + + NameMap::iterator nameiter = mBufferCache.begin(); + while(nameiter != mBufferCache.end()) + { + if(nameiter->second == oldbuf) + mBufferCache.erase(nameiter++); + else + nameiter++; + } + + bufsize = 0; + alGetBufferi(oldbuf, AL_SIZE, &bufsize); + alDeleteBuffers(1, &oldbuf); + mBufferCacheMemSize -= bufsize; + } return buf; } void OpenAL_Output::bufferFinished(ALuint buf) { if(mBufferRefs.at(buf)-- == 1) + { + mBufferRefs.erase(mBufferRefs.find(buf)); mUnusedBuffers.push_back(buf); + } } @@ -679,7 +712,8 @@ void OpenAL_Output::updateListener(const float *pos, const float *atdir, const f OpenAL_Output::OpenAL_Output(SoundManager &mgr) - : Sound_Output(mgr), mDevice(0), mContext(0), mStreamThread(new StreamThread) + : Sound_Output(mgr), mDevice(0), mContext(0), mBufferCacheMemSize(0), + mStreamThread(new StreamThread) { } diff --git a/apps/openmw/mwsound/openal_output.hpp b/apps/openmw/mwsound/openal_output.hpp index 62ec39aba..aeb64ad0d 100644 --- a/apps/openmw/mwsound/openal_output.hpp +++ b/apps/openmw/mwsound/openal_output.hpp @@ -33,6 +33,8 @@ namespace MWSound typedef std::deque IDDq; IDDq mUnusedBuffers; + uint64_t mBufferCacheMemSize; + ALuint getBuffer(const std::string &fname); void bufferFinished(ALuint buffer);