Index: libaf/af_volume.c =================================================================== RCS file: /cvsroot/mplayer/main/libaf/af_volume.c,v retrieving revision 1.15 diff -u -p -r1.15 af_volume.c --- libaf/af_volume.c 31 Jan 2005 11:43:36 -0000 1.15 +++ libaf/af_volume.c 19 Feb 2005 23:36:37 -0000 @@ -43,6 +43,7 @@ typedef struct af_volume_s float max[AF_NCH]; // Max Power level [dB] float level[AF_NCH]; // Gain level for each channel float time; // Forgetting factor for power estimate + int imax; int soft; // Enable/disable soft clipping int fast; // Use fix-point volume control }af_volume_t; @@ -66,6 +67,7 @@ static int control(struct af_instance_s* } else{ // Cutoff set to 10Hz for forgetting factor + s->fast = 0; float x = 2.0*M_PI*15.0/(float)af->data->rate; float t = 2.0-cos(x); s->time = 1.0 - (t - sqrt(t*t - 1)); @@ -113,8 +115,11 @@ static int control(struct af_instance_s* for(i=0;imax[i]); af_to_dB(1, &m, &m, 10.0); - af_msg(AF_MSG_INFO,"[volume] The maximum volume was %0.2fdB \n", m); + } else { + m = (1.0/SHRT_MAX) * s->imax; + af_to_dB(1, &m, &m, 20.0); } + af_msg(AF_MSG_INFO,"[volume] The maximum volume was %0.2fdB \n", m); return AF_OK; } } @@ -145,10 +150,18 @@ static af_data_t* play(struct af_instanc int len = c->len/2; // Number of samples for(ch = 0; ch < nch ; ch++){ if(s->enable[ch]){ - register int vol = (int)(255.0 * s->level[ch]); + int vol = (int)(65536.0 * s->level[ch]); + int xmax = ((SHRT_MAX<<16) + 0x7fff) / vol; + int xmin = -xmax - 0x10001 / vol; for(i=ch;i> 8; - a[i]=clamp(x,SHRT_MIN,SHRT_MAX); + int x = a[i]; + if (x > s->imax) + s->imax = x; + if (-x > s->imax) + s->imax = -x; + x = clamp(x, xmin, xmax); + x = (vol * x + 0x8000) >> 16; + a[i]=x; } } } @@ -216,6 +229,6 @@ af_info_t af_info_volume = { "volume", "Anders", "", - AF_FLAGS_NOT_REENTRANT, + 0, open };