X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_song.c;h=d7b6d2c51d5b4feb7e52be03d6d39f67bb838064;hb=HEAD;hp=973812b4e53d393db8d531e575ad044cf7b63ef6;hpb=debdd19f6d36f0e60bf5cab4c6adc575774c1f56;p=ncmpc.git diff --git a/src/screen_song.c b/src/screen_song.c index 973812b..d7b6d2c 100644 --- a/src/screen_song.c +++ b/src/screen_song.c @@ -1,5 +1,5 @@ /* 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 @@ -25,7 +25,7 @@ #include "i18n.h" #include "screen.h" #include "charset.h" -#include "utils.h" +#include "time_format.h" #include "mpdclient.h" #include @@ -112,19 +112,6 @@ screen_song_clear(void) } } -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) { @@ -135,7 +122,7 @@ 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) { @@ -173,7 +160,7 @@ screen_song_exit(void) } static void -screen_song_resize(int cols, int rows) +screen_song_resize(unsigned cols, unsigned rows) { list_window_resize(lw, cols, rows); } @@ -226,9 +213,12 @@ screen_song_append(const char *label, const char *value, unsigned label_col) char *p = g_strdup(value_iter); unsigned width = utf8_cut_width(p, value_col); - if (width == 0) + if (width == 0) { /* not enough room for anything - bail out */ + g_free(entry); + g_free(p); break; + } *entry_iter = 0; @@ -365,6 +355,41 @@ screen_song_add_stats(struct mpd_connection *connection) 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) { @@ -410,9 +435,7 @@ screen_song_update(struct mpdclient *c) mpd_status_get_audio_format(c->status); if (format) { char buf[32]; - g_snprintf(buf, sizeof(buf), _("%u:%u:%u"), - format->sample_rate, format->bits, - format->channels); + audio_format_to_string(buf, sizeof(buf), format); screen_song_append(_(tag_labels[LABEL_FORMAT]), buf, max_tag_label_width); } @@ -426,14 +449,14 @@ screen_song_update(struct mpdclient *c) 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; } @@ -479,7 +502,7 @@ screen_song_cmd(struct mpdclient *c, command_t cmd) 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; }