forked from mirror/openmw-tes3mp
Avoid an extra call to get the buffer size
This commit is contained in:
parent
5c53ee42a1
commit
41bb35655b
4 changed files with 22 additions and 27 deletions
|
@ -941,7 +941,7 @@ void OpenAL_Output::setHrtf(const std::string &hrtfname, HrtfMode hrtfmode)
|
|||
}
|
||||
|
||||
|
||||
Sound_Handle OpenAL_Output::loadSound(const std::string &fname)
|
||||
std::pair<Sound_Handle,size_t> OpenAL_Output::loadSound(const std::string &fname)
|
||||
{
|
||||
getALError();
|
||||
|
||||
|
@ -966,27 +966,31 @@ Sound_Handle OpenAL_Output::loadSound(const std::string &fname)
|
|||
|
||||
decoder->getInfo(&srate, &chans, &type);
|
||||
format = getALFormat(chans, type);
|
||||
if(!format) return nullptr;
|
||||
if(!format) return std::make_pair(nullptr, 0);
|
||||
|
||||
decoder->readAll(data);
|
||||
decoder->close();
|
||||
|
||||
ALint size;
|
||||
ALuint buf = 0;
|
||||
alGenBuffers(1, &buf);
|
||||
alBufferData(buf, format, &data[0], data.size(), srate);
|
||||
alBufferData(buf, format, data.data(), data.size(), srate);
|
||||
alGetBufferi(buf, AL_SIZE, &size);
|
||||
if(getALError() != AL_NO_ERROR)
|
||||
{
|
||||
if(buf && alIsBuffer(buf))
|
||||
alDeleteBuffers(1, &buf);
|
||||
getALError();
|
||||
return nullptr;
|
||||
return std::make_pair(nullptr, 0);
|
||||
}
|
||||
return MAKE_PTRID(buf);
|
||||
return std::make_pair(MAKE_PTRID(buf), size);
|
||||
}
|
||||
|
||||
void OpenAL_Output::unloadSound(Sound_Handle data)
|
||||
size_t OpenAL_Output::unloadSound(Sound_Handle data)
|
||||
{
|
||||
ALuint buffer = GET_PTRID(data);
|
||||
if(!buffer) return 0;
|
||||
|
||||
// Make sure no sources are playing this buffer before unloading it.
|
||||
SoundVec::const_iterator iter = mActiveSounds.begin();
|
||||
for(;iter != mActiveSounds.end();++iter)
|
||||
|
@ -1003,19 +1007,11 @@ void OpenAL_Output::unloadSound(Sound_Handle data)
|
|||
alSourcei(source, AL_BUFFER, 0);
|
||||
}
|
||||
}
|
||||
ALint size = 0;
|
||||
alGetBufferi(buffer, AL_SIZE, &size);
|
||||
alDeleteBuffers(1, &buffer);
|
||||
getALError();
|
||||
}
|
||||
|
||||
size_t OpenAL_Output::getSoundDataSize(Sound_Handle data) const
|
||||
{
|
||||
ALuint buffer = GET_PTRID(data);
|
||||
ALint size = 0;
|
||||
|
||||
alGetBufferi(buffer, AL_SIZE, &size);
|
||||
getALError();
|
||||
|
||||
return (ALuint)size;
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -66,9 +66,8 @@ namespace MWSound
|
|||
virtual std::vector<std::string> enumerateHrtf();
|
||||
virtual void setHrtf(const std::string &hrtfname, HrtfMode hrtfmode);
|
||||
|
||||
virtual Sound_Handle loadSound(const std::string &fname);
|
||||
virtual void unloadSound(Sound_Handle data);
|
||||
virtual size_t getSoundDataSize(Sound_Handle data) const;
|
||||
virtual std::pair<Sound_Handle,size_t> loadSound(const std::string &fname);
|
||||
virtual size_t unloadSound(Sound_Handle data);
|
||||
|
||||
virtual bool playSound(Sound *sound, Sound_Handle data, float offset);
|
||||
virtual bool playSound3D(Sound *sound, Sound_Handle data, float offset);
|
||||
|
|
|
@ -36,9 +36,8 @@ namespace MWSound
|
|||
virtual std::vector<std::string> enumerateHrtf() = 0;
|
||||
virtual void setHrtf(const std::string &hrtfname, HrtfMode hrtfmode) = 0;
|
||||
|
||||
virtual Sound_Handle loadSound(const std::string &fname) = 0;
|
||||
virtual void unloadSound(Sound_Handle data) = 0;
|
||||
virtual size_t getSoundDataSize(Sound_Handle data) const = 0;
|
||||
virtual std::pair<Sound_Handle,size_t> loadSound(const std::string &fname) = 0;
|
||||
virtual size_t unloadSound(Sound_Handle data) = 0;
|
||||
|
||||
virtual bool playSound(Sound *sound, Sound_Handle data, float offset) = 0;
|
||||
virtual bool playSound3D(Sound *sound, Sound_Handle data, float offset) = 0;
|
||||
|
|
|
@ -215,10 +215,11 @@ namespace MWSound
|
|||
|
||||
if(!sfx->mHandle)
|
||||
{
|
||||
sfx->mHandle = mOutput->loadSound(sfx->mResourceName);
|
||||
size_t size;
|
||||
std::tie(sfx->mHandle, size) = mOutput->loadSound(sfx->mResourceName);
|
||||
if(!sfx->mHandle) return nullptr;
|
||||
|
||||
mBufferCacheSize += mOutput->getSoundDataSize(sfx->mHandle);
|
||||
mBufferCacheSize += size;
|
||||
if(mBufferCacheSize > mBufferCacheMax)
|
||||
{
|
||||
do {
|
||||
|
@ -229,8 +230,8 @@ namespace MWSound
|
|||
}
|
||||
Sound_Buffer *unused = mUnusedBuffers.back();
|
||||
|
||||
mBufferCacheSize -= mOutput->getSoundDataSize(unused->mHandle);
|
||||
mOutput->unloadSound(unused->mHandle);
|
||||
size = mOutput->unloadSound(unused->mHandle);
|
||||
mBufferCacheSize -= size;
|
||||
unused->mHandle = 0;
|
||||
|
||||
mUnusedBuffers.pop_back();
|
||||
|
|
Loading…
Reference in a new issue