summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--doc/mpd.conf.58
-rw-r--r--src/filter/replay_gain_filter_plugin.c19
-rw-r--r--src/replay_gain_config.c5
-rw-r--r--src/replay_gain_info.h3
-rw-r--r--test/run_filter.c3
-rw-r--r--test/run_output.c3
7 files changed, 35 insertions, 7 deletions
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 <off or album or track>
+.B replaygain <off or album or track or auto>
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 <assert.h>
#include <string.h>
@@ -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 <math.h>
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 <glib.h>
@@ -33,6 +34,8 @@
#include <errno.h>
#include <unistd.h>
+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 <glib.h>
@@ -34,6 +35,8 @@
#include <string.h>
#include <unistd.h>
+struct playlist g_playlist;
+
void
idle_add(G_GNUC_UNUSED unsigned flags)
{