Limit the sound buffer cache to 15MB

This commit is contained in:
Chris Robinson 2015-11-23 06:52:37 -08:00
parent 0b2747098c
commit 22a6811425
5 changed files with 28 additions and 0 deletions

View file

@ -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)
{

View file

@ -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);

View file

@ -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;

View file

@ -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 "<<mBufferCacheSize<<" bytes!" <<std::endl;
break;
}
SoundSet::iterator iter = mUnusedBuffers.begin();
mBufferCacheSize -= mOutput->getSoundDataSize(*iter);
mUnusedBuffers.erase(iter);
}
mUnusedBuffers.insert(sfxiter->second.mHandle);
return &sfxiter->second;

View file

@ -49,6 +49,7 @@ namespace MWSound
typedef std::map<std::string,Sound_Buffer> NameBufferMap;
NameBufferMap mSoundBuffers;
size_t mBufferCacheSize;
// Should stream voices, but that requires handling the "lip" data
// separately from buffer loading.
NameBufferMap mVoiceSoundBuffers;