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

Reply via email to