]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 72104 via svnmerge from
authorR. David Murray <rdmurray@bitdance.com>
Wed, 29 Apr 2009 15:54:48 +0000 (15:54 +0000)
committerR. David Murray <rdmurray@bitdance.com>
Wed, 29 Apr 2009 15:54:48 +0000 (15:54 +0000)
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.
  ........
................

Lib/aifc.py
Lib/test/Sine-1000Hz-300ms.aif [new file with mode: 0644]
Lib/test/test_aifc.py [new file with mode: 0644]
Lib/test/test_sundry.py
Misc/ACKS
Misc/NEWS

index 26b0ff5b7a30b7261581a7607fde18543cefde83..36312b3c2cbe9dcd50c3f0b09c6d1f705b26821d 100644 (file)
@@ -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 (file)
index 0000000..bf08f5c
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 (file)
index 0000000..fd41126
--- /dev/null
@@ -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()
index 49813a32d43b14f33bda38dccc0ea3892a36eef6..b77690fbfd8624042085ae6ca5e2ba0337b2b2d9 100644 (file)
@@ -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
index a5ba8dca1d1193eb56aefc0dded28ffa21f38a63..fa556698e9870c3dcf42ec520f4b6dae2dbdad62 100644 (file)
--- 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
index 537dc0cc31da873c9d0ff665e2907a4969bd867f..d2eaacc5f91405eae0ded5982678ed7fdbbf25d6 100644 (file)
--- 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