Show playlist length time
Now we look distinctly Sonata-like.
This commit is contained in:
parent
0541b7e179
commit
b050113eed
67
nncmpp.c
67
nncmpp.c
|
@ -612,6 +612,7 @@ static struct app_context
|
||||||
|
|
||||||
struct item_list playlist; ///< Current playlist
|
struct item_list playlist; ///< Current playlist
|
||||||
uint32_t playlist_version; ///< Playlist version
|
uint32_t playlist_version; ///< Playlist version
|
||||||
|
int playlist_time; ///< Play time in seconds
|
||||||
|
|
||||||
// Data:
|
// Data:
|
||||||
|
|
||||||
|
@ -1289,21 +1290,45 @@ app_draw_view (void)
|
||||||
app_draw_scrollbar ();
|
app_draw_scrollbar ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
app_write_mpd_status_playlist (struct row_buffer *buf)
|
||||||
|
{
|
||||||
|
struct str stats;
|
||||||
|
str_init (&stats);
|
||||||
|
|
||||||
|
if (g.playlist.len == 1)
|
||||||
|
str_append_printf (&stats, "1 song ");
|
||||||
|
else
|
||||||
|
str_append_printf (&stats, "%zu songs ", g.playlist.len);
|
||||||
|
|
||||||
|
int hours = g.playlist_time / 3600;
|
||||||
|
int minutes = g.playlist_time % 3600 / 60;
|
||||||
|
if (hours || minutes)
|
||||||
|
{
|
||||||
|
str_append_c (&stats, ' ');
|
||||||
|
|
||||||
|
if (hours == 1)
|
||||||
|
str_append_printf (&stats, " 1 hour");
|
||||||
|
else if (hours)
|
||||||
|
str_append_printf (&stats, " %d hours", hours);
|
||||||
|
|
||||||
|
if (minutes == 1)
|
||||||
|
str_append_printf (&stats, " 1 minute");
|
||||||
|
else if (minutes)
|
||||||
|
str_append_printf (&stats, " %d minutes", minutes);
|
||||||
|
}
|
||||||
|
row_buffer_append (buf, stats.str, APP_ATTR (NORMAL));
|
||||||
|
str_free (&stats);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
app_write_mpd_status (struct row_buffer *buf)
|
app_write_mpd_status (struct row_buffer *buf)
|
||||||
{
|
{
|
||||||
struct str_map *map = &g.playback_info;
|
struct str_map *map = &g.playback_info;
|
||||||
|
|
||||||
// TODO: "N hours N minutes" ("stats" -> "playtime" or count in code)
|
|
||||||
char *stats;
|
|
||||||
if (str_map_find (map, "updating_db"))
|
if (str_map_find (map, "updating_db"))
|
||||||
stats = xstrdup ("Updating database...");
|
row_buffer_append (buf, "Updating database...", APP_ATTR (NORMAL));
|
||||||
else if (g.playlist.len == 1)
|
|
||||||
stats = xstrdup_printf ("%zu song", g.playlist.len);
|
|
||||||
else
|
else
|
||||||
stats = xstrdup_printf ("%zu songs", g.playlist.len);
|
app_write_mpd_status_playlist (buf);
|
||||||
row_buffer_append (buf, stats, APP_ATTR (NORMAL));
|
|
||||||
free (stats);
|
|
||||||
|
|
||||||
struct row_buffer right;
|
struct row_buffer right;
|
||||||
row_buffer_init (&right);
|
row_buffer_init (&right);
|
||||||
|
@ -2733,11 +2758,28 @@ mpd_read_time (const char *value, int *sec, int *optional_msec)
|
||||||
*sec = MIN (INT_MAX, n);
|
*sec = MIN (INT_MAX, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mpd_update_playlist_time (void)
|
||||||
|
{
|
||||||
|
g.playlist_time = 0;
|
||||||
|
|
||||||
|
// It would also be possible to retrieve this from "stats" -> "playtime"
|
||||||
|
unsigned long n;
|
||||||
|
for (size_t i = 0; i < g.playlist.len; i++)
|
||||||
|
{
|
||||||
|
compact_map_t map = item_list_get (&g.playlist, i);
|
||||||
|
const char *time = compact_map_find (map, "time");
|
||||||
|
if (time && xstrtoul (&n, time, 10))
|
||||||
|
g.playlist_time += n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mpd_update_playback_state (void)
|
mpd_update_playback_state (void)
|
||||||
{
|
{
|
||||||
struct str_map *map = &g.playback_info;
|
struct str_map *map = &g.playback_info;
|
||||||
g.song_elapsed = g.song_duration = g.volume = g.song = -1;
|
g.song_elapsed = g.song_duration = g.volume = g.song = -1;
|
||||||
|
uint32_t last_playlist_version = g.playlist_version;
|
||||||
g.playlist_version = 0;
|
g.playlist_version = 0;
|
||||||
|
|
||||||
const char *state;
|
const char *state;
|
||||||
|
@ -2784,6 +2826,9 @@ mpd_update_playback_state (void)
|
||||||
if (xstrtoul_map (map, "playlist", &n)) g.playlist_version = n;
|
if (xstrtoul_map (map, "playlist", &n)) g.playlist_version = n;
|
||||||
if (xstrtoul_map (map, "song", &n)) g.song = n;
|
if (xstrtoul_map (map, "song", &n)) g.song = n;
|
||||||
|
|
||||||
|
if (g.playlist_version != last_playlist_version)
|
||||||
|
mpd_update_playlist_time ();
|
||||||
|
|
||||||
app_invalidate ();
|
app_invalidate ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2949,10 +2994,10 @@ mpd_on_failure (void *user_data)
|
||||||
print_debug ("connection to MPD failed");
|
print_debug ("connection to MPD failed");
|
||||||
mpd_queue_reconnect ();
|
mpd_queue_reconnect ();
|
||||||
|
|
||||||
item_list_resize (&g.playlist, 0);
|
|
||||||
str_map_clear (&g.playback_info);
|
str_map_clear (&g.playback_info);
|
||||||
mpd_update_playback_state ();
|
item_list_resize (&g.playlist, 0);
|
||||||
|
|
||||||
|
mpd_update_playback_state ();
|
||||||
current_tab_update ();
|
current_tab_update ();
|
||||||
info_tab_update ();
|
info_tab_update ();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue