status: keep track of elapsed time separately from status

updating elapsed time on a separate rate causes too many problems.
this time it was current song position updating at the wrong time.
This commit is contained in:
Andrzej Rybczak
2014-09-05 22:21:28 +02:00
parent 0b4d7e203b
commit 166242210f
4 changed files with 20 additions and 10 deletions

View File

@@ -2681,7 +2681,7 @@ void seek()
Progressbar::lock(); Progressbar::lock();
Statusbar::lock(); Statusbar::lock();
unsigned songpos = Status::get().elapsedTime(); unsigned songpos = Status::elapsedTime();
auto t = Timer; auto t = Timer;
int old_timeout = wFooter->getTimeout(); int old_timeout = wFooter->getTimeout();

View File

@@ -56,6 +56,7 @@ size_t first_line_scroll_begin = 0;
size_t second_line_scroll_begin = 0; size_t second_line_scroll_begin = 0;
MPD::Status m_status; MPD::Status m_status;
unsigned m_elapsed_time = 0;
// local copies of these are needed to be independent // local copies of these are needed to be independent
// of the order of idle events incoming from MPD. // of the order of idle events incoming from MPD.
@@ -240,6 +241,11 @@ const MPD::Status &Status::get()
return m_status; return m_status;
} }
unsigned Status::elapsedTime()
{
return m_elapsed_time;
}
/*************************************************************************/ /*************************************************************************/
void Status::Changes::playlist(unsigned previous_version) void Status::Changes::playlist(unsigned previous_version)
@@ -399,7 +405,7 @@ void Status::Changes::songID()
void Status::Changes::elapsedTime(bool update_elapsed) void Status::Changes::elapsedTime(bool update_elapsed)
{ {
if (update_elapsed) if (update_elapsed)
m_status = Mpd.getStatus(); m_elapsed_time = Mpd.getStatus().elapsedTime();
const auto &st = m_status; const auto &st = m_status;
if (st.playerState() == MPD::psStop) if (st.playerState() == MPD::psStop)
@@ -431,17 +437,17 @@ void Status::Changes::elapsedTime(bool update_elapsed)
if (Config.display_remaining_time) if (Config.display_remaining_time)
{ {
tracklength += "-"; tracklength += "-";
tracklength += MPD::Song::ShowTime(st.totalTime()-st.elapsedTime()); tracklength += MPD::Song::ShowTime(st.totalTime()-m_elapsed_time);
} }
else else
tracklength += MPD::Song::ShowTime(st.elapsedTime()); tracklength += MPD::Song::ShowTime(m_elapsed_time);
tracklength += "/"; tracklength += "/";
tracklength += MPD::Song::ShowTime(st.totalTime()); tracklength += MPD::Song::ShowTime(st.totalTime());
tracklength += "]"; tracklength += "]";
} }
else else
{ {
tracklength += MPD::Song::ShowTime(st.elapsedTime()); tracklength += MPD::Song::ShowTime(m_elapsed_time);
tracklength += "]"; tracklength += "]";
} }
NC::WBuffer np_song; NC::WBuffer np_song;
@@ -455,10 +461,10 @@ void Status::Changes::elapsedTime(bool update_elapsed)
if (Config.display_remaining_time) if (Config.display_remaining_time)
{ {
tracklength = "-"; tracklength = "-";
tracklength += MPD::Song::ShowTime(st.totalTime()-st.elapsedTime()); tracklength += MPD::Song::ShowTime(st.totalTime()-m_elapsed_time);
} }
else else
tracklength = MPD::Song::ShowTime(st.elapsedTime()); tracklength = MPD::Song::ShowTime(m_elapsed_time);
if (st.totalTime()) if (st.totalTime())
{ {
tracklength += "/"; tracklength += "/";
@@ -498,7 +504,7 @@ void Status::Changes::elapsedTime(bool update_elapsed)
flags(); flags();
} }
if (Progressbar::isUnlocked()) if (Progressbar::isUnlocked())
Progressbar::draw(st.elapsedTime(), st.totalTime()); Progressbar::draw(m_elapsed_time, st.totalTime());
} }
void Status::Changes::repeat(bool show_msg) void Status::Changes::repeat(bool show_msg)

View File

@@ -36,6 +36,10 @@ void clear();
const MPD::Status &get(); const MPD::Status &get();
// get current elapsed time (the one from
// the status is outdated most of the time).
unsigned elapsedTime();
namespace Changes {// namespace Changes {//
void playlist(unsigned previous_version); void playlist(unsigned previous_version);

View File

@@ -112,7 +112,7 @@ void Statusbar::unlock()
put() << wclrtoeol; put() << wclrtoeol;
break; break;
case Design::Alternative: case Design::Alternative:
Progressbar::draw(Status::get().elapsedTime(), Status::get().totalTime()); Progressbar::draw(Status::elapsedTime(), Status::get().totalTime());
break; break;
} }
wFooter->refresh(); wFooter->refresh();
@@ -145,7 +145,7 @@ void Statusbar::tryRedraw()
Status::Changes::elapsedTime(false); Status::Changes::elapsedTime(false);
break; break;
case Design::Alternative: case Design::Alternative:
Progressbar::draw(Status::get().elapsedTime(), Status::get().totalTime()); Progressbar::draw(Status::elapsedTime(), Status::get().totalTime());
break; break;
} }
wFooter->refresh(); wFooter->refresh();