mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-06 18:40:23 +00:00
Cache loudness vector in the buffer cache
This commit is contained in:
parent
0943ff0886
commit
a59620f643
@ -739,7 +739,7 @@ void OpenAL_Output::deinit()
|
||||
mUnusedBuffers.clear();
|
||||
while(!mBufferCache.empty())
|
||||
{
|
||||
alDeleteBuffers(1, &mBufferCache.begin()->second);
|
||||
alDeleteBuffers(1, &mBufferCache.begin()->second.mALBuffer);
|
||||
mBufferCache.erase(mBufferCache.begin());
|
||||
}
|
||||
|
||||
@ -755,14 +755,14 @@ void OpenAL_Output::deinit()
|
||||
}
|
||||
|
||||
|
||||
ALuint OpenAL_Output::getBuffer(const std::string &fname, std::vector<float>* loudnessBuffer)
|
||||
const CachedSound& OpenAL_Output::getBuffer(const std::string &fname)
|
||||
{
|
||||
ALuint buf = 0;
|
||||
|
||||
NameMap::iterator iditer = mBufferCache.find(fname);
|
||||
if(iditer != mBufferCache.end())
|
||||
{
|
||||
buf = iditer->second;
|
||||
buf = iditer->second.mALBuffer;
|
||||
if(mBufferRefs[buf]++ == 0)
|
||||
{
|
||||
IDDq::iterator iter = std::find(mUnusedBuffers.begin(),
|
||||
@ -770,12 +770,11 @@ ALuint OpenAL_Output::getBuffer(const std::string &fname, std::vector<float>* lo
|
||||
if(iter != mUnusedBuffers.end())
|
||||
mUnusedBuffers.erase(iter);
|
||||
}
|
||||
|
||||
return iditer->second;
|
||||
}
|
||||
throwALerror();
|
||||
|
||||
if (buf != 0 && loudnessBuffer == NULL)
|
||||
return buf;
|
||||
|
||||
std::vector<char> data;
|
||||
ChannelConfig chans;
|
||||
SampleType type;
|
||||
@ -801,52 +800,49 @@ ALuint OpenAL_Output::getBuffer(const std::string &fname, std::vector<float>* lo
|
||||
decoder->readAll(data);
|
||||
decoder->close();
|
||||
|
||||
if (loudnessBuffer != NULL)
|
||||
CachedSound cached;
|
||||
analyzeLoudness(data, srate, chans, type, cached.mLoudnessVector, loudnessFPS);
|
||||
|
||||
alGenBuffers(1, &buf);
|
||||
throwALerror();
|
||||
|
||||
alBufferData(buf, format, &data[0], data.size(), srate);
|
||||
mBufferRefs[buf] = 1;
|
||||
cached.mALBuffer = buf;
|
||||
mBufferCache[fname] = cached;
|
||||
|
||||
ALint bufsize = 0;
|
||||
alGetBufferi(buf, AL_SIZE, &bufsize);
|
||||
mBufferCacheMemSize += bufsize;
|
||||
|
||||
// NOTE: Max buffer cache: 15MB
|
||||
while(mBufferCacheMemSize > 15*1024*1024)
|
||||
{
|
||||
analyzeLoudness(data, srate, chans, type, *loudnessBuffer, loudnessFPS);
|
||||
}
|
||||
|
||||
if (buf == 0)
|
||||
{
|
||||
alGenBuffers(1, &buf);
|
||||
throwALerror();
|
||||
|
||||
alBufferData(buf, format, &data[0], data.size(), srate);
|
||||
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())
|
||||
{
|
||||
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;
|
||||
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.mALBuffer == oldbuf)
|
||||
mBufferCache.erase(nameiter++);
|
||||
else
|
||||
++nameiter;
|
||||
}
|
||||
|
||||
bufsize = 0;
|
||||
alGetBufferi(oldbuf, AL_SIZE, &bufsize);
|
||||
alDeleteBuffers(1, &oldbuf);
|
||||
mBufferCacheMemSize -= bufsize;
|
||||
}
|
||||
return buf;
|
||||
|
||||
return mBufferCache[fname];
|
||||
}
|
||||
|
||||
void OpenAL_Output::bufferFinished(ALuint buf)
|
||||
@ -870,7 +866,7 @@ MWBase::SoundPtr OpenAL_Output::playSound(const std::string &fname, float vol, f
|
||||
|
||||
try
|
||||
{
|
||||
buf = getBuffer(fname);
|
||||
buf = getBuffer(fname).mALBuffer;
|
||||
sound.reset(new OpenAL_Sound(*this, src, buf, Ogre::Vector3(0.0f), vol, basevol, pitch, 1.0f, 1000.0f, flags));
|
||||
}
|
||||
catch(std::exception&)
|
||||
@ -909,12 +905,12 @@ MWBase::SoundPtr OpenAL_Output::playSound3D(const std::string &fname, const Ogre
|
||||
|
||||
try
|
||||
{
|
||||
std::vector<float> loudnessVector;
|
||||
|
||||
buf = getBuffer(fname, extractLoudness ? &loudnessVector : NULL);
|
||||
const CachedSound& cached = getBuffer(fname);
|
||||
buf = cached.mALBuffer;
|
||||
|
||||
sound.reset(new OpenAL_Sound3D(*this, src, buf, pos, vol, basevol, pitch, min, max, flags));
|
||||
sound->setLoudnessVector(loudnessVector, loudnessFPS);
|
||||
if (extractLoudness)
|
||||
sound->setLoudnessVector(cached.mLoudnessVector, loudnessFPS);
|
||||
}
|
||||
catch(std::exception&)
|
||||
{
|
||||
|
@ -16,6 +16,12 @@ namespace MWSound
|
||||
class SoundManager;
|
||||
class Sound;
|
||||
|
||||
struct CachedSound
|
||||
{
|
||||
ALuint mALBuffer;
|
||||
std::vector<float> mLoudnessVector;
|
||||
};
|
||||
|
||||
class OpenAL_Output : public Sound_Output
|
||||
{
|
||||
ALCdevice *mDevice;
|
||||
@ -25,7 +31,7 @@ namespace MWSound
|
||||
IDDq mFreeSources;
|
||||
IDDq mUnusedBuffers;
|
||||
|
||||
typedef std::map<std::string,ALuint> NameMap;
|
||||
typedef std::map<std::string,CachedSound> NameMap;
|
||||
NameMap mBufferCache;
|
||||
|
||||
typedef std::map<ALuint,ALuint> IDRefMap;
|
||||
@ -36,7 +42,7 @@ namespace MWSound
|
||||
typedef std::vector<Sound*> SoundVec;
|
||||
SoundVec mActiveSounds;
|
||||
|
||||
ALuint getBuffer(const std::string &fname, std::vector<float>* loudnessBuffer=NULL);
|
||||
const CachedSound& getBuffer(const std::string &fname);
|
||||
void bufferFinished(ALuint buffer);
|
||||
|
||||
Environment mLastEnvironment;
|
||||
|
Loading…
x
Reference in New Issue
Block a user