[Python-checkins] cpython: Issue #16685: Added support for writing any bytes-like objects in the aifc,

serhiy.storchaka python-checkins at python.org
Sat Nov 16 13:02:36 CET 2013


http://hg.python.org/cpython/rev/b96f4ee1b08b
changeset:   87149:b96f4ee1b08b
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sat Nov 16 14:01:31 2013 +0200
summary:
  Issue #16685: Added support for writing any bytes-like objects in the aifc,
sunau, and wave modules.

files:
  Doc/library/aifc.rst   |   6 ++++++
  Doc/library/sunau.rst  |   6 ++++++
  Doc/library/wave.rst   |   6 ++++++
  Lib/aifc.py            |   2 ++
  Lib/sunau.py           |   2 ++
  Lib/test/audiotests.py |  24 ++++++++++++++++++++++++
  Lib/wave.py            |   2 ++
  Misc/NEWS              |   3 +++
  8 files changed, 51 insertions(+), 0 deletions(-)


diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst
--- a/Doc/library/aifc.rst
+++ b/Doc/library/aifc.rst
@@ -225,12 +225,18 @@
    Write data to the output file.  This method can only be called after the audio
    file parameters have been set.
 
+   .. versionchanged:: 3.4
+      Any :term:`bytes-like object`\ s are now accepted.
+
 
 .. method:: aifc.writeframesraw(data)
 
    Like :meth:`writeframes`, except that the header of the audio file is not
    updated.
 
+   .. versionchanged:: 3.4
+      Any :term:`bytes-like object`\ s are now accepted.
+
 
 .. method:: aifc.close()
 
diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst
--- a/Doc/library/sunau.rst
+++ b/Doc/library/sunau.rst
@@ -250,11 +250,17 @@
 
    Write audio frames, without correcting *nframes*.
 
+   .. versionchanged:: 3.4
+      Any :term:`bytes-like object`\ s are now accepted.
+
 
 .. method:: AU_write.writeframes(data)
 
    Write audio frames and make sure *nframes* is correct.
 
+   .. versionchanged:: 3.4
+      Any :term:`bytes-like object`\ s are now accepted.
+
 
 .. method:: AU_write.close()
 
diff --git a/Doc/library/wave.rst b/Doc/library/wave.rst
--- a/Doc/library/wave.rst
+++ b/Doc/library/wave.rst
@@ -208,12 +208,18 @@
 
    Write audio frames, without correcting *nframes*.
 
+   .. versionchanged:: 3.4
+      Any :term:`bytes-like object`\ s are now accepted.
+
 
 .. method:: Wave_write.writeframes(data)
 
    Write audio frames and make sure *nframes* is correct. Can raise an
    exception if a file is not seekable.
 
+   .. versionchanged:: 3.4
+      Any :term:`bytes-like object`\ s are now accepted.
+
 
 Note that it is invalid to set any parameters after calling :meth:`writeframes`
 or :meth:`writeframesraw`, and any attempt to do so will raise
diff --git a/Lib/aifc.py b/Lib/aifc.py
--- a/Lib/aifc.py
+++ b/Lib/aifc.py
@@ -692,6 +692,8 @@
         return self._nframeswritten
 
     def writeframesraw(self, data):
+        if not isinstance(data, (bytes, bytearray)):
+            data = memoryview(data).cast('B')
         self._ensure_header_written(len(data))
         nframes = len(data) // (self._sampwidth * self._nchannels)
         if self._convert:
diff --git a/Lib/sunau.py b/Lib/sunau.py
--- a/Lib/sunau.py
+++ b/Lib/sunau.py
@@ -415,6 +415,8 @@
         return self._nframeswritten
 
     def writeframesraw(self, data):
+        if not isinstance(data, (bytes, bytearray)):
+            data = memoryview(data).cast('B')
         self._ensure_header_written()
         if self._comptype == 'ULAW':
             import audioop
diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py
--- a/Lib/test/audiotests.py
+++ b/Lib/test/audiotests.py
@@ -146,6 +146,30 @@
 
         self.check_file(TESTFN, self.nframes, self.frames)
 
+    def test_write_bytearray(self):
+        f = self.create_file(TESTFN)
+        f.setnframes(self.nframes)
+        f.writeframes(bytearray(self.frames))
+        f.close()
+
+        self.check_file(TESTFN, self.nframes, self.frames)
+
+    def test_write_array(self):
+        f = self.create_file(TESTFN)
+        f.setnframes(self.nframes)
+        f.writeframes(array.array('h', self.frames))
+        f.close()
+
+        self.check_file(TESTFN, self.nframes, self.frames)
+
+    def test_write_memoryview(self):
+        f = self.create_file(TESTFN)
+        f.setnframes(self.nframes)
+        f.writeframes(memoryview(self.frames))
+        f.close()
+
+        self.check_file(TESTFN, self.nframes, self.frames)
+
     def test_incompleted_write(self):
         with open(TESTFN, 'wb') as testfile:
             testfile.write(b'ababagalamaga')
diff --git a/Lib/wave.py b/Lib/wave.py
--- a/Lib/wave.py
+++ b/Lib/wave.py
@@ -435,6 +435,8 @@
         return self._nframeswritten
 
     def writeframesraw(self, data):
+        if not isinstance(data, (bytes, bytearray)):
+            data = memoryview(data).cast('B')
         self._ensure_header_written(len(data))
         nframes = len(data) // (self._sampwidth * self._nchannels)
         if self._convert:
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -47,6 +47,9 @@
 Library
 -------
 
+- Issue #16685: Added support for writing any bytes-like objects in the aifc,
+  sunau, and wave modules.
+
 - Issue #5202: Added support for unseekable files in the wave module.
 
 - Issue #19544 and Issue #1180: Restore global option to ignore

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list