Hello,
The first allows to choose whether clipping prevention is used
while applying ReplayGain tags or not.
The second pay attention to the ReplayGain mode “auto” and
the replay_gain_missing_preamp parameter inside of
decoder_replay_gain().
Daniel
5c3efc35829c626643262b4c99845d86e17be614
diff --git a/doc/mpd.conf.5 b/doc/mpd.conf.5
index b203e3c..08b4053 100644
--- a/doc/mpd.conf.5
+++ b/doc/mpd.conf.5
@@ -182,6 +182,9 @@ APEv2) are supported.
.B replaygain_preamp <-15 to 15>
This is the gain (in dB) applied to songs with ReplayGain tags.
.TP
+.B replaygain_limit <yes or no>
+Prevent clipping according to peak yes or no. The default is no.
+.TP
.B volume_normalization <yes or no>
If yes, mpd will normalize the volume of songs as they play. The default is no.
.TP
diff --git a/doc/mpdconf.example b/doc/mpdconf.example
index 3b69e9b..6121904 100644
--- a/doc/mpdconf.example
+++ b/doc/mpdconf.example
@@ -325,6 +325,10 @@ input {
#
#replaygain_preamp "0"
#
+# This setting prevents clipping according to ReplayGain peak. By default this
+# setting is false.
+#replaygain_limit "true"
+#
# This setting enables on-the-fly normalization volume adjustment. This will
# result in the volume of all playing audio to be adjusted so the output has
# equal "loudness". This setting is disabled by default.
diff --git a/src/conf.c b/src/conf.c
index ab7be10..476884d 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -72,6 +72,7 @@ static struct config_entry config_entries[] = {
{ .name = CONF_REPLAYGAIN, false, false },
{ .name = CONF_REPLAYGAIN_PREAMP, false, false },
{ .name = CONF_REPLAYGAIN_MISSING_PREAMP, false, false },
+ { .name = CONF_REPLAYGAIN_LIMIT, false, false },
{ .name = CONF_VOLUME_NORMALIZATION, false, false },
{ .name = CONF_SAMPLERATE_CONVERTER, false, false },
{ .name = CONF_AUDIO_BUFFER_SIZE, false, false },
diff --git a/src/conf.h b/src/conf.h
index d79a673..2385af4 100644
--- a/src/conf.h
+++ b/src/conf.h
@@ -48,6 +48,7 @@
#define CONF_REPLAYGAIN "replaygain"
#define CONF_REPLAYGAIN_PREAMP "replaygain_preamp"
#define CONF_REPLAYGAIN_MISSING_PREAMP "replaygain_missing_preamp"
+#define CONF_REPLAYGAIN_LIMIT "replaygain_limit"
#define CONF_VOLUME_NORMALIZATION "volume_normalization"
#define CONF_SAMPLERATE_CONVERTER "samplerate_converter"
#define CONF_AUDIO_BUFFER_SIZE "audio_buffer_size"
diff --git a/src/replay_gain_config.c b/src/replay_gain_config.c
index 3eae9d9..1c29ec4 100644
--- a/src/replay_gain_config.c
+++ b/src/replay_gain_config.c
@@ -36,8 +36,11 @@ static const char *const replay_gain_mode_names[] = {
enum replay_gain_mode replay_gain_mode = REPLAY_GAIN_OFF;
+const bool DEFAULT_REPLAYGAIN_LIMIT = false;
+
float replay_gain_preamp = 1.0;
float replay_gain_missing_preamp = 1.0;
+bool replay_gain_limit;
const char *
replay_gain_get_mode_string(void)
@@ -128,4 +131,7 @@ void replay_gain_global_init(void)
replay_gain_missing_preamp = pow(10, f / 20.0);
}
+
+ replay_gain_limit = config_get_bool(CONF_REPLAYGAIN_LIMIT, DEFAULT_REPLAYGAIN_LIMIT);
+ g_debug("ReplayGain peak limit: %s\n", replay_gain_limit ? "true" : "false");
}
diff --git a/src/replay_gain_config.h b/src/replay_gain_config.h
index 922fb2b..9aec1fe 100644
--- a/src/replay_gain_config.h
+++ b/src/replay_gain_config.h
@@ -28,6 +28,7 @@
extern enum replay_gain_mode replay_gain_mode;
extern float replay_gain_preamp;
extern float replay_gain_missing_preamp;
+extern bool replay_gain_limit;
void replay_gain_global_init(void);
diff --git a/src/replay_gain_info.c b/src/replay_gain_info.c
index 9ab5b05..6884f5a 100644
--- a/src/replay_gain_info.c
+++ b/src/replay_gain_info.c
@@ -19,6 +19,9 @@
#include "config.h"
#include "replay_gain_info.h"
+#include "replay_gain_config.h"
+
+#include <glib.h>
float
replay_gain_tuple_scale(const struct replay_gain_tuple *tuple, float preamp)
@@ -30,8 +33,11 @@ replay_gain_tuple_scale(const struct replay_gain_tuple *tuple, float preamp)
if (scale > 15.0)
scale = 15.0;
- if (scale * tuple->peak > 1.0)
- scale = 1.0 / tuple->peak;
+ if (replay_gain_limit)
+ if (scale * tuple->peak > 1.0)
+ scale = 1.0 / tuple->peak;
+
+ g_debug("replay_gain_tuple_scale: %f", scale);
return scale;
}
6f4b49b4e1ceff20ede69dd47b1eeec67783a0b4
diff --git a/src/decoder_api.c b/src/decoder_api.c
index a951b07..60d2830 100644
--- a/src/decoder_api.c
+++ b/src/decoder_api.c
@@ -419,7 +419,7 @@ decoder_replay_gain(struct decoder *decoder,
if (REPLAY_GAIN_OFF != replay_gain_mode) {
return_db = 20.0 * log10f(
replay_gain_tuple_scale(
- &replay_gain_info->tuples[replay_gain_mode],
+ &replay_gain_info->tuples[replay_gain_get_real_mode()],
replay_gain_preamp));
}
diff --git a/src/filter/replay_gain_filter_plugin.c b/src/filter/replay_gain_filter_plugin.c
index 0519b9d..9405aca 100644
--- a/src/filter/replay_gain_filter_plugin.c
+++ b/src/filter/replay_gain_filter_plugin.c
@@ -28,7 +28,6 @@
#include "replay_gain_info.h"
#include "replay_gain_config.h"
#include "mixer_control.h"
-#include "playlist.h"
#include <assert.h>
#include <string.h>
@@ -81,10 +80,7 @@ replay_gain_filter_update(struct replay_gain_filter *filter)
if (filter->mode != REPLAY_GAIN_OFF) {
const struct replay_gain_tuple *tuple =
&filter->info.tuples[filter->mode];
- float scale = replay_gain_tuple_defined(tuple)
- ? replay_gain_tuple_scale(tuple, replay_gain_preamp)
- : replay_gain_missing_preamp;
- g_debug("scale=%f\n", (double)scale);
+ float scale = replay_gain_tuple_scale(tuple, replay_gain_preamp);
filter->volume = pcm_float_to_volume(scale);
} else
@@ -115,11 +111,7 @@ replay_gain_filter_init(G_GNUC_UNUSED const struct config_param *param,
filter_init(&filter->filter, &replay_gain_filter_plugin);
filter->mixer = NULL;
- 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;
- }
+ filter->mode = replay_gain_get_real_mode();
replay_gain_info_init(&filter->info);
filter->volume = PCM_VOLUME_1;
@@ -169,11 +161,7 @@ replay_gain_filter_filter(struct filter *_filter,
enum replay_gain_mode rg_mode;
/* check if the mode has been changed since the last call */
- 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;
- }
+ rg_mode = replay_gain_get_real_mode();
if (filter->mode != rg_mode) {
g_debug("replay gain mode has changed %d->%d\n", filter->mode, rg_mode);
diff --git a/src/replay_gain_config.c b/src/replay_gain_config.c
index 1c29ec4..0d4a326 100644
--- a/src/replay_gain_config.c
+++ b/src/replay_gain_config.c
@@ -19,6 +19,7 @@
#include "config.h"
#include "replay_gain_config.h"
+#include "playlist.h"
#include "conf.h"
#include "idle.h"
@@ -135,3 +136,15 @@ void replay_gain_global_init(void)
replay_gain_limit = config_get_bool(CONF_REPLAYGAIN_LIMIT, DEFAULT_REPLAYGAIN_LIMIT);
g_debug("ReplayGain peak limit: %s\n", replay_gain_limit ? "true" : "false");
}
+
+enum replay_gain_mode replay_gain_get_real_mode(void)
+{
+ enum replay_gain_mode rgm;
+
+ rgm = replay_gain_mode;
+
+ if (rgm == REPLAY_GAIN_AUTO)
+ rgm = g_playlist.queue.random ? REPLAY_GAIN_TRACK : REPLAY_GAIN_ALBUM;
+
+ return rgm;
+}
\ No newline at end of file
diff --git a/src/replay_gain_config.h b/src/replay_gain_config.h
index 9aec1fe..8fb77a5 100644
--- a/src/replay_gain_config.h
+++ b/src/replay_gain_config.h
@@ -46,4 +46,10 @@ replay_gain_get_mode_string(void);
bool
replay_gain_set_mode_string(const char *p);
+/**
+ * Returns the "real" mode according to the "auto" setting"
+ */
+enum replay_gain_mode
+replay_gain_get_real_mode(void);
+
#endif
diff --git a/src/replay_gain_info.c b/src/replay_gain_info.c
index 6884f5a..adab267 100644
--- a/src/replay_gain_info.c
+++ b/src/replay_gain_info.c
@@ -28,15 +28,21 @@ replay_gain_tuple_scale(const struct replay_gain_tuple *tuple, float preamp)
{
float scale;
- scale = pow(10.0, tuple->gain / 20.0);
- scale *= preamp;
- if (scale > 15.0)
- scale = 15.0;
-
- if (replay_gain_limit)
- if (scale * tuple->peak > 1.0)
- scale = 1.0 / tuple->peak;
-
+ if (replay_gain_tuple_defined(tuple))
+ {
+ scale = pow(10.0, tuple->gain / 20.0);
+ scale *= preamp;
+ if (scale > 15.0)
+ scale = 15.0;
+
+ if (replay_gain_limit)
+ if (scale * tuple->peak > 1.0)
+ scale = 1.0 / tuple->peak;
+
+ } else {
+ scale = replay_gain_missing_preamp;
+ }
+
g_debug("replay_gain_tuple_scale: %f", scale);
return scale;
------------------------------------------------------------------------------
_______________________________________________
Musicpd-dev-team mailing list
Musicpd-dev-team@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/musicpd-dev-team