[pypy-commit] pypy stdlib-2.7.6: fixes for audioop

bdkearns noreply at buildbot.pypy.org
Sat Mar 1 23:40:19 CET 2014


Author: Brian Kearns <bdkearns at gmail.com>
Branch: stdlib-2.7.6
Changeset: r69582:781b1f702577
Date: 2014-03-01 17:30 -0500
http://bitbucket.org/pypy/pypy/changeset/781b1f702577/

Log:	fixes for audioop

diff --git a/lib_pypy/audioop.py b/lib_pypy/audioop.py
--- a/lib_pypy/audioop.py
+++ b/lib_pypy/audioop.py
@@ -1,3 +1,4 @@
+from __future__ import division
 import __builtin__ as builtins
 import math
 import struct
@@ -24,7 +25,7 @@
 
 
 def _sample_count(cp, size):
-    return len(cp) / size
+    return len(cp) // size
 
 
 def _get_samples(cp, size, signed=True):
@@ -101,7 +102,7 @@
 
 def getsample(cp, size, i):
     _check_params(len(cp), size)
-    if not (0 <= i < len(cp) / size):
+    if not (0 <= i < len(cp) // size):
         raise error("Index out of range")
     return _get_sample(cp, size, i)
 
@@ -118,7 +119,7 @@
 def minmax(cp, size):
     _check_params(len(cp), size)
 
-    max_sample, min_sample = 0, 0
+    min_sample, max_sample = 0x7fffffff, -0x80000000
     for sample in _get_samples(cp, size):
         max_sample = builtins.max(sample, max_sample)
         min_sample = builtins.min(sample, min_sample)
@@ -131,7 +132,7 @@
     sample_count = _sample_count(cp, size)
     if sample_count == 0:
         return 0
-    return sum(_get_samples(cp, size)) / sample_count
+    return sum(_get_samples(cp, size)) // sample_count
 
 
 def rms(cp, size):
@@ -142,7 +143,7 @@
         return 0
 
     sum_squares = sum(sample**2 for sample in _get_samples(cp, size))
-    return int(math.sqrt(sum_squares / sample_count))
+    return int(math.sqrt(sum_squares // sample_count))
 
 
 def _sum2(cp1, cp2, length):
@@ -241,6 +242,8 @@
 def avgpp(cp, size):
     _check_params(len(cp), size)
     sample_count = _sample_count(cp, size)
+    if sample_count <= 2:
+        return 0
 
     prevextremevalid = False
     prevextreme = None
@@ -271,12 +274,14 @@
     if nextreme == 0:
         return 0
 
-    return avg / nextreme
+    return avg // nextreme
 
 
 def maxpp(cp, size):
     _check_params(len(cp), size)
     sample_count = _sample_count(cp, size)
+    if sample_count <= 1:
+        return 0
 
     prevextremevalid = False
     prevextreme = None
@@ -309,13 +314,13 @@
 def cross(cp, size):
     _check_params(len(cp), size)
 
-    crossings = 0
-    last_sample = 0
+    crossings = -1
+    last_sample = 17
     for sample in _get_samples(cp, size):
-        if sample <= 0 < last_sample or sample >= 0 > last_sample:
+        sample = sample < 0
+        if sample != last_sample:
             crossings += 1
         last_sample = sample
-
     return crossings
 
 
@@ -338,7 +343,7 @@
 
     sample_count = _sample_count(cp, size)
 
-    result = create_string_buffer(len(cp) / 2)
+    result = create_string_buffer(len(cp) // 2)
 
     for i in range(0, sample_count, 2):
         l_sample = getsample(cp, size, i)
@@ -347,7 +352,7 @@
         sample = (l_sample * fac1) + (r_sample * fac2)
         sample = clip(sample)
 
-        _put_sample(result, size, i / 2, sample)
+        _put_sample(result, size, i // 2, sample)
 
     return result.raw
 
@@ -423,19 +428,20 @@
     if size == size2:
         return cp
 
-    new_len = (len(cp) / size) * size2
-
+    new_len = (len(cp) // size) * size2
     result = create_string_buffer(new_len)
 
     for i in range(_sample_count(cp, size)):
         sample = _get_sample(cp, size, i)
-        if size < size2:
-            sample = sample << (4 * size2 / size)
-        elif size > size2:
-            sample = sample >> (4 * size / size2)
-
+        if size == 1:
+            sample <<= 24
+        elif size == 2:
+            sample <<= 16
+        if size2 == 1:
+            sample >>= 24
+        elif size2 == 2:
+            sample >>= 16
         sample = _overflow(sample, size2)
-
         _put_sample(result, size2, i, sample)
 
     return result.raw
@@ -447,9 +453,9 @@
         raise error("# of channels should be >= 1")
 
     bytes_per_frame = size * nchannels
-    frame_count = len(cp) / bytes_per_frame
+    frame_count = len(cp) // bytes_per_frame
 
-    if bytes_per_frame / nchannels != size:
+    if bytes_per_frame // nchannels != size:
         raise OverflowError("width * nchannels too big for a C int")
 
     if weightA < 1 or weightB < 0:
@@ -462,8 +468,8 @@
         raise error("sampling rate not > 0")
 
     d = gcd(inrate, outrate)
-    inrate /= d
-    outrate /= d
+    inrate //= d
+    outrate //= d
 
     prev_i = [0] * nchannels
     cur_i = [0] * nchannels
@@ -479,7 +485,7 @@
         prev_i, cur_i = zip(*samps)
         prev_i, cur_i = list(prev_i), list(cur_i)
 
-    q = frame_count / inrate
+    q = frame_count // inrate
     ceiling = (q + 1) * outrate
     nbytes = ceiling * bytes_per_frame
 
@@ -505,7 +511,7 @@
 
                 cur_i[chan] = (
                     (weightA * cur_i[chan] + weightB * prev_i[chan])
-                    / (weightA + weightB)
+                    // (weightA + weightB)
                 )
 
             frame_count -= 1
@@ -515,7 +521,7 @@
             for chan in range(nchannels):
                 cur_o = (
                     (prev_i[chan] * d + cur_i[chan] * (outrate - d))
-                    / outrate
+                    // outrate
                 )
                 _put_sample(result, size, out_i, _overflow(cur_o, size))
                 out_i += 1


More information about the pypy-commit mailing list