From cecc3a0083e86fb81fcd7e5ba9117d5a175425e3 Mon Sep 17 00:00:00 2001 From: "R. David Murray" Date: Wed, 29 Apr 2009 14:54:29 +0000 Subject: [PATCH] Merged revisions 72100-72101 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ........ 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. ........ --- Lib/aifc.py | 7 ----- Lib/test/Sine-1000Hz-300ms.aif | Bin 0 -> 61696 bytes Lib/test/test_aifc.py | 54 +++++++++++++++++++++++++++++++++ Lib/test/test_sundry.py | 1 - Misc/ACKS | 2 ++ Misc/NEWS | 2 ++ 6 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 Lib/test/Sine-1000Hz-300ms.aif create mode 100644 Lib/test/test_aifc.py diff --git a/Lib/aifc.py b/Lib/aifc.py index f663dd67d2e..8e4f864495d 100644 --- a/Lib/aifc.py +++ b/Lib/aifc.py @@ -144,9 +144,6 @@ class Error(Exception): _AIFC_version = 0xA2805140L # Version 1 of AIFF-C -_skiplist = 'COMT', 'INST', 'MIDI', 'AESD', \ - 'APPL', 'NAME', 'AUTH', '(c) ', 'ANNO' - def _read_long(file): try: return struct.unpack('>l', file.read(4))[0] @@ -314,10 +311,6 @@ class Aifc_read: self._version = _read_ulong(chunk) elif chunkname == 'MARK': self._readmark(chunk) - elif chunkname in _skiplist: - pass - else: - raise Error, 'unrecognized chunk type '+chunk.chunkname 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 0000000000000000000000000000000000000000..bf08f5ce859429eeeab213fd29a201b0d851b9c3 GIT binary patch literal 61696 zcmeI&F-t;G6ae5$QxH_-;Ns*IlCzCQp$4VU8$`!`gF`emiG#nv&1lHMO=u9Bnj^xc zA!uj`8XOw)(9%Ds;dAhL-@EtvIOu!tp7YgOXQwHBejOawYKN`U)#tR6)>7K9rtRwH z-PNkSdeu%&&QjXC|7m#_0TB=Z5fA|p5CIVo0TB=Z5fA|p_}>x8vgT1ruj{|ha^q>^ zDc{TYij(4`+$y&!rAn!qtLEx&^|$6_^D>)dv-Y4p=qx&m?x;J8ZM0*59FKm{KgPxQ zm?!3odEahkL#!Vm;0~h2hVSwKRrKNzgT}+KU%-b zKggfRU&+78AIjg#Kg*x1U#P#RAF1D|KdPUqU#q|K1N;C#zz^^P`~W||5AXy006)MF z@B{n+Kfn+01N;C#zz^^P`~W||5AXy006)MF@B{n+Kfn+01N;C#zz^^P`~W||5AXy0 z06)MF@B{n+Kfn+01N;C#zz^^P`~W||5AXy006)MF@B{n+Kfn+01N;C#zz^^P`~W|| z5AXy006)MF@B{n+Kfn+01N;C#zz^^P`~W||5AXy006)MF@B{n+Kfn+01N;C#zz^^P z`~W||5AXy006)MF@B{n+Kfn+01N;C#zz^^P`~W||5AXy006)MF@B{n+Kfn+01N;C# zzz^^P`~W||5AXy006)MF@B{n+Kfn+01N;C#zz^^P`~W||5AXy006)MF@B{n+Kfn+0 z1N;C#zz^^P`~W||5AXy006)MF@B{n+Kfn+01N;C#zz^^P`~W||5AXy006)MF@B{q7 HU;BY?t&pq( literal 0 HcmV?d00001 diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py new file mode 100644 index 00000000000..7e5b2e96be0 --- /dev/null +++ b/Lib/test/test_aifc.py @@ -0,0 +1,54 @@ +from test.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) + self.assertEqual(f.getcomptype(), 'NONE') + self.assertEqual(f.getcompname(), 'not compressed') + self.assertEqual(f.getparams(), (2, 2, 48000, 14400, 'NONE', 'not compressed')) + f.close() + + def test_read(self): + f = aifc.open(self.sndfilepath) + self.assertEqual(f.tell(), 0) + self.assertEqual(f.readframes(2), '\x00\x00\x00\x00\x0b\xd4\x0b\xd4') + f.rewind() + pos0 = f.tell() + self.assertEqual(pos0, 0) + self.assertEqual(f.readframes(2), '\x00\x00\x00\x00\x0b\xd4\x0b\xd4') + pos2 = f.tell() + self.assertEqual(pos2, 2) + self.assertEqual(f.readframes(2), '\x17t\x17t"\xad"\xad') + f.setpos(pos2) + self.assertEqual(f.readframes(2), '\x17t\x17t"\xad"\xad') + f.setpos(pos0) + self.assertEqual(f.readframes(2), '\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 e7499ae4b26..3b91d656c21 100644 --- a/Lib/test/test_sundry.py +++ b/Lib/test/test_sundry.py @@ -10,7 +10,6 @@ class TestUntestedModules(unittest.TestCase): def test_at_least_import_untested_modules(self): with warnings.catch_warnings(): import CGIHTTPServer - import aifc import audiodev import bdb import cgitb diff --git a/Misc/ACKS b/Misc/ACKS index 79b74671245..4f25c56bf1e 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 96fcc3cbff8..132cea8fef4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,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