handle now playing song properly

np song was sometimes wrongly taken, if user was moving items in playlist.
fix this by taking it directly from mpd, but do this as seldom as possible.
This commit is contained in:
Andrzej Rybczak
2009-03-12 21:24:00 +01:00
parent 0aa36f3fb2
commit 502ce9be6a

View File

@@ -162,6 +162,7 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
static size_t playing_song_scroll_begin = 0;
static bool repeat_one_allowed = 0;
static string player_state;
static MPD::Song np;
int sx, sy;
wFooter->Bold(1);
@@ -183,6 +184,8 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
{
if (!Playlist::BlockUpdate)
{
np = Mpd->GetCurrentSong();
bool was_filtered = myPlaylist->Main()->isFiltered();
myPlaylist->Main()->ShowAll();
SongList list;
@@ -347,6 +350,7 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
myPlaylist->Main()->BoldOption(myPlaylist->OldPlaying, 0);
}
catch (std::out_of_range &) { }
np = Mpd->GetCurrentSong();
myPlaylist->Main()->BoldOption(myPlaylist->NowPlaying, 1);
if (Config.autocenter_mode && !myPlaylist->Main()->isFiltered())
myPlaylist->Main()->Highlight(myPlaylist->NowPlaying);
@@ -375,26 +379,25 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
}
if (changed.ElapsedTime)
{
const Song *s = myPlaylist->NowPlayingSong();
if (s)
if (!np.Empty())
{
int elapsed = Mpd->GetElapsedTime();
// 'repeat one' mode check - be sure that we deal with item with known length
if (s->GetTotalLength() && elapsed == s->GetTotalLength()-1)
if (np.GetTotalLength() && elapsed == np.GetTotalLength()-1)
repeat_one_allowed = 1;
WindowTitle(utf_to_locale_cpy(s->toString(Config.song_window_title_format)));
WindowTitle(utf_to_locale_cpy(np.toString(Config.song_window_title_format)));
if (!block_statusbar_update && Config.statusbar_visibility)
{
string tracklength;
if (s->GetTotalLength())
if (np.GetTotalLength())
{
tracklength = " [";
tracklength += Song::ShowTime(elapsed);
tracklength += "/";
tracklength += s->GetLength();
tracklength += np.GetLength();
tracklength += "]";
}
else
@@ -405,17 +408,17 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
}
*wFooter << XY(0, 1) << wclrtoeol << player_state
<< fmtBoldEnd
<< Scroller(utf_to_locale_cpy(s->toString(Config.song_status_format)), wFooter->GetWidth()-player_state.length()-tracklength.length(), playing_song_scroll_begin)
<< Scroller(utf_to_locale_cpy(np.toString(Config.song_status_format)), wFooter->GetWidth()-player_state.length()-tracklength.length(), playing_song_scroll_begin)
<< fmtBold
<< XY(wFooter->GetWidth()-tracklength.length(), 1) << tracklength;
}
if (!block_progressbar_update)
{
double progressbar_size = (double)elapsed/(s->GetTotalLength());
double progressbar_size = (double)elapsed/(np.GetTotalLength());
int howlong = wFooter->GetWidth()*progressbar_size;
wFooter->SetColor(Config.progressbar_color);
mvwhline(wFooter->Raw(), 0, 0, 0, wFooter->GetWidth());
if (s->GetTotalLength())
if (np.GetTotalLength())
{
mvwhline(wFooter->Raw(), 0, 0, '=',howlong);
mvwaddch(wFooter->Raw(), 0, howlong, '>');