bpo-33781: audioop: enhance rounding double as int (GH-7447) · python/cpython@45e4efb (original) (raw)
`@@ -20,10 +20,17 @@ static const unsigned int masks[] = {0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF};
`
20
20
`static int
`
21
21
`fbound(double val, double minval, double maxval)
`
22
22
`{
`
23
``
`-
if (val > maxval)
`
``
23
`+
if (val > maxval) {
`
24
24
`val = maxval;
`
25
``
`-
else if (val < minval + 1)
`
``
25
`+
}
`
``
26
`+
else if (val < minval + 1.0) {
`
26
27
`val = minval;
`
``
28
`+
}
`
``
29
+
``
30
`+
/* Round towards minus infinity (-inf) */
`
``
31
`+
val = floor(val);
`
``
32
+
``
33
`+
/* Cast double to integer: round towards zero */
`
27
34
`return (int)val;
`
28
35
`}
`
29
36
``
`@@ -924,9 +931,8 @@ audioop_mul_impl(PyObject *module, Py_buffer *fragment, int width,
`
924
931
``
925
932
`for (i = 0; i < fragment->len; i += width) {
`
926
933
`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);
`
930
936
` }
`
931
937
`return rv;
`
932
938
`}
`
`@@ -973,9 +979,9 @@ audioop_tomono_impl(PyObject *module, Py_buffer *fragment, int width,
`
973
979
`for (i = 0; i < len; i += width*2) {
`
974
980
`double val1 = GETRAWSAMPLE(width, cp, i);
`
975
981
`double val2 = GETRAWSAMPLE(width, cp, i + width);
`
976
``
`-
double val = val1lfactor + val2rfactor;
`
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);
`
979
985
` }
`
980
986
`return rv;
`
981
987
`}
`
`@@ -1021,8 +1027,8 @@ audioop_tostereo_impl(PyObject *module, Py_buffer *fragment, int width,
`
1021
1027
``
1022
1028
`for (i = 0; i < fragment->len; i += width) {
`
1023
1029
`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);
`
1026
1032
`SETRAWSAMPLE(width, ncp, i*2, val1);
`
1027
1033
`SETRAWSAMPLE(width, ncp, i*2 + width, val2);
`
1028
1034
` }
`
`@@ -1080,7 +1086,7 @@ audioop_add_impl(PyObject *module, Py_buffer *fragment1,
`
1080
1086
`else {
`
1081
1087
`double fval = (double)val1 + (double)val2;
`
1082
1088
`/* truncate in case of overflow */
`
1083
``
`-
newval = (int)floor(fbound(fval, minval, maxval));
`
``
1089
`+
newval = fbound(fval, minval, maxval);
`
1084
1090
` }
`
1085
1091
``
1086
1092
`SETRAWSAMPLE(width, ncp, i, newval);
`