Skip to content

Commit 64a38c0

Browse files
committed
Issue #1512791: In setframerate method of Wave_write, round non-integral
inputs to the nearest integer. Thanks Neil Tallim for the patch.
1 parent a620748 commit 64a38c0

5 files changed

Lines changed: 21 additions & 3 deletions

File tree

Doc/library/wave.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,10 @@ Wave_write objects, as returned by :func:`.open`, have the following methods:
157157

158158
Set the frame rate to *n*.
159159

160+
.. versionchanged:: 3.2
161+
A non-integral input to this method is rounded to the nearest
162+
integer.
163+
160164

161165
.. method:: Wave_write.setnframes(n)
162166

Lib/test/test_wave.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@ def tearDown(self):
2222
except OSError:
2323
pass
2424

25-
def test_it(self):
25+
def test_it(self, test_rounding=False):
2626
self.f = wave.open(TESTFN, 'wb')
2727
self.f.setnchannels(nchannels)
2828
self.f.setsampwidth(sampwidth)
29-
self.f.setframerate(framerate)
29+
if test_rounding:
30+
self.f.setframerate(framerate - 0.1)
31+
else:
32+
self.f.setframerate(framerate)
3033
self.f.setnframes(nframes)
3134
output = b'\0' * nframes * nchannels * sampwidth
3235
self.f.writeframes(output)
@@ -39,6 +42,13 @@ def test_it(self):
3942
self.assertEqual(nframes, self.f.getnframes())
4043
self.assertEqual(self.f.readframes(nframes), output)
4144

45+
def test_fractional_framerate(self):
46+
"""
47+
Addresses [ 1512791 ] module wave does no rounding
48+
Floating point framerates should be rounded, rather than truncated.
49+
"""
50+
self.test_it(test_rounding=True)
51+
4252
def test_issue7681(self):
4353
self.f = wave.open(TESTFN, 'wb')
4454
self.f.setnchannels(nchannels)

Lib/wave.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ def setframerate(self, framerate):
355355
raise Error('cannot change parameters after starting to write')
356356
if framerate <= 0:
357357
raise Error('bad frame rate')
358-
self._framerate = framerate
358+
self._framerate = int(round(framerate))
359359

360360
def getframerate(self):
361361
if not self._framerate:

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -792,6 +792,7 @@ Paul Swartz
792792
Thenault Sylvain
793793
Péter Szabó
794794
Arfrever Frehtes Taifersar Arahesis
795+
Neil Tallim
795796
Geoff Talvola
796797
Musashi Tamura
797798
William Tanksley

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ Extensions
132132
Library
133133
-------
134134

135+
- Issue #1512791: In setframerate() in the wave module, non-integral
136+
frame rates are rounded to the nearest integer.
137+
135138
- Issue #8797: urllib2 does a retry for Basic Authentication failure instead of
136139
falling into recursion.
137140

0 commit comments

Comments
 (0)