aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Rivera <stefano@rivera.za.net>2020-10-10 13:54:28 -0700
committerStefano Rivera <stefano@rivera.za.net>2020-10-10 13:54:28 -0700
commitabf6b47c7ccef678fc7af01cd71dfe0a5f7e06f6 (patch)
tree3df494b98f5e1a961ae3f63ea96344f644e5326a /lib_pypy
parentbpo-29004: Document binascii.crc_hqx() implements CRC-CCITT (diff)
downloadpypy-abf6b47c7ccef678fc7af01cd71dfe0a5f7e06f6.tar.gz
pypy-abf6b47c7ccef678fc7af01cd71dfe0a5f7e06f6.tar.bz2
pypy-abf6b47c7ccef678fc7af01cd71dfe0a5f7e06f6.zip
bpo-33781: audioop: enhance rounding double as int
Diffstat (limited to 'lib_pypy')
-rw-r--r--lib_pypy/_audioop_build.py23
1 files changed, 15 insertions, 8 deletions
diff --git a/lib_pypy/_audioop_build.py b/lib_pypy/_audioop_build.py
index 88d67d9c4b..043ea849c3 100644
--- a/lib_pypy/_audioop_build.py
+++ b/lib_pypy/_audioop_build.py
@@ -313,11 +313,18 @@ static const int minvals[] = {0, -0x80, -0x8000, -0x800000, -0x7FFFFFFF-1};
static int
fbound(double val, double minval, double maxval)
{
- if (val > maxval)
+ if (val > maxval) {
val = maxval;
- else if (val < minval + 1)
+ }
+ else if (val < minval + 1.0) {
val = minval;
- return val;
+ }
+
+ /* Round towards minus infinity (-inf) */
+ val = floor(val);
+
+ /* Cast double to integer: round towards zero */
+ return (int)val;
}
static int
@@ -409,11 +416,11 @@ void tostereo(char* rv, char* cp, size_t len, int size,
else if ( size == 2 ) val = (int)*SHORTP(cp, i);
else if ( size == 4 ) val = (int)*LONGP(cp, i);
- fval = (double)val*fac1;
- val1 = (int)floor(fbound(fval, minval, maxval));
+ fval = (double)val * fac1;
+ val1 = fbound(fval, minval, maxval);
- fval = (double)val*fac2;
- val2 = (int)floor(fbound(fval, minval, maxval));
+ fval = (double)val * fac2;
+ val2 = fbound(fval, minval, maxval);
if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1;
else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1;
@@ -454,7 +461,7 @@ void add(char* rv, char* cp1, char* cp2, size_t len1, int size)
else {
double fval = (double)val1 + (double)val2;
/* truncate in case of overflow */
- newval = (int)floor(fbound(fval, minval, maxval));
+ newval = fbound(fval, minval, maxval);
}
if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval;