diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp index bfcc2ea124cebd187fa7f63dde9218e178b32fc8..9eebe84d711cd27513fed67dd13d2b44efb87b9d 100644 --- a/indra/llaudio/llaudioengine_fmodstudio.cpp +++ b/indra/llaudio/llaudioengine_fmodstudio.cpp @@ -486,7 +486,6 @@ bool LLAudioChannelFMODSTUDIO::updateBuffer() // If we have a source for the channel, we need to update its gain. if (mCurrentSourcep) { - // SJB: warnings can spam and hurt framerate, disabling //FMOD_RESULT result; mChannelp->setVolume(getSecondaryGain() * mCurrentSourcep->getGain()); @@ -677,7 +676,7 @@ bool LLAudioBufferFMODSTUDIO::loadWAV(const std::string& filename) mSoundp = NULL; } - FMOD_MODE base_mode = FMOD_LOOP_NORMAL | FMOD_SOFTWARE; + FMOD_MODE base_mode = FMOD_LOOP_NORMAL; FMOD_CREATESOUNDEXINFO exinfo; memset(&exinfo,0,sizeof(exinfo)); exinfo.cbsize = sizeof(exinfo); diff --git a/indra/llaudio/llstreamingaudio_fmodstudio.cpp b/indra/llaudio/llstreamingaudio_fmodstudio.cpp index 5110cd380640476849271d79fc260dcd651f17c5..d8833e114cd6f9ae6ce805ca992e5dc2e70cf506 100644 --- a/indra/llaudio/llstreamingaudio_fmodstudio.cpp +++ b/indra/llaudio/llstreamingaudio_fmodstudio.cpp @@ -100,9 +100,17 @@ void LLStreamingAudio_FMODSTUDIO::start(const std::string& url) if (!url.empty()) { - LL_INFOS() << "Starting internet stream: " << url << LL_ENDL; - mCurrentInternetStreamp = new LLAudioStreamManagerFMODSTUDIO(mSystem,url); - mURL = url; + if(mDeadStreams.empty()) + { + LL_INFOS() << "Starting internet stream: " << url << LL_ENDL; + mCurrentInternetStreamp = new LLAudioStreamManagerFMODSTUDIO(mSystem,url); + mURL = url; + } + else + { + LL_INFOS() << "Deferring stream load until buffer release: " << url << LL_ENDL; + mPendingURL = url; + } } else { @@ -131,6 +139,21 @@ void LLStreamingAudio_FMODSTUDIO::update() } } + if(!mDeadStreams.empty()) + { + llassert_always(mCurrentInternetStreamp == NULL); + return; + } + + if(!mPendingURL.empty()) + { + llassert_always(mCurrentInternetStreamp == NULL); + llinfos << "Starting internet stream: " << mPendingURL << LL_ENDL; + mCurrentInternetStreamp = new LLAudioStreamManagerFMODSTUDIO(mSystem,mPendingURL); + mURL = mPendingURL; + mPendingURL.clear(); + } + // Don't do anything if there are no streams playing if (!mCurrentInternetStreamp) { @@ -211,6 +234,8 @@ void LLStreamingAudio_FMODSTUDIO::update() void LLStreamingAudio_FMODSTUDIO::stop() { + mPendingURL.clear(); + if (mFMODInternetStreamChannelp) { mFMODInternetStreamChannelp->setPaused(true); @@ -264,7 +289,7 @@ int LLStreamingAudio_FMODSTUDIO::isPlaying() { return 1; // Active and playing } - else if (!mURL.empty()) + else if (!mURL.empty() || !mPendingURL.empty()) { return 2; // "Paused" } @@ -344,8 +369,6 @@ bool LLAudioStreamManagerFMODSTUDIO::stopStream() { if (mInternetStream) { - - bool close = true; switch (getOpenState()) { @@ -356,9 +379,8 @@ bool LLAudioStreamManagerFMODSTUDIO::stopStream() close = true; } - if (close) + if (close && mInternetStream->release() == FMOD_OK) { - mInternetStream->release(); mStreamChannel = NULL; mInternetStream = NULL; return true; diff --git a/indra/llaudio/llstreamingaudio_fmodstudio.h b/indra/llaudio/llstreamingaudio_fmodstudio.h index 4ed797c7421fabff6335c9fa5c344ba9ec67f2b5..5e1a6a373ca280bb042ef9651f8aa962a355f0f9 100644 --- a/indra/llaudio/llstreamingaudio_fmodstudio.h +++ b/indra/llaudio/llstreamingaudio_fmodstudio.h @@ -66,6 +66,7 @@ private: std::list<LLAudioStreamManagerFMODSTUDIO *> mDeadStreams; std::string mURL; + std::string mPendingURL; F32 mGain; };