(Loading...) text in ticker now goes away after 10 seconds. Some streams simply do not provide artist/title metadata. Only parse metadata every half second (opposed to every frame). Also fixed paused text getting clobbered.

This commit is contained in:
Shyotl
2012-01-05 15:52:03 -06:00
parent c73913a864
commit dcbf39bcfa
2 changed files with 41 additions and 22 deletions

View File

@@ -14,7 +14,7 @@
SHFloaterMediaTicker::SHFloaterMediaTicker() : LLFloater()/*, LLSingleton<SHFloaterMediaTicker>()*/,
mPlayState(STATE_PAUSED),
mPlayState(STATE_PLAYING),
mArtistScrollChars(0),
mTitleScrollChars(0),
mCurScrollChar(0),
@@ -40,8 +40,7 @@ SHFloaterMediaTicker::SHFloaterMediaTicker() : LLFloater()/*, LLSingleton<SHFloa
mszPaused = getString("paused");
mOscillatorColor = gColors.getColor("SHMediaTickerOscillatorColor");
if(mArtistText) mArtistText->setText(mszPaused);
if(mTitleText) mTitleText->setText(mszPaused);
setPaused(true);
return LLFloater::postBuild();
}
@@ -90,25 +89,39 @@ void SHFloaterMediaTicker::updateTickerText() //called via draw.
bool dirty = setPaused(stream_paused);
if(!stream_paused)
{
const LLSD* metadata = gAudiop->getStreamingAudioImpl()->getMetaData();
LLSD artist = metadata ? metadata->get("ARTIST") : LLSD();
LLSD title = metadata ? metadata->get("TITLE") : LLSD();
if(dirty || mUpdateTimer.getElapsedTimeF64() >= .5f)
{
mUpdateTimer.reset();
const LLSD* metadata = gAudiop->getStreamingAudioImpl()->getMetaData();
LLSD artist = metadata ? metadata->get("ARTIST") : LLSD();
LLSD title = metadata ? metadata->get("TITLE") : LLSD();
dirty |= setArtist(artist.isDefined() ? artist.asString() : mszLoading);
dirty |= setTitle(title.isDefined() ? title.asString() : mszLoading);
if(dirty)
resetTicker();
else iterateTickerOffset();
dirty |= setArtist(artist.isDefined() ? artist.asString() : mszLoading);
dirty |= setTitle(title.isDefined() ? title.asString() : mszLoading);
if(artist.isDefined() && title.isDefined())
mLoadTimer.stop();
else if(dirty)
mLoadTimer.reset();
else if(mLoadTimer.getStarted() && mLoadTimer.getElapsedTimeF64() > 10.f) //It has been 10 seconds.. give up.
{
if(!artist.isDefined())
dirty |= setArtist("");
if(!title.isDefined())
dirty |= setTitle("");
mLoadTimer.stop();
}
}
}
if(dirty)
resetTicker();
else
iterateTickerOffset();
}
void SHFloaterMediaTicker::drawOscilloscope() //called via draw.
{
if(!mVisualizer || !gAudiop->getStreamingAudioImpl()->supportsWaveData())
return;
if(mPlayState == STATE_PAUSED)
return;
static const S32 NUM_LINE_STRIPS = 64; //How many lines to draw. 64 is more than enough.
static const S32 WAVE_DATA_STEP_SIZE = 4; //Increase to provide more history at expense of cpu/memory.
@@ -116,22 +129,26 @@ void SHFloaterMediaTicker::drawOscilloscope() //called via draw.
static const S32 NUM_WAVE_DATA_VALUES = NUM_LINE_STRIPS*WAVE_DATA_STEP_SIZE; //Actual buffer size. Don't toy with this. Change above vars to tweak.
static F32 buf[NUM_WAVE_DATA_VALUES];
if(!gAudiop->getStreamingAudioImpl()->getWaveData(&buf[0],NUM_WAVE_DATA_VALUES,WAVE_DATA_STEP_SIZE))
return;
LLRect root_rect = mVisualizer->getRect();
F32 height = root_rect.getHeight();
F32 height_scale = height / 2.f; //WaveData ranges from 1 to -1, so height_scale = height / 2
F32 width_scale = root_rect.getWidth() / (F32)NUM_WAVE_DATA_VALUES;
F32 width = root_rect.getWidth();
F32 width_scale = width / (F32)NUM_WAVE_DATA_VALUES;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.color4fv(mOscillatorColor.mV);
gGL.pushMatrix();
gGL.translatef((F32)root_rect.mLeft, (F32)root_rect.mBottom + height*.5f, 0.f);
gGL.begin( LLRender::LINE_STRIP );
for(S32 i = NUM_WAVE_DATA_VALUES-1; i>=0;i-=WAVE_DATA_STEP_SIZE)
gGL.vertex2f((F32)i * width_scale, buf[i]*height_scale);
if(mPlayState == STATE_PAUSED || !gAudiop->getStreamingAudioImpl()->getWaveData(&buf[0],NUM_WAVE_DATA_VALUES,WAVE_DATA_STEP_SIZE))
{
gGL.vertex2i(0,0);
gGL.vertex2i((S32)width,0);
}
else
for(S32 i = NUM_WAVE_DATA_VALUES-1; i>=0;i-=WAVE_DATA_STEP_SIZE)
gGL.vertex2f((F32)i * width_scale, buf[i]*height_scale);
gGL.end();
gGL.popMatrix();
gGL.flush();
@@ -144,8 +161,8 @@ bool SHFloaterMediaTicker::setPaused(bool pause)
mPlayState = pause ? STATE_PAUSED : STATE_PLAYING;
if(pause)
{
if(mArtistText) mArtistText->setText(mszPaused);
if(mTitleText) mTitleText->setText(mszPaused);
setArtist(mszPaused);
setTitle(mszPaused);
}
return true;
}

View File

@@ -37,6 +37,8 @@ private:
std::string mszArtist;
std::string mszTitle;
LLTimer mScrollTimer;
LLTimer mLoadTimer;
LLTimer mUpdateTimer;
S32 mArtistScrollChars;
S32 mTitleScrollChars;
S32 mCurScrollChar;