forked from mirror/openmw-tes3mp
Enforce a 15MB limit on the sound buffer cache
This commit is contained in:
parent
04638516b2
commit
fd37a4827c
2 changed files with 37 additions and 1 deletions
|
@ -469,13 +469,46 @@ ALuint OpenAL_Output::getBuffer(const std::string &fname)
|
||||||
mBufferCache[fname] = buf;
|
mBufferCache[fname] = buf;
|
||||||
mBufferRefs[buf] = 1;
|
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;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenAL_Output::bufferFinished(ALuint buf)
|
void OpenAL_Output::bufferFinished(ALuint buf)
|
||||||
{
|
{
|
||||||
if(mBufferRefs.at(buf)-- == 1)
|
if(mBufferRefs.at(buf)-- == 1)
|
||||||
|
{
|
||||||
|
mBufferRefs.erase(mBufferRefs.find(buf));
|
||||||
mUnusedBuffers.push_back(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)
|
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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,8 @@ namespace MWSound
|
||||||
typedef std::deque<ALuint> IDDq;
|
typedef std::deque<ALuint> IDDq;
|
||||||
IDDq mUnusedBuffers;
|
IDDq mUnusedBuffers;
|
||||||
|
|
||||||
|
uint64_t mBufferCacheMemSize;
|
||||||
|
|
||||||
ALuint getBuffer(const std::string &fname);
|
ALuint getBuffer(const std::string &fname);
|
||||||
void bufferFinished(ALuint buffer);
|
void bufferFinished(ALuint buffer);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue