]> granicus.if.org Git - python/commitdiff
Issue #16685: Added support for writing any bytes-like objects in the aifc,
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 16 Nov 2013 12:01:31 +0000 (14:01 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sat, 16 Nov 2013 12:01:31 +0000 (14:01 +0200)
sunau, and wave modules.

Doc/library/aifc.rst
Doc/library/sunau.rst
Doc/library/wave.rst
Lib/aifc.py
Lib/sunau.py
Lib/test/audiotests.py
Lib/wave.py
Misc/NEWS

index 48c3ea9435b0c50afcbd9cfcf360495d27be8239..9ffb5a3ffe9d1dfe72888c2727409b72e97f0277 100644 (file)
@@ -225,12 +225,18 @@ number of frames must be filled in.
    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()
 
index 6455ed9c75a6de042cc73e9fd4c4081ab44be5e3..15c06b561abcfbeeb409cc425b069fddae517288 100644 (file)
@@ -250,11 +250,17 @@ AU_write objects, as returned by :func:`.open` above, have the following methods
 
    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()
 
index 189f21a3e2d8687fa7ff215644814ab0165462eb..c32e1fcd857a055376f2319276415d234f585f4c 100644 (file)
@@ -208,12 +208,18 @@ Wave_write objects, as returned by :func:`.open`, have the following methods:
 
    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
index 18f236da7a6db88dd930fc67694eb54d515dc553..c1c8ea7055708560b9dab4d5c7ec995ff87922b4 100644 (file)
@@ -692,6 +692,8 @@ class Aifc_write:
         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:
index 1880a01d1a232d45cb98eaecf8538cbfb8795c31..3c244925d1e8f7edfe42d64e5a890b5a1069dd5d 100644 (file)
@@ -415,6 +415,8 @@ class Au_write:
         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
index c22f0a10a9651e84c7e7a70969fbd723da86b42f..0e9175d8f4930885795ae7b2e3a0d104fb6dc4ac 100644 (file)
@@ -146,6 +146,30 @@ class AudioWriteTests(AudioTests):
 
         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')
index 3d01817afd0b0fa15c68532dbdf0778f7e581c37..7de1cd0f8858fb5ae975c0b6b9774be2883a78df 100644 (file)
@@ -435,6 +435,8 @@ class Wave_write:
         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:
index 9fd34c299aec4084c5e289c72581b93d493a784e..67b5dd0afdaa2d65673557941f77e3c10c53c82f 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -47,6 +47,9 @@ Core and Builtins
 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