From 499d82136dbe48680b9a90e7e5f4ed48eea7866a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 12 Oct 2013 21:35:33 +0300 Subject: [PATCH] Issue #18919: If the close() method of a writer in the sunau or wave module failed, second invocation of close() and destructor no more raise an exception. Second invocation of close() on sunau writer now has no effects. The aifc module now accepts lower case of names of the 'ulaw' and 'alaw' codecs. --- Lib/aifc.py | 18 +++++++++--------- Lib/sunau.py | 15 +++++++++------ Lib/wave.py | 12 +++++++----- Misc/NEWS | 6 ++++++ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/Lib/aifc.py b/Lib/aifc.py index f4c196c4f6..d8b7fab7da 100644 --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -486,7 +486,7 @@ class Aifc_read: try: import cl except ImportError: - if self._comptype == 'ULAW': + if self._comptype in ('ULAW', 'ulaw'): try: import audioop self._convert = self._ulaw2lin @@ -495,9 +495,9 @@ class Aifc_read: except ImportError: pass raise Error, 'cannot read compressed AIFF-C files' - if self._comptype == 'ULAW': + if self._comptype in ('ULAW', 'ulaw'): scheme = cl.G711_ULAW - elif self._comptype == 'ALAW': + elif self._comptype in ('ALAW', 'alaw'): scheme = cl.G711_ALAW else: raise Error, 'unsupported compression type' @@ -654,7 +654,7 @@ class Aifc_write: def setcomptype(self, comptype, compname): if self._nframeswritten: raise Error, 'cannot change parameters after starting to write' - if comptype not in ('NONE', 'ULAW', 'ALAW', 'G722'): + if comptype not in ('NONE', 'ULAW', 'ulaw', 'ALAW', 'alaw', 'G722'): raise Error, 'unsupported compression type' self._comptype = comptype self._compname = compname @@ -674,7 +674,7 @@ class Aifc_write: nchannels, sampwidth, framerate, nframes, comptype, compname = info if self._nframeswritten: raise Error, 'cannot change parameters after starting to write' - if comptype not in ('NONE', 'ULAW', 'ALAW', 'G722'): + if comptype not in ('NONE', 'ULAW', 'ulaw', 'ALAW', 'alaw', 'G722'): raise Error, 'unsupported compression type' self.setnchannels(nchannels) self.setsampwidth(sampwidth) @@ -803,7 +803,7 @@ class Aifc_write: try: import cl except ImportError: - if self._comptype == 'ULAW': + if self._comptype in ('ULAW', 'ulaw'): try: import audioop self._convert = self._lin2ulaw @@ -811,9 +811,9 @@ class Aifc_write: except ImportError: pass raise Error, 'cannot write compressed AIFF-C files' - if self._comptype == 'ULAW': + if self._comptype in ('ULAW', 'ulaw'): scheme = cl.G711_ULAW - elif self._comptype == 'ALAW': + elif self._comptype in ('ALAW', 'alaw'): scheme = cl.G711_ALAW else: raise Error, 'unsupported compression type' @@ -866,7 +866,7 @@ class Aifc_write: _write_short(self._file, self._nchannels) self._nframes_pos = self._file.tell() _write_ulong(self._file, self._nframes) - if self._comptype in ('ULAW', 'ALAW', 'G722'): + if self._comptype in ('ULAW', 'ulaw', 'ALAW', 'alaw', 'G722'): _write_short(self._file, 8) else: _write_short(self._file, self._sampwidth * 8) diff --git a/Lib/sunau.py b/Lib/sunau.py index 4f0885aaf5..31b280da92 100644 --- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -406,12 +406,15 @@ class Au_write: self._patchheader() def close(self): - self._ensure_header_written() - if self._nframeswritten != self._nframes or \ - self._datalength != self._datawritten: - self._patchheader() - self._file.flush() - self._file = None + if self._file: + try: + self._ensure_header_written() + if self._nframeswritten != self._nframes or \ + self._datalength != self._datawritten: + self._patchheader() + self._file.flush() + finally: + self._file = None # # private methods diff --git a/Lib/wave.py b/Lib/wave.py index 16b11dcfcd..04a1a6db38 100644 --- a/Lib/wave.py +++ b/Lib/wave.py @@ -436,11 +436,13 @@ class Wave_write: def close(self): if self._file: - self._ensure_header_written(0) - if self._datalength != self._datawritten: - self._patchheader() - self._file.flush() - self._file = None + try: + self._ensure_header_written(0) + if self._datalength != self._datawritten: + self._patchheader() + self._file.flush() + finally: + self._file = None if self._i_opened_the_file: self._i_opened_the_file.close() self._i_opened_the_file = None diff --git a/Misc/NEWS b/Misc/NEWS index d23f7ccca3..ee4f001add 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,12 @@ Core and Builtins Library ------- +- Issue #18919: If the close() method of a writer in the sunau or wave module + failed, second invocation of close() and destructor no more raise an + exception. Second invocation of close() on sunau writer now has no effects. + The aifc module now accepts lower case of names of the 'ulaw' and 'alaw' + codecs. + - Issue #19131: The aifc module now correctly reads and writes sampwidth of compressed streams. -- 2.50.1