mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-23 18:09:43 +00:00
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);
|
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)
|
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 Sound_Handle loadSound(const std::string &fname, Sound_Loudness *loudness);
|
||||||
virtual void unloadSound(Sound_Handle data);
|
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.
|
/// @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);
|
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 Sound_Handle loadSound(const std::string &fname, Sound_Loudness *loudness=0) = 0;
|
||||||
virtual void unloadSound(Sound_Handle data) = 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.
|
/// @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;
|
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)
|
, mMusicVolume(1.0f)
|
||||||
, mVoiceVolume(1.0f)
|
, mVoiceVolume(1.0f)
|
||||||
, mFootstepsVolume(1.0f)
|
, mFootstepsVolume(1.0f)
|
||||||
|
, mBufferCacheSize(0)
|
||||||
, mListenerUnderwater(false)
|
, mListenerUnderwater(false)
|
||||||
, mListenerPos(0,0,0)
|
, mListenerPos(0,0,0)
|
||||||
, mListenerDir(1,0,0)
|
, mListenerDir(1,0,0)
|
||||||
|
@ -165,6 +166,19 @@ namespace MWSound
|
||||||
}
|
}
|
||||||
|
|
||||||
sfxiter->second.mHandle = mOutput->loadSound(sfxiter->second.mResourceName);
|
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);
|
mUnusedBuffers.insert(sfxiter->second.mHandle);
|
||||||
|
|
||||||
return &sfxiter->second;
|
return &sfxiter->second;
|
||||||
|
|
|
@ -49,6 +49,7 @@ namespace MWSound
|
||||||
|
|
||||||
typedef std::map<std::string,Sound_Buffer> NameBufferMap;
|
typedef std::map<std::string,Sound_Buffer> NameBufferMap;
|
||||||
NameBufferMap mSoundBuffers;
|
NameBufferMap mSoundBuffers;
|
||||||
|
size_t mBufferCacheSize;
|
||||||
// Should stream voices, but that requires handling the "lip" data
|
// Should stream voices, but that requires handling the "lip" data
|
||||||
// separately from buffer loading.
|
// separately from buffer loading.
|
||||||
NameBufferMap mVoiceSoundBuffers;
|
NameBufferMap mVoiceSoundBuffers;
|
||||||
|
|
Loading…
Reference in a new issue