From 4e880d80767fc04c42bd5e9080a0dd85dfde82d6 Mon Sep 17 00:00:00 2001 From: reynaldo Date: Sat, 11 Mar 2006 21:16:59 +0000 Subject: added dinamically calculated gain factor at output stage to avoid clipping on sane ranges git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@17813 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libaf/af_equalizer.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'libaf') diff --git a/libaf/af_equalizer.c b/libaf/af_equalizer.c index 95acc2540d..18d76c5442 100644 --- a/libaf/af_equalizer.c +++ b/libaf/af_equalizer.c @@ -58,6 +58,7 @@ typedef struct af_equalizer_s float g[AF_NCH][KM]; // Gain factor for each channel and band int K; // Number of used eq bands int channels; // Number of channels + float gain_factor; // applied at output to avoid clipping } af_equalizer_t; // 2nd order Band-pass Filter design @@ -79,9 +80,11 @@ static int control(struct af_instance_s* af, int cmd, void* arg) switch(cmd){ case AF_CONTROL_REINIT:{ - int k =0; + int k =0, i =0; float F[KM] = CF; + s->gain_factor=0.0; + // Sanity check if(!arg) return AF_ERROR; @@ -105,7 +108,25 @@ static int control(struct af_instance_s* af, int cmd, void* arg) // Calculate how much this plugin adds to the overall time delay af->delay += 2000.0/((float)af->data->rate); + + // Calculate gain factor to prevent clipping at output + for(k=0;kgain_factor < s->g[k][i]) s->gain_factor=s->g[k][i]; + } + } + s->gain_factor=log10(s->gain_factor + 1.0) * 20.0; + + if(s->gain_factor > 0.0) + { + s->gain_factor=0.1+(s->gain_factor/12.0); + }else{ + s->gain_factor=1; + } + return af_test_output(af,arg); } case AF_CONTROL_COMMAND_LINE:{ @@ -190,7 +211,7 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data) wq[0] = w; } // Calculate output - *out=yt; + *out=yt*s->gain_factor; out+=nch; } } -- cgit v1.2.3