Skip to content

Commit b17d409

Browse files
authored
bpo-33781: audioop: enhance rounding double as int (GH-7447) (GH-7452)
Move the floor() call into fbound() to call floor() on a double rather than an int. The change should enhance the rounding. Document also (int)double rounding mode. (cherry picked from commit 45e4efb)
1 parent d098098 commit b17d409

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

Modules/audioop.c

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,18 @@ static const unsigned int masks[] = {0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF};
3131
static int
3232
fbound(double val, double minval, double maxval)
3333
{
34-
if (val > maxval)
34+
if (val > maxval) {
3535
val = maxval;
36-
else if (val < minval + 1)
36+
}
37+
else if (val < minval + 1.0) {
3738
val = minval;
38-
return val;
39+
}
40+
41+
/* Round towards minus infinity (-inf) */
42+
val = floor(val);
43+
44+
/* Cast double to integer: round towards zero */
45+
return (int)val;
3946
}
4047

4148

@@ -793,8 +800,8 @@ audioop_mul(PyObject *self, PyObject *args)
793800
if ( size == 1 ) val = (int)*CHARP(cp, i);
794801
else if ( size == 2 ) val = (int)*SHORTP(cp, i);
795802
else if ( size == 4 ) val = (int)*LONGP(cp, i);
796-
fval = (double)val*factor;
797-
val = (int)floor(fbound(fval, minval, maxval));
803+
fval = (double)val * factor;
804+
val = fbound(fval, minval, maxval);
798805
if ( size == 1 ) *CHARP(ncp, i) = (signed char)val;
799806
else if ( size == 2 ) *SHORTP(ncp, i) = (short)val;
800807
else if ( size == 4 ) *LONGP(ncp, i) = (Py_Int32)val;
@@ -837,8 +844,8 @@ audioop_tomono(PyObject *self, PyObject *args)
837844
if ( size == 1 ) val2 = (int)*CHARP(cp, i+1);
838845
else if ( size == 2 ) val2 = (int)*SHORTP(cp, i+2);
839846
else if ( size == 4 ) val2 = (int)*LONGP(cp, i+4);
840-
fval = (double)val1*fac1 + (double)val2*fac2;
841-
val1 = (int)floor(fbound(fval, minval, maxval));
847+
fval = (double)val1 * fac1 + (double)val2 * fac2;
848+
val1 = fbound(fval, minval, maxval);
842849
if ( size == 1 ) *CHARP(ncp, i/2) = (signed char)val1;
843850
else if ( size == 2 ) *SHORTP(ncp, i/2) = (short)val1;
844851
else if ( size == 4 ) *LONGP(ncp, i/2)= (Py_Int32)val1;
@@ -881,11 +888,11 @@ audioop_tostereo(PyObject *self, PyObject *args)
881888
else if ( size == 2 ) val = (int)*SHORTP(cp, i);
882889
else if ( size == 4 ) val = (int)*LONGP(cp, i);
883890

884-
fval = (double)val*fac1;
885-
val1 = (int)floor(fbound(fval, minval, maxval));
891+
fval = (double)val * fac1;
892+
val1 = fbound(fval, minval, maxval);
886893

887-
fval = (double)val*fac2;
888-
val2 = (int)floor(fbound(fval, minval, maxval));
894+
fval = (double)val * fac2;
895+
val2 = fbound(fval, minval, maxval);
889896

890897
if ( size == 1 ) *CHARP(ncp, i*2) = (signed char)val1;
891898
else if ( size == 2 ) *SHORTP(ncp, i*2) = (short)val1;
@@ -944,7 +951,7 @@ audioop_add(PyObject *self, PyObject *args)
944951
else {
945952
double fval = (double)val1 + (double)val2;
946953
/* truncate in case of overflow */
947-
newval = (int)floor(fbound(fval, minval, maxval));
954+
newval = fbound(fval, minval, maxval);
948955
}
949956

950957
if ( size == 1 ) *CHARP(ncp, i) = (signed char)newval;

0 commit comments

Comments
 (0)