Commit 0161fed4 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #16685: Added support for writing any bytes-like objects in the aifc,

sunau, and wave modules.
parent a6453b41
...@@ -225,12 +225,18 @@ number of frames must be filled in. ...@@ -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 Write data to the output file. This method can only be called after the audio
file parameters have been set. file parameters have been set.
.. versionchanged:: 3.4
Any :term:`bytes-like object`\ s are now accepted.
.. method:: aifc.writeframesraw(data) .. method:: aifc.writeframesraw(data)
Like :meth:`writeframes`, except that the header of the audio file is not Like :meth:`writeframes`, except that the header of the audio file is not
updated. updated.
.. versionchanged:: 3.4
Any :term:`bytes-like object`\ s are now accepted.
.. method:: aifc.close() .. method:: aifc.close()
......
...@@ -250,11 +250,17 @@ AU_write objects, as returned by :func:`.open` above, have the following methods ...@@ -250,11 +250,17 @@ AU_write objects, as returned by :func:`.open` above, have the following methods
Write audio frames, without correcting *nframes*. Write audio frames, without correcting *nframes*.
.. versionchanged:: 3.4
Any :term:`bytes-like object`\ s are now accepted.
.. method:: AU_write.writeframes(data) .. method:: AU_write.writeframes(data)
Write audio frames and make sure *nframes* is correct. 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() .. method:: AU_write.close()
......
...@@ -208,12 +208,18 @@ Wave_write objects, as returned by :func:`.open`, have the following methods: ...@@ -208,12 +208,18 @@ Wave_write objects, as returned by :func:`.open`, have the following methods:
Write audio frames, without correcting *nframes*. Write audio frames, without correcting *nframes*.
.. versionchanged:: 3.4
Any :term:`bytes-like object`\ s are now accepted.
.. method:: Wave_write.writeframes(data) .. method:: Wave_write.writeframes(data)
Write audio frames and make sure *nframes* is correct. Can raise an Write audio frames and make sure *nframes* is correct. Can raise an
exception if a file is not seekable. 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` Note that it is invalid to set any parameters after calling :meth:`writeframes`
or :meth:`writeframesraw`, and any attempt to do so will raise or :meth:`writeframesraw`, and any attempt to do so will raise
......
...@@ -692,6 +692,8 @@ class Aifc_write: ...@@ -692,6 +692,8 @@ class Aifc_write:
return self._nframeswritten return self._nframeswritten
def writeframesraw(self, data): def writeframesraw(self, data):
if not isinstance(data, (bytes, bytearray)):
data = memoryview(data).cast('B')
self._ensure_header_written(len(data)) self._ensure_header_written(len(data))
nframes = len(data) // (self._sampwidth * self._nchannels) nframes = len(data) // (self._sampwidth * self._nchannels)
if self._convert: if self._convert:
......
...@@ -415,6 +415,8 @@ class Au_write: ...@@ -415,6 +415,8 @@ class Au_write:
return self._nframeswritten return self._nframeswritten
def writeframesraw(self, data): def writeframesraw(self, data):
if not isinstance(data, (bytes, bytearray)):
data = memoryview(data).cast('B')
self._ensure_header_written() self._ensure_header_written()
if self._comptype == 'ULAW': if self._comptype == 'ULAW':
import audioop import audioop
......
...@@ -146,6 +146,30 @@ class AudioWriteTests(AudioTests): ...@@ -146,6 +146,30 @@ class AudioWriteTests(AudioTests):
self.check_file(TESTFN, self.nframes, self.frames) 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): def test_incompleted_write(self):
with open(TESTFN, 'wb') as testfile: with open(TESTFN, 'wb') as testfile:
testfile.write(b'ababagalamaga') testfile.write(b'ababagalamaga')
......
...@@ -435,6 +435,8 @@ class Wave_write: ...@@ -435,6 +435,8 @@ class Wave_write:
return self._nframeswritten return self._nframeswritten
def writeframesraw(self, data): def writeframesraw(self, data):
if not isinstance(data, (bytes, bytearray)):
data = memoryview(data).cast('B')
self._ensure_header_written(len(data)) self._ensure_header_written(len(data))
nframes = len(data) // (self._sampwidth * self._nchannels) nframes = len(data) // (self._sampwidth * self._nchannels)
if self._convert: if self._convert:
......
...@@ -47,6 +47,9 @@ Core and Builtins ...@@ -47,6 +47,9 @@ Core and Builtins
Library 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 #5202: Added support for unseekable files in the wave module.
- Issue #19544 and Issue #1180: Restore global option to ignore - Issue #19544 and Issue #1180: Restore global option to ignore
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment