diff --git a/Makefile.am b/Makefile.am index fa0743ee4..58a04f10c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -120,7 +120,6 @@ mpd_headers = \ src/mixer/software_mixer_plugin.h \ src/mixer/pulse_mixer_plugin.h \ src/daemon.h \ - src/normalize.h \ src/AudioCompress/config.h \ src/AudioCompress/compress.h \ src/buffer.h \ @@ -264,7 +263,6 @@ src_mpd_SOURCES = \ src/main.c \ src/event_pipe.c \ src/daemon.c \ - src/normalize.c \ src/AudioCompress/compress.c \ src/buffer.c \ src/pipe.c \ @@ -902,8 +900,7 @@ test_software_volume_LDADD = \ test_run_normalize_SOURCES = test/run_normalize.c \ src/audio_check.c \ src/audio_parser.c \ - src/AudioCompress/compress.c \ - src/normalize.c + src/AudioCompress/compress.c test_run_normalize_LDADD = \ $(GLIB_LIBS) @@ -952,9 +949,12 @@ test_run_output_SOURCES = test/run_output.c \ $(MIXER_SRC) \ src/filter_plugin.c src/filter/chain_filter_plugin.c \ src/filter_config.c \ + src/filter/autoconvert_filter_plugin.c \ src/filter/convert_filter_plugin.c \ + src/filter/normalize_filter_plugin.c \ src/filter/volume_filter_plugin.c \ src/pcm_volume.c \ + src/AudioCompress/compress.c \ src/fd_util.c \ $(OUTPUT_SRC) diff --git a/NEWS b/NEWS index 64f192df9..bf8798987 100644 --- a/NEWS +++ b/NEWS @@ -66,6 +66,7 @@ ver 0.16 (20??/??/??) - sort songs by album name first, then disc/track number - rescan after metadata_to_use change * normalize: upgraded to AudioCompress 2.0 + - automatically convert to 16 bit samples * log unused/unknown block parameters * removed the deprecated "error_file" option * save state when stopped diff --git a/src/decoder_api.c b/src/decoder_api.c index 73b01533f..ae2c6687b 100644 --- a/src/decoder_api.c +++ b/src/decoder_api.c @@ -25,8 +25,6 @@ #include "audio.h" #include "song.h" #include "buffer.h" - -#include "normalize.h" #include "pipe.h" #include "chunk.h" @@ -340,8 +338,6 @@ decoder_data(struct decoder *decoder, if (replay_gain_mode != REPLAY_GAIN_OFF) replay_gain_apply(replay_gain_info, dest, nbytes, &dc->out_audio_format); - else if (normalizationEnabled) - normalizeData(dest, nbytes, &dc->out_audio_format); /* expand the music pipe chunk */ diff --git a/src/main.c b/src/main.c index 882664d49..a40dae369 100644 --- a/src/main.c +++ b/src/main.c @@ -49,7 +49,6 @@ #include "state_file.h" #include "tag.h" #include "dbUtils.h" -#include "normalize.h" #include "zeroconf.h" #include "event_pipe.h" #include "dirvec.h" @@ -348,7 +347,6 @@ int main(int argc, char *argv[]) audio_output_all_init(); client_manager_init(); replay_gain_global_init(); - initNormalization(); if (!input_stream_global_init(&error)) { g_warning("%s", error->message); @@ -426,7 +424,6 @@ int main(int argc, char *argv[]) playlist_list_global_finish(); input_stream_global_finish(); - finishNormalization(); audio_output_all_finish(); volume_finish(); mapper_finish(); diff --git a/src/normalize.c b/src/normalize.c deleted file mode 100644 index 1c8173def..000000000 --- a/src/normalize.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2003-2009 The Music Player Daemon Project - * http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "config.h" -#include "normalize.h" -#include "AudioCompress/compress.h" -#include "conf.h" -#include "audio_format.h" - -#define DEFAULT_VOLUME_NORMALIZATION 0 - -int normalizationEnabled; - -static struct Compressor *compressor; - -void initNormalization(void) -{ - normalizationEnabled = config_get_bool(CONF_VOLUME_NORMALIZATION, - DEFAULT_VOLUME_NORMALIZATION); - - if (normalizationEnabled) - compressor = Compressor_new(0); -} - -void finishNormalization(void) -{ - if (normalizationEnabled) - Compressor_delete(compressor); -} - -void normalizeData(void *buffer, int bufferSize, - const struct audio_format *format) -{ - if (format->format != SAMPLE_FORMAT_S16 || format->channels != 2) - return; - - Compressor_Process_int16(compressor, buffer, bufferSize / 2); -} diff --git a/src/normalize.h b/src/normalize.h deleted file mode 100644 index 2834f07fd..000000000 --- a/src/normalize.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2003-2009 The Music Player Daemon Project - * http://www.musicpd.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef MPD_NORMALIZE_H -#define MPD_NORMALIZE_H - -struct audio_format; - -extern int normalizationEnabled; - -void initNormalization(void); - -void finishNormalization(void); - -void normalizeData(void *buffer, int bufferSize, - const struct audio_format *format); - -#endif /* !NORMALIZE_H */ diff --git a/src/output_init.c b/src/output_init.c index ab5257829..fe9e4d86a 100644 --- a/src/output_init.c +++ b/src/output_init.c @@ -31,6 +31,7 @@ #include "filter_registry.h" #include "filter_config.h" #include "filter/chain_filter_plugin.h" +#include "filter/autoconvert_filter_plugin.h" #include @@ -192,6 +193,16 @@ audio_output_init(struct audio_output *ao, const struct config_param *param, ao->filter = filter_chain_new(); assert(ao->filter != NULL); + + if (config_get_bool(CONF_VOLUME_NORMALIZATION, false)) { + struct filter *normalize_filter = + filter_new(&normalize_filter_plugin, NULL, NULL); + assert(normalize_filter != NULL); + + filter_chain_append(ao->filter, + autoconvert_filter_new(normalize_filter)); + } + filter_chain_parse(ao->filter, config_get_block_string(param, AUDIO_FILTERS, ""), &error diff --git a/test/run_normalize.c b/test/run_normalize.c index 979be9201..33446d884 100644 --- a/test/run_normalize.c +++ b/test/run_normalize.c @@ -24,10 +24,9 @@ */ #include "config.h" -#include "normalize.h" +#include "AudioCompress/compress.h" #include "audio_parser.h" #include "audio_format.h" -#include "conf.h" #include @@ -35,20 +34,12 @@ #include #include -bool -config_get_bool(const char *name, bool default_value) -{ - if (strcmp(name, CONF_VOLUME_NORMALIZATION) == 0) - return true; - else - return default_value; -} - int main(int argc, char **argv) { GError *error = NULL; struct audio_format audio_format; bool ret; + struct Compressor *compressor; static char buffer[4096]; ssize_t nbytes; @@ -68,12 +59,13 @@ int main(int argc, char **argv) } else audio_format_init(&audio_format, 48000, 16, 2); - initNormalization(); + compressor = Compressor_new(0); while ((nbytes = read(0, buffer, sizeof(buffer))) > 0) { - normalizeData(buffer, nbytes, &audio_format); + Compressor_Process_int16(compressor, + (int16_t *)buffer, nbytes / 2); write(1, buffer, nbytes); } - finishNormalization(); + Compressor_delete(compressor); }