diff --git a/indra/llaudio/llstreamingaudio.h b/indra/llaudio/llstreamingaudio.h index aa89e6a17..009327c7c 100644 --- a/indra/llaudio/llstreamingaudio.h +++ b/indra/llaudio/llstreamingaudio.h @@ -36,6 +36,8 @@ #include "stdtypes.h" // from llcommon +class LLSD; + // Entirely abstract. Based exactly on the historic API. class LLStreamingAudioInterface { @@ -51,6 +53,7 @@ class LLStreamingAudioInterface virtual void setGain(F32 vol) = 0; virtual F32 getGain() = 0; virtual std::string getURL() = 0; + virtual const LLSD *getMetaData() = 0; //return NULL if not supported. }; #endif // LL_STREAMINGAUDIO_H diff --git a/indra/llaudio/llstreamingaudio_fmod.cpp b/indra/llaudio/llstreamingaudio_fmod.cpp index fe9468856..08cc74bf2 100644 --- a/indra/llaudio/llstreamingaudio_fmod.cpp +++ b/indra/llaudio/llstreamingaudio_fmod.cpp @@ -51,6 +51,8 @@ public: const std::string& getURL() { return mInternetStreamURL; } int getOpenState(); + + FSOUND_STREAM* getStream() { return mInternetStream; } protected: FSOUND_STREAM* mInternetStream; bool mReady; @@ -66,7 +68,8 @@ protected: LLStreamingAudio_FMOD::LLStreamingAudio_FMOD() : mCurrentInternetStreamp(NULL), mFMODInternetStreamChannel(-1), - mGain(1.0f) + mGain(1.0f), + mMetaData(NULL) { // Number of milliseconds of audio to buffer for the audio card. // Must be larger than the usual Second Life frame stutter time. @@ -87,6 +90,17 @@ LLStreamingAudio_FMOD::~LLStreamingAudio_FMOD() // nothing interesting/safe to do. } +signed char F_CALLBACKAPI MetaDataCallback(char *name, char *value, void *userdata) +{ + std::string szName(name); + if(szName == "TITLE" || szName=="TIT2" || szName=="Title") + (*(LLSD*)userdata)["TITLE"] = value; + if(szName == "ARTIST" || szName=="TPE1" || szName =="WM/AlbumTitle") + (*(LLSD*)userdata)["ARTIST"] = value; + else + (*(LLSD*)userdata)[std::string(name)] = value; + return true; +} void LLStreamingAudio_FMOD::start(const std::string& url) { @@ -104,6 +118,10 @@ void LLStreamingAudio_FMOD::start(const std::string& url) llinfos << "Starting internet stream: " << url << llendl; mCurrentInternetStreamp = new LLAudioStreamManagerFMOD(url); mURL = url; + if(mCurrentInternetStreamp->getStream()) + { + mMetaData = new LLSD; + } } else { @@ -154,6 +172,10 @@ void LLStreamingAudio_FMOD::update() // Reset volume to previously set volume setGain(getGain()); FSOUND_SetPaused(mFMODInternetStreamChannel, false); + if(mCurrentInternetStreamp->getStream() && mMetaData) + { + FSOUND_Stream_Net_SetMetadataCallback(mCurrentInternetStreamp->getStream(),&MetaDataCallback, mMetaData); + } } } } @@ -184,11 +206,17 @@ void LLStreamingAudio_FMOD::update() // buffering break; } - } void LLStreamingAudio_FMOD::stop() { + if(mMetaData) + { + if(mCurrentInternetStreamp && mCurrentInternetStreamp->getStream()) + FSOUND_Stream_Net_SetMetadataCallback(mCurrentInternetStreamp->getStream(),NULL,NULL); + delete mMetaData; + mMetaData = NULL; + } if (mFMODInternetStreamChannel != -1) { FSOUND_SetPaused(mFMODInternetStreamChannel, true); diff --git a/indra/llaudio/llstreamingaudio_fmod.h b/indra/llaudio/llstreamingaudio_fmod.h index 968ab53a0..5c4597fae 100644 --- a/indra/llaudio/llstreamingaudio_fmod.h +++ b/indra/llaudio/llstreamingaudio_fmod.h @@ -54,6 +54,7 @@ class LLStreamingAudio_FMOD : public LLStreamingAudioInterface /*virtual*/ void setGain(F32 vol); /*virtual*/ F32 getGain(); /*virtual*/ std::string getURL(); + /*virtual*/ const LLSD *getMetaData(){return mMetaData;} //return NULL if not supported. private: LLAudioStreamManagerFMOD *mCurrentInternetStreamp; @@ -62,6 +63,8 @@ private: std::string mURL; F32 mGain; + + LLSD *mMetaData; }; diff --git a/indra/newview/llmediaremotectrl.cpp b/indra/newview/llmediaremotectrl.cpp index 877ba0de5..68db6b6b3 100644 --- a/indra/newview/llmediaremotectrl.cpp +++ b/indra/newview/llmediaremotectrl.cpp @@ -46,6 +46,7 @@ #include "llparcel.h" #include "llviewercontrol.h" #include "llbutton.h" +#include "llstreamingaudio.h" //////////////////////////////////////////////////////////////////////////////// // @@ -88,7 +89,11 @@ BOOL LLMediaRemoteCtrl::postBuild() childSetAction("media_pause",LLOverlayBar::toggleMediaPlay,this); childSetAction("music_pause",LLOverlayBar::toggleMusicPlay,this); - childSetAction("expand", onClickExpandBtn, this); + childSetAction("expand", onClickExpandBtn, this); + + LLButton *pause = getChild("music_pause"); + mCachedPauseTip = pause->getToolTip(); + return TRUE; } @@ -235,6 +240,28 @@ void LLMediaRemoteCtrl::enableMediaButtons() music_pause_btn->setEnabled(music_show_pause); music_pause_btn->setVisible(music_show_pause); music_play_btn->setVisible(! music_show_pause); + + if(music_show_pause) + { + LLStreamingAudioInterface *stream = gAudiop ? gAudiop->getStreamingAudioImpl() : NULL; + if(stream && stream->getMetaData()) + { + std::string info_text = "Loading..."; + const LLSD& metadata = *(stream->getMetaData()); + LLSD artist = metadata.get("ARTIST"); + LLSD title = metadata.get("TITLE"); + if(artist.isDefined() && title.isDefined()) + info_text = artist.asString() + " -- " + title.asString(); + else if(title.isDefined()) + info_text = std::string("Title: ") + title.asString(); + else if(artist.isDefined()) + info_text = std::string("Artist: ") + artist.asString(); + music_pause_btn->setToolTip(info_text); + } + else + music_pause_btn->setToolTip(mCachedPauseTip); + } + childSetColor("music_icon", music_icon_color); if(!media_icon_name.empty()) { diff --git a/indra/newview/llmediaremotectrl.h b/indra/newview/llmediaremotectrl.h index 3a49a4cb9..9fedfd386 100644 --- a/indra/newview/llmediaremotectrl.h +++ b/indra/newview/llmediaremotectrl.h @@ -35,6 +35,8 @@ #include "llpanel.h" +class LLButton; + //////////////////////////////////////////////////////////////////////////////// // class LLMediaRemoteCtrl : public LLPanel @@ -57,6 +59,8 @@ public: protected: void build(); + + std::string mCachedPauseTip; }; #endif diff --git a/indra/newview/llviewermedia_streamingaudio.h b/indra/newview/llviewermedia_streamingaudio.h index 270bab762..e5093f974 100644 --- a/indra/newview/llviewermedia_streamingaudio.h +++ b/indra/newview/llviewermedia_streamingaudio.h @@ -55,6 +55,7 @@ class LLStreamingAudio_MediaPlugins : public LLStreamingAudioInterface /*virtual*/ void setGain(F32 vol); /*virtual*/ F32 getGain(); /*virtual*/ std::string getURL(); + /*virtual*/ LLSD *getMetaData(){return NULL;} //return NULL if not supported. private: LLPluginClassMedia* initializeMedia(const std::string& media_type);