summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ. Alexander Treuman <jat@spatialrift.net>2006-07-22 00:53:37 +0000
committerJ. Alexander Treuman <jat@spatialrift.net>2006-07-22 00:53:37 +0000
commitcf90f8194fdcf4b7d3234453da00f8f3b88e54c9 (patch)
tree171cf6dc76a024d6efeea52082bdbfb12075c765
parentc4d1344f8c9ca6398317135173a01d423d315f63 (diff)
Adding on the fly volume normalization support. Code originally from mplayer, ported by syscrash, cleaned up by avuton, and further cleaned up by me (jat).
git-svn-id: https://svn.musicpd.org/mpd/trunk@4424 09075e82-0dd4-0310-85a5-a0d7c8717e4f
-rw-r--r--doc/mpd.conf.53
-rw-r--r--doc/mpdconf.example9
-rw-r--r--src/Makefile.am2
-rw-r--r--src/conf.c1
-rw-r--r--src/conf.h1
-rw-r--r--src/outputBuffer.c20
6 files changed, 35 insertions, 1 deletions
diff --git a/doc/mpd.conf.5 b/doc/mpd.conf.5
index 9f0fe59f1..809ea8dc7 100644
--- a/doc/mpd.conf.5
+++ b/doc/mpd.conf.5
@@ -92,6 +92,9 @@ Musepack, and MP3 (through ID3v2 replaygain tags, not APEv2) are supported.
.B replaygain_preamp <-15 to 15>
This is the gain (in dB) applied to songs with replaygain tags.
.TP
+.B volume_normalization <yes or no>
+If yes, mpd will normalize the volume of songs as they play. Default is no.
+.TP
.B audio_buffer_size <size in KiB>
This specifies the size of the audio output buffer that mpd uses. The default
is 2048.
diff --git a/doc/mpdconf.example b/doc/mpdconf.example
index 1dcfdf686..8f77a4ace 100644
--- a/doc/mpdconf.example
+++ b/doc/mpdconf.example
@@ -126,7 +126,7 @@ pid_file "~/.mpd/mpd.pid"
##########################################################
-################# REPLAYGAIN #############################
+################# Normalization ##########################
#
# Use Replay Gain (album or track)
# http://www.replaygain.org
@@ -138,6 +138,13 @@ pid_file "~/.mpd/mpd.pid"
#
#replaygain_preamp "0"
#
+# Normalization increases the amplitude of the audio
+# waveform to the maximum level without introducing any
+# distortion into the recording. This option will
+# normalize when replaygain is not on, utilizing the
+# CPU for calculation.
+#
+#volume_normalization "yes"
##########################################################
diff --git a/src/Makefile.am b/src/Makefile.am
index d4c8d57f2..d25732728 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -49,6 +49,7 @@ mpd_headers = \
metadataChunk.h \
mpd_types.h \
myfprintf.h \
+ normalize.h \
outputBuffer.h \
path.h \
pcm_utils.h \
@@ -93,6 +94,7 @@ mpd_SOURCES = \
main.c \
metadataChunk.c \
myfprintf.c \
+ normalize.c \
outputBuffer.c \
path.c \
pcm_utils.c \
diff --git a/src/conf.c b/src/conf.c
index 2a0ab2077..995cbf892 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -171,6 +171,7 @@ void initConf(void)
registerConfigParam(CONF_REPLAYGAIN_PREAMP, 0, 0);
registerConfigParam(CONF_METADATA_TO_USE, 0, 0);
registerConfigParam(CONF_ID3V1_ENCODING, 0, 0);
+ registerConfigParam(CONF_VOLUME_NORMALIZATION, 0, 0);
}
static void addBlockParam(ConfigParam * param, char *name, char *value,
diff --git a/src/conf.h b/src/conf.h
index fd68ca327..e0526b8a0 100644
--- a/src/conf.h
+++ b/src/conf.h
@@ -58,6 +58,7 @@
#define CONF_HTTP_PREBUFFER_SIZE "http_prebuffer_size"
#define CONF_METADATA_TO_USE "metadata_to_use"
#define CONF_ID3V1_ENCODING "id3v1_encoding"
+#define CONF_VOLUME_NORMALIZATION "volume_normalization"
typedef struct _BlockParam {
char *name;
diff --git a/src/outputBuffer.c b/src/outputBuffer.c
index 30a96bd22..02d9234fd 100644
--- a/src/outputBuffer.c
+++ b/src/outputBuffer.c
@@ -22,6 +22,8 @@
#include "playerData.h"
#include "utils.h"
#include "log.h"
+#include "normalize.h"
+#include "conf.h"
#include <string.h>
@@ -76,6 +78,22 @@ int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream,
size_t datalen;
static char *convBuffer = NULL;
static long convBufferLen = 0;
+ static int normalEnable = -1;
+ ConfigParam *param;
+
+ if (normalEnable == -1) {
+ normalEnable = getBoolConfigParam(CONF_VOLUME_NORMALIZATION);
+ if (normalEnable == -1) {
+ /* not set */
+ normalEnable = 0;
+ } else if (normalEnable < 0) {
+ param = getConfigParam(CONF_VOLUME_NORMALIZATION);
+ WARNING("%s is not \"yes\" or \"no\" on line %i, "
+ "disabling\n", CONF_VOLUME_NORMALIZATION,
+ param->line);
+ normalEnable = 0;
+ }
+ }
if (cmpAudioFormat(&(cb->audioFormat), &(dc->audioFormat)) == 0) {
data = dataIn;
@@ -99,6 +117,8 @@ int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream,
if (replayGainInfo) {
doReplayGain(replayGainInfo, data, datalen, &cb->audioFormat);
+ } else if (normalEnable) {
+ normalizeData(data, datalen, &cb->audioFormat);
}
while (datalen) {