forked from teamnwah/openmw-tes3coop
Limit the sound buffer cache to 15MB
This commit is contained in:
parent
0b2747098c
commit
22a6811425
5 changed files with 28 additions and 0 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue