Author: Amaury Forgeot d'Arc <amaur...@gmail.com>
Branch: py3.3
Changeset: r75190:f9375d4e25c3
Date: 2014-12-31 16:32 +0100
http://bitbucket.org/pypy/pypy/changeset/f9375d4e25c3/

Log:    audioop: Use cffi instead of ctypes to create mutable buffers also
        precompile the module.

diff --git a/lib_pypy/audioop.py b/lib_pypy/audioop.py
--- a/lib_pypy/audioop.py
+++ b/lib_pypy/audioop.py
@@ -2,7 +2,7 @@
 import math
 import struct
 from fractions import gcd
-from ctypes import create_string_buffer
+from cffi import FFI
 
 
 _buffer = memoryview
@@ -327,13 +327,14 @@
     _check_params(len(cp), size)
     clip = _get_clipfn(size)
 
-    result = create_string_buffer(len(cp))
+    rv = ffi.new("unsigned char[]", len(cp))
+    result = ffi.buffer(rv)
 
     for i, sample in enumerate(_get_samples(cp, size)):
         sample = clip(int(sample * factor))
         _put_sample(result, size, i, sample)
 
-    return result.raw
+    return result[:]
 
 
 def tomono(cp, size, fac1, fac2):
@@ -342,7 +343,8 @@
 
     sample_count = _sample_count(cp, size)
 
-    result = create_string_buffer(len(cp) // 2)
+    rv = ffi.new("unsigned char[]", len(cp) // 2)
+    result = ffi.buffer(rv)
 
     for i in range(0, sample_count, 2):
         l_sample = getsample(cp, size, i)
@@ -353,7 +355,7 @@
 
         _put_sample(result, size, i // 2, sample)
 
-    return result.raw
+    return result[:]
 
 
 def tostereo(cp, size, fac1, fac2):
@@ -361,7 +363,8 @@
 
     sample_count = _sample_count(cp, size)
 
-    result = create_string_buffer(len(cp) * 2)
+    rv = ffi.new("unsigned char[]", len(cp) * 2)
+    result = ffi.buffer(rv)
     clip = _get_clipfn(size)
 
     for i in range(sample_count):
@@ -373,7 +376,7 @@
         _put_sample(result, size, i * 2, l_sample)
         _put_sample(result, size, i * 2 + 1, r_sample)
 
-    return result.raw
+    return result[:]
 
 
 def add(cp1, cp2, size):
@@ -384,7 +387,8 @@
 
     clip = _get_clipfn(size)
     sample_count = _sample_count(cp1, size)
-    result = create_string_buffer(len(cp1))
+    rv = ffi.new("unsigned char[]", len(cp1))
+    result = ffi.buffer(rv)
 
     for i in range(sample_count):
         sample1 = getsample(cp1, size, i)
@@ -394,30 +398,32 @@
 
         _put_sample(result, size, i, sample)
 
-    return result.raw
+    return result[:]
 
 
 def bias(cp, size, bias):
     _check_params(len(cp), size)
 
-    result = create_string_buffer(len(cp))
+    rv = ffi.new("unsigned char[]", len(cp))
+    result = ffi.buffer(rv)
 
     for i, sample in enumerate(_get_samples(cp, size)):
         sample = _overflow(sample + bias, size)
         _put_sample(result, size, i, sample)
 
-    return result.raw
+    return result[:]
 
 
 def reverse(cp, size):
     _check_params(len(cp), size)
     sample_count = _sample_count(cp, size)
 
-    result = create_string_buffer(len(cp))
+    rv = ffi.new("unsigned char[]", len(cp))
+    result = ffi.buffer(rv)
     for i, sample in enumerate(_get_samples(cp, size)):
         _put_sample(result, size, sample_count - i - 1, sample)
 
-    return result.raw
+    return result[:]
 
 
 def lin2lin(cp, size, size2):
@@ -428,7 +434,8 @@
         return cp
 
     new_len = (len(cp) // size) * size2
-    result = create_string_buffer(new_len)
+    rv = ffi.new("unsigned char[]", new_len)
+    result = ffi.buffer(rv)
 
     for i in range(_sample_count(cp, size)):
         sample = _get_sample(cp, size, i)
@@ -443,7 +450,7 @@
         sample = _overflow(sample, size2)
         _put_sample(result, size2, i, sample)
 
-    return result.raw
+    return result[:]
 
 
 def ratecv(cp, size, nchannels, inrate, outrate, state, weightA=1, weightB=0):
@@ -488,7 +495,8 @@
     ceiling = (q + 1) * outrate
     nbytes = ceiling * bytes_per_frame
 
-    result = create_string_buffer(nbytes)
+    rv = ffi.new("unsigned char[]", nbytes)
+    result = ffi.buffer(rv)
 
     samples = _get_samples(cp, size)
     out_i = 0
@@ -496,7 +504,7 @@
         while d < 0:
             if frame_count == 0:
                 samps = zip(prev_i, cur_i)
-                retval = result.raw
+                retval = result[:]
 
                 # slice off extra bytes
                 trim_index = (out_i * bytes_per_frame) - len(retval)
@@ -527,7 +535,6 @@
                 d -= inrate
 
 
-from cffi import FFI
 ffi = FFI()
 ffi.cdef("""
 typedef short PyInt16;
diff --git a/pypy/tool/release/package.py b/pypy/tool/release/package.py
--- a/pypy/tool/release/package.py
+++ b/pypy/tool/release/package.py
@@ -111,7 +111,7 @@
 '''
 
 def create_cffi_import_libraries(pypy_c, options):
-    modules = ['_sqlite3', '_lzma']
+    modules = ['_sqlite3', '_lzma', 'audioop']
     subprocess.check_call([str(pypy_c), '-c', 'import _sqlite3'])
     if not sys.platform == 'win32':
         modules += ['_curses', 'syslog', '_gdbm', '_sqlite3']
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to