diff options
Diffstat (limited to 'indra/llaudio/llaudioengine.cpp')
-rw-r--r-- | indra/llaudio/llaudioengine.cpp | 2622 |
1 files changed, 1311 insertions, 1311 deletions
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp index ece0a12a7a..3697422ac8 100644 --- a/indra/llaudio/llaudioengine.cpp +++ b/indra/llaudio/llaudioengine.cpp @@ -1,4 +1,4 @@ - /** + /** * @file audioengine.cpp * @brief implementation of LLAudioEngine class abstracting the Open * AL audio support @@ -6,21 +6,21 @@ * $LicenseInfo:firstyear=2000&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -41,7 +41,7 @@ #include "llassetstorage.h" -// necessary for grabbing sounds from sim (implemented in viewer) +// necessary for grabbing sounds from sim (implemented in viewer) extern void request_sound(const LLUUID &sound_guid); LLAudioEngine* gAudiop = NULL; @@ -54,7 +54,7 @@ LLAudioEngine* gAudiop = NULL; LLAudioEngine::LLAudioEngine() { - setDefaults(); + setDefaults(); } @@ -64,1173 +64,1173 @@ LLAudioEngine::~LLAudioEngine() LLStreamingAudioInterface* LLAudioEngine::getStreamingAudioImpl() { - return mStreamingAudioImpl; + return mStreamingAudioImpl; } void LLAudioEngine::setStreamingAudioImpl(LLStreamingAudioInterface *impl) { - mStreamingAudioImpl = impl; + mStreamingAudioImpl = impl; } void LLAudioEngine::setDefaults() { - mMaxWindGain = 1.f; + mMaxWindGain = 1.f; - mListenerp = NULL; + mListenerp = NULL; - mMuted = false; - mUserData = NULL; + mMuted = false; + mUserData = NULL; - mLastStatus = 0; + mLastStatus = 0; - mEnableWind = false; + mEnableWind = false; - mChannels.fill(nullptr); - mBuffers.fill(nullptr); + mChannels.fill(nullptr); + mBuffers.fill(nullptr); - mMasterGain = 1.f; - // Setting mInternalGain to an out of range value fixes the issue reported in STORM-830. - // There is an edge case in setMasterGain during startup which prevents setInternalGain from - // being called if the master volume setting and mInternalGain both equal 0, so using -1 forces - // the if statement in setMasterGain to execute when the viewer starts up. - mInternalGain = -1.f; - mNextWindUpdate = 0.f; + mMasterGain = 1.f; + // Setting mInternalGain to an out of range value fixes the issue reported in STORM-830. + // There is an edge case in setMasterGain during startup which prevents setInternalGain from + // being called if the master volume setting and mInternalGain both equal 0, so using -1 forces + // the if statement in setMasterGain to execute when the viewer starts up. + mInternalGain = -1.f; + mNextWindUpdate = 0.f; - mStreamingAudioImpl = NULL; + mStreamingAudioImpl = NULL; - for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++) - mSecondaryGain[i] = 1.0f; + for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++) + mSecondaryGain[i] = 1.0f; } bool LLAudioEngine::init(void* userdata, const std::string &app_title) { - setDefaults(); + setDefaults(); - mUserData = userdata; - - allocateListener(); + mUserData = userdata; - LL_INFOS("AudioEngine") << "LLAudioEngine::init() AudioEngine successfully initialized" << LL_ENDL; + allocateListener(); - return true; + LL_INFOS("AudioEngine") << "LLAudioEngine::init() AudioEngine successfully initialized" << LL_ENDL; + + return true; } void LLAudioEngine::shutdown() { - // Clean up wind source - cleanupWind(); + // Clean up wind source + cleanupWind(); - // Clean up audio sources - for (source_map::value_type& src_pair : mAllSources) - { - delete src_pair.second; - } + // Clean up audio sources + for (source_map::value_type& src_pair : mAllSources) + { + delete src_pair.second; + } - // Clean up audio data - for (data_map::value_type& data_pair : mAllData) - { - delete data_pair.second; - } + // Clean up audio data + for (data_map::value_type& data_pair : mAllData) + { + delete data_pair.second; + } - // Clean up channels - S32 i; - for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) - { - delete mChannels[i]; - mChannels[i] = NULL; - } + // Clean up channels + S32 i; + for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) + { + delete mChannels[i]; + mChannels[i] = NULL; + } - // Clean up buffers - for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) - { - delete mBuffers[i]; - mBuffers[i] = NULL; - } + // Clean up buffers + for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) + { + delete mBuffers[i]; + mBuffers[i] = NULL; + } } // virtual void LLAudioEngine::startInternetStream(const std::string& url) { - if (mStreamingAudioImpl) - mStreamingAudioImpl->start(url); + if (mStreamingAudioImpl) + mStreamingAudioImpl->start(url); } // virtual void LLAudioEngine::stopInternetStream() { - if (mStreamingAudioImpl) - mStreamingAudioImpl->stop(); + if (mStreamingAudioImpl) + mStreamingAudioImpl->stop(); } // virtual void LLAudioEngine::pauseInternetStream(S32 pause) { - if (mStreamingAudioImpl) - mStreamingAudioImpl->pause(pause); + if (mStreamingAudioImpl) + mStreamingAudioImpl->pause(pause); } // virtual void LLAudioEngine::updateInternetStream() { - if (mStreamingAudioImpl) - mStreamingAudioImpl->update(); + if (mStreamingAudioImpl) + mStreamingAudioImpl->update(); } // virtual LLAudioEngine::LLAudioPlayState LLAudioEngine::isInternetStreamPlaying() { - if (mStreamingAudioImpl) - return (LLAudioEngine::LLAudioPlayState) mStreamingAudioImpl->isPlaying(); + if (mStreamingAudioImpl) + return (LLAudioEngine::LLAudioPlayState) mStreamingAudioImpl->isPlaying(); - return LLAudioEngine::AUDIO_STOPPED; // Stopped + return LLAudioEngine::AUDIO_STOPPED; // Stopped } // virtual void LLAudioEngine::setInternetStreamGain(F32 vol) { - if (mStreamingAudioImpl) - mStreamingAudioImpl->setGain(vol); + if (mStreamingAudioImpl) + mStreamingAudioImpl->setGain(vol); } // virtual std::string LLAudioEngine::getInternetStreamURL() { - if (mStreamingAudioImpl) - return mStreamingAudioImpl->getURL(); + if (mStreamingAudioImpl) + return mStreamingAudioImpl->getURL(); - return std::string(); + return std::string(); } void LLAudioEngine::updateChannels() { - S32 i; - for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) - { - if (mChannels[i]) - { - mChannels[i]->updateBuffer(); - mChannels[i]->update3DPosition(); - mChannels[i]->updateLoop(); - } - } + S32 i; + for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) + { + if (mChannels[i]) + { + mChannels[i]->updateBuffer(); + mChannels[i]->update3DPosition(); + mChannels[i]->updateLoop(); + } + } } void LLAudioEngine::idle() { - // "Update" all of our audio sources, clean up dead ones. - // Primarily does position updating, cleanup of unused audio sources. - // Also does regeneration of the current priority of each audio source. - - S32 i; - for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) - { - if (mBuffers[i]) - { - mBuffers[i]->mInUse = false; - } - } - - F32 max_priority = -1.f; - LLAudioSource *max_sourcep = NULL; // Maximum priority source without a channel - source_map::iterator iter; - for (iter = mAllSources.begin(); iter != mAllSources.end();) - { - LLAudioSource *sourcep = iter->second; - - // Update this source - sourcep->update(); - sourcep->updatePriority(); - - if (sourcep->isDone()) - { - // The source is done playing, clean it up. - delete sourcep; + // "Update" all of our audio sources, clean up dead ones. + // Primarily does position updating, cleanup of unused audio sources. + // Also does regeneration of the current priority of each audio source. + + S32 i; + for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) + { + if (mBuffers[i]) + { + mBuffers[i]->mInUse = false; + } + } + + F32 max_priority = -1.f; + LLAudioSource *max_sourcep = NULL; // Maximum priority source without a channel + source_map::iterator iter; + for (iter = mAllSources.begin(); iter != mAllSources.end();) + { + LLAudioSource *sourcep = iter->second; + + // Update this source + sourcep->update(); + sourcep->updatePriority(); + + if (sourcep->isDone()) + { + // The source is done playing, clean it up. + delete sourcep; iter = mAllSources.erase(iter); - continue; - } - - if (sourcep->isMuted()) - { - ++iter; - continue; - } - - if (!sourcep->getChannel() && sourcep->getCurrentBuffer()) - { - // We could potentially play this sound if its priority is high enough. - if (sourcep->getPriority() > max_priority) - { - max_priority = sourcep->getPriority(); - max_sourcep = sourcep; - } - } - - // Move on to the next source - iter++; - } - - // Now, do priority-based organization of audio sources. - // All channels used, check priorities. - // Find channel with lowest priority - if (max_sourcep) - { - LLAudioChannel *channelp = getFreeChannel(max_priority); - if (channelp) - { - //LL_INFOS() << "Replacing source in channel due to priority!" << LL_ENDL; - max_sourcep->setChannel(channelp); - channelp->setSource(max_sourcep); - if (max_sourcep->isSyncSlave()) - { - // A sync slave, it doesn't start playing until it's synced up with the master. - // Flag this channel as waiting for sync, and return true. - channelp->setWaiting(true); - } - else - { - channelp->setWaiting(false); - channelp->play(); - } - } - } - - - // Do this BEFORE we update the channels - // Update the channels to sync up with any changes that the source made, - // such as changing what sound was playing. - updateChannels(); - - // Update queued sounds (switch to next queued data if the current has finished playing) - for (source_map::value_type& src_pair : mAllSources) - { - // This is lame, instead of this I could actually iterate through all the sources - // attached to each channel, since only those with active channels - // can have anything interesting happen with their queue? (Maybe not true) - LLAudioSource *sourcep = src_pair.second; - if (!sourcep->mQueuedDatap || sourcep->isMuted()) - { - // Muted, or nothing queued, so we don't care. - continue; - } - - LLAudioChannel *channelp = sourcep->getChannel(); - if (!channelp) - { - // This sound isn't playing, so we just process move the queue - sourcep->mCurrentDatap = sourcep->mQueuedDatap; - sourcep->mQueuedDatap = NULL; - - // Reset the timer so the source doesn't die. - sourcep->mAgeTimer.reset(); - // Make sure we have the buffer set up if we just decoded the data - if (sourcep->mCurrentDatap) - { - updateBufferForData(sourcep->mCurrentDatap); - } - - // Actually play the associated data. - sourcep->setupChannel(); - channelp = sourcep->getChannel(); - if (channelp) - { - channelp->updateBuffer(); - sourcep->getChannel()->play(); - } - continue; - } - - // Check to see if the current sound is done playing. - if (!channelp->isPlaying()) - { - sourcep->mCurrentDatap = sourcep->mQueuedDatap; - sourcep->mQueuedDatap = NULL; - - // Reset the timer so the source doesn't die. - sourcep->mAgeTimer.reset(); - - // Make sure we have the buffer set up if we just decoded the data - if (sourcep->mCurrentDatap) - { - updateBufferForData(sourcep->mCurrentDatap); - } - - // Actually play the associated data. - sourcep->setupChannel(); - channelp->updateBuffer(); - sourcep->getChannel()->play(); - continue; - } - - // Check to see if the current sound is looped. - if (sourcep->isLoop()) - { - // It's a loop, we need to check and see if we're done with it. - if (channelp->mLoopedThisFrame) - { - sourcep->mCurrentDatap = sourcep->mQueuedDatap; - sourcep->mQueuedDatap = NULL; - - // Actually, should do a time sync so if we're a loop master/slave - // we don't drift away. - sourcep->setupChannel(); - sourcep->getChannel()->play(); - } - } - } - - // Lame, update the channels AGAIN. - // Update the channels to sync up with any changes that the source made, - // such as changing what sound was playing. - updateChannels(); - - // Hack! For now, just use a global sync master; - LLAudioSource *sync_masterp = NULL; - LLAudioChannel *master_channelp = NULL; - F32 max_sm_priority = -1.f; - for (source_map::value_type& src_pair : mAllSources) - { - LLAudioSource *sourcep = src_pair.second; - if (!sourcep->isMuted() && sourcep->isSyncMaster() && sourcep->getPriority() > max_sm_priority) - { - sync_masterp = sourcep; - master_channelp = sync_masterp->getChannel(); - max_sm_priority = sourcep->getPriority(); - } - } - - if (master_channelp && master_channelp->mLoopedThisFrame) - { - // Synchronize loop slaves with their masters - // Update queued sounds (switch to next queued data if the current has finished playing) - for (source_map::value_type& src_pair : mAllSources) - { - LLAudioSource *sourcep = src_pair.second; - - if (!sourcep->isSyncSlave()) - { - // Not a loop slave, we don't need to do anything - continue; - } - - LLAudioChannel *channelp = sourcep->getChannel(); - if (!channelp) - { - // Not playing, don't need to bother. - continue; - } - - if (!channelp->isPlaying()) - { - // Now we need to check if our loop master has just looped, and - // start playback if that's the case. - if (sync_masterp->getChannel()) - { - channelp->playSynced(master_channelp); - channelp->setWaiting(false); - } - } - } - } - - // Sync up everything that the audio engine needs done. - commitDeferredChanges(); - - // Flush unused buffers that are stale enough - for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) - { - if (mBuffers[i]) - { - if (!mBuffers[i]->mInUse && mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > 30.f) - { - //LL_INFOS() << "Flushing unused buffer!" << LL_ENDL; - mBuffers[i]->mAudioDatap->mBufferp = NULL; - delete mBuffers[i]; - mBuffers[i] = NULL; - } - } - } - - - // Clear all of the looped flags for the channels - for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) - { - if (mChannels[i]) - { - mChannels[i]->mLoopedThisFrame = false; - } - } - - // Decode audio files + continue; + } + + if (sourcep->isMuted()) + { + ++iter; + continue; + } + + if (!sourcep->getChannel() && sourcep->getCurrentBuffer()) + { + // We could potentially play this sound if its priority is high enough. + if (sourcep->getPriority() > max_priority) + { + max_priority = sourcep->getPriority(); + max_sourcep = sourcep; + } + } + + // Move on to the next source + iter++; + } + + // Now, do priority-based organization of audio sources. + // All channels used, check priorities. + // Find channel with lowest priority + if (max_sourcep) + { + LLAudioChannel *channelp = getFreeChannel(max_priority); + if (channelp) + { + //LL_INFOS() << "Replacing source in channel due to priority!" << LL_ENDL; + max_sourcep->setChannel(channelp); + channelp->setSource(max_sourcep); + if (max_sourcep->isSyncSlave()) + { + // A sync slave, it doesn't start playing until it's synced up with the master. + // Flag this channel as waiting for sync, and return true. + channelp->setWaiting(true); + } + else + { + channelp->setWaiting(false); + channelp->play(); + } + } + } + + + // Do this BEFORE we update the channels + // Update the channels to sync up with any changes that the source made, + // such as changing what sound was playing. + updateChannels(); + + // Update queued sounds (switch to next queued data if the current has finished playing) + for (source_map::value_type& src_pair : mAllSources) + { + // This is lame, instead of this I could actually iterate through all the sources + // attached to each channel, since only those with active channels + // can have anything interesting happen with their queue? (Maybe not true) + LLAudioSource *sourcep = src_pair.second; + if (!sourcep->mQueuedDatap || sourcep->isMuted()) + { + // Muted, or nothing queued, so we don't care. + continue; + } + + LLAudioChannel *channelp = sourcep->getChannel(); + if (!channelp) + { + // This sound isn't playing, so we just process move the queue + sourcep->mCurrentDatap = sourcep->mQueuedDatap; + sourcep->mQueuedDatap = NULL; + + // Reset the timer so the source doesn't die. + sourcep->mAgeTimer.reset(); + // Make sure we have the buffer set up if we just decoded the data + if (sourcep->mCurrentDatap) + { + updateBufferForData(sourcep->mCurrentDatap); + } + + // Actually play the associated data. + sourcep->setupChannel(); + channelp = sourcep->getChannel(); + if (channelp) + { + channelp->updateBuffer(); + sourcep->getChannel()->play(); + } + continue; + } + + // Check to see if the current sound is done playing. + if (!channelp->isPlaying()) + { + sourcep->mCurrentDatap = sourcep->mQueuedDatap; + sourcep->mQueuedDatap = NULL; + + // Reset the timer so the source doesn't die. + sourcep->mAgeTimer.reset(); + + // Make sure we have the buffer set up if we just decoded the data + if (sourcep->mCurrentDatap) + { + updateBufferForData(sourcep->mCurrentDatap); + } + + // Actually play the associated data. + sourcep->setupChannel(); + channelp->updateBuffer(); + sourcep->getChannel()->play(); + continue; + } + + // Check to see if the current sound is looped. + if (sourcep->isLoop()) + { + // It's a loop, we need to check and see if we're done with it. + if (channelp->mLoopedThisFrame) + { + sourcep->mCurrentDatap = sourcep->mQueuedDatap; + sourcep->mQueuedDatap = NULL; + + // Actually, should do a time sync so if we're a loop master/slave + // we don't drift away. + sourcep->setupChannel(); + sourcep->getChannel()->play(); + } + } + } + + // Lame, update the channels AGAIN. + // Update the channels to sync up with any changes that the source made, + // such as changing what sound was playing. + updateChannels(); + + // Hack! For now, just use a global sync master; + LLAudioSource *sync_masterp = NULL; + LLAudioChannel *master_channelp = NULL; + F32 max_sm_priority = -1.f; + for (source_map::value_type& src_pair : mAllSources) + { + LLAudioSource *sourcep = src_pair.second; + if (!sourcep->isMuted() && sourcep->isSyncMaster() && sourcep->getPriority() > max_sm_priority) + { + sync_masterp = sourcep; + master_channelp = sync_masterp->getChannel(); + max_sm_priority = sourcep->getPriority(); + } + } + + if (master_channelp && master_channelp->mLoopedThisFrame) + { + // Synchronize loop slaves with their masters + // Update queued sounds (switch to next queued data if the current has finished playing) + for (source_map::value_type& src_pair : mAllSources) + { + LLAudioSource *sourcep = src_pair.second; + + if (!sourcep->isSyncSlave()) + { + // Not a loop slave, we don't need to do anything + continue; + } + + LLAudioChannel *channelp = sourcep->getChannel(); + if (!channelp) + { + // Not playing, don't need to bother. + continue; + } + + if (!channelp->isPlaying()) + { + // Now we need to check if our loop master has just looped, and + // start playback if that's the case. + if (sync_masterp->getChannel()) + { + channelp->playSynced(master_channelp); + channelp->setWaiting(false); + } + } + } + } + + // Sync up everything that the audio engine needs done. + commitDeferredChanges(); + + // Flush unused buffers that are stale enough + for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) + { + if (mBuffers[i]) + { + if (!mBuffers[i]->mInUse && mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > 30.f) + { + //LL_INFOS() << "Flushing unused buffer!" << LL_ENDL; + mBuffers[i]->mAudioDatap->mBufferp = NULL; + delete mBuffers[i]; + mBuffers[i] = NULL; + } + } + } + + + // Clear all of the looped flags for the channels + for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) + { + if (mChannels[i]) + { + mChannels[i]->mLoopedThisFrame = false; + } + } + + // Decode audio files LLAudioDecodeMgr::getInstance()->processQueue(); - - // Call this every frame, just in case we somehow - // missed picking it up in all the places that can add - // or request new data. - startNextTransfer(); - updateInternetStream(); + // Call this every frame, just in case we somehow + // missed picking it up in all the places that can add + // or request new data. + startNextTransfer(); + + updateInternetStream(); } bool LLAudioEngine::updateBufferForData(LLAudioData *adp, const LLUUID &audio_uuid) { - if (!adp) - { - return false; - } - - // Update the audio buffer first - load a sound if we have it. - // Note that this could potentially cause us to waste time updating buffers - // for sounds that actually aren't playing, although this should be mitigated - // by the fact that we limit the number of buffers, and we flush buffers based - // on priority. - if (!adp->getBuffer()) - { - if (adp->hasDecodedData()) - { - adp->load(); - } - else if (adp->hasLocalData()) - { - if (audio_uuid.notNull()) - { + if (!adp) + { + return false; + } + + // Update the audio buffer first - load a sound if we have it. + // Note that this could potentially cause us to waste time updating buffers + // for sounds that actually aren't playing, although this should be mitigated + // by the fact that we limit the number of buffers, and we flush buffers based + // on priority. + if (!adp->getBuffer()) + { + if (adp->hasDecodedData()) + { + adp->load(); + } + else if (adp->hasLocalData()) + { + if (audio_uuid.notNull()) + { LLAudioDecodeMgr::getInstance()->addDecodeRequest(audio_uuid); - } - } - else - { - return false; - } - } - return true; + } + } + else + { + return false; + } + } + return true; } void LLAudioEngine::enableWind(bool enable) { - if (enable && (!mEnableWind)) - { - mEnableWind = initWind(); - } - else if (mEnableWind && (!enable)) - { - mEnableWind = false; - cleanupWind(); - } + if (enable && (!mEnableWind)) + { + mEnableWind = initWind(); + } + else if (mEnableWind && (!enable)) + { + mEnableWind = false; + cleanupWind(); + } } LLAudioBuffer * LLAudioEngine::getFreeBuffer() { - S32 i; - for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) - { - if (!mBuffers[i]) - { - mBuffers[i] = createBuffer(); - return mBuffers[i]; - } - } - - - // Grab the oldest unused buffer - F32 max_age = -1.f; - S32 buffer_id = -1; - for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) - { - if (mBuffers[i]) - { - if (!mBuffers[i]->mInUse) - { - if (mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > max_age) - { - max_age = mBuffers[i]->mLastUseTimer.getElapsedTimeF32(); - buffer_id = i; - } - } - } - } - - if (buffer_id >= 0) - { - LL_DEBUGS() << "Taking over unused buffer " << buffer_id << LL_ENDL; - //LL_INFOS() << "Flushing unused buffer!" << LL_ENDL; - mBuffers[buffer_id]->mAudioDatap->mBufferp = NULL; - delete mBuffers[buffer_id]; - mBuffers[buffer_id] = createBuffer(); - return mBuffers[buffer_id]; - } - return NULL; + S32 i; + for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) + { + if (!mBuffers[i]) + { + mBuffers[i] = createBuffer(); + return mBuffers[i]; + } + } + + + // Grab the oldest unused buffer + F32 max_age = -1.f; + S32 buffer_id = -1; + for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) + { + if (mBuffers[i]) + { + if (!mBuffers[i]->mInUse) + { + if (mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > max_age) + { + max_age = mBuffers[i]->mLastUseTimer.getElapsedTimeF32(); + buffer_id = i; + } + } + } + } + + if (buffer_id >= 0) + { + LL_DEBUGS() << "Taking over unused buffer " << buffer_id << LL_ENDL; + //LL_INFOS() << "Flushing unused buffer!" << LL_ENDL; + mBuffers[buffer_id]->mAudioDatap->mBufferp = NULL; + delete mBuffers[buffer_id]; + mBuffers[buffer_id] = createBuffer(); + return mBuffers[buffer_id]; + } + return NULL; } LLAudioChannel * LLAudioEngine::getFreeChannel(const F32 priority) { - S32 i; + S32 i; for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) - { - if (!mChannels[i]) - { - // No channel allocated here, use it. - mChannels[i] = createChannel(); - return mChannels[i]; - } - else - { - // Channel is allocated but not playing right now, use it. - if (!mChannels[i]->isPlaying() && !mChannels[i]->isWaiting()) - { - mChannels[i]->cleanup(); - if (mChannels[i]->getSource()) - { - mChannels[i]->getSource()->setChannel(NULL); - } - return mChannels[i]; - } - } - } - - // All channels used, check priorities. - // Find channel with lowest priority and see if we want to replace it. - F32 min_priority = 10000.f; - LLAudioChannel *min_channelp = NULL; + { + if (!mChannels[i]) + { + // No channel allocated here, use it. + mChannels[i] = createChannel(); + return mChannels[i]; + } + else + { + // Channel is allocated but not playing right now, use it. + if (!mChannels[i]->isPlaying() && !mChannels[i]->isWaiting()) + { + mChannels[i]->cleanup(); + if (mChannels[i]->getSource()) + { + mChannels[i]->getSource()->setChannel(NULL); + } + return mChannels[i]; + } + } + } + + // All channels used, check priorities. + // Find channel with lowest priority and see if we want to replace it. + F32 min_priority = 10000.f; + LLAudioChannel *min_channelp = NULL; for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) - { - LLAudioChannel *channelp = mChannels[i]; - LLAudioSource *sourcep = channelp->getSource(); - if (sourcep->getPriority() < min_priority) - { - min_channelp = channelp; - min_priority = sourcep->getPriority(); - } - } + { + LLAudioChannel *channelp = mChannels[i]; + LLAudioSource *sourcep = channelp->getSource(); + if (sourcep->getPriority() < min_priority) + { + min_channelp = channelp; + min_priority = sourcep->getPriority(); + } + } - if (min_priority > priority || !min_channelp) - { - // All playing channels have higher priority, return. - return NULL; - } + if (min_priority > priority || !min_channelp) + { + // All playing channels have higher priority, return. + return NULL; + } - // Flush the minimum priority channel, and return it. - min_channelp->cleanup(); - min_channelp->getSource()->setChannel(NULL); - return min_channelp; + // Flush the minimum priority channel, and return it. + min_channelp->cleanup(); + min_channelp->getSource()->setChannel(NULL); + return min_channelp; } void LLAudioEngine::cleanupBuffer(LLAudioBuffer *bufferp) { - S32 i; - for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) - { - if (mBuffers[i] == bufferp) - { - delete mBuffers[i]; - mBuffers[i] = NULL; - } - } + S32 i; + for (i = 0; i < LL_MAX_AUDIO_BUFFERS; i++) + { + if (mBuffers[i] == bufferp) + { + delete mBuffers[i]; + mBuffers[i] = NULL; + } + } } bool LLAudioEngine::preloadSound(const LLUUID &uuid) { - LL_DEBUGS("AudioEngine")<<"( "<<uuid<<" )"<<LL_ENDL; + LL_DEBUGS("AudioEngine")<<"( "<<uuid<<" )"<<LL_ENDL; - getAudioData(uuid); // We don't care about the return value, this is just to make sure - // that we have an entry, which will mean that the audio engine knows about this + getAudioData(uuid); // We don't care about the return value, this is just to make sure + // that we have an entry, which will mean that the audio engine knows about this if (LLAudioDecodeMgr::getInstance()->addDecodeRequest(uuid)) - { - // This means that we do have a local copy, and we're working on decoding it. - return true; - } + { + // This means that we do have a local copy, and we're working on decoding it. + return true; + } - return false; + return false; } bool LLAudioEngine::isWindEnabled() { - return mEnableWind; + return mEnableWind; } void LLAudioEngine::setMuted(bool muted) { - if (muted != mMuted) - { - mMuted = muted; - setMasterGain(mMasterGain); - } - enableWind(!mMuted); + if (muted != mMuted) + { + mMuted = muted; + setMasterGain(mMasterGain); + } + enableWind(!mMuted); } void LLAudioEngine::setMasterGain(const F32 gain) { - mMasterGain = gain; - F32 internal_gain = getMuted() ? 0.f : gain; - if (internal_gain != mInternalGain) - { - mInternalGain = internal_gain; - setInternalGain(mInternalGain); - } + mMasterGain = gain; + F32 internal_gain = getMuted() ? 0.f : gain; + if (internal_gain != mInternalGain) + { + mInternalGain = internal_gain; + setInternalGain(mInternalGain); + } } F32 LLAudioEngine::getMasterGain() { - return mMasterGain; + return mMasterGain; } void LLAudioEngine::setSecondaryGain(S32 type, F32 gain) { - llassert(type < LLAudioEngine::AUDIO_TYPE_COUNT); - - mSecondaryGain[type] = gain; + llassert(type < LLAudioEngine::AUDIO_TYPE_COUNT); + + mSecondaryGain[type] = gain; } F32 LLAudioEngine::getSecondaryGain(S32 type) { - return mSecondaryGain[type]; + return mSecondaryGain[type]; } F32 LLAudioEngine::getInternetStreamGain() { - if (mStreamingAudioImpl) - return mStreamingAudioImpl->getGain(); - else - return 1.0f; + if (mStreamingAudioImpl) + return mStreamingAudioImpl->getGain(); + else + return 1.0f; } void LLAudioEngine::setMaxWindGain(F32 gain) { - mMaxWindGain = gain; + mMaxWindGain = gain; } F64 LLAudioEngine::mapWindVecToGain(LLVector3 wind_vec) { - F64 gain = 0.0; - - gain = wind_vec.magVec(); + F64 gain = 0.0; + + gain = wind_vec.magVec(); - if (gain) - { - if (gain > 20) - { - gain = 20; - } - gain = gain/20.0; - } + if (gain) + { + if (gain > 20) + { + gain = 20; + } + gain = gain/20.0; + } - return (gain); + return (gain); } F64 LLAudioEngine::mapWindVecToPitch(LLVector3 wind_vec) { - LLVector3 listen_right; - F64 theta; - - // Wind frame is in listener-relative coordinates - LLVector3 norm_wind = wind_vec; - norm_wind.normVec(); - listen_right.setVec(1.0,0.0,0.0); + LLVector3 listen_right; + F64 theta; + + // Wind frame is in listener-relative coordinates + LLVector3 norm_wind = wind_vec; + norm_wind.normVec(); + listen_right.setVec(1.0,0.0,0.0); - // measure angle between wind vec and listener right axis (on 0,PI) - theta = acos(norm_wind * listen_right); + // measure angle between wind vec and listener right axis (on 0,PI) + theta = acos(norm_wind * listen_right); - // put it on 0, 1 - theta /= F_PI; + // put it on 0, 1 + theta /= F_PI; - // put it on [0, 0.5, 0] - if (theta > 0.5) theta = 1.0-theta; - if (theta < 0) theta = 0; + // put it on [0, 0.5, 0] + if (theta > 0.5) theta = 1.0-theta; + if (theta < 0) theta = 0; - return (theta); + return (theta); } F64 LLAudioEngine::mapWindVecToPan(LLVector3 wind_vec) { - LLVector3 listen_right; - F64 theta; - - // Wind frame is in listener-relative coordinates - listen_right.setVec(1.0,0.0,0.0); + LLVector3 listen_right; + F64 theta; - LLVector3 norm_wind = wind_vec; - norm_wind.normVec(); + // Wind frame is in listener-relative coordinates + listen_right.setVec(1.0,0.0,0.0); - // measure angle between wind vec and listener right axis (on 0,PI) - theta = acos(norm_wind * listen_right); + LLVector3 norm_wind = wind_vec; + norm_wind.normVec(); - // put it on 0, 1 - theta /= F_PI; + // measure angle between wind vec and listener right axis (on 0,PI) + theta = acos(norm_wind * listen_right); - return (theta); + // put it on 0, 1 + theta /= F_PI; + + return (theta); } void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, - const S32 type, const LLVector3d &pos_global) -{ - // Create a new source (since this can't be associated with an existing source. - //LL_INFOS() << "Localized: " << audio_uuid << LL_ENDL; - - if (mMuted) - { - return; - } - - LLUUID source_id; - source_id.generate(); - - LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type); - addAudioSource(asp); - if (pos_global.isExactlyZero()) - { - // For sound preview and UI - asp->setForcedPriority(true); - } - else - { - asp->setPositionGlobal(pos_global); - } - asp->updatePriority(); - asp->play(audio_uuid); + const S32 type, const LLVector3d &pos_global) +{ + // Create a new source (since this can't be associated with an existing source. + //LL_INFOS() << "Localized: " << audio_uuid << LL_ENDL; + + if (mMuted) + { + return; + } + + LLUUID source_id; + source_id.generate(); + + LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type); + addAudioSource(asp); + if (pos_global.isExactlyZero()) + { + // For sound preview and UI + asp->setForcedPriority(true); + } + else + { + asp->setPositionGlobal(pos_global); + } + asp->updatePriority(); + asp->play(audio_uuid); } void LLAudioEngine::triggerSound(SoundData& soundData) { - triggerSound(soundData.audio_uuid, soundData.owner_id, soundData.gain, soundData.type, soundData.pos_global); + triggerSound(soundData.audio_uuid, soundData.owner_id, soundData.gain, soundData.type, soundData.pos_global); } void LLAudioEngine::setListenerPos(LLVector3 aVec) { - mListenerp->setPosition(aVec); + mListenerp->setPosition(aVec); } LLVector3 LLAudioEngine::getListenerPos() { - if (mListenerp) - { - return(mListenerp->getPosition()); - } - else - { - return(LLVector3::zero); - } + if (mListenerp) + { + return(mListenerp->getPosition()); + } + else + { + return(LLVector3::zero); + } } void LLAudioEngine::setListenerVelocity(LLVector3 aVec) { - mListenerp->setVelocity(aVec); + mListenerp->setVelocity(aVec); } void LLAudioEngine::translateListener(LLVector3 aVec) { - mListenerp->translate(aVec); + mListenerp->translate(aVec); } void LLAudioEngine::orientListener(LLVector3 up, LLVector3 at) { - mListenerp->orient(up, at); + mListenerp->orient(up, at); } void LLAudioEngine::setListener(LLVector3 pos, LLVector3 vel, LLVector3 up, LLVector3 at) { - mListenerp->set(pos,vel,up,at); + mListenerp->set(pos,vel,up,at); } void LLAudioEngine::setDopplerFactor(F32 factor) { - if (mListenerp) - { - mListenerp->setDopplerFactor(factor); - } + if (mListenerp) + { + mListenerp->setDopplerFactor(factor); + } } F32 LLAudioEngine::getDopplerFactor() { - if (mListenerp) - { - return mListenerp->getDopplerFactor(); - } - else - { - return 0.f; - } + if (mListenerp) + { + return mListenerp->getDopplerFactor(); + } + else + { + return 0.f; + } } void LLAudioEngine::setRolloffFactor(F32 factor) { - if (mListenerp) - { - mListenerp->setRolloffFactor(factor); - } + if (mListenerp) + { + mListenerp->setRolloffFactor(factor); + } } F32 LLAudioEngine::getRolloffFactor() { - if (mListenerp) - { - return mListenerp->getRolloffFactor(); - } - else - { - return 0.f; - } + if (mListenerp) + { + return mListenerp->getRolloffFactor(); + } + else + { + return 0.f; + } } void LLAudioEngine::commitDeferredChanges() { - mListenerp->commitDeferredChanges(); + mListenerp->commitDeferredChanges(); } LLAudioSource * LLAudioEngine::findAudioSource(const LLUUID &source_id) { - source_map::iterator iter; - iter = mAllSources.find(source_id); + source_map::iterator iter; + iter = mAllSources.find(source_id); - if (iter == mAllSources.end()) - { - return NULL; - } - else - { - return iter->second; - } + if (iter == mAllSources.end()) + { + return NULL; + } + else + { + return iter->second; + } } LLAudioData * LLAudioEngine::getAudioData(const LLUUID &audio_uuid) { - LL_PROFILE_ZONE_SCOPED_CATEGORY_MEDIA; - data_map::iterator iter; - iter = mAllData.find(audio_uuid); - if (iter == mAllData.end()) - { - // Create the new audio data - LLAudioData *adp = new LLAudioData(audio_uuid); - mAllData[audio_uuid] = adp; - return adp; - } - else - { - return iter->second; - } + LL_PROFILE_ZONE_SCOPED_CATEGORY_MEDIA; + data_map::iterator iter; + iter = mAllData.find(audio_uuid); + if (iter == mAllData.end()) + { + // Create the new audio data + LLAudioData *adp = new LLAudioData(audio_uuid); + mAllData[audio_uuid] = adp; + return adp; + } + else + { + return iter->second; + } } void LLAudioEngine::addAudioSource(LLAudioSource *asp) { - mAllSources[asp->getID()] = asp; + mAllSources[asp->getID()] = asp; } void LLAudioEngine::cleanupAudioSource(LLAudioSource *asp) { - source_map::iterator iter; - iter = mAllSources.find(asp->getID()); - if (iter == mAllSources.end()) - { - LL_WARNS() << "Cleaning up unknown audio source!" << LL_ENDL; - return; - } - else - { - LL_DEBUGS("AudioEngine") << "Cleaning up audio sources for "<< asp->getID() <<LL_ENDL; - delete asp; - mAllSources.erase(iter); - } + source_map::iterator iter; + iter = mAllSources.find(asp->getID()); + if (iter == mAllSources.end()) + { + LL_WARNS() << "Cleaning up unknown audio source!" << LL_ENDL; + return; + } + else + { + LL_DEBUGS("AudioEngine") << "Cleaning up audio sources for "<< asp->getID() <<LL_ENDL; + delete asp; + mAllSources.erase(iter); + } } bool LLAudioEngine::hasDecodedFile(const LLUUID &uuid) { - std::string uuid_str; - uuid.toString(uuid_str); + std::string uuid_str; + uuid.toString(uuid_str); - std::string wav_path; - wav_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str); - wav_path += ".dsf"; + std::string wav_path; + wav_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str); + wav_path += ".dsf"; - if (gDirUtilp->fileExists(wav_path)) - { - return true; - } - else - { - return false; - } + if (gDirUtilp->fileExists(wav_path)) + { + return true; + } + else + { + return false; + } } bool LLAudioEngine::hasLocalFile(const LLUUID &uuid) { - // See if it's in the cache. - bool have_local = LLFileSystem::getExists(uuid, LLAssetType::AT_SOUND); - LL_DEBUGS("AudioEngine") << "sound uuid " << uuid << " exists in cache" << LL_ENDL; - return have_local; + // See if it's in the cache. + bool have_local = LLFileSystem::getExists(uuid, LLAssetType::AT_SOUND); + LL_DEBUGS("AudioEngine") << "sound uuid " << uuid << " exists in cache" << LL_ENDL; + return have_local; } void LLAudioEngine::startNextTransfer() { - //LL_INFOS() << "LLAudioEngine::startNextTransfer()" << LL_ENDL; - if (mCurrentTransfer.notNull() || getMuted()) - { - //LL_INFOS() << "Transfer in progress, aborting" << LL_ENDL; - return; - } - - // Get the ID for the next asset that we want to transfer. - // Pick one in the following order: - LLUUID asset_id; - S32 i; - LLAudioSource *asp = NULL; - LLAudioData *adp = NULL; - data_map::iterator data_iter; - - // Check all channels for currently playing sounds. - F32 max_pri = -1.f; - for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) - { - if (!mChannels[i]) - { - continue; - } - - asp = mChannels[i]->getSource(); - if (!asp) - { - continue; - } - if (asp->getPriority() <= max_pri) - { - continue; - } - - if (asp->getPriority() <= max_pri) - { - continue; - } - - adp = asp->getCurrentData(); - if (!adp) - { - continue; - } + //LL_INFOS() << "LLAudioEngine::startNextTransfer()" << LL_ENDL; + if (mCurrentTransfer.notNull() || getMuted()) + { + //LL_INFOS() << "Transfer in progress, aborting" << LL_ENDL; + return; + } + + // Get the ID for the next asset that we want to transfer. + // Pick one in the following order: + LLUUID asset_id; + S32 i; + LLAudioSource *asp = NULL; + LLAudioData *adp = NULL; + data_map::iterator data_iter; + + // Check all channels for currently playing sounds. + F32 max_pri = -1.f; + for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) + { + if (!mChannels[i]) + { + continue; + } + + asp = mChannels[i]->getSource(); + if (!asp) + { + continue; + } + if (asp->getPriority() <= max_pri) + { + continue; + } + + if (asp->getPriority() <= max_pri) + { + continue; + } + + adp = asp->getCurrentData(); + if (!adp) + { + continue; + } if (!adp->hasLocalData() && !adp->hasDecodeFailed()) - { - asset_id = adp->getID(); - max_pri = asp->getPriority(); - } - } - - // Check all channels for currently queued sounds. - if (asset_id.isNull()) - { - max_pri = -1.f; - for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) - { - if (!mChannels[i]) - { - continue; - } - - LLAudioSource *asp; - asp = mChannels[i]->getSource(); - if (!asp) - { - continue; - } - - if (asp->getPriority() <= max_pri) - { - continue; - } - - adp = asp->getQueuedData(); - if (!adp) - { - continue; - } + { + asset_id = adp->getID(); + max_pri = asp->getPriority(); + } + } + + // Check all channels for currently queued sounds. + if (asset_id.isNull()) + { + max_pri = -1.f; + for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) + { + if (!mChannels[i]) + { + continue; + } + + LLAudioSource *asp; + asp = mChannels[i]->getSource(); + if (!asp) + { + continue; + } + + if (asp->getPriority() <= max_pri) + { + continue; + } + + adp = asp->getQueuedData(); + if (!adp) + { + continue; + } if (!adp->hasLocalData() && !adp->hasDecodeFailed()) - { - asset_id = adp->getID(); - max_pri = asp->getPriority(); - } - } - } - - // Check all live channels for other sounds (preloads). - if (asset_id.isNull()) - { - max_pri = -1.f; - for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) - { - if (!mChannels[i]) - { - continue; - } - - LLAudioSource *asp; - asp = mChannels[i]->getSource(); - if (!asp) - { - continue; - } - - if (asp->getPriority() <= max_pri) - { - continue; - } - - - for (data_map::value_type& preload_pair : asp->mPreloadMap) - { - LLAudioData *adp = preload_pair.second; - if (!adp) - { - continue; - } + { + asset_id = adp->getID(); + max_pri = asp->getPriority(); + } + } + } + + // Check all live channels for other sounds (preloads). + if (asset_id.isNull()) + { + max_pri = -1.f; + for (i = 0; i < LL_MAX_AUDIO_CHANNELS; i++) + { + if (!mChannels[i]) + { + continue; + } + + LLAudioSource *asp; + asp = mChannels[i]->getSource(); + if (!asp) + { + continue; + } + + if (asp->getPriority() <= max_pri) + { + continue; + } + + + for (data_map::value_type& preload_pair : asp->mPreloadMap) + { + LLAudioData *adp = preload_pair.second; + if (!adp) + { + continue; + } if (!adp->hasLocalData() && !adp->hasDecodeFailed()) - { - asset_id = adp->getID(); - max_pri = asp->getPriority(); - } - } - } - } - - // Check all sources - if (asset_id.isNull()) - { - max_pri = -1.f; - source_map::iterator source_iter; - for (source_map::value_type& source_pair : mAllSources) - { - asp = source_pair.second; - if (!asp) - { - continue; - } - - if (asp->getPriority() <= max_pri) - { - continue; - } - - adp = asp->getCurrentData(); + { + asset_id = adp->getID(); + max_pri = asp->getPriority(); + } + } + } + } + + // Check all sources + if (asset_id.isNull()) + { + max_pri = -1.f; + source_map::iterator source_iter; + for (source_map::value_type& source_pair : mAllSources) + { + asp = source_pair.second; + if (!asp) + { + continue; + } + + if (asp->getPriority() <= max_pri) + { + continue; + } + + adp = asp->getCurrentData(); if (adp && !adp->hasLocalData() && !adp->hasDecodeFailed()) - { - asset_id = adp->getID(); - max_pri = asp->getPriority(); - continue; - } + { + asset_id = adp->getID(); + max_pri = asp->getPriority(); + continue; + } - adp = asp->getQueuedData(); + adp = asp->getQueuedData(); if (adp && !adp->hasLocalData() && !adp->hasDecodeFailed()) - { - asset_id = adp->getID(); - max_pri = asp->getPriority(); - continue; - } - - for (data_map::value_type& preload_pair : asp->mPreloadMap) - { - LLAudioData *adp = preload_pair.second; - if (!adp) - { - continue; - } + { + asset_id = adp->getID(); + max_pri = asp->getPriority(); + continue; + } + + for (data_map::value_type& preload_pair : asp->mPreloadMap) + { + LLAudioData *adp = preload_pair.second; + if (!adp) + { + continue; + } if (!adp->hasLocalData() && !adp->hasDecodeFailed()) - { - asset_id = adp->getID(); - max_pri = asp->getPriority(); - break; - } - } - } - } - - if (asset_id.notNull()) - { - LL_INFOS() << "Getting asset data for: " << asset_id << LL_ENDL; - mCurrentTransfer = asset_id; - mCurrentTransferTimer.reset(); - gAssetStorage->getAssetData(asset_id, LLAssetType::AT_SOUND, - assetCallback, NULL); - } - else - { - //LL_INFOS() << "No pending transfers?" << LL_ENDL; - } + { + asset_id = adp->getID(); + max_pri = asp->getPriority(); + break; + } + } + } + } + + if (asset_id.notNull()) + { + LL_INFOS() << "Getting asset data for: " << asset_id << LL_ENDL; + mCurrentTransfer = asset_id; + mCurrentTransferTimer.reset(); + gAssetStorage->getAssetData(asset_id, LLAssetType::AT_SOUND, + assetCallback, NULL); + } + else + { + //LL_INFOS() << "No pending transfers?" << LL_ENDL; + } } // static void LLAudioEngine::assetCallback(const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status) { - if (!gAudiop) - { - LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; - return; - } - - if (result_code) - { - LL_INFOS() << "Boom, error in audio file transfer: " << LLAssetStorage::getErrorString( result_code ) << " (" << result_code << ")" << LL_ENDL; - // Need to mark data as bad to avoid constant rerequests. - LLAudioData *adp = gAudiop->getAudioData(uuid); - if (adp) - { // Make sure everything is cleared + if (!gAudiop) + { + LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; + return; + } + + if (result_code) + { + LL_INFOS() << "Boom, error in audio file transfer: " << LLAssetStorage::getErrorString( result_code ) << " (" << result_code << ")" << LL_ENDL; + // Need to mark data as bad to avoid constant rerequests. + LLAudioData *adp = gAudiop->getAudioData(uuid); + if (adp) + { // Make sure everything is cleared adp->setHasDecodeFailed(true); - adp->setHasLocalData(false); - adp->setHasDecodedData(false); - adp->setHasCompletedDecode(true); - } - } - else - { - LLAudioData *adp = gAudiop->getAudioData(uuid); - if (!adp) + adp->setHasLocalData(false); + adp->setHasDecodedData(false); + adp->setHasCompletedDecode(true); + } + } + else + { + LLAudioData *adp = gAudiop->getAudioData(uuid); + if (!adp) { - // Should never happen - LL_WARNS() << "Got asset callback without audio data for " << uuid << LL_ENDL; + // Should never happen + LL_WARNS() << "Got asset callback without audio data for " << uuid << LL_ENDL; } - else - { - // LL_INFOS() << "Got asset callback with good audio data for " << uuid << ", making decode request" << LL_ENDL; + else + { + // LL_INFOS() << "Got asset callback with good audio data for " << uuid << ", making decode request" << LL_ENDL; adp->setHasDecodeFailed(false); - adp->setHasLocalData(true); + adp->setHasLocalData(true); LLAudioDecodeMgr::getInstance()->addDecodeRequest(uuid); - } - } - gAudiop->mCurrentTransfer = LLUUID::null; - gAudiop->startNextTransfer(); + } + } + gAudiop->mCurrentTransfer = LLUUID::null; + gAudiop->startNextTransfer(); } @@ -1240,142 +1240,142 @@ void LLAudioEngine::assetCallback(const LLUUID &uuid, LLAssetType::EType type, v LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32 gain, const S32 type) -: mID(id), - mOwnerID(owner_id), - mPriority(0.f), - mGain(gain), - mSourceMuted(false), - mForcedPriority(false), - mLoop(false), - mSyncMaster(false), - mSyncSlave(false), - mQueueSounds(false), - mPlayedOnce(false), - mCorrupted(false), - mType(type), - mChannelp(NULL), - mCurrentDatap(NULL), - mQueuedDatap(NULL) +: mID(id), + mOwnerID(owner_id), + mPriority(0.f), + mGain(gain), + mSourceMuted(false), + mForcedPriority(false), + mLoop(false), + mSyncMaster(false), + mSyncSlave(false), + mQueueSounds(false), + mPlayedOnce(false), + mCorrupted(false), + mType(type), + mChannelp(NULL), + mCurrentDatap(NULL), + mQueuedDatap(NULL) { } LLAudioSource::~LLAudioSource() { - if (mChannelp) - { - // Stop playback of this sound - mChannelp->setSource(NULL); - mChannelp = NULL; - } + if (mChannelp) + { + // Stop playback of this sound + mChannelp->setSource(NULL); + mChannelp = NULL; + } } void LLAudioSource::setChannel(LLAudioChannel *channelp) { - if (channelp == mChannelp) - { - return; - } + if (channelp == mChannelp) + { + return; + } - mChannelp = channelp; + mChannelp = channelp; } void LLAudioSource::update() { - if(mCorrupted) - { - return ; //no need to update - } - - if (!getCurrentBuffer()) - { - LLAudioData *adp = getCurrentData(); - if (adp) - { - // Hack - try and load the sound. Will do this as a callback - // on decode later. + if(mCorrupted) + { + return ; //no need to update + } + + if (!getCurrentBuffer()) + { + LLAudioData *adp = getCurrentData(); + if (adp) + { + // Hack - try and load the sound. Will do this as a callback + // on decode later. if (adp->getBuffer()) - { - play(adp->getID()); - } + { + play(adp->getID()); + } else if (adp->hasDecodedData() && !adp->hasWAVLoadFailed()) { adp->load(); } else if (adp->hasCompletedDecode() && adp->hasDecodeFailed()) // Only mark corrupted after decode is done - { - LL_WARNS() << "Marking LLAudioSource corrupted for " << adp->getID() << LL_ENDL; - mCorrupted = true ; - } - } - } + { + LL_WARNS() << "Marking LLAudioSource corrupted for " << adp->getID() << LL_ENDL; + mCorrupted = true ; + } + } + } } void LLAudioSource::updatePriority() { - if (isForcedPriority()) - { - mPriority = 1.f; - } - else if (isMuted()) - { - mPriority = 0.f; - } - else - { - // Priority is based on distance - LLVector3 dist_vec; - dist_vec.setVec(getPositionGlobal()); + if (isForcedPriority()) + { + mPriority = 1.f; + } + else if (isMuted()) + { + mPriority = 0.f; + } + else + { + // Priority is based on distance + LLVector3 dist_vec; + dist_vec.setVec(getPositionGlobal()); - if (gAudiop) - { - dist_vec -= gAudiop->getListenerPos(); - } + if (gAudiop) + { + dist_vec -= gAudiop->getListenerPos(); + } - F32 dist_squared = llmax(1.f, dist_vec.magVecSquared()); + F32 dist_squared = llmax(1.f, dist_vec.magVecSquared()); - mPriority = mGain / dist_squared; - } + mPriority = mGain / dist_squared; + } } bool LLAudioSource::setupChannel() { - LLAudioData *adp = getCurrentData(); + LLAudioData *adp = getCurrentData(); - if (!adp->getBuffer()) - { - // We're not ready to play back the sound yet, so don't try and allocate a channel for it. - //LL_WARNS() << "Aborting, no buffer" << LL_ENDL; - return false; - } + if (!adp->getBuffer()) + { + // We're not ready to play back the sound yet, so don't try and allocate a channel for it. + //LL_WARNS() << "Aborting, no buffer" << LL_ENDL; + return false; + } - if (!gAudiop) - { - LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; - return false; - } + if (!gAudiop) + { + LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; + return false; + } - if (!mChannelp) - { - // Update the priority, in case we need to push out another channel. - updatePriority(); + if (!mChannelp) + { + // Update the priority, in case we need to push out another channel. + updatePriority(); - setChannel(gAudiop->getFreeChannel(getPriority())); - } + setChannel(gAudiop->getFreeChannel(getPriority())); + } - if (!mChannelp) - { - // Ugh, we don't have any free channels. - // Now we have to reprioritize. - // For now, just don't play the sound. - //LL_WARNS() << "Aborting, no free channels" << LL_ENDL; - return false; - } + if (!mChannelp) + { + // Ugh, we don't have any free channels. + // Now we have to reprioritize. + // For now, just don't play the sound. + //LL_WARNS() << "Aborting, no free channels" << LL_ENDL; + return false; + } - mChannelp->setSource(this); - return true; + mChannelp->setSource(this); + return true; } void LLAudioSource::stop() @@ -1390,249 +1390,249 @@ void LLAudioSource::stop() bool LLAudioSource::play(const LLUUID &audio_uuid) { - // Special abuse of play(); don't play a sound, but kill it. - if (audio_uuid.isNull()) - { - if (getChannel()) - { - getChannel()->setSource(NULL); - setChannel(NULL); - if (!isMuted()) - { - mCurrentDatap = NULL; - } - } - return false; - } - - // Reset our age timeout if someone attempts to play the source. - mAgeTimer.reset(); - - if (!gAudiop) - { - LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; - return false; - } - - LLAudioData *adp = gAudiop->getAudioData(audio_uuid); - addAudioData(adp); - - if (isMuted()) - { - return false; - } - - bool has_buffer = gAudiop->updateBufferForData(adp, audio_uuid); - if (!has_buffer) - { - // Don't bother trying to set up a channel or anything, we don't have an audio buffer. - return false; - } - - if (!setupChannel()) - { - return false; - } - - if (isSyncSlave()) - { - // A sync slave, it doesn't start playing until it's synced up with the master. - // Flag this channel as waiting for sync, and return true. - getChannel()->setWaiting(true); - return true; - } - - getChannel()->play(); - return true; + // Special abuse of play(); don't play a sound, but kill it. + if (audio_uuid.isNull()) + { + if (getChannel()) + { + getChannel()->setSource(NULL); + setChannel(NULL); + if (!isMuted()) + { + mCurrentDatap = NULL; + } + } + return false; + } + + // Reset our age timeout if someone attempts to play the source. + mAgeTimer.reset(); + + if (!gAudiop) + { + LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; + return false; + } + + LLAudioData *adp = gAudiop->getAudioData(audio_uuid); + addAudioData(adp); + + if (isMuted()) + { + return false; + } + + bool has_buffer = gAudiop->updateBufferForData(adp, audio_uuid); + if (!has_buffer) + { + // Don't bother trying to set up a channel or anything, we don't have an audio buffer. + return false; + } + + if (!setupChannel()) + { + return false; + } + + if (isSyncSlave()) + { + // A sync slave, it doesn't start playing until it's synced up with the master. + // Flag this channel as waiting for sync, and return true. + getChannel()->setWaiting(true); + return true; + } + + getChannel()->play(); + return true; } bool LLAudioSource::isDone() const { - if(mCorrupted) - { - return true ; - } - - const F32 MAX_AGE = 60.f; - const F32 MAX_UNPLAYED_AGE = 15.f; - const F32 MAX_MUTED_AGE = 11.f; - - if (isLoop()) - { - // Looped sources never die on their own. - return false; - } - - if (hasPendingPreloads()) - { - return false; - } - - if (mQueuedDatap) - { - // Don't kill this sound if we've got something queued up to play. - return false; - } - - F32 elapsed = mAgeTimer.getElapsedTimeF32(); - - // This is a single-play source - if (!mChannelp) - { - if ((elapsed > (mSourceMuted ? MAX_MUTED_AGE : MAX_UNPLAYED_AGE)) || mPlayedOnce) - { - // We don't have a channel assigned, and it's been - // over 15 seconds since we tried to play it. Don't bother. - //LL_INFOS() << "No channel assigned, source is done" << LL_ENDL; - return true; - } - else - { - return false; - } - } - - if (mChannelp->isPlaying()) - { - if (elapsed > MAX_AGE) - { - // Arbitarily cut off non-looped sounds when they're old. - return true; - } - else - { - // Sound is still playing and we haven't timed out, don't kill it. - return false; - } - } - - if ((elapsed > MAX_UNPLAYED_AGE) || mPlayedOnce) - { - // The sound isn't playing back after 15 seconds or we're already done playing it, kill it. - return true; - } - - return false; + if(mCorrupted) + { + return true ; + } + + const F32 MAX_AGE = 60.f; + const F32 MAX_UNPLAYED_AGE = 15.f; + const F32 MAX_MUTED_AGE = 11.f; + + if (isLoop()) + { + // Looped sources never die on their own. + return false; + } + + if (hasPendingPreloads()) + { + return false; + } + + if (mQueuedDatap) + { + // Don't kill this sound if we've got something queued up to play. + return false; + } + + F32 elapsed = mAgeTimer.getElapsedTimeF32(); + + // This is a single-play source + if (!mChannelp) + { + if ((elapsed > (mSourceMuted ? MAX_MUTED_AGE : MAX_UNPLAYED_AGE)) || mPlayedOnce) + { + // We don't have a channel assigned, and it's been + // over 15 seconds since we tried to play it. Don't bother. + //LL_INFOS() << "No channel assigned, source is done" << LL_ENDL; + return true; + } + else + { + return false; + } + } + + if (mChannelp->isPlaying()) + { + if (elapsed > MAX_AGE) + { + // Arbitarily cut off non-looped sounds when they're old. + return true; + } + else + { + // Sound is still playing and we haven't timed out, don't kill it. + return false; + } + } + + if ((elapsed > MAX_UNPLAYED_AGE) || mPlayedOnce) + { + // The sound isn't playing back after 15 seconds or we're already done playing it, kill it. + return true; + } + + return false; } void LLAudioSource::addAudioData(LLAudioData *adp, const bool set_current) { - // Only handle a single piece of audio data associated with a source right now, - // until I implement prefetch. - - if (!gAudiop) - { - LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; - return; - } - - if (set_current) - { - if (!mCurrentDatap) - { - mCurrentDatap = adp; - if (mChannelp) - { - mChannelp->updateBuffer(); - mChannelp->play(); - } - - // Make sure the audio engine knows that we want to request this sound. - gAudiop->startNextTransfer(); - return; - } - else if (mQueueSounds) - { - // If we have current data, and we're queuing, put - // the object onto the queue. - if (mQueuedDatap) - { - // We only queue one sound at a time, and it's a FIFO. - // Don't put it onto the queue. - return; - } - - if (adp == mCurrentDatap && isLoop()) - { - // No point in queueing the same sound if - // we're looping. - return; - } - mQueuedDatap = adp; - - // Make sure the audio engine knows that we want to request this sound. - gAudiop->startNextTransfer(); - } - else - { - if (mCurrentDatap != adp) - { - // Right now, if we're currently playing this sound in a channel, we - // update the buffer that the channel's associated with - // and play it. This may not be the correct behavior. - mCurrentDatap = adp; - if (mChannelp) - { - mChannelp->updateBuffer(); - mChannelp->play(); - } - // Make sure the audio engine knows that we want to request this sound. - gAudiop->startNextTransfer(); - } - } - } - else - { - // Add it to the preload list. - mPreloadMap[adp->getID()] = adp; - gAudiop->startNextTransfer(); - } + // Only handle a single piece of audio data associated with a source right now, + // until I implement prefetch. + + if (!gAudiop) + { + LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; + return; + } + + if (set_current) + { + if (!mCurrentDatap) + { + mCurrentDatap = adp; + if (mChannelp) + { + mChannelp->updateBuffer(); + mChannelp->play(); + } + + // Make sure the audio engine knows that we want to request this sound. + gAudiop->startNextTransfer(); + return; + } + else if (mQueueSounds) + { + // If we have current data, and we're queuing, put + // the object onto the queue. + if (mQueuedDatap) + { + // We only queue one sound at a time, and it's a FIFO. + // Don't put it onto the queue. + return; + } + + if (adp == mCurrentDatap && isLoop()) + { + // No point in queueing the same sound if + // we're looping. + return; + } + mQueuedDatap = adp; + + // Make sure the audio engine knows that we want to request this sound. + gAudiop->startNextTransfer(); + } + else + { + if (mCurrentDatap != adp) + { + // Right now, if we're currently playing this sound in a channel, we + // update the buffer that the channel's associated with + // and play it. This may not be the correct behavior. + mCurrentDatap = adp; + if (mChannelp) + { + mChannelp->updateBuffer(); + mChannelp->play(); + } + // Make sure the audio engine knows that we want to request this sound. + gAudiop->startNextTransfer(); + } + } + } + else + { + // Add it to the preload list. + mPreloadMap[adp->getID()] = adp; + gAudiop->startNextTransfer(); + } } bool LLAudioSource::hasPendingPreloads() const { - // Check to see if we've got any preloads on deck for this source - for (const data_map::value_type& preload_pair : mPreloadMap) - { - LLAudioData *adp = preload_pair.second; - // note: a bad UUID will forever be !hasDecodedData() + // Check to see if we've got any preloads on deck for this source + for (const data_map::value_type& preload_pair : mPreloadMap) + { + LLAudioData *adp = preload_pair.second; + // note: a bad UUID will forever be !hasDecodedData() // but also hasDecodeFailed(), hence the check for hasDecodeFailed() - if (!adp) - { - continue; - } + if (!adp) + { + continue; + } if (!adp->hasDecodedData() && !adp->hasDecodeFailed()) - { - // This source is still waiting for a preload - return true; - } - } + { + // This source is still waiting for a preload + return true; + } + } - return false; + return false; } LLAudioData * LLAudioSource::getCurrentData() { - return mCurrentDatap; + return mCurrentDatap; } LLAudioData * LLAudioSource::getQueuedData() { - return mQueuedDatap; + return mQueuedDatap; } LLAudioBuffer * LLAudioSource::getCurrentBuffer() { - if (!mCurrentDatap) - { - return NULL; - } + if (!mCurrentDatap) + { + return NULL; + } - return mCurrentDatap->getBuffer(); + return mCurrentDatap->getBuffer(); } @@ -1644,106 +1644,106 @@ LLAudioBuffer * LLAudioSource::getCurrentBuffer() LLAudioChannel::LLAudioChannel() : - mCurrentSourcep(NULL), - mCurrentBufferp(NULL), - mLoopedThisFrame(false), - mWaiting(false), - mSecondaryGain(1.0f) + mCurrentSourcep(NULL), + mCurrentBufferp(NULL), + mLoopedThisFrame(false), + mWaiting(false), + mSecondaryGain(1.0f) { } LLAudioChannel::~LLAudioChannel() { - // Need to disconnect any sources which are using this channel. - //LL_INFOS() << "Cleaning up audio channel" << LL_ENDL; - if (mCurrentSourcep) - { - mCurrentSourcep->setChannel(NULL); - } - mCurrentBufferp = NULL; + // Need to disconnect any sources which are using this channel. + //LL_INFOS() << "Cleaning up audio channel" << LL_ENDL; + if (mCurrentSourcep) + { + mCurrentSourcep->setChannel(NULL); + } + mCurrentBufferp = NULL; } void LLAudioChannel::setSource(LLAudioSource *sourcep) { - //LL_INFOS() << this << ": setSource(" << sourcep << ")" << LL_ENDL; + //LL_INFOS() << this << ": setSource(" << sourcep << ")" << LL_ENDL; - if (!sourcep) - { - // Clearing the source for this channel, don't need to do anything. - //LL_INFOS() << "Clearing source for channel" << LL_ENDL; - cleanup(); - mCurrentSourcep = NULL; - mWaiting = false; - } - else - { - LL_DEBUGS("AudioEngine") << "( id: " << sourcep->getID() << ")" << LL_ENDL; + if (!sourcep) + { + // Clearing the source for this channel, don't need to do anything. + //LL_INFOS() << "Clearing source for channel" << LL_ENDL; + cleanup(); + mCurrentSourcep = NULL; + mWaiting = false; + } + else + { + LL_DEBUGS("AudioEngine") << "( id: " << sourcep->getID() << ")" << LL_ENDL; - if (sourcep == mCurrentSourcep) - { - // Don't reallocate the channel, this will make FMOD goofy. - //LL_INFOS() << "Calling setSource with same source!" << LL_ENDL; - } + if (sourcep == mCurrentSourcep) + { + // Don't reallocate the channel, this will make FMOD goofy. + //LL_INFOS() << "Calling setSource with same source!" << LL_ENDL; + } - mCurrentSourcep = sourcep; + mCurrentSourcep = sourcep; - updateBuffer(); - update3DPosition(); - } + updateBuffer(); + update3DPosition(); + } } bool LLAudioChannel::updateBuffer() { - if (!gAudiop) - { - LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; - return false; - } + if (!gAudiop) + { + LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; + return false; + } - if (!mCurrentSourcep) - { - // This channel isn't associated with any source, nothing - // to be updated - return false; - } + if (!mCurrentSourcep) + { + // This channel isn't associated with any source, nothing + // to be updated + return false; + } - // Initialize the channel's gain setting for this sound. - setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType())); + // Initialize the channel's gain setting for this sound. + setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType())); - LLAudioBuffer *bufferp = mCurrentSourcep->getCurrentBuffer(); - if (bufferp == mCurrentBufferp) - { - if (bufferp) - { - // The source hasn't changed what buffer it's playing - bufferp->mLastUseTimer.reset(); - bufferp->mInUse = true; - } - return false; - } + LLAudioBuffer *bufferp = mCurrentSourcep->getCurrentBuffer(); + if (bufferp == mCurrentBufferp) + { + if (bufferp) + { + // The source hasn't changed what buffer it's playing + bufferp->mLastUseTimer.reset(); + bufferp->mInUse = true; + } + return false; + } - // - // The source changed what buffer it's playing. We need to clean up - // the existing channel - // - cleanup(); + // + // The source changed what buffer it's playing. We need to clean up + // the existing channel + // + cleanup(); - mCurrentBufferp = bufferp; - if (bufferp) - { - bufferp->mLastUseTimer.reset(); - bufferp->mInUse = true; - } + mCurrentBufferp = bufferp; + if (bufferp) + { + bufferp->mLastUseTimer.reset(); + bufferp->mInUse = true; + } - if (!mCurrentBufferp) - { - // There's no new buffer to be played, so we just abort. - return false; - } + if (!mCurrentBufferp) + { + // There's no new buffer to be played, so we just abort. + return false; + } - return true; + return true; } @@ -1755,82 +1755,82 @@ bool LLAudioChannel::updateBuffer() LLAudioData::LLAudioData(const LLUUID &uuid) : - mID(uuid), - mBufferp(NULL), - mHasLocalData(false), - mHasDecodedData(false), - mHasCompletedDecode(false), + mID(uuid), + mBufferp(NULL), + mHasLocalData(false), + mHasDecodedData(false), + mHasCompletedDecode(false), mHasDecodeFailed(false), mHasWAVLoadFailed(false) { - if (uuid.isNull()) - { - // This is a null sound. - return; - } - - if (!gAudiop) - { - LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; - return; - } - - if (gAudiop->hasDecodedFile(uuid)) - { - // Already have a decoded version, don't need to decode it. - setHasLocalData(true); - setHasDecodedData(true); - setHasCompletedDecode(true); - } - else if (gAssetStorage && gAssetStorage->hasLocalAsset(uuid, LLAssetType::AT_SOUND)) - { - setHasLocalData(true); - } + if (uuid.isNull()) + { + // This is a null sound. + return; + } + + if (!gAudiop) + { + LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; + return; + } + + if (gAudiop->hasDecodedFile(uuid)) + { + // Already have a decoded version, don't need to decode it. + setHasLocalData(true); + setHasDecodedData(true); + setHasCompletedDecode(true); + } + else if (gAssetStorage && gAssetStorage->hasLocalAsset(uuid, LLAssetType::AT_SOUND)) + { + setHasLocalData(true); + } } //return false when the audio file is corrupted. bool LLAudioData::load() { - // For now, just assume we're going to use one buffer per audiodata. - if (mBufferp) - { - // We already have this sound in a buffer, don't do anything. - LL_INFOS() << "Already have a buffer for this sound, don't bother loading!" << LL_ENDL; + // For now, just assume we're going to use one buffer per audiodata. + if (mBufferp) + { + // We already have this sound in a buffer, don't do anything. + LL_INFOS() << "Already have a buffer for this sound, don't bother loading!" << LL_ENDL; mHasWAVLoadFailed = false; - return true; - } + return true; + } - if (!gAudiop) - { - LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; + if (!gAudiop) + { + LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; mHasWAVLoadFailed = true; - return false; - } - - mBufferp = gAudiop->getFreeBuffer(); - if (!mBufferp) - { - // No free buffers, abort. - LL_INFOS() << "Not able to allocate a new audio buffer, aborting." << LL_ENDL; + return false; + } + + mBufferp = gAudiop->getFreeBuffer(); + if (!mBufferp) + { + // No free buffers, abort. + LL_INFOS() << "Not able to allocate a new audio buffer, aborting." << LL_ENDL; // *TODO: Mark this failure differently so the audio engine could retry loading this buffer in the future mHasWAVLoadFailed = true; - return true; - } + return true; + } - std::string uuid_str; - std::string wav_path; - mID.toString(uuid_str); - wav_path= gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str) + ".dsf"; + std::string uuid_str; + std::string wav_path; + mID.toString(uuid_str); + wav_path= gDirUtilp->getExpandedFilename(LL_PATH_CACHE,uuid_str) + ".dsf"; mHasWAVLoadFailed = !mBufferp->loadWAV(wav_path); if (mHasWAVLoadFailed) - { - // Hrm. Right now, let's unset the buffer, since it's empty. - gAudiop->cleanupBuffer(mBufferp); - mBufferp = NULL; - - return false; - } - mBufferp->mAudioDatap = this; - return true; + { + // Hrm. Right now, let's unset the buffer, since it's empty. + gAudiop->cleanupBuffer(mBufferp); + mBufferp = NULL; + + return false; + } + mBufferp->mAudioDatap = this; + return true; } |