blob: 5f1deb5776148855aaa9fdc5f78353c9ebcc72c7 [file] [log] [blame]
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00001import audioop
Serhiy Storchaka62e709c2013-02-09 11:10:30 +02002import sys
Benjamin Peterson7416a4c2008-06-28 23:06:05 +00003import unittest
Serhiy Storchaka62e709c2013-02-09 11:10:30 +02004import struct
Benjamin Peterson7416a4c2008-06-28 23:06:05 +00005from test.test_support import run_unittest
6
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00007
Serhiy Storchaka62e709c2013-02-09 11:10:30 +02008formats = {
9 1: 'b',
10 2: 'h',
11 4: 'i',
12}
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000013
Serhiy Storchaka62e709c2013-02-09 11:10:30 +020014def pack(width, data):
15 return struct.pack('=%d%s' % (len(data), formats[width]), *data)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000016
Serhiy Storchaka62e709c2013-02-09 11:10:30 +020017packs = {
18 1: lambda *data: pack(1, data),
19 2: lambda *data: pack(2, data),
20 4: lambda *data: pack(4, data),
21}
22maxvalues = {w: (1 << (8 * w - 1)) - 1 for w in (1, 2, 4)}
23minvalues = {w: -1 << (8 * w - 1) for w in (1, 2, 4)}
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000024
Serhiy Storchaka62e709c2013-02-09 11:10:30 +020025datas = {
26 1: b'\x00\x12\x45\xbb\x7f\x80\xff',
27 2: packs[2](0, 0x1234, 0x4567, -0x4567, 0x7fff, -0x8000, -1),
28 4: packs[4](0, 0x12345678, 0x456789ab, -0x456789ab,
29 0x7fffffff, -0x80000000, -1),
30}
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000031
Victor Stinner15e5b1b2010-07-03 13:36:19 +000032INVALID_DATA = [
Antoine Pitrou88c51e82012-01-28 22:01:59 +010033 (b'abc', 0),
34 (b'abc', 2),
35 (b'abc', 4),
Victor Stinner15e5b1b2010-07-03 13:36:19 +000036]
37
Guido van Rossum4fdb7441996-12-20 03:13:06 +000038
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000039class TestAudioop(unittest.TestCase):
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000040
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000041 def test_max(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +020042 for w in 1, 2, 4:
43 self.assertEqual(audioop.max(b'', w), 0)
44 p = packs[w]
45 self.assertEqual(audioop.max(p(5), w), 5)
46 self.assertEqual(audioop.max(p(5, -8, -1), w), 8)
47 self.assertEqual(audioop.max(p(maxvalues[w]), w), maxvalues[w])
48 self.assertEqual(audioop.max(p(minvalues[w]), w), -minvalues[w])
49 self.assertEqual(audioop.max(datas[w], w), -minvalues[w])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000050
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000051 def test_minmax(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +020052 for w in 1, 2, 4:
53 self.assertEqual(audioop.minmax(b'', w),
54 (0x7fffffff, -0x80000000))
55 p = packs[w]
56 self.assertEqual(audioop.minmax(p(5), w), (5, 5))
57 self.assertEqual(audioop.minmax(p(5, -8, -1), w), (-8, 5))
58 self.assertEqual(audioop.minmax(p(maxvalues[w]), w),
59 (maxvalues[w], maxvalues[w]))
60 self.assertEqual(audioop.minmax(p(minvalues[w]), w),
61 (minvalues[w], minvalues[w]))
62 self.assertEqual(audioop.minmax(datas[w], w),
63 (minvalues[w], maxvalues[w]))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000064
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000065 def test_maxpp(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +020066 for w in 1, 2, 4:
67 self.assertEqual(audioop.maxpp(b'', w), 0)
68 self.assertEqual(audioop.maxpp(packs[w](*range(100)), w), 0)
69 self.assertEqual(audioop.maxpp(packs[w](9, 10, 5, 5, 0, 1), w), 10)
70 self.assertEqual(audioop.maxpp(datas[w], w),
71 maxvalues[w] - minvalues[w])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000072
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000073 def test_avg(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +020074 for w in 1, 2, 4:
75 self.assertEqual(audioop.avg(b'', w), 0)
76 p = packs[w]
77 self.assertEqual(audioop.avg(p(5), w), 5)
78 self .assertEqual(audioop.avg(p(5, 8), w), 6)
79 self.assertEqual(audioop.avg(p(5, -8), w), -2)
80 self.assertEqual(audioop.avg(p(maxvalues[w], maxvalues[w]), w),
81 maxvalues[w])
82 self.assertEqual(audioop.avg(p(minvalues[w], minvalues[w]), w),
83 minvalues[w])
84 self.assertEqual(audioop.avg(packs[4](0x50000000, 0x70000000), 4),
85 0x60000000)
86 self.assertEqual(audioop.avg(packs[4](-0x50000000, -0x70000000), 4),
87 -0x60000000)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000088
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000089 def test_avgpp(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +020090 for w in 1, 2, 4:
91 self.assertEqual(audioop.avgpp(b'', w), 0)
92 self.assertEqual(audioop.avgpp(packs[w](*range(100)), w), 0)
93 self.assertEqual(audioop.avgpp(packs[w](9, 10, 5, 5, 0, 1), w), 10)
94 self.assertEqual(audioop.avgpp(datas[1], 1), 196)
95 self.assertEqual(audioop.avgpp(datas[2], 2), 50534)
96 self.assertEqual(audioop.avgpp(datas[4], 4), 3311897002)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000097
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000098 def test_rms(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +020099 for w in 1, 2, 4:
100 self.assertEqual(audioop.rms(b'', w), 0)
101 p = packs[w]
102 self.assertEqual(audioop.rms(p(*range(100)), w), 57)
103 self.assertAlmostEqual(audioop.rms(p(maxvalues[w]) * 5, w),
104 maxvalues[w], delta=1)
105 self.assertAlmostEqual(audioop.rms(p(minvalues[w]) * 5, w),
106 -minvalues[w], delta=1)
107 self.assertEqual(audioop.rms(datas[1], 1), 77)
108 self.assertEqual(audioop.rms(datas[2], 2), 20001)
109 self.assertEqual(audioop.rms(datas[4], 4), 1310854152)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000110
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000111 def test_cross(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200112 for w in 1, 2, 4:
113 self.assertEqual(audioop.cross(b'', w), -1)
114 p = packs[w]
115 self.assertEqual(audioop.cross(p(0, 1, 2), w), 0)
116 self.assertEqual(audioop.cross(p(1, 2, -3, -4), w), 1)
117 self.assertEqual(audioop.cross(p(-1, -2, 3, 4), w), 1)
118 self.assertEqual(audioop.cross(p(0, minvalues[w]), w), 1)
119 self.assertEqual(audioop.cross(p(minvalues[w], maxvalues[w]), w), 1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000120
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000121 def test_add(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200122 for w in 1, 2, 4:
123 self.assertEqual(audioop.add(b'', b'', w), b'')
124 self.assertEqual(audioop.add(datas[w], b'\0' * len(datas[w]), w),
125 datas[w])
126 self.assertEqual(audioop.add(datas[1], datas[1], 1),
127 b'\x00\x24\x7f\x80\x7f\x80\xfe')
128 self.assertEqual(audioop.add(datas[2], datas[2], 2),
129 packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2))
130 self.assertEqual(audioop.add(datas[4], datas[4], 4),
131 packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000,
132 0x7fffffff, -0x80000000, -2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000133
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000134 def test_bias(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200135 for w in 1, 2, 4:
136 for bias in 0, 1, -1, 127, -128, 0x7fffffff, -0x80000000:
137 self.assertEqual(audioop.bias(b'', w, bias), b'')
138 self.assertEqual(audioop.bias(datas[1], 1, 1),
139 b'\x01\x13\x46\xbc\x80\x81\x00')
140 self.assertEqual(audioop.bias(datas[1], 1, -1),
141 b'\xff\x11\x44\xba\x7e\x7f\xfe')
142 self.assertEqual(audioop.bias(datas[1], 1, 0x7fffffff),
143 b'\xff\x11\x44\xba\x7e\x7f\xfe')
144 self.assertEqual(audioop.bias(datas[1], 1, -0x80000000),
145 datas[1])
146 self.assertEqual(audioop.bias(datas[2], 2, 1),
147 packs[2](1, 0x1235, 0x4568, -0x4566, -0x8000, -0x7fff, 0))
148 self.assertEqual(audioop.bias(datas[2], 2, -1),
149 packs[2](-1, 0x1233, 0x4566, -0x4568, 0x7ffe, 0x7fff, -2))
150 self.assertEqual(audioop.bias(datas[2], 2, 0x7fffffff),
151 packs[2](-1, 0x1233, 0x4566, -0x4568, 0x7ffe, 0x7fff, -2))
152 self.assertEqual(audioop.bias(datas[2], 2, -0x80000000),
153 datas[2])
154 self.assertEqual(audioop.bias(datas[4], 4, 1),
155 packs[4](1, 0x12345679, 0x456789ac, -0x456789aa,
156 -0x80000000, -0x7fffffff, 0))
157 self.assertEqual(audioop.bias(datas[4], 4, -1),
158 packs[4](-1, 0x12345677, 0x456789aa, -0x456789ac,
159 0x7ffffffe, 0x7fffffff, -2))
160 self.assertEqual(audioop.bias(datas[4], 4, 0x7fffffff),
161 packs[4](0x7fffffff, -0x6dcba989, -0x3a987656, 0x3a987654,
162 -2, -1, 0x7ffffffe))
163 self.assertEqual(audioop.bias(datas[4], 4, -0x80000000),
164 packs[4](-0x80000000, -0x6dcba988, -0x3a987655, 0x3a987655,
165 -1, 0, 0x7fffffff))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000166
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000167 def test_lin2lin(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200168 for w in 1, 2, 4:
169 self.assertEqual(audioop.lin2lin(datas[w], w, w), datas[w])
170
171 self.assertEqual(audioop.lin2lin(datas[1], 1, 2),
172 packs[2](0, 0x1200, 0x4500, -0x4500, 0x7f00, -0x8000, -0x100))
173 self.assertEqual(audioop.lin2lin(datas[1], 1, 4),
174 packs[4](0, 0x12000000, 0x45000000, -0x45000000,
175 0x7f000000, -0x80000000, -0x1000000))
176 self.assertEqual(audioop.lin2lin(datas[2], 2, 1),
177 b'\x00\x12\x45\xba\x7f\x80\xff')
178 self.assertEqual(audioop.lin2lin(datas[2], 2, 4),
179 packs[4](0, 0x12340000, 0x45670000, -0x45670000,
180 0x7fff0000, -0x80000000, -0x10000))
181 self.assertEqual(audioop.lin2lin(datas[4], 4, 1),
182 b'\x00\x12\x45\xba\x7f\x80\xff')
183 self.assertEqual(audioop.lin2lin(datas[4], 4, 2),
184 packs[2](0, 0x1234, 0x4567, -0x4568, 0x7fff, -0x8000, -1))
Anthony Baxterfa869072006-03-20 05:21:58 +0000185
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000186 def test_adpcm2lin(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200187 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 1, None),
188 (b'\x00\x00\x00\xff\x00\xff', (-179, 40)))
189 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 2, None),
190 (packs[2](0, 0xb, 0x29, -0x16, 0x72, -0xb3), (-179, 40)))
191 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 4, None),
192 (packs[4](0, 0xb0000, 0x290000, -0x160000, 0x720000,
193 -0xb30000), (-179, 40)))
194
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000195 # Very cursory test
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200196 for w in 1, 2, 4:
197 self.assertEqual(audioop.adpcm2lin(b'\0' * 5, w, None),
198 (b'\0' * w * 10, (0, 0)))
Anthony Baxterfa869072006-03-20 05:21:58 +0000199
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000200 def test_lin2adpcm(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200201 self.assertEqual(audioop.lin2adpcm(datas[1], 1, None),
202 (b'\x07\x7f\x7f', (-221, 39)))
203 self.assertEqual(audioop.lin2adpcm(datas[2], 2, None),
204 (b'\x07\x7f\x7f', (31, 39)))
205 self.assertEqual(audioop.lin2adpcm(datas[4], 4, None),
206 (b'\x07\x7f\x7f', (31, 39)))
207
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000208 # Very cursory test
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200209 for w in 1, 2, 4:
210 self.assertEqual(audioop.lin2adpcm(b'\0' * w * 10, w, None),
211 (b'\0' * 5, (0, 0)))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000212
Serhiy Storchaka84af51d2015-06-28 17:51:40 +0300213 def test_invalid_adpcm_state(self):
214 # state must be a tuple or None, not an integer
215 self.assertRaises(TypeError, audioop.adpcm2lin, b'\0', 1, 555)
216 self.assertRaises(TypeError, audioop.lin2adpcm, b'\0', 1, 555)
217 # Issues #24456, #24457: index out of range
218 self.assertRaises(ValueError, audioop.adpcm2lin, b'\0', 1, (0, -1))
219 self.assertRaises(ValueError, audioop.adpcm2lin, b'\0', 1, (0, 89))
220 self.assertRaises(ValueError, audioop.lin2adpcm, b'\0', 1, (0, -1))
221 self.assertRaises(ValueError, audioop.lin2adpcm, b'\0', 1, (0, 89))
222 # value out of range
223 self.assertRaises(ValueError, audioop.adpcm2lin, b'\0', 1, (-0x8001, 0))
224 self.assertRaises(ValueError, audioop.adpcm2lin, b'\0', 1, (0x8000, 0))
225 self.assertRaises(ValueError, audioop.lin2adpcm, b'\0', 1, (-0x8001, 0))
226 self.assertRaises(ValueError, audioop.lin2adpcm, b'\0', 1, (0x8000, 0))
227
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000228 def test_lin2alaw(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200229 self.assertEqual(audioop.lin2alaw(datas[1], 1),
230 b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
231 self.assertEqual(audioop.lin2alaw(datas[2], 2),
232 b'\xd5\x87\xa4\x24\xaa\x2a\x55')
233 self.assertEqual(audioop.lin2alaw(datas[4], 4),
234 b'\xd5\x87\xa4\x24\xaa\x2a\x55')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000235
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000236 def test_alaw2lin(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200237 encoded = b'\x00\x03\x24\x2a\x51\x54\x55\x58\x6b\x71\x7f'\
238 b'\x80\x83\xa4\xaa\xd1\xd4\xd5\xd8\xeb\xf1\xff'
239 src = [-688, -720, -2240, -4032, -9, -3, -1, -27, -244, -82, -106,
240 688, 720, 2240, 4032, 9, 3, 1, 27, 244, 82, 106]
241 for w in 1, 2, 4:
242 self.assertEqual(audioop.alaw2lin(encoded, w),
243 packs[w](*(x << (w * 8) >> 13 for x in src)))
244
245 encoded = ''.join(chr(x) for x in xrange(256))
246 for w in 2, 4:
247 decoded = audioop.alaw2lin(encoded, w)
248 self.assertEqual(audioop.lin2alaw(decoded, w), encoded)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000249
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000250 def test_lin2ulaw(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200251 self.assertEqual(audioop.lin2ulaw(datas[1], 1),
252 b'\xff\xad\x8e\x0e\x80\x00\x67')
253 self.assertEqual(audioop.lin2ulaw(datas[2], 2),
254 b'\xff\xad\x8e\x0e\x80\x00\x7e')
255 self.assertEqual(audioop.lin2ulaw(datas[4], 4),
256 b'\xff\xad\x8e\x0e\x80\x00\x7e')
Guido van Rossumc8504e21997-02-14 15:58:00 +0000257
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000258 def test_ulaw2lin(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200259 encoded = b'\x00\x0e\x28\x3f\x57\x6a\x76\x7c\x7e\x7f'\
260 b'\x80\x8e\xa8\xbf\xd7\xea\xf6\xfc\xfe\xff'
261 src = [-8031, -4447, -1471, -495, -163, -53, -18, -6, -2, 0,
262 8031, 4447, 1471, 495, 163, 53, 18, 6, 2, 0]
263 for w in 1, 2, 4:
264 self.assertEqual(audioop.ulaw2lin(encoded, w),
265 packs[w](*(x << (w * 8) >> 14 for x in src)))
266
267 # Current u-law implementation has two codes fo 0: 0x7f and 0xff.
268 encoded = ''.join(chr(x) for x in range(127) + range(128, 256))
269 for w in 2, 4:
270 decoded = audioop.ulaw2lin(encoded, w)
271 self.assertEqual(audioop.lin2ulaw(decoded, w), encoded)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000272
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000273 def test_mul(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200274 for w in 1, 2, 4:
275 self.assertEqual(audioop.mul(b'', w, 2), b'')
276 self.assertEqual(audioop.mul(datas[w], w, 0),
277 b'\0' * len(datas[w]))
278 self.assertEqual(audioop.mul(datas[w], w, 1),
279 datas[w])
280 self.assertEqual(audioop.mul(datas[1], 1, 2),
281 b'\x00\x24\x7f\x80\x7f\x80\xfe')
282 self.assertEqual(audioop.mul(datas[2], 2, 2),
283 packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2))
284 self.assertEqual(audioop.mul(datas[4], 4, 2),
285 packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000,
286 0x7fffffff, -0x80000000, -2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000287
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000288 def test_ratecv(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200289 for w in 1, 2, 4:
290 self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 8000, None),
291 (b'', (-1, ((0, 0),))))
292 self.assertEqual(audioop.ratecv(b'', w, 5, 8000, 8000, None),
293 (b'', (-1, ((0, 0),) * 5)))
294 self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 16000, None),
295 (b'', (-2, ((0, 0),))))
296 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None)[0],
297 datas[w])
Serhiy Storchaka1e953402015-05-30 00:53:26 +0300298 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 1, 0)[0],
299 datas[w])
300
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000301 state = None
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200302 d1, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
303 d2, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
304 self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002')
305
306 for w in 1, 2, 4:
307 d0, state0 = audioop.ratecv(datas[w], w, 1, 8000, 16000, None)
308 d, state = b'', None
309 for i in range(0, len(datas[w]), w):
310 d1, state = audioop.ratecv(datas[w][i:i + w], w, 1,
311 8000, 16000, state)
312 d += d1
313 self.assertEqual(d, d0)
314 self.assertEqual(state, state0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000315
Serhiy Storchaka1e953402015-05-30 00:53:26 +0300316 expected = {
317 1: packs[1](0, 0x0d, 0x37, -0x26, 0x55, -0x4b, -0x14),
318 2: packs[2](0, 0x0da7, 0x3777, -0x2630, 0x5673, -0x4a64, -0x129a),
Serhiy Storchaka1e953402015-05-30 00:53:26 +0300319 4: packs[4](0, 0x0da740da, 0x37777776, -0x262fc962,
320 0x56740da6, -0x4a62fc96, -0x1298bf26),
321 }
Serhiy Storchakacfb70282015-05-31 12:05:40 +0300322 for w in 1, 2, 4:
Serhiy Storchaka1e953402015-05-30 00:53:26 +0300323 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 3, 1)[0],
324 expected[w])
325 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 30, 10)[0],
326 expected[w])
327
Oren Milmanbc80fd12017-08-26 21:56:31 +0300328 self.assertRaises(TypeError, audioop.ratecv, b'', 1, 1, 8000, 8000, 42)
329 self.assertRaises(TypeError, audioop.ratecv,
330 b'', 1, 1, 8000, 8000, (1, (42,)))
331
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000332 def test_reverse(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200333 for w in 1, 2, 4:
334 self.assertEqual(audioop.reverse(b'', w), b'')
335 self.assertEqual(audioop.reverse(packs[w](0, 1, 2), w),
336 packs[w](2, 1, 0))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000337
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000338 def test_tomono(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200339 for w in 1, 2, 4:
340 data1 = datas[w]
341 data2 = bytearray(2 * len(data1))
342 for k in range(w):
343 data2[k::2*w] = data1[k::w]
344 self.assertEqual(audioop.tomono(str(data2), w, 1, 0), data1)
345 self.assertEqual(audioop.tomono(str(data2), w, 0, 1), b'\0' * len(data1))
346 for k in range(w):
347 data2[k+w::2*w] = data1[k::w]
348 self.assertEqual(audioop.tomono(str(data2), w, 0.5, 0.5), data1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000349
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000350 def test_tostereo(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200351 for w in 1, 2, 4:
352 data1 = datas[w]
353 data2 = bytearray(2 * len(data1))
354 for k in range(w):
355 data2[k::2*w] = data1[k::w]
356 self.assertEqual(audioop.tostereo(data1, w, 1, 0), data2)
357 self.assertEqual(audioop.tostereo(data1, w, 0, 0), b'\0' * len(data2))
358 for k in range(w):
359 data2[k+w::2*w] = data1[k::w]
360 self.assertEqual(audioop.tostereo(data1, w, 1, 1), data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000361
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000362 def test_findfactor(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200363 self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0)
364 self.assertEqual(audioop.findfactor(b'\0' * len(datas[2]), datas[2]),
365 0.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000366
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000367 def test_findfit(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200368 self.assertEqual(audioop.findfit(datas[2], datas[2]), (0, 1.0))
369 self.assertEqual(audioop.findfit(datas[2], packs[2](1, 2, 0)),
370 (1, 8038.8))
371 self.assertEqual(audioop.findfit(datas[2][:-2] * 5 + datas[2], datas[2]),
372 (30, 1.0))
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000373
374 def test_findmax(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200375 self.assertEqual(audioop.findmax(datas[2], 1), 5)
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000376
377 def test_getsample(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200378 for w in 1, 2, 4:
379 data = packs[w](0, 1, -1, maxvalues[w], minvalues[w])
380 self.assertEqual(audioop.getsample(data, w, 0), 0)
381 self.assertEqual(audioop.getsample(data, w, 1), 1)
382 self.assertEqual(audioop.getsample(data, w, 2), -1)
383 self.assertEqual(audioop.getsample(data, w, 3), maxvalues[w])
384 self.assertEqual(audioop.getsample(data, w, 4), minvalues[w])
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000385
Neal Norwitzbe3ff9c2008-07-20 20:39:36 +0000386 def test_negativelen(self):
Facundo Batista1a664412008-07-07 17:02:59 +0000387 # from issue 3306, previously it segfaulted
388 self.assertRaises(audioop.error,
389 audioop.findmax, ''.join( chr(x) for x in xrange(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000390
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000391 def test_issue7673(self):
392 state = None
393 for data, size in INVALID_DATA:
394 size2 = size
395 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
396 self.assertRaises(audioop.error, audioop.max, data, size)
397 self.assertRaises(audioop.error, audioop.minmax, data, size)
398 self.assertRaises(audioop.error, audioop.avg, data, size)
399 self.assertRaises(audioop.error, audioop.rms, data, size)
400 self.assertRaises(audioop.error, audioop.avgpp, data, size)
401 self.assertRaises(audioop.error, audioop.maxpp, data, size)
402 self.assertRaises(audioop.error, audioop.cross, data, size)
403 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
404 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
405 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
406 self.assertRaises(audioop.error, audioop.add, data, data, size)
407 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
408 self.assertRaises(audioop.error, audioop.reverse, data, size)
409 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
410 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
411 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000412 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000413 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100414
415 def test_wrongsize(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200416 data = b'abcdefgh'
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100417 state = None
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200418 for size in (-1, 0, 3, 5, 1024):
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100419 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
420 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000421 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
422
Brett Cannon7dbd9182008-03-03 04:19:29 +0000423def test_main():
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000424 run_unittest(TestAudioop)
Brett Cannon7dbd9182008-03-03 04:19:29 +0000425
426if __name__ == '__main__':
427 test_main()