audio: clamp sample values in float->int format conversions

Make af_format clamp float sample values to the range [-1, 1] before
conversion to integer types. Before any out-of-range values wrapped
around and caused nasty artifacts. This filter is used for all
automatic format conversions; thus any decoder that outputs floats
with possible out-of-range values would have been affected by the bad
conversion if its output needed to be converted to integers for AO.
This commit is contained in:
Rudolf Polzer 2011-05-03 22:11:53 +02:00 committed by Uoti Urpala
parent 24d0d48c4a
commit 0fff1380b1
1 changed files with 4 additions and 4 deletions

View File

@ -478,19 +478,19 @@ static void float2int(float* in, void* out, int len, int bps)
switch(bps){ switch(bps){
case(1): case(1):
for(i=0;i<len;i++) for(i=0;i<len;i++)
((int8_t*)out)[i] = lrintf(127.0 * in[i]); ((int8_t*)out)[i] = lrintf(127.0 * clamp(in[i], -1.0f, +1.0f));
break; break;
case(2): case(2):
for(i=0;i<len;i++) for(i=0;i<len;i++)
((int16_t*)out)[i] = lrintf(32767.0 * in[i]); ((int16_t*)out)[i] = lrintf(32767.0 * clamp(in[i], -1.0f, +1.0f));
break; break;
case(3): case(3):
for(i=0;i<len;i++) for(i=0;i<len;i++)
store24bit(out, i, lrintf(2147483647.0 * in[i])); store24bit(out, i, lrintf(2147483647.0 * clamp(in[i], -1.0f, +1.0f)));
break; break;
case(4): case(4):
for(i=0;i<len;i++) for(i=0;i<len;i++)
((int32_t*)out)[i] = lrintf(2147483647.0 * in[i]); ((int32_t*)out)[i] = lrintf(2147483647.0 * clamp(in[i], -1.0f, +1.0f));
break; break;
} }
} }