# HG changeset patch # User reynaldo # Date 1142111819 0 # Node ID 1ade5769c97bafea96b1ca1ab65dd11486662ed7 # Parent 6fc398692249e5535f3b8204330d2a799bc517f5 added dinamically calculated gain factor at output stage to avoid clipping on sane ranges diff -r 6fc398692249 -r 1ade5769c97b libaf/af_equalizer.c --- a/libaf/af_equalizer.c Sat Mar 11 19:47:05 2006 +0000 +++ b/libaf/af_equalizer.c Sat Mar 11 21:16:59 2006 +0000 @@ -58,6 +58,7 @@ 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 @@ 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 @@ // 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 @@ wq[0] = w; } // Calculate output - *out=yt; + *out=yt*s->gain_factor; out+=nch; } }