Skip to content

Commit 5c022f1

Browse files
bpo-33781: audioop: enhance rounding double as int (GH-7447)
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) Co-authored-by: Victor Stinner <[email protected]>
1 parent 9aa1e72 commit 5c022f1

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

Modules/audioop.c

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,17 @@ static const unsigned int masks[] = {0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF};
2020
static int
2121
fbound(double val, double minval, double maxval)
2222
{
23-
if (val > maxval)
23+
if (val > maxval) {
2424
val = maxval;
25-
else if (val < minval + 1)
25+
}
26+
else if (val < minval + 1.0) {
2627
val = minval;
28+
}
29+
30+
/* Round towards minus infinity (-inf) */
31+
val = floor(val);
32+
33+
/* Cast double to integer: round towards zero */
2734
return (int)val;
2835
}
2936

@@ -924,9 +931,8 @@ audioop_mul_impl(PyObject *module, Py_buffer *fragment, int width,
924931

925932
for (i = 0; i < fragment->len; i += width) {
926933
double val = GETRAWSAMPLE(width, fragment->buf, i);
927-
val *= factor;
928-
val = floor(fbound(val, minval, maxval));
929-
SETRAWSAMPLE(width, ncp, i, (int)val);
934+
int ival = fbound(val * factor, minval, maxval);
935+
SETRAWSAMPLE(width, ncp, i, ival);
930936
}
931937
return rv;
932938
}
@@ -973,9 +979,9 @@ audioop_tomono_impl(PyObject *module, Py_buffer *fragment, int width,
973979
for (i = 0; i < len; i += width*2) {
974980
double val1 = GETRAWSAMPLE(width, cp, i);
975981
double val2 = GETRAWSAMPLE(width, cp, i + width);
976-
double val = val1*lfactor + val2*rfactor;
977-
val = floor(fbound(val, minval, maxval));
978-
SETRAWSAMPLE(width, ncp, i/2, val);
982+
double val = val1 * lfactor + val2 * rfactor;
983+
int ival = fbound(val, minval, maxval);
984+
SETRAWSAMPLE(width, ncp, i/2, ival);
979985
}
980986
return rv;
981987
}
@@ -1021,8 +1027,8 @@ audioop_tostereo_impl(PyObject *module, Py_buffer *fragment, int width,
10211027

10221028
for (i = 0; i < fragment->len; i += width) {
10231029
double val = GETRAWSAMPLE(width, fragment->buf, i);
1024-
int val1 = (int)floor(fbound(val*lfactor, minval, maxval));
1025-
int val2 = (int)floor(fbound(val*rfactor, minval, maxval));
1030+
int val1 = fbound(val * lfactor, minval, maxval);
1031+
int val2 = fbound(val * rfactor, minval, maxval);
10261032
SETRAWSAMPLE(width, ncp, i*2, val1);
10271033
SETRAWSAMPLE(width, ncp, i*2 + width, val2);
10281034
}
@@ -1080,7 +1086,7 @@ audioop_add_impl(PyObject *module, Py_buffer *fragment1,
10801086
else {
10811087
double fval = (double)val1 + (double)val2;
10821088
/* truncate in case of overflow */
1083-
newval = (int)floor(fbound(fval, minval, maxval));
1089+
newval = fbound(fval, minval, maxval);
10841090
}
10851091

10861092
SETRAWSAMPLE(width, ncp, i, newval);

0 commit comments

Comments
 (0)