Issue #16685: Added support for writing any bytes-like objects in the aifc,
sunau, and wave modules.
This commit is contained in:
parent
7714ebbe0e
commit
452bab4acf
|
@ -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
|
||||||
|
|
||||||
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:
|
||||||
|
|
||||||
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:
|
||||||
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:
|
||||||
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):
|
||||||
|
|
||||||
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:
|
||||||
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
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue