diff --git a/Lib/aifc.py b/Lib/aifc.py index 26b0ff5b7a3..36312b3c2cb 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 @@ def initfp(self, file): 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 00000000000..bf08f5ce859 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 00000000000..fd411262207 --- /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 bba54fe5ed1..ee387c74548 100644 --- a/Lib/test/test_sundry.py +++ b/Lib/test/test_sundry.py @@ -9,7 +9,6 @@ class TestUntestedModules(unittest.TestCase): def test_at_least_import_untested_modules(self): with warnings.catch_warnings(): warnings.simplefilter("ignore") - import aifc import bdb import cgitb import code diff --git a/Misc/ACKS b/Misc/ACKS index a4f848108ff..7eab407d2ed 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -372,6 +372,7 @@ Tamito Kajiyama Peter van Kampen Jacob Kaplan-Moss Lou Kates +Hiroaki Kawai Sebastien Keim Robert Kern Randall Kern @@ -545,6 +546,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 54a3b093f80..bb4c134eac8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -473,6 +473,8 @@ Core and Builtins Library ------- +- Issue #2245: aifc now skips chunk types it doesn't recognize, per spec. + - Issue #5874: distutils.tests.test_config_cmd is not locale-sensitive anymore.