blob: 739de238bf11dbd87acc96a82c54623ab6886471 [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
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000213 def test_lin2alaw(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200214 self.assertEqual(audioop.lin2alaw(datas[1], 1),
215 b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
216 self.assertEqual(audioop.lin2alaw(datas[2], 2),
217 b'\xd5\x87\xa4\x24\xaa\x2a\x55')
218 self.assertEqual(audioop.lin2alaw(datas[4], 4),
219 b'\xd5\x87\xa4\x24\xaa\x2a\x55')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000220
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000221 def test_alaw2lin(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200222 encoded = b'\x00\x03\x24\x2a\x51\x54\x55\x58\x6b\x71\x7f'\
223 b'\x80\x83\xa4\xaa\xd1\xd4\xd5\xd8\xeb\xf1\xff'
224 src = [-688, -720, -2240, -4032, -9, -3, -1, -27, -244, -82, -106,
225 688, 720, 2240, 4032, 9, 3, 1, 27, 244, 82, 106]
226 for w in 1, 2, 4:
227 self.assertEqual(audioop.alaw2lin(encoded, w),
228 packs[w](*(x << (w * 8) >> 13 for x in src)))
229
230 encoded = ''.join(chr(x) for x in xrange(256))
231 for w in 2, 4:
232 decoded = audioop.alaw2lin(encoded, w)
233 self.assertEqual(audioop.lin2alaw(decoded, w), encoded)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000234
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000235 def test_lin2ulaw(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200236 self.assertEqual(audioop.lin2ulaw(datas[1], 1),
237 b'\xff\xad\x8e\x0e\x80\x00\x67')
238 self.assertEqual(audioop.lin2ulaw(datas[2], 2),
239 b'\xff\xad\x8e\x0e\x80\x00\x7e')
240 self.assertEqual(audioop.lin2ulaw(datas[4], 4),
241 b'\xff\xad\x8e\x0e\x80\x00\x7e')
Guido van Rossumc8504e21997-02-14 15:58:00 +0000242
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000243 def test_ulaw2lin(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200244 encoded = b'\x00\x0e\x28\x3f\x57\x6a\x76\x7c\x7e\x7f'\
245 b'\x80\x8e\xa8\xbf\xd7\xea\xf6\xfc\xfe\xff'
246 src = [-8031, -4447, -1471, -495, -163, -53, -18, -6, -2, 0,
247 8031, 4447, 1471, 495, 163, 53, 18, 6, 2, 0]
248 for w in 1, 2, 4:
249 self.assertEqual(audioop.ulaw2lin(encoded, w),
250 packs[w](*(x << (w * 8) >> 14 for x in src)))
251
252 # Current u-law implementation has two codes fo 0: 0x7f and 0xff.
253 encoded = ''.join(chr(x) for x in range(127) + range(128, 256))
254 for w in 2, 4:
255 decoded = audioop.ulaw2lin(encoded, w)
256 self.assertEqual(audioop.lin2ulaw(decoded, w), encoded)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000257
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000258 def test_mul(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200259 for w in 1, 2, 4:
260 self.assertEqual(audioop.mul(b'', w, 2), b'')
261 self.assertEqual(audioop.mul(datas[w], w, 0),
262 b'\0' * len(datas[w]))
263 self.assertEqual(audioop.mul(datas[w], w, 1),
264 datas[w])
265 self.assertEqual(audioop.mul(datas[1], 1, 2),
266 b'\x00\x24\x7f\x80\x7f\x80\xfe')
267 self.assertEqual(audioop.mul(datas[2], 2, 2),
268 packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2))
269 self.assertEqual(audioop.mul(datas[4], 4, 2),
270 packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000,
271 0x7fffffff, -0x80000000, -2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000272
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000273 def test_ratecv(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200274 for w in 1, 2, 4:
275 self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 8000, None),
276 (b'', (-1, ((0, 0),))))
277 self.assertEqual(audioop.ratecv(b'', w, 5, 8000, 8000, None),
278 (b'', (-1, ((0, 0),) * 5)))
279 self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 16000, None),
280 (b'', (-2, ((0, 0),))))
281 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None)[0],
282 datas[w])
Serhiy Storchaka1e953402015-05-30 00:53:26 +0300283 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 1, 0)[0],
284 datas[w])
285
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000286 state = None
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200287 d1, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
288 d2, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
289 self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002')
290
291 for w in 1, 2, 4:
292 d0, state0 = audioop.ratecv(datas[w], w, 1, 8000, 16000, None)
293 d, state = b'', None
294 for i in range(0, len(datas[w]), w):
295 d1, state = audioop.ratecv(datas[w][i:i + w], w, 1,
296 8000, 16000, state)
297 d += d1
298 self.assertEqual(d, d0)
299 self.assertEqual(state, state0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000300
Serhiy Storchaka1e953402015-05-30 00:53:26 +0300301 expected = {
302 1: packs[1](0, 0x0d, 0x37, -0x26, 0x55, -0x4b, -0x14),
303 2: packs[2](0, 0x0da7, 0x3777, -0x2630, 0x5673, -0x4a64, -0x129a),
304 3: packs[3](0, 0x0da740, 0x377776, -0x262fca,
305 0x56740c, -0x4a62fd, -0x1298c0),
306 4: packs[4](0, 0x0da740da, 0x37777776, -0x262fc962,
307 0x56740da6, -0x4a62fc96, -0x1298bf26),
308 }
309 for w in 1, 2, 3, 4:
310 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 3, 1)[0],
311 expected[w])
312 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 30, 10)[0],
313 expected[w])
314
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000315 def test_reverse(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200316 for w in 1, 2, 4:
317 self.assertEqual(audioop.reverse(b'', w), b'')
318 self.assertEqual(audioop.reverse(packs[w](0, 1, 2), w),
319 packs[w](2, 1, 0))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000320
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000321 def test_tomono(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200322 for w in 1, 2, 4:
323 data1 = datas[w]
324 data2 = bytearray(2 * len(data1))
325 for k in range(w):
326 data2[k::2*w] = data1[k::w]
327 self.assertEqual(audioop.tomono(str(data2), w, 1, 0), data1)
328 self.assertEqual(audioop.tomono(str(data2), w, 0, 1), b'\0' * len(data1))
329 for k in range(w):
330 data2[k+w::2*w] = data1[k::w]
331 self.assertEqual(audioop.tomono(str(data2), w, 0.5, 0.5), data1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000332
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000333 def test_tostereo(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200334 for w in 1, 2, 4:
335 data1 = datas[w]
336 data2 = bytearray(2 * len(data1))
337 for k in range(w):
338 data2[k::2*w] = data1[k::w]
339 self.assertEqual(audioop.tostereo(data1, w, 1, 0), data2)
340 self.assertEqual(audioop.tostereo(data1, w, 0, 0), b'\0' * len(data2))
341 for k in range(w):
342 data2[k+w::2*w] = data1[k::w]
343 self.assertEqual(audioop.tostereo(data1, w, 1, 1), data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000344
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000345 def test_findfactor(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200346 self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0)
347 self.assertEqual(audioop.findfactor(b'\0' * len(datas[2]), datas[2]),
348 0.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000349
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000350 def test_findfit(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200351 self.assertEqual(audioop.findfit(datas[2], datas[2]), (0, 1.0))
352 self.assertEqual(audioop.findfit(datas[2], packs[2](1, 2, 0)),
353 (1, 8038.8))
354 self.assertEqual(audioop.findfit(datas[2][:-2] * 5 + datas[2], datas[2]),
355 (30, 1.0))
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000356
357 def test_findmax(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200358 self.assertEqual(audioop.findmax(datas[2], 1), 5)
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000359
360 def test_getsample(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200361 for w in 1, 2, 4:
362 data = packs[w](0, 1, -1, maxvalues[w], minvalues[w])
363 self.assertEqual(audioop.getsample(data, w, 0), 0)
364 self.assertEqual(audioop.getsample(data, w, 1), 1)
365 self.assertEqual(audioop.getsample(data, w, 2), -1)
366 self.assertEqual(audioop.getsample(data, w, 3), maxvalues[w])
367 self.assertEqual(audioop.getsample(data, w, 4), minvalues[w])
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000368
Neal Norwitzbe3ff9c2008-07-20 20:39:36 +0000369 def test_negativelen(self):
Facundo Batista1a664412008-07-07 17:02:59 +0000370 # from issue 3306, previously it segfaulted
371 self.assertRaises(audioop.error,
372 audioop.findmax, ''.join( chr(x) for x in xrange(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000373
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000374 def test_issue7673(self):
375 state = None
376 for data, size in INVALID_DATA:
377 size2 = size
378 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
379 self.assertRaises(audioop.error, audioop.max, data, size)
380 self.assertRaises(audioop.error, audioop.minmax, data, size)
381 self.assertRaises(audioop.error, audioop.avg, data, size)
382 self.assertRaises(audioop.error, audioop.rms, data, size)
383 self.assertRaises(audioop.error, audioop.avgpp, data, size)
384 self.assertRaises(audioop.error, audioop.maxpp, data, size)
385 self.assertRaises(audioop.error, audioop.cross, data, size)
386 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
387 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
388 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
389 self.assertRaises(audioop.error, audioop.add, data, data, size)
390 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
391 self.assertRaises(audioop.error, audioop.reverse, data, size)
392 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
393 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
394 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000395 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000396 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100397
398 def test_wrongsize(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200399 data = b'abcdefgh'
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100400 state = None
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200401 for size in (-1, 0, 3, 5, 1024):
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100402 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
403 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000404 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
405
Brett Cannon7dbd9182008-03-03 04:19:29 +0000406def test_main():
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000407 run_unittest(TestAudioop)
Brett Cannon7dbd9182008-03-03 04:19:29 +0000408
409if __name__ == '__main__':
410 test_main()