cpython: 41ed98a93236 (original) (raw)
Mercurial > cpython
changeset 85819:41ed98a93236 3.3
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.getnframes() now returns an integer (as in Python 2). Au_read and Au_write now correctly works with file object if start file position is not a zero. [#18950]
Serhiy Storchaka storchaka@gmail.com | |
---|---|
date | Sat, 28 Sep 2013 21:21:39 +0300 |
parents | 460b0ccbab7f |
children | 9e54def97a5e 6bf37e2cbe83 |
files | Lib/sunau.py Misc/NEWS |
diffstat | 2 files changed, 28 insertions(+), 6 deletions(-)[+] [-] Lib/sunau.py 27 Misc/NEWS 7 |
line wrap: on
line diff
--- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -205,6 +205,10 @@ class Au_read: break else: self._info = ''
try:[](#l1.7)
self._data_pos = file.tell()[](#l1.8)
except (AttributeError, OSError):[](#l1.9)
self._data_pos = None[](#l1.10)
def getfp(self): return self._file @@ -222,7 +226,7 @@ class Au_read: if self._data_size == AUDIO_UNKNOWN_SIZE: return AUDIO_UNKNOWN_SIZE if self._encoding in _simple_encodings:
return self._data_size / self._framesize[](#l1.18)
return self._data_size // self._framesize[](#l1.19) return 0 # XXX--must do some arithmetic here[](#l1.20)
def getcomptype(self): @@ -257,7 +261,8 @@ class Au_read: if nframes == AUDIO_UNKNOWN_SIZE: data = self._file.read() else:
data = self._file.read(nframes * self._framesize * self._nchannels)[](#l1.27)
data = self._file.read(nframes * self._framesize)[](#l1.28)
self._soundpos += len(data) // self._framesize[](#l1.29) if self._encoding == AUDIO_FILE_ENCODING_MULAW_8:[](#l1.30) import audioop[](#l1.31) data = audioop.ulaw2lin(data, self._sampwidth)[](#l1.32)
@@ -265,8 +270,10 @@ class Au_read: return None # XXX--not implemented yet def rewind(self):
if self._data_pos is None:[](#l1.37)
raise OSError('cannot seek')[](#l1.38)
self._file.seek(self._data_pos)[](#l1.39) self._soundpos = 0[](#l1.40)
self._file.seek(self._hdr_size)[](#l1.41)
def tell(self): return self._soundpos @@ -274,7 +281,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.49)
if self._data_pos is None:[](#l1.50)
raise OSError('cannot seek')[](#l1.51)
self._file.seek(self._data_pos + pos * self._framesize)[](#l1.52) self._soundpos = pos[](#l1.53)
def close(self): @@ -390,10 +399,10 @@ class Au_write: def writeframesraw(self, data): self._ensure_header_written()
nframes = len(data) / self._framesize[](#l1.60) if self._comptype == 'ULAW':[](#l1.61) import audioop[](#l1.62) data = audioop.lin2ulaw(data, self._sampwidth)[](#l1.63)
nframes = len(data) // self._framesize[](#l1.64) self._file.write(data)[](#l1.65) self._nframeswritten = self._nframeswritten + nframes[](#l1.66) self._datawritten = self._datawritten + len(data)[](#l1.67)
@@ -455,6 +464,10 @@ class Au_write: length = AUDIO_UNKNOWN_SIZE else: length = self._nframes * self._framesize
try:[](#l1.72)
self._form_length_pos = self._file.tell()[](#l1.73)
except (AttributeError, OSError):[](#l1.74)
self._form_length_pos = None[](#l1.75) _write_u32(self._file, length)[](#l1.76) self._datalength = length[](#l1.77) _write_u32(self._file, encoding)[](#l1.78)
@@ -464,7 +477,9 @@ class Au_write: self._file.write(b'\0'*(header_size - len(self._info) - 24)) def _patchheader(self):
self._file.seek(8)[](#l1.83)
if self._form_length_pos is None:[](#l1.84)
raise OSError('cannot seek')[](#l1.85)
self._file.seek(self._form_length_pos)[](#l1.86) _write_u32(self._file, self._datawritten)[](#l1.87) self._datalength = self._datawritten[](#l1.88) self._file.seek(0, 2)[](#l1.89)
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -71,6 +71,13 @@ Core and Builtins Library ------- +- 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.getnframes() now returns an
- integer (as in Python 2). Au_read and Au_write now correctly works with file
- object if start file position is not a zero. +