diff --git a/src/screen_song.c b/src/screen_song.c
index 2a69860ae33e9466c96ec89e02cee843d0773fd7..086768cec6b058f353604cf1b3df2bfd35156846 100644 (file)
--- a/src/screen_song.c
+++ b/src/screen_song.c
/* ncmpc (Ncurses MPD Client)
- * (c) 2004-2010 The Music Player Daemon Project
+ * (c) 2004-2017 The Music Player Daemon Project
* Project homepage: http://musicpd.org
*
* This program is free software; you can redistribute it and/or modify
}
}
-static void
-screen_song_paint(void);
-
-/**
- * Repaint and update the screen.
- */
-static void
-screen_song_repaint(void)
-{
- screen_song_paint();
- wrefresh(lw->w);
-}
-
static const char *
screen_song_list_callback(unsigned idx, gcc_unused void *data)
{
static void
-screen_song_init(WINDOW *w, int cols, int rows)
+screen_song_init(WINDOW *w, unsigned cols, unsigned rows)
{
for (unsigned i = 0; i < G_N_ELEMENTS(tag_labels); ++i) {
if (tag_labels[i] != NULL) {
}
static void
-screen_song_resize(int cols, int rows)
+screen_song_resize(unsigned cols, unsigned rows)
{
list_window_resize(lw, cols, rows);
}
}
static void
-screen_song_add_song(const struct mpd_song *song, const struct mpdclient *c)
+screen_song_add_song(const struct mpd_song *song)
{
assert(song != NULL);
screen_song_append(_(tag_labels[LABEL_PATH]), mpd_song_get_uri(song),
max_tag_label_width);
- if (mpdclient_is_playing(c) && c->song != NULL &&
- strcmp(mpd_song_get_uri(c->song), mpd_song_get_uri(song)) == 0 &&
- mpd_status_get_kbit_rate(c->status)) {
- char buf[16];
- g_snprintf(buf, sizeof(buf), _("%d kbps"),
- mpd_status_get_kbit_rate(c->status));
- screen_song_append(_(tag_labels[LABEL_BITRATE]), buf,
- max_tag_label_width);
-
- const struct mpd_audio_format *format =
- mpd_status_get_audio_format(c->status);
- if (format) {
- g_snprintf(buf, sizeof(buf), _("%u:%u:%u"),
- format->sample_rate, format->bits,
- format->channels);
- screen_song_append(_(tag_labels[LABEL_FORMAT]), buf,
- max_tag_label_width);
- }
- }
}
static void
return true;
}
+static void
+audio_format_to_string(char *buffer, size_t size,
+ const struct mpd_audio_format *format)
+{
+#if LIBMPDCLIENT_CHECK_VERSION(2,10,0)
+ if (format->bits == MPD_SAMPLE_FORMAT_FLOAT) {
+ g_snprintf(buffer, size, "%u:f:%u",
+ format->sample_rate,
+ format->channels);
+ return;
+ }
+
+ if (format->bits == MPD_SAMPLE_FORMAT_DSD) {
+ if (format->sample_rate > 0 &&
+ format->sample_rate % 44100 == 0) {
+ /* use shortcuts such as "dsd64" which implies the
+ sample rate */
+ g_snprintf(buffer, size, "dsd%u:%u",
+ format->sample_rate * 8 / 44100,
+ format->channels);
+ return;
+ }
+
+ g_snprintf(buffer, size, "%u:dsd:%u",
+ format->sample_rate,
+ format->channels);
+ return;
+ }
+#endif
+
+ g_snprintf(buffer, size, "%u:%u:%u",
+ format->sample_rate, format->bits,
+ format->channels);
+}
+
static void
screen_song_update(struct mpdclient *c)
{
mpd_song_get_uri(c->song)) != 0 ||
!mpdclient_is_playing(c))) {
g_ptr_array_add(current.lines, g_strdup(_("Selected song")) );
- screen_song_add_song(current.selected_song, c);
+ screen_song_add_song(current.selected_song);
g_ptr_array_add(current.lines, g_strdup("\0"));
}
}
current.played_song = mpd_song_dup(c->song);
g_ptr_array_add(current.lines, g_strdup(_("Currently playing song")));
- screen_song_add_song(current.played_song, c);
+ screen_song_add_song(current.played_song);
+
+ if (mpd_status_get_kbit_rate(c->status) > 0) {
+ char buf[16];
+ g_snprintf(buf, sizeof(buf), _("%d kbps"),
+ mpd_status_get_kbit_rate(c->status));
+ screen_song_append(_(tag_labels[LABEL_BITRATE]), buf,
+ max_tag_label_width);
+ }
+
+ const struct mpd_audio_format *format =
+ mpd_status_get_audio_format(c->status);
+ if (format) {
+ char buf[32];
+ audio_format_to_string(buf, sizeof(buf), format);
+ screen_song_append(_(tag_labels[LABEL_FORMAT]), buf,
+ max_tag_label_width);
+ }
+
g_ptr_array_add(current.lines, g_strdup("\0"));
}
mpdclient_handle_error(c);
list_window_set_length(lw, current.lines->len);
- screen_song_repaint();
+ screen_song_paint();
}
static bool
screen_song_cmd(struct mpdclient *c, command_t cmd)
{
if (list_window_scroll_cmd(lw, cmd)) {
- screen_song_repaint();
+ screen_song_paint();
return true;
}
if (screen_find(lw, cmd, screen_song_list_callback, NULL)) {
/* center the row */
list_window_center(lw, lw->selected);
- screen_song_repaint();
+ screen_song_paint();
return true;
}