Issue #1512791: In setframerate method of Wave_write, round non-integral

inputs to the nearest integer.  Thanks Neil Tallim for the patch.
This commit is contained in:
Mark Dickinson 2010-08-28 17:22:16 +00:00
parent a62074883b
commit 64a38c0eb5
5 changed files with 21 additions and 3 deletions

View file

@ -157,6 +157,10 @@ Wave_write objects, as returned by :func:`.open`, have the following methods:
Set the frame rate to *n*. Set the frame rate to *n*.
.. versionchanged:: 3.2
A non-integral input to this method is rounded to the nearest
integer.
.. method:: Wave_write.setnframes(n) .. method:: Wave_write.setnframes(n)

View file

@ -22,10 +22,13 @@ class TestWave(unittest.TestCase):
except OSError: except OSError:
pass pass
def test_it(self): def test_it(self, test_rounding=False):
self.f = wave.open(TESTFN, 'wb') self.f = wave.open(TESTFN, 'wb')
self.f.setnchannels(nchannels) self.f.setnchannels(nchannels)
self.f.setsampwidth(sampwidth) self.f.setsampwidth(sampwidth)
if test_rounding:
self.f.setframerate(framerate - 0.1)
else:
self.f.setframerate(framerate) self.f.setframerate(framerate)
self.f.setnframes(nframes) self.f.setnframes(nframes)
output = b'\0' * nframes * nchannels * sampwidth output = b'\0' * nframes * nchannels * sampwidth
@ -39,6 +42,13 @@ class TestWave(unittest.TestCase):
self.assertEqual(nframes, self.f.getnframes()) self.assertEqual(nframes, self.f.getnframes())
self.assertEqual(self.f.readframes(nframes), output) self.assertEqual(self.f.readframes(nframes), output)
def test_fractional_framerate(self):
"""
Addresses [ 1512791 ] module wave does no rounding
Floating point framerates should be rounded, rather than truncated.
"""
self.test_it(test_rounding=True)
def test_issue7681(self): def test_issue7681(self):
self.f = wave.open(TESTFN, 'wb') self.f = wave.open(TESTFN, 'wb')
self.f.setnchannels(nchannels) self.f.setnchannels(nchannels)

View file

@ -355,7 +355,7 @@ class Wave_write:
raise Error('cannot change parameters after starting to write') raise Error('cannot change parameters after starting to write')
if framerate <= 0: if framerate <= 0:
raise Error('bad frame rate') raise Error('bad frame rate')
self._framerate = framerate self._framerate = int(round(framerate))
def getframerate(self): def getframerate(self):
if not self._framerate: if not self._framerate:

View file

@ -792,6 +792,7 @@ Paul Swartz
Thenault Sylvain Thenault Sylvain
Péter Szabó Péter Szabó
Arfrever Frehtes Taifersar Arahesis Arfrever Frehtes Taifersar Arahesis
Neil Tallim
Geoff Talvola Geoff Talvola
Musashi Tamura Musashi Tamura
William Tanksley William Tanksley

View file

@ -132,6 +132,9 @@ Extensions
Library Library
------- -------
- Issue #1512791: In setframerate() in the wave module, non-integral
frame rates are rounded to the nearest integer.
- Issue #8797: urllib2 does a retry for Basic Authentication failure instead of - Issue #8797: urllib2 does a retry for Basic Authentication failure instead of
falling into recursion. falling into recursion.