parent
bfcb1f61a8
commit
90286fa476
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@ private:
|
|||
|
||||
std::string mURL;
|
||||
F32 mGain;
|
||||
S32 mRetryCount;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1821,6 +1821,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.
|
||||
|
|
|
|||
|
|
@ -83,6 +83,8 @@ void LLViewerAudio::registerIdleListener()
|
|||
|
||||
void LLViewerAudio::startInternetStreamWithAutoFade(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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue