blob: ceaf2a3325b9eda76c2b772d48764a76fefc1028 [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),
Serhiy Storchaka1e953402015-05-30 00:53:26 +0300304 4: packs[4](0, 0x0da740da, 0x37777776, -0x262fc962,
305 0x56740da6, -0x4a62fc96, -0x1298bf26),
306 }
Serhiy Storchakacfb70282015-05-31 12:05:40 +0300307 for w in 1, 2, 4:
Serhiy Storchaka1e953402015-05-30 00:53:26 +0300308 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 3, 1)[0],
309 expected[w])
310 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 30, 10)[0],
311 expected[w])
312
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000313 def test_reverse(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200314 for w in 1, 2, 4:
315 self.assertEqual(audioop.reverse(b'', w), b'')
316 self.assertEqual(audioop.reverse(packs[w](0, 1, 2), w),
317 packs[w](2, 1, 0))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000318
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000319 def test_tomono(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200320 for w in 1, 2, 4:
321 data1 = datas[w]
322 data2 = bytearray(2 * len(data1))
323 for k in range(w):
324 data2[k::2*w] = data1[k::w]
325 self.assertEqual(audioop.tomono(str(data2), w, 1, 0), data1)
326 self.assertEqual(audioop.tomono(str(data2), w, 0, 1), b'\0' * len(data1))
327 for k in range(w):
328 data2[k+w::2*w] = data1[k::w]
329 self.assertEqual(audioop.tomono(str(data2), w, 0.5, 0.5), data1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000330
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000331 def test_tostereo(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200332 for w in 1, 2, 4:
333 data1 = datas[w]
334 data2 = bytearray(2 * len(data1))
335 for k in range(w):
336 data2[k::2*w] = data1[k::w]
337 self.assertEqual(audioop.tostereo(data1, w, 1, 0), data2)
338 self.assertEqual(audioop.tostereo(data1, w, 0, 0), b'\0' * len(data2))
339 for k in range(w):
340 data2[k+w::2*w] = data1[k::w]
341 self.assertEqual(audioop.tostereo(data1, w, 1, 1), data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000342
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000343 def test_findfactor(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200344 self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0)
345 self.assertEqual(audioop.findfactor(b'\0' * len(datas[2]), datas[2]),
346 0.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000347
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000348 def test_findfit(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200349 self.assertEqual(audioop.findfit(datas[2], datas[2]), (0, 1.0))
350 self.assertEqual(audioop.findfit(datas[2], packs[2](1, 2, 0)),
351 (1, 8038.8))
352 self.assertEqual(audioop.findfit(datas[2][:-2] * 5 + datas[2], datas[2]),
353 (30, 1.0))
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000354
355 def test_findmax(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200356 self.assertEqual(audioop.findmax(datas[2], 1), 5)
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000357
358 def test_getsample(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200359 for w in 1, 2, 4:
360 data = packs[w](0, 1, -1, maxvalues[w], minvalues[w])
361 self.assertEqual(audioop.getsample(data, w, 0), 0)
362 self.assertEqual(audioop.getsample(data, w, 1), 1)
363 self.assertEqual(audioop.getsample(data, w, 2), -1)
364 self.assertEqual(audioop.getsample(data, w, 3), maxvalues[w])
365 self.assertEqual(audioop.getsample(data, w, 4), minvalues[w])
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000366
Neal Norwitzbe3ff9c2008-07-20 20:39:36 +0000367 def test_negativelen(self):
Facundo Batista1a664412008-07-07 17:02:59 +0000368 # from issue 3306, previously it segfaulted
369 self.assertRaises(audioop.error,
370 audioop.findmax, ''.join( chr(x) for x in xrange(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000371
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000372 def test_issue7673(self):
373 state = None
374 for data, size in INVALID_DATA:
375 size2 = size
376 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
377 self.assertRaises(audioop.error, audioop.max, data, size)
378 self.assertRaises(audioop.error, audioop.minmax, data, size)
379 self.assertRaises(audioop.error, audioop.avg, data, size)
380 self.assertRaises(audioop.error, audioop.rms, data, size)
381 self.assertRaises(audioop.error, audioop.avgpp, data, size)
382 self.assertRaises(audioop.error, audioop.maxpp, data, size)
383 self.assertRaises(audioop.error, audioop.cross, data, size)
384 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
385 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
386 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
387 self.assertRaises(audioop.error, audioop.add, data, data, size)
388 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
389 self.assertRaises(audioop.error, audioop.reverse, data, size)
390 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
391 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
392 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000393 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000394 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100395
396 def test_wrongsize(self):
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200397 data = b'abcdefgh'
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100398 state = None
Serhiy Storchaka62e709c2013-02-09 11:10:30 +0200399 for size in (-1, 0, 3, 5, 1024):
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100400 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
401 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000402 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
403
Brett Cannon7dbd9182008-03-03 04:19:29 +0000404def test_main():
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000405 run_unittest(TestAudioop)
Brett Cannon7dbd9182008-03-03 04:19:29 +0000406
407if __name__ == '__main__':
408 test_main()