Kaydet (Commit) 70efbefc authored tarafından Sandro Tosi's avatar Sandro Tosi

Issue #13594: various fixes to aifc module; patch by Oleg Plakhotnyuk

üst bdd53547
...@@ -539,8 +539,7 @@ class Aifc_write: ...@@ -539,8 +539,7 @@ class Aifc_write:
self._aifc = 1 # AIFF-C is default self._aifc = 1 # AIFF-C is default
def __del__(self): def __del__(self):
if self._file: self.close()
self.close()
# #
# User visible methods. # User visible methods.
...@@ -643,8 +642,8 @@ class Aifc_write: ...@@ -643,8 +642,8 @@ class Aifc_write:
raise Error('marker ID must be > 0') raise Error('marker ID must be > 0')
if pos < 0: if pos < 0:
raise Error('marker position must be >= 0') raise Error('marker position must be >= 0')
if not isinstance(name, str): if not isinstance(name, bytes):
raise Error('marker name must be a string') raise Error('marker name must be bytes')
for i in range(len(self._markers)): for i in range(len(self._markers)):
if id == self._markers[i][0]: if id == self._markers[i][0]:
self._markers[i] = id, pos, name self._markers[i] = id, pos, name
...@@ -681,19 +680,21 @@ class Aifc_write: ...@@ -681,19 +680,21 @@ class Aifc_write:
self._patchheader() self._patchheader()
def close(self): def close(self):
self._ensure_header_written(0) if self._file:
if self._datawritten & 1: self._ensure_header_written(0)
# quick pad to even size if self._datawritten & 1:
self._file.write(b'\x00') # quick pad to even size
self._datawritten = self._datawritten + 1 self._file.write(b'\x00')
self._writemarkers() self._datawritten = self._datawritten + 1
if self._nframeswritten != self._nframes or \ self._writemarkers()
self._datalength != self._datawritten or \ if self._nframeswritten != self._nframes or \
self._marklength: self._datalength != self._datawritten or \
self._patchheader() self._marklength:
# Prevent ref cycles self._patchheader()
self._convert = None # Prevent ref cycles
self._file.close() self._convert = None
self._file.close()
self._file = None
# #
# Internal methods. # Internal methods.
......
...@@ -120,6 +120,29 @@ class AIFCTest(unittest.TestCase): ...@@ -120,6 +120,29 @@ class AIFCTest(unittest.TestCase):
self.assertEqual(fout.getsampwidth(), 2) self.assertEqual(fout.getsampwidth(), 2)
fout.initfp(None) fout.initfp(None)
def test_write_markers_values(self):
fout = self.fout = aifc.open(io.BytesIO(), 'wb')
self.assertEqual(fout.getmarkers(), None)
fout.setmark(1, 0, b'foo1')
fout.setmark(1, 1, b'foo2')
self.assertEqual(fout.getmark(1), (1, 1, b'foo2'))
self.assertEqual(fout.getmarkers(), [(1, 1, b'foo2')])
fout.initfp(None)
def test_read_markers(self):
fout = self.fout = aifc.open(TESTFN, 'wb')
fout.aiff()
fout.setparams((1, 1, 1, 1, b'NONE', b''))
fout.setmark(1, 0, b'odd')
fout.setmark(2, 0, b'even')
fout.writeframes(b'\x00')
fout.close()
f = self.f = aifc.open(TESTFN, 'rb')
self.assertEqual(f.getmarkers(), [(1, 0, b'odd'), (2, 0, b'even')])
self.assertEqual(f.getmark(1), (1, 0, b'odd'))
self.assertEqual(f.getmark(2), (2, 0, b'even'))
self.assertRaises(aifc.Error, f.getmark, 3)
def test_main(): def test_main():
run_unittest(AIFCTest) run_unittest(AIFCTest)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment