From fff9d235e49f5957e6d84b4774ca42c1a6cbcd35 Mon Sep 17 00:00:00 2001 From: erihel Date: Fri, 4 Jan 2013 21:44:16 +0100 Subject: * Fixed problem with freeing buffers while conneted to a source resulting with "Unable to unload buffer message" * Fixed posible segfault while trying to play sound after not loading file properly --- src/sound/oalsound/alsound.cpp | 20 +++++++++++++++----- src/sound/oalsound/channel.cpp | 35 ++++++++++++++++++++++++++++------- src/sound/oalsound/channel.h | 1 + 3 files changed, 44 insertions(+), 12 deletions(-) (limited to 'src/sound/oalsound') diff --git a/src/sound/oalsound/alsound.cpp b/src/sound/oalsound/alsound.cpp index f683a62..b8dbcda 100644 --- a/src/sound/oalsound/alsound.cpp +++ b/src/sound/oalsound/alsound.cpp @@ -49,9 +49,14 @@ void ALSound::CleanUp() if (mEnabled) { GetLogger()->Info("Unloading files and closing device...\n"); StopAll(); + + for (auto channel : mChannels) { + delete channel.second; + } - for (auto item : mSounds) + for (auto item : mSounds) { delete item.second; + } mEnabled = false; alutExit(); @@ -213,7 +218,7 @@ bool ALSound::SearchFreeBuffer(Sound sound, int &channel, bool &bAlreadyLoaded) it.second->SetPriority(priority); channel = it.first; - bAlreadyLoaded = true; + bAlreadyLoaded = it.second->IsLoaded(); return true; } @@ -296,15 +301,20 @@ int ALSound::Play(Sound sound, Math::Vector pos, float amplitude, float frequenc GetLogger()->Warn("Sound %d was not loaded!\n", sound); return -1; } - + GetLogger()->Trace("ALSound::Play sound: %d volume: %f frequency: %f\n", sound, amplitude, frequency); int channel; bool bAlreadyLoaded; if (!SearchFreeBuffer(sound, channel, bAlreadyLoaded)) return -1; - if ( !bAlreadyLoaded ) { - mChannels[channel]->SetBuffer(mSounds[sound]); + + bAlreadyLoaded = false; + if (!bAlreadyLoaded) { + if (!mChannels[channel]->SetBuffer(mSounds[sound])) { + GetLogger()->Trace("ALSound::Play SetBuffer failed\n"); + return -1; + } } Position(channel, pos); diff --git a/src/sound/oalsound/channel.cpp b/src/sound/oalsound/channel.cpp index 7d8244b..e1bf202 100644 --- a/src/sound/oalsound/channel.cpp +++ b/src/sound/oalsound/channel.cpp @@ -36,6 +36,7 @@ Channel::Channel() { Channel::~Channel() { if (mReady) { + alSourceStop(mSource); alSourcei(mSource, AL_BUFFER, 0); alDeleteSources(1, &mSource); if (alCheck()) @@ -45,7 +46,7 @@ Channel::~Channel() { bool Channel::Play() { - if (!mReady) + if (!mReady || mBuffer == nullptr) return false; alSourcePlay(mSource); @@ -56,7 +57,7 @@ bool Channel::Play() { bool Channel::SetPosition(Math::Vector pos) { - if (!mReady) + if (!mReady || mBuffer == nullptr) return false; alSource3f(mSource, AL_POSITION, pos.x, pos.y, pos.z); @@ -70,7 +71,7 @@ bool Channel::SetPosition(Math::Vector pos) { bool Channel::SetFrequency(float freq) { - if (!mReady) + if (!mReady || mBuffer == nullptr) return false; alSourcef(mSource, AL_PITCH, freq); @@ -85,7 +86,7 @@ bool Channel::SetFrequency(float freq) float Channel::GetFrequency() { ALfloat freq; - if (!mReady) + if (!mReady || mBuffer == nullptr) return 0; alGetSourcef(mSource, AL_PITCH, &freq); @@ -100,7 +101,7 @@ float Channel::GetFrequency() bool Channel::SetVolume(float vol) { - if (!mReady || vol < 0) + if (!mReady || vol < 0 || mBuffer == nullptr) return false; alSourcef(mSource, AL_GAIN, vol / MAXVOLUME); @@ -115,7 +116,7 @@ bool Channel::SetVolume(float vol) float Channel::GetVolume() { ALfloat vol; - if (!mReady) + if (!mReady || mBuffer == nullptr) return 0; alGetSourcef(mSource, AL_GAIN, &vol); @@ -201,6 +202,9 @@ void Channel::ResetOper() Sound Channel::GetSoundType() { + if (!mReady || mBuffer == nullptr) + return SOUND_NONE; + return mBuffer->GetSoundType(); } @@ -233,7 +237,8 @@ void Channel::AdjustVolume(float volume) { bool Channel::IsPlaying() { ALint status; - if (!mReady) return false; + if (!mReady || mBuffer == nullptr) + return false; alGetSourcei(mSource, AL_SOURCE_STATE, &status); if (alCheck()) { @@ -249,8 +254,15 @@ bool Channel::IsReady() { return mReady; } +bool Channel::IsLoaded() { + return mBuffer == nullptr; +} + bool Channel::Stop() { + if (!mReady || mBuffer == nullptr) + return false; + alSourceStop(mSource); if (alCheck()) { GetLogger()->Warn("Could not stop sound. Code: %d\n", alGetCode()); @@ -262,6 +274,9 @@ bool Channel::Stop() { float Channel::GetCurrentTime() { + if (!mReady || mBuffer == nullptr) + return 0.0f; + ALfloat current; alGetSourcef(mSource, AL_SEC_OFFSET, ¤t); if (alCheck()) { @@ -274,6 +289,9 @@ float Channel::GetCurrentTime() void Channel::SetCurrentTime(float current) { + if (!mReady || mBuffer == nullptr) + return; + alSourcef(mSource, AL_SEC_OFFSET, current); if (alCheck()) GetLogger()->Warn("Could not get source current play time. Code: %d\n", alGetCode()); @@ -282,6 +300,9 @@ void Channel::SetCurrentTime(float current) float Channel::GetDuration() { + if (!mReady || mBuffer == nullptr) + return 0.0f; + return mBuffer->GetDuration(); } diff --git a/src/sound/oalsound/channel.h b/src/sound/oalsound/channel.h index 165ff50..5caf2b0 100644 --- a/src/sound/oalsound/channel.h +++ b/src/sound/oalsound/channel.h @@ -60,6 +60,7 @@ class Channel float GetVolume(); bool IsPlaying(); bool IsReady(); + bool IsLoaded(); bool SetBuffer(Buffer *); bool HasEnvelope(); -- cgit v1.2.3-1-g7c22