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

sunau, and wave modules.
This commit is contained in:
Serhiy Storchaka 2013-11-16 14:01:31 +02:00
parent 7714ebbe0e
commit 452bab4acf
8 changed files with 51 additions and 0 deletions

View 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 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()

View File

@ -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()

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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')

View File

@ -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:

View File

@ -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