#10198: fix duplicate header when writeframes() is called with an empty string.

This commit is contained in:
Georg Brandl 2010-10-30 08:29:28 +00:00
parent dd4215483f
commit cc2adbc693
2 changed files with 8 additions and 1 deletions

View File

@ -319,6 +319,7 @@ class Wave_write:
self._nframeswritten = 0 self._nframeswritten = 0
self._datawritten = 0 self._datawritten = 0
self._datalength = 0 self._datalength = 0
self._headerwritten = False
def __del__(self): def __del__(self):
self.close() self.close()
@ -449,7 +450,7 @@ class Wave_write:
# #
def _ensure_header_written(self, datasize): def _ensure_header_written(self, datasize):
if not self._datawritten: if not self._headerwritten:
if not self._nchannels: if not self._nchannels:
raise Error('# channels not specified') raise Error('# channels not specified')
if not self._sampwidth: if not self._sampwidth:
@ -459,6 +460,7 @@ class Wave_write:
self._write_header(datasize) self._write_header(datasize)
def _write_header(self, initlength): def _write_header(self, initlength):
assert not self._headerwritten
self._file.write(b'RIFF') self._file.write(b'RIFF')
if not self._nframes: if not self._nframes:
self._nframes = initlength // (self._nchannels * self._sampwidth) self._nframes = initlength // (self._nchannels * self._sampwidth)
@ -472,8 +474,10 @@ class Wave_write:
self._sampwidth * 8, 'data')) self._sampwidth * 8, 'data'))
self._data_length_pos = self._file.tell() self._data_length_pos = self._file.tell()
self._file.write(struct.pack('<l', self._datalength)) self._file.write(struct.pack('<l', self._datalength))
self._headerwritten = True
def _patchheader(self): def _patchheader(self):
assert self._headerwritten
if self._datawritten == self._datalength: if self._datawritten == self._datalength:
return return
curpos = self._file.tell() curpos = self._file.tell()

View File

@ -57,6 +57,9 @@ Core and Builtins
Library Library
------- -------
- Issue #10198: fix duplicate header written to wave files when writeframes()
is called without data.
- Close file objects in modulefinder in a timely manner. - Close file objects in modulefinder in a timely manner.
- Close a io.TextIOWrapper object in email.parser in a timely manner. - Close a io.TextIOWrapper object in email.parser in a timely manner.