extern float lastgainLeft;
extern float lastgainRight;
static void Limiter(float *Samples, short int *OutBuf, int CH, int Num)
//Samples were not clipped yet!

{
float *Data = Samples;
short int *Out = OutBuf;
int X = Num;
float Max = 0;
float val, delta, i;
if(CH!=2) return;
_Left:
while(X--)
{
if(fabs(Data[0])>Max) Max = fabs(Data[0]);
Data+=2;
}
if(Max<32767.00f)
{
Data = Samples;
Out = OutBuf;
X = Num;
val = 1.00f;
i = lastgainLeft;
delta = (float)(((float)val-(float)lastgainLeft)/(float)Num);
while(X--)
{
Out[0] = (float)Data[0]*(float)i;
if(i!=val) i+=delta;
Data+=2;
Out+=2;
}
lastgainLeft = val;
goto _Right;
}
Data = Samples;
Out = OutBuf;
val = (float)((float)32767.00f/(float)Max);
X = Num;
i = lastgainLeft;
delta = (float)(((float)val-(float)lastgainLeft)/1000.00f);
while(X--)
{
if(i!=val) i+=delta;
Out[0] = (float)Data[0]*(float)i;
Data+=2;
Out+=2;
}
lastgainLeft = val;
_Right:
Max = 0;
X = Num;
Data = Samples;
Out = OutBuf;
while(X--)
{
if(fabs(Data[1])>Max) Max = fabs(Data[1]);
Data+=2;
}
if(Max<32767.00f)
{
Data = Samples;
Out = OutBuf;
X = Num;
val = 1.00f;
i = lastgainRight;
delta = (float)(((float)val-(float)lastgainRight)/(float)Num);
while(X--)
{
Out[1] = (float)Data[1]*(float)i;
if(i!=val) i+=delta;
Data+=2;
Out+=2;
}
lastgainRight = val;
return;
}
Data = Samples;
Out = OutBuf;
val = (float)((float)32767.00f/(float)Max);
X = Num;
i = lastgainRight;
delta = (float)(((float)val-(float)lastgainRight)/Speed);
while(X--)
{
if(i!=val) i+=delta;
Out[1] = (float)Data[1]*(float)i;
Data+=2;
Out+=2;
}
lastgainRight = val;
return;
}