From: R. David Murray Date: Wed, 29 Apr 2009 15:54:48 +0000 (+0000) Subject: Merged revisions 72104 via svnmerge from X-Git-Tag: 3.0~153 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=392e740f044b1990c373170f14cd3431b5fa9ab3;p=thirdparty%2FPython%2Fcpython.git Merged revisions 72104 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r72104 | r.david.murray | 2009-04-29 11:34:32 -0400 (Wed, 29 Apr 2009) | 17 lines Merged revisions 72100-72101 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r72100 | r.david.murray | 2009-04-29 09:17:37 -0400 (Wed, 29 Apr 2009) | 7 lines Fix issue 2245. aifc now skips any chunk type it doesn't actually process instead of throwing errors for anything not in an explicit skip list. This is per this spec: http://www.cnpbagwell.com/aiff-c.txt. Spec reference and test sound file provided by Santiago Peresón, fix based on patch by Hiroaki Kawai. ........ r72101 | r.david.murray | 2009-04-29 09:51:44 -0400 (Wed, 29 Apr 2009) | 2 lines Now that we've got a test_aifc, add a few tests. ........ ................ --- diff --git a/Lib/aifc.py b/Lib/aifc.py index 26b0ff5b7a30..36312b3c2cbe 100644 --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -144,9 +144,6 @@ class Error(Exception): _AIFC_version = 0xA2805140 # Version 1 of AIFF-C -_skiplist = b'COMT', b'INST', b'MIDI', b'AESD', \ - b'APPL', b'NAME', b'AUTH', b'(c) ', b'ANNO' - def _read_long(file): try: return struct.unpack('>l', file.read(4))[0] @@ -313,11 +310,6 @@ class Aifc_read: self._version = _read_ulong(chunk) elif chunkname == b'MARK': self._readmark(chunk) - elif chunkname in _skiplist: - pass - else: - raise Error('unrecognized chunk type ' + - chunkname.decode('latin1')) chunk.skip() if not self._comm_chunk_read or not self._ssnd_chunk: raise Error('COMM chunk and/or SSND chunk missing') diff --git a/Lib/test/Sine-1000Hz-300ms.aif b/Lib/test/Sine-1000Hz-300ms.aif new file mode 100644 index 000000000000..bf08f5ce8594 Binary files /dev/null and b/Lib/test/Sine-1000Hz-300ms.aif differ diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py new file mode 100644 index 000000000000..fd411262207c --- /dev/null +++ b/Lib/test/test_aifc.py @@ -0,0 +1,59 @@ +from test.support import findfile, run_unittest +import unittest + +import aifc + + +class AIFCTest(unittest.TestCase): + + def setUp(self): + self.sndfilepath = findfile('Sine-1000Hz-300ms.aif') + + def test_skipunknown(self): + #Issue 2245 + #This file contains chunk types aifc doesn't recognize. + f = aifc.open(self.sndfilepath) + f.close() + + def test_params(self): + f = aifc.open(self.sndfilepath) + self.assertEqual(f.getnchannels(), 2) + self.assertEqual(f.getsampwidth(), 2) + self.assertEqual(f.getframerate(), 48000) + self.assertEqual(f.getnframes(), 14400) + # XXX: are the next two correct? The docs say/imply they are supposed + # to be strings. + self.assertEqual(f.getcomptype(), b'NONE') + self.assertEqual(f.getcompname(), b'not compressed') + self.assertEqual( + f.getparams(), + (2, 2, 48000, 14400, b'NONE', b'not compressed'), + ) + f.close() + + def test_read(self): + f = aifc.open(self.sndfilepath) + self.assertEqual(f.tell(), 0) + self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') + f.rewind() + pos0 = f.tell() + self.assertEqual(pos0, 0) + self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') + pos2 = f.tell() + self.assertEqual(pos2, 2) + self.assertEqual(f.readframes(2), b'\x17t\x17t"\xad"\xad') + f.setpos(pos2) + self.assertEqual(f.readframes(2), b'\x17t\x17t"\xad"\xad') + f.setpos(pos0) + self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') + f.close() + + #XXX Need more tests! + + +def test_main(): + run_unittest(AIFCTest) + + +if __name__ == "__main__": + unittest.main() diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py index 49813a32d43b..b77690fbfd86 100644 --- a/Lib/test/test_sundry.py +++ b/Lib/test/test_sundry.py @@ -8,7 +8,6 @@ import warnings class TestUntestedModules(unittest.TestCase): def test_at_least_import_untested_modules(self): with warnings.catch_warnings(): - import aifc import bdb import cgitb import code diff --git a/Misc/ACKS b/Misc/ACKS index a5ba8dca1d11..fa556698e987 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -362,6 +362,7 @@ Tamito Kajiyama Peter van Kampen Jacob Kaplan-Moss Lou Kates +Hiroaki Kawai Sebastien Keim Robert Kern Randall Kern @@ -527,6 +528,7 @@ Randy Pausch Samuele Pedroni Marcel van der Peijl Steven Pemberton +Santiago Peresón Mark Perrego Trevor Perrin Tim Peters diff --git a/Misc/NEWS b/Misc/NEWS index 537dc0cc31da..d2eaacc5f914 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -42,6 +42,8 @@ Core and Builtins Library ------- +- Issue #2245: aifc now skips chunk types it doesn't recognize, per spec. + - Issue #4305: ctypes should now build again on mipsel-linux-gnu - Issue #5853: calling a function of the mimetypes module from several threads