Preamp for missing replay-gain
This commit is contained in:
parent
f16d05c633
commit
4ffd9bce5a
@ -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);
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
|
@ -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));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user