From 829e1b311f5fdd3c19d812b14cccf1175ddf6dc6 Mon Sep 17 00:00:00 2001 From: McCabe Maxsted Date: Fri, 20 Feb 2009 15:33:07 -0700 Subject: Added STATUS_DEAD to LLMediaBase --- linden/indra/llaudio/audioengine.cpp | 55 +++++++++++---------------- linden/indra/llaudio/audioengine.h | 6 ++- linden/indra/llmedia/llmediabase.h | 3 +- linden/indra/llmedia/llmediaimplgstreamer.cpp | 33 +++++++++++----- linden/indra/llmedia/llmediaimplgstreamer.h | 2 +- linden/indra/newview/lloverlaybar.cpp | 8 ---- 6 files changed, 55 insertions(+), 52 deletions(-) (limited to 'linden') diff --git a/linden/indra/llaudio/audioengine.cpp b/linden/indra/llaudio/audioengine.cpp index 3a079f1..400e938 100644 --- a/linden/indra/llaudio/audioengine.cpp +++ b/linden/indra/llaudio/audioengine.cpp @@ -45,6 +45,8 @@ #include "llassetstorage.h" #include "llmediamanager.h" +#include "llmediabase.h" +#include "llmediaimplcommon.h" // necessary for grabbing sounds from sim (implemented in viewer) extern void request_sound(const LLUUID &sound_guid); @@ -101,6 +103,8 @@ void LLAudioEngine::setDefaults() for (U32 i = 0; i < LLAudioEngine::AUDIO_TYPE_COUNT; i++) mSecondaryGain[i] = 1.0f; + + mStatus = LLMediaBase::STATUS_UNKNOWN; } @@ -168,6 +172,14 @@ void LLAudioEngine::shutdown() } +//////////////////////////////////////////////////////////////////////////////// +// virtual (derives from LLMediaBase) +LLMediaBase::EStatus LLAudioEngine::getStatus() +{ + return mStatus; +} + + // virtual void LLAudioEngine::startInternetStream(const std::string& url) { @@ -179,12 +191,22 @@ void LLAudioEngine::startInternetStream(const std::string& url) if (mgr) { mInternetStreamMedia = mgr->createSourceFromMimeType(LLURI(url).scheme(), "audio/mpeg"); // assumes that whatever media implementation supports mp3 also supports vorbis. - LL_INFOS("AudioEngine") << "mInternetStreamMedia is now " << mInternetStreamMedia << llendl; + //LL_INFOS("AudioEngine") << "mInternetStreamMedia is now " << mInternetStreamMedia << llendl; } } if(!mInternetStreamMedia) return; + + // Check for a dead stream, just in case + if(getStatus() == LLMediaBase::STATUS_DEAD) + { + mInternetStreamURL.clear(); + mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_STOP); + mInternetStreamMedia->updateMedia(); + stopInternetStream(); + return; + } if (!url.empty()) { @@ -202,7 +224,6 @@ void LLAudioEngine::startInternetStream(const std::string& url) mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_STOP); mInternetStreamMedia->updateMedia(); } - //#endif } // virtual @@ -223,31 +244,6 @@ void LLAudioEngine::stopInternetStream() } // virtual -void LLAudioEngine::pauseInternetStream(int pause) -{ - LL_INFOS("AudioEngine") << "entered pauseInternetStream()" << llendl; - - if(!mInternetStreamMedia) - return; - - if(pause) - { - if(! mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_PAUSE)) - { - LL_INFOS("AudioEngine") << "attempting to pause stream failed!" << llendl; - } - } - else - { - if(! mInternetStreamMedia->addCommand(LLMediaBase::COMMAND_START)) - { - LL_INFOS("AudioEngine") << "attempting to unpause stream failed!" << llendl; - } - } - mInternetStreamMedia->updateMedia(); -} - -// virtual void LLAudioEngine::updateInternetStream() { if (mInternetStreamMedia) @@ -265,11 +261,6 @@ int LLAudioEngine::isInternetStreamPlaying() return 1; // Active and playing } - if (mInternetStreamMedia->getStatus() == LLMediaBase::STATUS_PAUSED) - { - return 2; // paused - } - return 0; // Stopped } diff --git a/linden/indra/llaudio/audioengine.h b/linden/indra/llaudio/audioengine.h index 15cb35f..878a96a 100644 --- a/linden/indra/llaudio/audioengine.h +++ b/linden/indra/llaudio/audioengine.h @@ -45,6 +45,8 @@ #include "llframetimer.h" #include "llassettype.h" +#include "llmediabase.h" + class LLMediaBase; const F32 LL_WIND_UPDATE_INTERVAL = 0.1f; @@ -153,13 +155,13 @@ public: // Internet stream methods virtual void startInternetStream(const std::string& url); virtual void stopInternetStream(); - virtual void pauseInternetStream(int pause); virtual void updateInternetStream(); virtual int isInternetStreamPlaying(); virtual void getInternetStreamInfo(char* artist, char* title); // use a value from 0.0 to 1.0, inclusive virtual void setInternetStreamGain(F32 vol); virtual const std::string& getInternetStreamURL(); + virtual LLMediaBase::EStatus getStatus(); // For debugging usage virtual LLVector3 getListenerPos(); @@ -246,6 +248,8 @@ protected: LLFrameTimer mWindUpdateTimer; + LLMediaBase::EStatus mStatus; + private: void setDefaults(); LLMediaBase *mInternetStreamMedia; diff --git a/linden/indra/llmedia/llmediabase.h b/linden/indra/llmedia/llmediabase.h index dad02ca..b5b9420 100644 --- a/linden/indra/llmedia/llmediabase.h +++ b/linden/indra/llmedia/llmediabase.h @@ -153,7 +153,8 @@ class LLMediaBase STATUS_STARTED = 3, STATUS_STOPPED = 4, STATUS_PAUSED = 6, - STATUS_RESETTING = 7 + STATUS_RESETTING = 7, + STATUS_DEAD = 8 }; virtual bool addCommand( ECommand cmd ) = 0; virtual bool clearCommand() = 0; diff --git a/linden/indra/llmedia/llmediaimplgstreamer.cpp b/linden/indra/llmedia/llmediaimplgstreamer.cpp index b17dbb9..20a1fc3 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer.cpp +++ b/linden/indra/llmedia/llmediaimplgstreamer.cpp @@ -395,8 +395,7 @@ bool LLMediaImplGStreamer::navigateTo (const std::string urlIn) LL_DEBUGS("MediaImpl") << "Setting media URI: " << urlIn.c_str() << LL_ENDL; - if (NULL == mPump - || NULL == mPlaybin) + if (mPump == NULL || mPlaybin == NULL) { return false; } @@ -415,6 +414,8 @@ bool LLMediaImplGStreamer::navigateTo (const std::string urlIn) llgst_bus_add_watch (bus, bus_callback, this); llgst_object_unref (bus); + mState = GST_STATE_READY; + // navigateTo implicitly plays, too. play(); @@ -447,6 +448,8 @@ bool LLMediaImplGStreamer::unload() } mVideoSink = NULL; + mState = GST_STATE_NULL; + setStatus(LLMediaBase::STATUS_DEAD); return true; } @@ -458,15 +461,19 @@ bool LLMediaImplGStreamer::updateMedia() //LL_DEBUGS("MediaImpl") << "updating media..." << LL_ENDL; // sanity check - if (NULL == mPump - || NULL == mPlaybin) + if (mPump == NULL || mPlaybin == NULL) { #ifdef LL_GST_REPORT_STATE_CHANGES LL_DEBUGS("MediaImpl") << "dead media..." << LL_ENDL; #endif + mState = GST_STATE_NULL; + setStatus(LLMediaBase::STATUS_DEAD); return false; } + if (mState == GST_STATE_VOID_PENDING || mState == GST_STATE_NULL) + return false; + // process next outstanding command switch (nextCommand()) { @@ -579,13 +586,18 @@ bool LLMediaImplGStreamer::stop() { LL_DEBUGS("MediaImpl") << "attempting to stop..." << LL_ENDL; - if (!mPlaybin) return true; + if (!mPlaybin || mState == GST_STATE_NULL) + return true; GstElement *pipeline = (GstElement *)llgst_object_ref(GST_OBJECT(mPlaybin)); llgst_object_unref(pipeline); llgst_element_set_state(pipeline, GST_STATE_READY); - mState = GST_STATE_READY; + + if (mState == GST_STATE_PLAYING) + mState = GST_STATE_VOID_PENDING; + else + mState = GST_STATE_READY; GstStateChangeReturn state_change = llgst_element_get_state(mPlaybin, NULL, NULL, GST_CLOCK_TIME_NONE); LL_DEBUGS("MediaImpl") << "get_state: " << state_change << LL_ENDL; @@ -599,7 +611,8 @@ bool LLMediaImplGStreamer::play() { LL_DEBUGS("MediaImpl") << "attempting to play..." << LL_ENDL; - if (!mPlaybin) return true; + if (!mPlaybin || mState == GST_STATE_NULL) + return true; GstElement *pipeline = (GstElement *)llgst_object_ref(GST_OBJECT(mPlaybin)); llgst_object_unref(pipeline); @@ -615,6 +628,7 @@ bool LLMediaImplGStreamer::play() // Check to make sure playing was successful. If not, stop. if (state_change == GST_STATE_CHANGE_FAILURE) { + setStatus(LLMediaBase::STATUS_STOPPED); stop(); } @@ -627,7 +641,8 @@ bool LLMediaImplGStreamer::pause() { LL_DEBUGS("MediaImpl") << "attempting to pause..." << LL_ENDL; - if (!mPlaybin) return true; + if (!mPlaybin || mState == GST_STATE_NULL) + return true; llgst_element_set_state(mPlaybin, GST_STATE_PAUSED); mState = GST_STATE_PAUSED; @@ -675,7 +690,7 @@ bool LLMediaImplGStreamer::setVolume(float volume) if(mVolume == volume) return true; - LL_DEBUGS("MediaImpl") << "setVolume(" << volume << ") : " << getpid() << LL_ENDL; + LL_DEBUGS("MediaImpl") << "setVolume(" << volume << ") : " << getpid() << LL_ENDL; mVolume = volume; if (mPlaybin) { diff --git a/linden/indra/llmedia/llmediaimplgstreamer.h b/linden/indra/llmedia/llmediaimplgstreamer.h index 10b01dd..dec970a 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer.h +++ b/linden/indra/llmedia/llmediaimplgstreamer.h @@ -74,7 +74,7 @@ class LLMediaImplGStreamer: /* virtual */ int getTextureFormatType() const; /* virtual */ int getTextureFormatInternal() const; /* virtual */ bool seek( double time ); - /* virtual */ bool setVolume( float volume ); + /* virtual */ bool setVolume( float volume ); LLMediaEmitter< LLMediaObserver > getEventEmitter() const {return mEventEmitter;}; diff --git a/linden/indra/newview/lloverlaybar.cpp b/linden/indra/newview/lloverlaybar.cpp index 80cac14..a4eedbb 100644 --- a/linden/indra/newview/lloverlaybar.cpp +++ b/linden/indra/newview/lloverlaybar.cpp @@ -391,14 +391,6 @@ void LLOverlayBar::toggleMusicPlay(void*) } } } - //else - //{ - // gOverlayBar->mMusicState = PAUSED; // desired state - // if (gAudiop) - // { - // gAudiop->pauseInternetStream(1); - // } - //} else { gOverlayBar->mMusicState = STOPPED; // desired state -- cgit v1.1