@@ -20,10 +20,17 @@ static const unsigned int masks[] = {0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF};
2020static int
2121fbound (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