diff --git a/NEWS b/NEWS index 0081f7596..b4ba20306 100644 --- a/NEWS +++ b/NEWS @@ -77,6 +77,7 @@ ver 0.16 (20??/??/??) - reimplemented as a filter plugin - fall back to track gain if album gain is unavailable - optionally use hardware mixer to apply replay gain + - added mode "auto" * log unused/unknown block parameters * removed the deprecated "error_file" option * save state when stopped diff --git a/doc/mpd.conf.5 b/doc/mpd.conf.5 index e0a30449e..4cddd7ba9 100644 --- a/doc/mpd.conf.5 +++ b/doc/mpd.conf.5 @@ -170,12 +170,14 @@ only choice) if MPD was compiled without libsamplerate. For an up-to-date list of available converters, please see the libsamplerate documentation (available online at <\fBhttp://www.mega-nerd.com/SRC/\fP>). .TP -.B replaygain +.B replaygain If specified, mpd will adjust the volume of songs played using ReplayGain tags (see <\fBhttp://www.replaygain.org/\fP>). Setting this to "album" will adjust volume using the album's ReplayGain tags, while setting it to "track" will -adjust it using the track ReplayGain tags. Currently only FLAC, Ogg Vorbis, -Musepack, and MP3 (through ID3v2 ReplayGain tags, not APEv2) are supported. +adjust it using the track ReplayGain tags. "auto" uses the track ReplayGain +tags if random play is activated otherwise the album ReplayGain tags. Currently +only FLAC, Ogg Vorbis, Musepack, and MP3 (through ID3v2 ReplayGain tags, not +APEv2) are supported. .TP .B replaygain_preamp <-15 to 15> This is the gain (in dB) applied to songs with ReplayGain tags. diff --git a/src/filter/replay_gain_filter_plugin.c b/src/filter/replay_gain_filter_plugin.c index c8e74c7fe..159b2eab2 100644 --- a/src/filter/replay_gain_filter_plugin.c +++ b/src/filter/replay_gain_filter_plugin.c @@ -28,6 +28,7 @@ #include "replay_gain_info.h" #include "replay_gain_config.h" #include "mixer_control.h" +#include "playlist.h" #include #include @@ -114,7 +115,11 @@ replay_gain_filter_init(G_GNUC_UNUSED const struct config_param *param, filter_init(&filter->filter, &replay_gain_filter_plugin); filter->mixer = NULL; - filter->mode = replay_gain_mode; + if (replay_gain_mode == REPLAY_GAIN_AUTO) { + filter->mode = g_playlist.queue.random ? REPLAY_GAIN_TRACK : REPLAY_GAIN_ALBUM; + } else { + filter->mode = replay_gain_mode; + } replay_gain_info_init(&filter->info); filter->volume = PCM_VOLUME_1; @@ -161,10 +166,18 @@ replay_gain_filter_filter(struct filter *_filter, (struct replay_gain_filter *)_filter; bool success; void *dest; + enum replay_gain_mode rg_mode; /* check if the mode has been changed since the last call */ - if (filter->mode != replay_gain_mode) { - filter->mode = replay_gain_mode; + if (replay_gain_mode == REPLAY_GAIN_AUTO) { + rg_mode = g_playlist.queue.random ? REPLAY_GAIN_TRACK : REPLAY_GAIN_ALBUM; + } else { + rg_mode = replay_gain_mode; + } + + if (filter->mode != rg_mode) { + g_debug("replay gain mode has changed %d->%d\n", filter->mode, rg_mode); + filter->mode = rg_mode; replay_gain_filter_update(filter); } diff --git a/src/replay_gain_config.c b/src/replay_gain_config.c index 7cb08bba3..3eae9d960 100644 --- a/src/replay_gain_config.c +++ b/src/replay_gain_config.c @@ -43,6 +43,9 @@ const char * replay_gain_get_mode_string(void) { switch (replay_gain_mode) { + case REPLAY_GAIN_AUTO: + return "auto"; + case REPLAY_GAIN_OFF: return "off"; @@ -69,6 +72,8 @@ replay_gain_set_mode_string(const char *p) replay_gain_mode = REPLAY_GAIN_TRACK; else if (strcmp(p, "album") == 0) replay_gain_mode = REPLAY_GAIN_ALBUM; + else if (strcmp(p, "auto") == 0) + replay_gain_mode = REPLAY_GAIN_AUTO; else return false; diff --git a/src/replay_gain_info.h b/src/replay_gain_info.h index f39974d59..49f375b04 100644 --- a/src/replay_gain_info.h +++ b/src/replay_gain_info.h @@ -26,7 +26,8 @@ #include enum replay_gain_mode { - REPLAY_GAIN_OFF = -1, + REPLAY_GAIN_AUTO = -2, + REPLAY_GAIN_OFF, REPLAY_GAIN_ALBUM, REPLAY_GAIN_TRACK, }; diff --git a/test/run_filter.c b/test/run_filter.c index f9d628aeb..29fa502e1 100644 --- a/test/run_filter.c +++ b/test/run_filter.c @@ -25,6 +25,7 @@ #include "pcm_volume.h" #include "idle.h" #include "mixer_control.h" +#include "playlist.h" #include @@ -33,6 +34,8 @@ #include #include +struct playlist g_playlist; + void idle_add(G_GNUC_UNUSED unsigned flags) { diff --git a/test/run_output.c b/test/run_output.c index 6e0fffbd0..188f87104 100644 --- a/test/run_output.c +++ b/test/run_output.c @@ -27,6 +27,7 @@ #include "pcm_convert.h" #include "event_pipe.h" #include "idle.h" +#include "playlist.h" #include @@ -34,6 +35,8 @@ #include #include +struct playlist g_playlist; + void idle_add(G_GNUC_UNUSED unsigned flags) {