cpython: fdbbbc7b40d7 (original) (raw)
Mercurial > cpython
changeset 85821:fdbbbc7b40d7 2.7
Issue #18950: Fix miscellaneous bugs in the sunau module. Au_read.readframes() now updates current file position and reads correct number of frames from multichannel stream. Au_write.writeframesraw() now correctly updates current file position. Au_read and Au_write now correctly work with file object if start file position is not a zero. [#18950]
Serhiy Storchaka storchaka@gmail.com | |
---|---|
date | Sat, 28 Sep 2013 21:31:36 +0300 |
parents | b0866382064f |
children | 39bb7421cb69 |
files | Lib/sunau.py Misc/NEWS |
diffstat | 2 files changed, 26 insertions(+), 5 deletions(-)[+] [-] Lib/sunau.py 25 Misc/NEWS 6 |
line wrap: on
line diff
--- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -203,6 +203,10 @@ class Au_read: break else: self._info = ''
try:[](#l1.7)
self._data_pos = file.tell()[](#l1.8)
except (AttributeError, IOError):[](#l1.9)
self._data_pos = None[](#l1.10)
def getfp(self): return self._file @@ -255,7 +259,8 @@ class Au_read: if nframes == AUDIO_UNKNOWN_SIZE: data = self._file.read() else:
data = self._file.read(nframes * self._framesize * self._nchannels)[](#l1.18)
data = self._file.read(nframes * self._framesize)[](#l1.19)
self._soundpos += len(data) // self._framesize[](#l1.20) if self._encoding == AUDIO_FILE_ENCODING_MULAW_8:[](#l1.21) import audioop[](#l1.22) data = audioop.ulaw2lin(data, self._sampwidth)[](#l1.23)
@@ -263,8 +268,10 @@ class Au_read: return None # XXX--not implemented yet def rewind(self):
if self._data_pos is None:[](#l1.28)
raise IOError('cannot seek')[](#l1.29)
self._file.seek(self._data_pos)[](#l1.30) self._soundpos = 0[](#l1.31)
self._file.seek(self._hdr_size)[](#l1.32)
def tell(self): return self._soundpos @@ -272,7 +279,9 @@ class Au_read: def setpos(self, pos): if pos < 0 or pos > self.getnframes(): raise Error, 'position not in range'
self._file.seek(pos * self._framesize + self._hdr_size)[](#l1.40)
if self._data_pos is None:[](#l1.41)
raise IOError('cannot seek')[](#l1.42)
self._file.seek(self._data_pos + pos * self._framesize)[](#l1.43) self._soundpos = pos[](#l1.44)
def close(self): @@ -382,10 +391,10 @@ class Au_write: def writeframesraw(self, data): self._ensure_header_written()
nframes = len(data) / self._framesize[](#l1.51) if self._comptype == 'ULAW':[](#l1.52) import audioop[](#l1.53) data = audioop.lin2ulaw(data, self._sampwidth)[](#l1.54)
nframes = len(data) // self._framesize[](#l1.55) self._file.write(data)[](#l1.56) self._nframeswritten = self._nframeswritten + nframes[](#l1.57) self._datawritten = self._datawritten + len(data)[](#l1.58)
@@ -445,6 +454,10 @@ class Au_write: length = AUDIO_UNKNOWN_SIZE else: length = self._nframes * self._framesize
try:[](#l1.63)
self._form_length_pos = self._file.tell()[](#l1.64)
except (AttributeError, IOError):[](#l1.65)
self._form_length_pos = None[](#l1.66) _write_u32(self._file, length)[](#l1.67) self._datalength = length[](#l1.68) _write_u32(self._file, encoding)[](#l1.69)
@@ -454,7 +467,9 @@ class Au_write: self._file.write('\0'*(header_size - len(self._info) - 24)) def _patchheader(self):
self._file.seek(8)[](#l1.74)
if self._form_length_pos is None:[](#l1.75)
raise IOError('cannot seek')[](#l1.76)
self._file.seek(self._form_length_pos)[](#l1.77) _write_u32(self._file, self._datawritten)[](#l1.78) self._datalength = self._datawritten[](#l1.79) self._file.seek(0, 2)[](#l1.80)
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,12 @@ Core and Builtins Library ------- +- Issue #18950: Fix miscellaneous bugs in the sunau module.