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);

`