Compare commits

..

No commits in common. "6c2ae2f6bb57554e0d153f5bf8b246dfefef162b" and "525e952753cc218a2be15438689d8ed2f5d97b50" have entirely different histories.

View File

@ -609,8 +609,7 @@ static struct app_context
struct str_map playback_info; ///< Current song info struct str_map playback_info; ///< Current song info
struct poller_timer elapsed_event; ///< Seconds elapsed event struct poller_timer elapsed_event; ///< Seconds elapsed event
int64_t elapsed_since; ///< Time of the last tick int64_t elapsed_since; ///< Time of the next tick
bool elapsed_poll; ///< Poll MPD for the elapsed time?
// TODO: initialize these to -1 // TODO: initialize these to -1
int song; ///< Current song index int song; ///< Current song index
@ -693,13 +692,6 @@ tab_selection_range (struct tab *self)
// --- Configuration ----------------------------------------------------------- // --- Configuration -----------------------------------------------------------
static void
on_poll_elapsed_time_changed (struct config_item *item)
{
// This is only set once, on application startup
g.elapsed_poll = item->value.boolean;
}
static struct config_schema g_config_settings[] = static struct config_schema g_config_settings[] =
{ {
{ .name = "address", { .name = "address",
@ -712,11 +704,6 @@ static struct config_schema g_config_settings[] =
{ .name = "root", { .name = "root",
.comment = "Where all the files MPD is playing are located", .comment = "Where all the files MPD is playing are located",
.type = CONFIG_ITEM_STRING }, .type = CONFIG_ITEM_STRING },
{ .name = "poll_elapsed_time",
.comment = "Whether to actively poll MPD for the elapsed time",
.type = CONFIG_ITEM_BOOLEAN,
.on_change = on_poll_elapsed_time_changed,
.default_ = "off" },
{} {}
}; };
@ -3419,20 +3406,11 @@ mpd_update_playback_state (void)
mpd_read_time (duration, &g.song_duration, NULL); mpd_read_time (duration, &g.song_duration, NULL);
strv_free (&fields); strv_free (&fields);
// We could also just poll the server each half a second but let's not
poller_timer_reset (&g.elapsed_event); poller_timer_reset (&g.elapsed_event);
if (g.state == PLAYER_PLAYING) if (g.state == PLAYER_PLAYING)
{ {
int until_next = 1000 - msec_past_second; poller_timer_set (&g.elapsed_event, 1000 - msec_past_second);
// We could make use of "until_next", however this might create
// an intensive busy loop when playback stalls (typically because of
// some network issues). Half a second will work reasonably well.
if (g.elapsed_poll)
until_next = 500;
// Set a timer for when the next round second of playback happens
poller_timer_set (&g.elapsed_event, until_next);
// Remember when the last round second was, relative to monotonic time
g.elapsed_since = clock_msec (CLOCK_BEST) - msec_past_second; g.elapsed_since = clock_msec (CLOCK_BEST) - msec_past_second;
} }
@ -3559,19 +3537,15 @@ mpd_on_info_response (const struct mpd_response *response,
} }
static void static void
mpd_on_elapsed_time_tick (void *user_data) mpd_on_tick (void *user_data)
{ {
(void) user_data; (void) user_data;
// Compute how much time has elapsed since the last round second
int64_t diff_msec = clock_msec (CLOCK_BEST) - g.elapsed_since; int64_t diff_msec = clock_msec (CLOCK_BEST) - g.elapsed_since;
int elapsed_sec = diff_msec / 1000; int elapsed_sec = diff_msec / 1000;
int elapsed_msec = diff_msec % 1000; int elapsed_msec = diff_msec % 1000;
g.song_elapsed += elapsed_sec; g.song_elapsed += elapsed_sec;
g.elapsed_since += elapsed_sec * 1000; g.elapsed_since += elapsed_sec * 1000;
// Try to get called on the next round second of playback
poller_timer_set (&g.elapsed_event, 1000 - elapsed_msec); poller_timer_set (&g.elapsed_event, 1000 - elapsed_msec);
app_invalidate (); app_invalidate ();
@ -3592,15 +3566,6 @@ mpd_request_info (void)
mpd_client_idle (c, 0); mpd_client_idle (c, 0);
} }
static void
mpd_on_elapsed_time_tick_poll (void *user_data)
{
(void) user_data;
// As soon as the reply arrives, we (may) set the timer again
mpd_request_info ();
}
static void static void
mpd_on_events (unsigned subsystems, void *user_data) mpd_on_events (unsigned subsystems, void *user_data)
{ {
@ -3952,9 +3917,7 @@ app_init_poller_events (void)
poller_timer_set (&g.connect_event, 0); poller_timer_set (&g.connect_event, 0);
g.elapsed_event = poller_timer_make (&g.poller); g.elapsed_event = poller_timer_make (&g.poller);
g.elapsed_event.dispatcher = g.elapsed_poll g.elapsed_event.dispatcher = mpd_on_tick;
? mpd_on_elapsed_time_tick_poll
: mpd_on_elapsed_time_tick;
g.refresh_event = poller_idle_make (&g.poller); g.refresh_event = poller_idle_make (&g.poller);
g.refresh_event.dispatcher = app_on_refresh; g.refresh_event.dispatcher = app_on_refresh;