From eeef501ed865b4ef9e0c971829a39a98c7b81ee9 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 15 Feb 2010 14:36:05 +0100 Subject: replay_gain: added function defined() This function determines whether replay gain data is available. --- src/replay_gain_info.h | 8 ++++++++ src/replay_gain_state.c | 22 ++++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/replay_gain_info.h b/src/replay_gain_info.h index 51a167ce3..9a11a8965 100644 --- a/src/replay_gain_info.h +++ b/src/replay_gain_info.h @@ -22,6 +22,8 @@ #include "check.h" +#include + enum replay_gain_mode { REPLAY_GAIN_OFF = -1, REPLAY_GAIN_ALBUM, @@ -49,4 +51,10 @@ replay_gain_info_dup(const struct replay_gain_info *src); void replay_gain_info_free(struct replay_gain_info *info); +static inline bool +replay_gain_tuple_defined(const struct replay_gain_tuple *tuple) +{ + return tuple->gain > 0.0; +} + #endif diff --git a/src/replay_gain_state.c b/src/replay_gain_state.c index c14ff6e10..db77dc1e9 100644 --- a/src/replay_gain_state.c +++ b/src/replay_gain_state.c @@ -42,7 +42,7 @@ replay_gain_state_new(float preamp, float missing_preamp) struct replay_gain_state *state = g_new(struct replay_gain_state, 1); state->preamp = preamp; - state->missing_preamp = missing_preamp; + state->scale = state->missing_preamp = missing_preamp; state->mode = REPLAY_GAIN_OFF; state->info = NULL; @@ -65,8 +65,6 @@ calc_replay_gain_scale(float gain, float peak, float preamp) { float scale; - if (gain == 0.0) - return (1); scale = pow(10.0, gain / 20.0); scale *= preamp; if (scale > 15.0) @@ -88,12 +86,14 @@ replay_gain_state_calc_scale(struct replay_gain_state *state) const struct replay_gain_tuple *tuple = &state->info->tuples[state->mode]; - - g_debug("computing ReplayGain scale with gain %f, peak %f", - tuple->gain, tuple->peak); - - state->scale = calc_replay_gain_scale(tuple->gain, tuple->peak, - state->preamp); + if (replay_gain_tuple_defined(tuple)) { + g_debug("computing ReplayGain scale with gain %f, peak %f", + tuple->gain, tuple->peak); + + state->scale = calc_replay_gain_scale(tuple->gain, tuple->peak, + state->preamp); + } else + state->scale = state->missing_preamp; } void @@ -136,7 +136,5 @@ replay_gain_state_apply(const struct replay_gain_state *state, if (state->mode == REPLAY_GAIN_OFF) return; - float scale = state->info != NULL - ? state->scale : state->missing_preamp; - pcm_volume(buffer, size, format, pcm_float_to_volume(scale)); + pcm_volume(buffer, size, format, pcm_float_to_volume(state->scale)); } -- cgit v1.2.3