From 4ffd9bce5a9a12a03ecaecac7c0861e5f692d9e3 Mon Sep 17 00:00:00 2001 From: Daniel Seuthe Date: Fri, 19 Jun 2009 09:02:12 +0200 Subject: Preamp for missing replay-gain --- src/conf.c | 1 + src/conf.h | 1 + src/decoder_api.c | 3 +-- src/replay_gain.c | 47 ++++++++++++++++++++++++++++++++++++++--------- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/conf.c b/src/conf.c index cce7dbf27..de81194b5 100644 --- a/src/conf.c +++ b/src/conf.c @@ -196,6 +196,7 @@ void config_global_init(void) registerConfigParam(CONF_MIXER_CONTROL, 0, 0); registerConfigParam(CONF_REPLAYGAIN, 0, 0); registerConfigParam(CONF_REPLAYGAIN_PREAMP, 0, 0); + registerConfigParam(CONF_REPLAYGAIN_MISSING_PREAMP, 0, 0); registerConfigParam(CONF_VOLUME_NORMALIZATION, 0, 0); registerConfigParam(CONF_SAMPLERATE_CONVERTER, 0, 0); registerConfigParam(CONF_AUDIO_BUFFER_SIZE, 0, 0); diff --git a/src/conf.h b/src/conf.h index c5e49960e..3e01e0542 100644 --- a/src/conf.h +++ b/src/conf.h @@ -48,6 +48,7 @@ #define CONF_MIXER_CONTROL "mixer_control" #define CONF_REPLAYGAIN "replaygain" #define CONF_REPLAYGAIN_PREAMP "replaygain_preamp" +#define CONF_REPLAYGAIN_MISSING_PREAMP "replaygain_missing_preamp" #define CONF_VOLUME_NORMALIZATION "volume_normalization" #define CONF_SAMPLERATE_CONVERTER "samplerate_converter" #define CONF_AUDIO_BUFFER_SIZE "audio_buffer_size" diff --git a/src/decoder_api.c b/src/decoder_api.c index 2ece3bb98..408e8005e 100644 --- a/src/decoder_api.c +++ b/src/decoder_api.c @@ -301,8 +301,7 @@ decoder_data(struct decoder *decoder, /* apply replay gain or normalization */ - if (replay_gain_info != NULL && - replay_gain_mode != REPLAY_GAIN_OFF) + if (replay_gain_mode != REPLAY_GAIN_OFF) replay_gain_apply(replay_gain_info, dest, nbytes, &dc.out_audio_format); else if (normalizationEnabled) diff --git a/src/replay_gain.c b/src/replay_gain.c index bcb501e54..d21b94e0a 100644 --- a/src/replay_gain.c +++ b/src/replay_gain.c @@ -38,6 +38,7 @@ static const char *const replay_gain_mode_names[] = { enum replay_gain_mode replay_gain_mode = REPLAY_GAIN_OFF; static float replay_gain_preamp = 1.0; +static float replay_gain_missing_preamp = 1.0; void replay_gain_global_init(void) { @@ -73,6 +74,25 @@ void replay_gain_global_init(void) replay_gain_preamp = pow(10, f / 20.0); } + + param = config_get_param(CONF_REPLAYGAIN_MISSING_PREAMP); + + if (param) { + char *test; + float f = strtod(param->value, &test); + + if (*test != '\0') { + g_error("Replaygain missing preamp \"%s\" is not a number at " + "line %i\n", param->value, param->line); + } + + if (f < -15 || f > 15) { + g_error("Replaygain missing preamp \"%s\" is not between -15 and" + "15 at line %i\n", param->value, param->line); + } + + replay_gain_missing_preamp = pow(10, f / 20.0); + } } static float calc_replay_gain_scale(float gain, float peak) @@ -116,19 +136,28 @@ void replay_gain_apply(struct replay_gain_info *info, char *buffer, int size, const struct audio_format *format) { - if (replay_gain_mode == REPLAY_GAIN_OFF || !info) + float scale; + + if (replay_gain_mode == REPLAY_GAIN_OFF) return; - if (info->scale < 0) { - const struct replay_gain_tuple *tuple = - &info->tuples[replay_gain_mode]; + if (info) { + if (info->scale < 0) { + const struct replay_gain_tuple *tuple = + &info->tuples[replay_gain_mode]; - g_debug("computing ReplayGain %s scale with gain %f, peak %f\n", - replay_gain_mode_names[replay_gain_mode], - tuple->gain, tuple->peak); + g_debug("computing ReplayGain %s scale with gain %f, peak %f\n", + replay_gain_mode_names[replay_gain_mode], + tuple->gain, tuple->peak); - info->scale = calc_replay_gain_scale(tuple->gain, tuple->peak); + info->scale = calc_replay_gain_scale(tuple->gain, tuple->peak); + } + scale = info->scale; + } + else { + scale = replay_gain_missing_preamp; + g_debug("ReplayGain is missing, computing scale %f\n", scale); } - pcm_volume(buffer, size, format, pcm_float_to_volume(info->scale)); + pcm_volume(buffer, size, format, pcm_float_to_volume(scale)); } -- cgit v1.2.3