diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2013-09-28 21:24:43 +0300 |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2013-09-28 21:24:43 +0300 |
commit | 134184d24bba629769035e90e42bbb91f6e5de47 (patch) | |
tree | f08b1937668e973bd304b2bd5c23137f3275a470 /Lib/sunau.py | |
parent | 75a8814a123a1be57a57ddfd5d28e027a2a6b2b0 (diff) | |
parent | a3c0ebd9304d51843a83e4a52ba3a39a5a6a8e84 (diff) | |
download | cpython-134184d24bba629769035e90e42bbb91f6e5de47.tar.gz |
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.
Diffstat (limited to 'Lib/sunau.py')
-rw-r--r-- | Lib/sunau.py | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/Lib/sunau.py b/Lib/sunau.py index efdc146095..5761390361 100644 --- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -216,6 +216,10 @@ class Au_read: break else: self._info = '' + try: + self._data_pos = file.tell() + except (AttributeError, OSError): + self._data_pos = None def getfp(self): return self._file @@ -233,7 +237,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 + return self._data_size // self._framesize return 0 # XXX--must do some arithmetic here def getcomptype(self): @@ -268,7 +272,8 @@ class Au_read: if nframes == AUDIO_UNKNOWN_SIZE: data = self._file.read() else: - data = self._file.read(nframes * self._framesize * self._nchannels) + data = self._file.read(nframes * self._framesize) + self._soundpos += len(data) // self._framesize if self._encoding == AUDIO_FILE_ENCODING_MULAW_8: import audioop data = audioop.ulaw2lin(data, self._sampwidth) @@ -276,8 +281,10 @@ class Au_read: return None # XXX--not implemented yet def rewind(self): + if self._data_pos is None: + raise OSError('cannot seek') + self._file.seek(self._data_pos) self._soundpos = 0 - self._file.seek(self._hdr_size) def tell(self): return self._soundpos @@ -285,7 +292,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) + if self._data_pos is None: + raise OSError('cannot seek') + self._file.seek(self._data_pos + pos * self._framesize) self._soundpos = pos def close(self): @@ -407,10 +416,10 @@ class Au_write: def writeframesraw(self, data): self._ensure_header_written() - nframes = len(data) / self._framesize if self._comptype == 'ULAW': import audioop data = audioop.lin2ulaw(data, self._sampwidth) + nframes = len(data) // self._framesize self._file.write(data) self._nframeswritten = self._nframeswritten + nframes self._datawritten = self._datawritten + len(data) @@ -475,6 +484,10 @@ class Au_write: length = AUDIO_UNKNOWN_SIZE else: length = self._nframes * self._framesize + try: + self._form_length_pos = self._file.tell() + except (AttributeError, OSError): + self._form_length_pos = None _write_u32(self._file, length) self._datalength = length _write_u32(self._file, encoding) @@ -484,7 +497,9 @@ class Au_write: self._file.write(b'\0'*(header_size - len(self._info) - 24)) def _patchheader(self): - self._file.seek(8) + if self._form_length_pos is None: + raise OSError('cannot seek') + self._file.seek(self._form_length_pos) _write_u32(self._file, self._datawritten) self._datalength = self._datawritten self._file.seek(0, 2) |