summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2021-10-28 23:42:38 +0300
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2021-11-18 20:35:50 +0200
commitac2135a459f65cf9fdeb7715bcc5b4a6f1c47990 (patch)
tree4898e6a3bdf49364659ee2903bb4584727da8fbc
parent472509dff43931bff8528c573ca950ea851f0928 (diff)
SL-16235 Restart music in case of an error
Additional logging
-rw-r--r--indra/llaudio/llstreamingaudio_fmodstudio.cpp53
-rw-r--r--indra/llaudio/llstreamingaudio_fmodstudio.h1
-rw-r--r--indra/newview/llappviewer.cpp2
-rw-r--r--indra/newview/llvieweraudio.cpp5
4 files changed, 48 insertions, 13 deletions
diff --git a/indra/llaudio/llstreamingaudio_fmodstudio.cpp b/indra/llaudio/llstreamingaudio_fmodstudio.cpp
index 08d19209aa..6439095cee 100644
--- a/indra/llaudio/llstreamingaudio_fmodstudio.cpp
+++ b/indra/llaudio/llstreamingaudio_fmodstudio.cpp
@@ -63,7 +63,8 @@ LLStreamingAudio_FMODSTUDIO::LLStreamingAudio_FMODSTUDIO(FMOD::System *system) :
mSystem(system),
mCurrentInternetStreamp(NULL),
mFMODInternetStreamChannelp(NULL),
-mGain(1.0f)
+mGain(1.0f),
+mRetryCount(0)
{
// Number of milliseconds of audio to buffer for the audio card.
// Must be larger than the usual Second Life frame stutter time.
@@ -100,15 +101,17 @@ void LLStreamingAudio_FMODSTUDIO::start(const std::string& url)
if (!url.empty())
{
- LL_INFOS() << "Starting internet stream: " << url << LL_ENDL;
+ LL_INFOS("FMOD") << "Starting internet stream: " << url << LL_ENDL;
mCurrentInternetStreamp = new LLAudioStreamManagerFMODSTUDIO(mSystem, url);
mURL = url;
}
else
{
- LL_INFOS() << "Set internet stream to null" << LL_ENDL;
+ LL_INFOS("FMOD") << "Set internet stream to null" << LL_ENDL;
mURL.clear();
}
+
+ mRetryCount = 0;
}
@@ -121,7 +124,7 @@ void LLStreamingAudio_FMODSTUDIO::update()
LLAudioStreamManagerFMODSTUDIO *streamp = *iter;
if (streamp->stopStream())
{
- LL_INFOS() << "Closed dead stream" << LL_ENDL;
+ LL_INFOS("FMOD") << "Closed dead stream" << LL_ENDL;
delete streamp;
mDeadStreams.erase(iter++);
}
@@ -154,10 +157,33 @@ void LLStreamingAudio_FMODSTUDIO::update()
setGain(getGain());
mFMODInternetStreamChannelp->setPaused(false);
}
+ mRetryCount = 0;
}
else if (open_state == FMOD_OPENSTATE_ERROR)
{
- stop();
+ LL_INFOS("FMOD") << "State: FMOD_OPENSTATE_ERROR"
+ << " Progress: " << U32(progress)
+ << " Starving: " << S32(starving)
+ << " Diskbusy: " << S32(diskbusy) << LL_ENDL;
+ if (mRetryCount < 2)
+ {
+ // Retry
+ std::string url = mURL;
+ stop(); // might drop mURL, drops mCurrentInternetStreamp
+
+ mRetryCount++;
+
+ if (!url.empty())
+ {
+ LL_INFOS("FMOD") << "Restarting internet stream: " << url << ", attempt " << (mRetryCount + 1) << LL_ENDL;
+ mCurrentInternetStreamp = new LLAudioStreamManagerFMODSTUDIO(mSystem, url);
+ mURL = url;
+ }
+ }
+ else
+ {
+ stop();
+ }
return;
}
@@ -181,7 +207,7 @@ void LLStreamingAudio_FMODSTUDIO::update()
{
if (!strcmp(tag.name, "Sample Rate Change"))
{
- LL_INFOS() << "Stream forced changing sample rate to " << *((float *)tag.data) << LL_ENDL;
+ LL_INFOS("FMOD") << "Stream forced changing sample rate to " << *((float *)tag.data) << LL_ENDL;
mFMODInternetStreamChannelp->setFrequency(*((float *)tag.data));
}
continue;
@@ -195,9 +221,9 @@ void LLStreamingAudio_FMODSTUDIO::update()
mFMODInternetStreamChannelp->getPaused(&paused);
if (!paused)
{
- LL_INFOS() << "Stream starvation detected! Pausing stream until buffer nearly full." << LL_ENDL;
- LL_INFOS() << " (diskbusy=" << diskbusy << ")" << LL_ENDL;
- LL_INFOS() << " (progress=" << progress << ")" << LL_ENDL;
+ LL_INFOS("FMOD") << "Stream starvation detected! Pausing stream until buffer nearly full." << LL_ENDL;
+ LL_INFOS("FMOD") << " (diskbusy=" << diskbusy << ")" << LL_ENDL;
+ LL_INFOS("FMOD") << " (progress=" << progress << ")" << LL_ENDL;
mFMODInternetStreamChannelp->setPaused(true);
}
}
@@ -220,14 +246,14 @@ void LLStreamingAudio_FMODSTUDIO::stop()
if (mCurrentInternetStreamp)
{
- LL_INFOS() << "Stopping internet stream: " << mCurrentInternetStreamp->getURL() << LL_ENDL;
+ LL_INFOS("FMOD") << "Stopping internet stream: " << mCurrentInternetStreamp->getURL() << LL_ENDL;
if (mCurrentInternetStreamp->stopStream())
{
delete mCurrentInternetStreamp;
}
else
{
- LL_WARNS() << "Pushing stream to dead list: " << mCurrentInternetStreamp->getURL() << LL_ENDL;
+ LL_WARNS("FMOD") << "Pushing stream to dead list: " << mCurrentInternetStreamp->getURL() << LL_ENDL;
mDeadStreams.push_back(mCurrentInternetStreamp);
}
mCurrentInternetStreamp = NULL;
@@ -246,6 +272,7 @@ void LLStreamingAudio_FMODSTUDIO::pause(int pauseopt)
{
if (mCurrentInternetStreamp)
{
+ LL_INFOS("FMOD") << "Pausing internet stream" << LL_ENDL;
stop();
}
}
@@ -314,7 +341,7 @@ mReady(false)
if (result != FMOD_OK)
{
- LL_WARNS() << "Couldn't open fmod stream, error "
+ LL_WARNS("FMOD") << "Couldn't open fmod stream, error "
<< FMOD_ErrorString(result)
<< LL_ENDL;
mReady = false;
@@ -329,7 +356,7 @@ FMOD::Channel *LLAudioStreamManagerFMODSTUDIO::startStream()
// We need a live and opened stream before we try and play it.
if (!mInternetStream || getOpenState() != FMOD_OPENSTATE_READY)
{
- LL_WARNS() << "No internet stream to start playing!" << LL_ENDL;
+ LL_WARNS("FMOD") << "No internet stream to start playing!" << LL_ENDL;
return NULL;
}
diff --git a/indra/llaudio/llstreamingaudio_fmodstudio.h b/indra/llaudio/llstreamingaudio_fmodstudio.h
index 1fc3c54d79..ea451bc9b5 100644
--- a/indra/llaudio/llstreamingaudio_fmodstudio.h
+++ b/indra/llaudio/llstreamingaudio_fmodstudio.h
@@ -67,6 +67,7 @@ private:
std::string mURL;
F32 mGain;
+ S32 mRetryCount;
};
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 3ce325cd4b..c4ba754084 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1841,6 +1841,8 @@ bool LLAppViewer::cleanup()
if (gAudiop)
{
+ LL_INFOS() << "Shutting down audio" << LL_ENDL;
+
// be sure to stop the internet stream cleanly BEFORE destroying the interface to stop it.
gAudiop->stopInternetStream();
// shut down the streaming audio sub-subsystem first, in case it relies on not outliving the general audio subsystem.
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index f97ba0930e..f810e5f4ef 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -83,6 +83,8 @@ void LLViewerAudio::registerIdleListener()
void LLViewerAudio::startInternetStreamWithAutoFade(const std::string &streamURI)
{
+ LL_DEBUGS("AudioEngine") << "Start with outo fade: " << streamURI << LL_ENDL;
+
// Old and new stream are identical
if (mNextStreamURI == streamURI)
{
@@ -166,6 +168,7 @@ bool LLViewerAudio::onIdleUpdate()
if (gAudiop)
{
// Clear URI
+ LL_DEBUGS("AudioEngine") << "Done with audio fade" << LL_ENDL;
gAudiop->startInternetStream(LLStringUtil::null);
gAudiop->stopInternetStream();
}
@@ -176,6 +179,7 @@ bool LLViewerAudio::onIdleUpdate()
if (gAudiop)
{
+ LL_DEBUGS("AudioEngine") << "Audio fade in: " << mNextStreamURI << LL_ENDL;
LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl();
if(stream && stream->supportsAdjustableBufferSizes())
stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize"));
@@ -219,6 +223,7 @@ void LLViewerAudio::stopInternetStreamWithAutoFade()
if (gAudiop)
{
+ LL_DEBUGS("AudioEngine") << "Stop audio fade" << LL_ENDL;
gAudiop->startInternetStream(LLStringUtil::null);
gAudiop->stopInternetStream();
}