blob: 879adea2b8eb295a9992d5ed8873688207879453 [file] [log] [blame]
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00001import audioop
Serhiy Storchaka01ad6222013-02-09 11:10:53 +02002import sys
Benjamin Peterson41181742008-07-02 20:22:54 +00003import unittest
Benjamin Peterson41181742008-07-02 20:22:54 +00004
Serhiy Storchaka01ad6222013-02-09 11:10:53 +02005def pack(width, data):
6 return b''.join(v.to_bytes(width, sys.byteorder, signed=True) for v in data)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00007
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +03008def unpack(width, data):
9 return [int.from_bytes(data[i: i + width], sys.byteorder, signed=True)
10 for i in range(0, len(data), width)]
11
12packs = {w: (lambda *data, width=w: pack(width, data)) for w in (1, 2, 3, 4)}
13maxvalues = {w: (1 << (8 * w - 1)) - 1 for w in (1, 2, 3, 4)}
14minvalues = {w: -1 << (8 * w - 1) for w in (1, 2, 3, 4)}
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000015
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020016datas = {
17 1: b'\x00\x12\x45\xbb\x7f\x80\xff',
18 2: packs[2](0, 0x1234, 0x4567, -0x4567, 0x7fff, -0x8000, -1),
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030019 3: packs[3](0, 0x123456, 0x456789, -0x456789, 0x7fffff, -0x800000, -1),
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020020 4: packs[4](0, 0x12345678, 0x456789ab, -0x456789ab,
21 0x7fffffff, -0x80000000, -1),
22}
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000023
Victor Stinnerbc5c54b2010-07-03 13:44:22 +000024INVALID_DATA = [
Antoine Pitrou75ff65e2012-01-28 22:01:59 +010025 (b'abc', 0),
26 (b'abc', 2),
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030027 (b'ab', 3),
Antoine Pitrou75ff65e2012-01-28 22:01:59 +010028 (b'abc', 4),
Victor Stinnerbc5c54b2010-07-03 13:44:22 +000029]
30
Guido van Rossum4fdb7441996-12-20 03:13:06 +000031
Benjamin Peterson41181742008-07-02 20:22:54 +000032class TestAudioop(unittest.TestCase):
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000033
Benjamin Peterson41181742008-07-02 20:22:54 +000034 def test_max(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030035 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020036 self.assertEqual(audioop.max(b'', w), 0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +020037 self.assertEqual(audioop.max(bytearray(), w), 0)
38 self.assertEqual(audioop.max(memoryview(b''), w), 0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020039 p = packs[w]
40 self.assertEqual(audioop.max(p(5), w), 5)
41 self.assertEqual(audioop.max(p(5, -8, -1), w), 8)
42 self.assertEqual(audioop.max(p(maxvalues[w]), w), maxvalues[w])
43 self.assertEqual(audioop.max(p(minvalues[w]), w), -minvalues[w])
44 self.assertEqual(audioop.max(datas[w], w), -minvalues[w])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000045
Benjamin Peterson41181742008-07-02 20:22:54 +000046 def test_minmax(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030047 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020048 self.assertEqual(audioop.minmax(b'', w),
49 (0x7fffffff, -0x80000000))
Serhiy Storchaka711e91b2013-11-10 21:44:36 +020050 self.assertEqual(audioop.minmax(bytearray(), w),
51 (0x7fffffff, -0x80000000))
52 self.assertEqual(audioop.minmax(memoryview(b''), w),
53 (0x7fffffff, -0x80000000))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020054 p = packs[w]
55 self.assertEqual(audioop.minmax(p(5), w), (5, 5))
56 self.assertEqual(audioop.minmax(p(5, -8, -1), w), (-8, 5))
57 self.assertEqual(audioop.minmax(p(maxvalues[w]), w),
58 (maxvalues[w], maxvalues[w]))
59 self.assertEqual(audioop.minmax(p(minvalues[w]), w),
60 (minvalues[w], minvalues[w]))
61 self.assertEqual(audioop.minmax(datas[w], w),
62 (minvalues[w], maxvalues[w]))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000063
Benjamin Peterson41181742008-07-02 20:22:54 +000064 def test_maxpp(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030065 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020066 self.assertEqual(audioop.maxpp(b'', w), 0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +020067 self.assertEqual(audioop.maxpp(bytearray(), w), 0)
68 self.assertEqual(audioop.maxpp(memoryview(b''), w), 0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020069 self.assertEqual(audioop.maxpp(packs[w](*range(100)), w), 0)
70 self.assertEqual(audioop.maxpp(packs[w](9, 10, 5, 5, 0, 1), w), 10)
71 self.assertEqual(audioop.maxpp(datas[w], w),
72 maxvalues[w] - minvalues[w])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000073
Benjamin Peterson41181742008-07-02 20:22:54 +000074 def test_avg(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030075 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020076 self.assertEqual(audioop.avg(b'', w), 0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +020077 self.assertEqual(audioop.avg(bytearray(), w), 0)
78 self.assertEqual(audioop.avg(memoryview(b''), w), 0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020079 p = packs[w]
80 self.assertEqual(audioop.avg(p(5), w), 5)
81 self .assertEqual(audioop.avg(p(5, 8), w), 6)
82 self.assertEqual(audioop.avg(p(5, -8), w), -2)
83 self.assertEqual(audioop.avg(p(maxvalues[w], maxvalues[w]), w),
84 maxvalues[w])
85 self.assertEqual(audioop.avg(p(minvalues[w], minvalues[w]), w),
86 minvalues[w])
87 self.assertEqual(audioop.avg(packs[4](0x50000000, 0x70000000), 4),
88 0x60000000)
89 self.assertEqual(audioop.avg(packs[4](-0x50000000, -0x70000000), 4),
90 -0x60000000)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000091
Benjamin Peterson41181742008-07-02 20:22:54 +000092 def test_avgpp(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030093 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020094 self.assertEqual(audioop.avgpp(b'', w), 0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +020095 self.assertEqual(audioop.avgpp(bytearray(), w), 0)
96 self.assertEqual(audioop.avgpp(memoryview(b''), w), 0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020097 self.assertEqual(audioop.avgpp(packs[w](*range(100)), w), 0)
98 self.assertEqual(audioop.avgpp(packs[w](9, 10, 5, 5, 0, 1), w), 10)
99 self.assertEqual(audioop.avgpp(datas[1], 1), 196)
100 self.assertEqual(audioop.avgpp(datas[2], 2), 50534)
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300101 self.assertEqual(audioop.avgpp(datas[3], 3), 12937096)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200102 self.assertEqual(audioop.avgpp(datas[4], 4), 3311897002)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000103
Benjamin Peterson41181742008-07-02 20:22:54 +0000104 def test_rms(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300105 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200106 self.assertEqual(audioop.rms(b'', w), 0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200107 self.assertEqual(audioop.rms(bytearray(), w), 0)
108 self.assertEqual(audioop.rms(memoryview(b''), w), 0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200109 p = packs[w]
110 self.assertEqual(audioop.rms(p(*range(100)), w), 57)
111 self.assertAlmostEqual(audioop.rms(p(maxvalues[w]) * 5, w),
112 maxvalues[w], delta=1)
113 self.assertAlmostEqual(audioop.rms(p(minvalues[w]) * 5, w),
114 -minvalues[w], delta=1)
115 self.assertEqual(audioop.rms(datas[1], 1), 77)
116 self.assertEqual(audioop.rms(datas[2], 2), 20001)
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300117 self.assertEqual(audioop.rms(datas[3], 3), 5120523)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200118 self.assertEqual(audioop.rms(datas[4], 4), 1310854152)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000119
Benjamin Peterson41181742008-07-02 20:22:54 +0000120 def test_cross(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300121 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200122 self.assertEqual(audioop.cross(b'', w), -1)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200123 self.assertEqual(audioop.cross(bytearray(), w), -1)
124 self.assertEqual(audioop.cross(memoryview(b''), w), -1)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200125 p = packs[w]
126 self.assertEqual(audioop.cross(p(0, 1, 2), w), 0)
127 self.assertEqual(audioop.cross(p(1, 2, -3, -4), w), 1)
128 self.assertEqual(audioop.cross(p(-1, -2, 3, 4), w), 1)
129 self.assertEqual(audioop.cross(p(0, minvalues[w]), w), 1)
130 self.assertEqual(audioop.cross(p(minvalues[w], maxvalues[w]), w), 1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000131
Benjamin Peterson41181742008-07-02 20:22:54 +0000132 def test_add(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300133 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200134 self.assertEqual(audioop.add(b'', b'', w), b'')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200135 self.assertEqual(audioop.add(bytearray(), bytearray(), w), b'')
136 self.assertEqual(audioop.add(memoryview(b''), memoryview(b''), w), b'')
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200137 self.assertEqual(audioop.add(datas[w], b'\0' * len(datas[w]), w),
138 datas[w])
139 self.assertEqual(audioop.add(datas[1], datas[1], 1),
140 b'\x00\x24\x7f\x80\x7f\x80\xfe')
141 self.assertEqual(audioop.add(datas[2], datas[2], 2),
142 packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300143 self.assertEqual(audioop.add(datas[3], datas[3], 3),
144 packs[3](0, 0x2468ac, 0x7fffff, -0x800000,
145 0x7fffff, -0x800000, -2))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200146 self.assertEqual(audioop.add(datas[4], datas[4], 4),
147 packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000,
148 0x7fffffff, -0x80000000, -2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000149
Benjamin Peterson41181742008-07-02 20:22:54 +0000150 def test_bias(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300151 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200152 for bias in 0, 1, -1, 127, -128, 0x7fffffff, -0x80000000:
153 self.assertEqual(audioop.bias(b'', w, bias), b'')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200154 self.assertEqual(audioop.bias(bytearray(), w, bias), b'')
155 self.assertEqual(audioop.bias(memoryview(b''), w, bias), b'')
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200156 self.assertEqual(audioop.bias(datas[1], 1, 1),
157 b'\x01\x13\x46\xbc\x80\x81\x00')
158 self.assertEqual(audioop.bias(datas[1], 1, -1),
159 b'\xff\x11\x44\xba\x7e\x7f\xfe')
160 self.assertEqual(audioop.bias(datas[1], 1, 0x7fffffff),
161 b'\xff\x11\x44\xba\x7e\x7f\xfe')
162 self.assertEqual(audioop.bias(datas[1], 1, -0x80000000),
163 datas[1])
164 self.assertEqual(audioop.bias(datas[2], 2, 1),
165 packs[2](1, 0x1235, 0x4568, -0x4566, -0x8000, -0x7fff, 0))
166 self.assertEqual(audioop.bias(datas[2], 2, -1),
167 packs[2](-1, 0x1233, 0x4566, -0x4568, 0x7ffe, 0x7fff, -2))
168 self.assertEqual(audioop.bias(datas[2], 2, 0x7fffffff),
169 packs[2](-1, 0x1233, 0x4566, -0x4568, 0x7ffe, 0x7fff, -2))
170 self.assertEqual(audioop.bias(datas[2], 2, -0x80000000),
171 datas[2])
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300172 self.assertEqual(audioop.bias(datas[3], 3, 1),
173 packs[3](1, 0x123457, 0x45678a, -0x456788,
174 -0x800000, -0x7fffff, 0))
175 self.assertEqual(audioop.bias(datas[3], 3, -1),
176 packs[3](-1, 0x123455, 0x456788, -0x45678a,
177 0x7ffffe, 0x7fffff, -2))
178 self.assertEqual(audioop.bias(datas[3], 3, 0x7fffffff),
179 packs[3](-1, 0x123455, 0x456788, -0x45678a,
180 0x7ffffe, 0x7fffff, -2))
181 self.assertEqual(audioop.bias(datas[3], 3, -0x80000000),
182 datas[3])
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200183 self.assertEqual(audioop.bias(datas[4], 4, 1),
184 packs[4](1, 0x12345679, 0x456789ac, -0x456789aa,
185 -0x80000000, -0x7fffffff, 0))
186 self.assertEqual(audioop.bias(datas[4], 4, -1),
187 packs[4](-1, 0x12345677, 0x456789aa, -0x456789ac,
188 0x7ffffffe, 0x7fffffff, -2))
189 self.assertEqual(audioop.bias(datas[4], 4, 0x7fffffff),
190 packs[4](0x7fffffff, -0x6dcba989, -0x3a987656, 0x3a987654,
191 -2, -1, 0x7ffffffe))
192 self.assertEqual(audioop.bias(datas[4], 4, -0x80000000),
193 packs[4](-0x80000000, -0x6dcba988, -0x3a987655, 0x3a987655,
194 -1, 0, 0x7fffffff))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000195
Benjamin Peterson41181742008-07-02 20:22:54 +0000196 def test_lin2lin(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300197 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200198 self.assertEqual(audioop.lin2lin(datas[w], w, w), datas[w])
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200199 self.assertEqual(audioop.lin2lin(bytearray(datas[w]), w, w),
200 datas[w])
201 self.assertEqual(audioop.lin2lin(memoryview(datas[w]), w, w),
202 datas[w])
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200203
204 self.assertEqual(audioop.lin2lin(datas[1], 1, 2),
205 packs[2](0, 0x1200, 0x4500, -0x4500, 0x7f00, -0x8000, -0x100))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300206 self.assertEqual(audioop.lin2lin(datas[1], 1, 3),
207 packs[3](0, 0x120000, 0x450000, -0x450000,
208 0x7f0000, -0x800000, -0x10000))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200209 self.assertEqual(audioop.lin2lin(datas[1], 1, 4),
210 packs[4](0, 0x12000000, 0x45000000, -0x45000000,
211 0x7f000000, -0x80000000, -0x1000000))
212 self.assertEqual(audioop.lin2lin(datas[2], 2, 1),
213 b'\x00\x12\x45\xba\x7f\x80\xff')
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300214 self.assertEqual(audioop.lin2lin(datas[2], 2, 3),
215 packs[3](0, 0x123400, 0x456700, -0x456700,
216 0x7fff00, -0x800000, -0x100))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200217 self.assertEqual(audioop.lin2lin(datas[2], 2, 4),
218 packs[4](0, 0x12340000, 0x45670000, -0x45670000,
219 0x7fff0000, -0x80000000, -0x10000))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300220 self.assertEqual(audioop.lin2lin(datas[3], 3, 1),
221 b'\x00\x12\x45\xba\x7f\x80\xff')
222 self.assertEqual(audioop.lin2lin(datas[3], 3, 2),
223 packs[2](0, 0x1234, 0x4567, -0x4568, 0x7fff, -0x8000, -1))
224 self.assertEqual(audioop.lin2lin(datas[3], 3, 4),
225 packs[4](0, 0x12345600, 0x45678900, -0x45678900,
226 0x7fffff00, -0x80000000, -0x100))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200227 self.assertEqual(audioop.lin2lin(datas[4], 4, 1),
228 b'\x00\x12\x45\xba\x7f\x80\xff')
229 self.assertEqual(audioop.lin2lin(datas[4], 4, 2),
230 packs[2](0, 0x1234, 0x4567, -0x4568, 0x7fff, -0x8000, -1))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300231 self.assertEqual(audioop.lin2lin(datas[4], 4, 3),
232 packs[3](0, 0x123456, 0x456789, -0x45678a,
233 0x7fffff, -0x800000, -1))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000234
Benjamin Peterson41181742008-07-02 20:22:54 +0000235 def test_adpcm2lin(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200236 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 1, None),
237 (b'\x00\x00\x00\xff\x00\xff', (-179, 40)))
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200238 self.assertEqual(audioop.adpcm2lin(bytearray(b'\x07\x7f\x7f'), 1, None),
239 (b'\x00\x00\x00\xff\x00\xff', (-179, 40)))
240 self.assertEqual(audioop.adpcm2lin(memoryview(b'\x07\x7f\x7f'), 1, None),
241 (b'\x00\x00\x00\xff\x00\xff', (-179, 40)))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200242 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 2, None),
243 (packs[2](0, 0xb, 0x29, -0x16, 0x72, -0xb3), (-179, 40)))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300244 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 3, None),
245 (packs[3](0, 0xb00, 0x2900, -0x1600, 0x7200,
246 -0xb300), (-179, 40)))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200247 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 4, None),
248 (packs[4](0, 0xb0000, 0x290000, -0x160000, 0x720000,
249 -0xb30000), (-179, 40)))
250
Benjamin Peterson41181742008-07-02 20:22:54 +0000251 # Very cursory test
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300252 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200253 self.assertEqual(audioop.adpcm2lin(b'\0' * 5, w, None),
254 (b'\0' * w * 10, (0, 0)))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000255
Benjamin Peterson41181742008-07-02 20:22:54 +0000256 def test_lin2adpcm(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200257 self.assertEqual(audioop.lin2adpcm(datas[1], 1, None),
258 (b'\x07\x7f\x7f', (-221, 39)))
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200259 self.assertEqual(audioop.lin2adpcm(bytearray(datas[1]), 1, None),
260 (b'\x07\x7f\x7f', (-221, 39)))
261 self.assertEqual(audioop.lin2adpcm(memoryview(datas[1]), 1, None),
262 (b'\x07\x7f\x7f', (-221, 39)))
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300263 for w in 2, 3, 4:
264 self.assertEqual(audioop.lin2adpcm(datas[w], w, None),
265 (b'\x07\x7f\x7f', (31, 39)))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200266
Benjamin Peterson41181742008-07-02 20:22:54 +0000267 # Very cursory test
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300268 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200269 self.assertEqual(audioop.lin2adpcm(b'\0' * w * 10, w, None),
270 (b'\0' * 5, (0, 0)))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000271
Victor Stinnerdaeffd22014-01-03 03:26:47 +0100272 def test_invalid_adpcm_state(self):
273 # state must be a tuple or None, not an integer
274 self.assertRaises(TypeError, audioop.adpcm2lin, b'\0', 1, 555)
275 self.assertRaises(TypeError, audioop.lin2adpcm, b'\0', 1, 555)
276
Benjamin Peterson41181742008-07-02 20:22:54 +0000277 def test_lin2alaw(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200278 self.assertEqual(audioop.lin2alaw(datas[1], 1),
279 b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200280 self.assertEqual(audioop.lin2alaw(bytearray(datas[1]), 1),
281 b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
282 self.assertEqual(audioop.lin2alaw(memoryview(datas[1]), 1),
283 b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300284 for w in 2, 3, 4:
285 self.assertEqual(audioop.lin2alaw(datas[w], w),
286 b'\xd5\x87\xa4\x24\xaa\x2a\x55')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000287
Benjamin Peterson41181742008-07-02 20:22:54 +0000288 def test_alaw2lin(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200289 encoded = b'\x00\x03\x24\x2a\x51\x54\x55\x58\x6b\x71\x7f'\
290 b'\x80\x83\xa4\xaa\xd1\xd4\xd5\xd8\xeb\xf1\xff'
291 src = [-688, -720, -2240, -4032, -9, -3, -1, -27, -244, -82, -106,
292 688, 720, 2240, 4032, 9, 3, 1, 27, 244, 82, 106]
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300293 for w in 1, 2, 3, 4:
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200294 decoded = packs[w](*(x << (w * 8) >> 13 for x in src))
295 self.assertEqual(audioop.alaw2lin(encoded, w), decoded)
296 self.assertEqual(audioop.alaw2lin(bytearray(encoded), w), decoded)
297 self.assertEqual(audioop.alaw2lin(memoryview(encoded), w), decoded)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200298
299 encoded = bytes(range(256))
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300300 for w in 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200301 decoded = audioop.alaw2lin(encoded, w)
302 self.assertEqual(audioop.lin2alaw(decoded, w), encoded)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000303
Benjamin Peterson41181742008-07-02 20:22:54 +0000304 def test_lin2ulaw(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200305 self.assertEqual(audioop.lin2ulaw(datas[1], 1),
306 b'\xff\xad\x8e\x0e\x80\x00\x67')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200307 self.assertEqual(audioop.lin2ulaw(bytearray(datas[1]), 1),
308 b'\xff\xad\x8e\x0e\x80\x00\x67')
309 self.assertEqual(audioop.lin2ulaw(memoryview(datas[1]), 1),
310 b'\xff\xad\x8e\x0e\x80\x00\x67')
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300311 for w in 2, 3, 4:
312 self.assertEqual(audioop.lin2ulaw(datas[w], w),
313 b'\xff\xad\x8e\x0e\x80\x00\x7e')
Guido van Rossumc8504e21997-02-14 15:58:00 +0000314
Benjamin Peterson41181742008-07-02 20:22:54 +0000315 def test_ulaw2lin(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200316 encoded = b'\x00\x0e\x28\x3f\x57\x6a\x76\x7c\x7e\x7f'\
317 b'\x80\x8e\xa8\xbf\xd7\xea\xf6\xfc\xfe\xff'
318 src = [-8031, -4447, -1471, -495, -163, -53, -18, -6, -2, 0,
319 8031, 4447, 1471, 495, 163, 53, 18, 6, 2, 0]
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300320 for w in 1, 2, 3, 4:
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200321 decoded = packs[w](*(x << (w * 8) >> 14 for x in src))
322 self.assertEqual(audioop.ulaw2lin(encoded, w), decoded)
323 self.assertEqual(audioop.ulaw2lin(bytearray(encoded), w), decoded)
324 self.assertEqual(audioop.ulaw2lin(memoryview(encoded), w), decoded)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200325
326 # Current u-law implementation has two codes fo 0: 0x7f and 0xff.
327 encoded = bytes(range(127)) + bytes(range(128, 256))
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300328 for w in 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200329 decoded = audioop.ulaw2lin(encoded, w)
330 self.assertEqual(audioop.lin2ulaw(decoded, w), encoded)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000331
Benjamin Peterson41181742008-07-02 20:22:54 +0000332 def test_mul(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300333 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200334 self.assertEqual(audioop.mul(b'', w, 2), b'')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200335 self.assertEqual(audioop.mul(bytearray(), w, 2), b'')
336 self.assertEqual(audioop.mul(memoryview(b''), w, 2), b'')
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200337 self.assertEqual(audioop.mul(datas[w], w, 0),
338 b'\0' * len(datas[w]))
339 self.assertEqual(audioop.mul(datas[w], w, 1),
340 datas[w])
341 self.assertEqual(audioop.mul(datas[1], 1, 2),
342 b'\x00\x24\x7f\x80\x7f\x80\xfe')
343 self.assertEqual(audioop.mul(datas[2], 2, 2),
344 packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300345 self.assertEqual(audioop.mul(datas[3], 3, 2),
346 packs[3](0, 0x2468ac, 0x7fffff, -0x800000,
347 0x7fffff, -0x800000, -2))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200348 self.assertEqual(audioop.mul(datas[4], 4, 2),
349 packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000,
350 0x7fffffff, -0x80000000, -2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000351
Benjamin Peterson41181742008-07-02 20:22:54 +0000352 def test_ratecv(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300353 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200354 self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 8000, None),
355 (b'', (-1, ((0, 0),))))
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200356 self.assertEqual(audioop.ratecv(bytearray(), w, 1, 8000, 8000, None),
357 (b'', (-1, ((0, 0),))))
358 self.assertEqual(audioop.ratecv(memoryview(b''), w, 1, 8000, 8000, None),
359 (b'', (-1, ((0, 0),))))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200360 self.assertEqual(audioop.ratecv(b'', w, 5, 8000, 8000, None),
361 (b'', (-1, ((0, 0),) * 5)))
362 self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 16000, None),
363 (b'', (-2, ((0, 0),))))
364 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None)[0],
365 datas[w])
Benjamin Peterson41181742008-07-02 20:22:54 +0000366 state = None
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200367 d1, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
368 d2, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
Benjamin Peterson41181742008-07-02 20:22:54 +0000369 self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000370
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300371 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200372 d0, state0 = audioop.ratecv(datas[w], w, 1, 8000, 16000, None)
373 d, state = b'', None
374 for i in range(0, len(datas[w]), w):
375 d1, state = audioop.ratecv(datas[w][i:i + w], w, 1,
376 8000, 16000, state)
377 d += d1
378 self.assertEqual(d, d0)
379 self.assertEqual(state, state0)
380
Benjamin Peterson41181742008-07-02 20:22:54 +0000381 def test_reverse(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300382 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200383 self.assertEqual(audioop.reverse(b'', w), b'')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200384 self.assertEqual(audioop.reverse(bytearray(), w), b'')
385 self.assertEqual(audioop.reverse(memoryview(b''), w), b'')
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200386 self.assertEqual(audioop.reverse(packs[w](0, 1, 2), w),
387 packs[w](2, 1, 0))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000388
Benjamin Peterson41181742008-07-02 20:22:54 +0000389 def test_tomono(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300390 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200391 data1 = datas[w]
392 data2 = bytearray(2 * len(data1))
393 for k in range(w):
394 data2[k::2*w] = data1[k::w]
395 self.assertEqual(audioop.tomono(data2, w, 1, 0), data1)
396 self.assertEqual(audioop.tomono(data2, w, 0, 1), b'\0' * len(data1))
397 for k in range(w):
398 data2[k+w::2*w] = data1[k::w]
399 self.assertEqual(audioop.tomono(data2, w, 0.5, 0.5), data1)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200400 self.assertEqual(audioop.tomono(bytearray(data2), w, 0.5, 0.5),
401 data1)
402 self.assertEqual(audioop.tomono(memoryview(data2), w, 0.5, 0.5),
403 data1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000404
Benjamin Peterson41181742008-07-02 20:22:54 +0000405 def test_tostereo(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300406 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200407 data1 = datas[w]
408 data2 = bytearray(2 * len(data1))
409 for k in range(w):
410 data2[k::2*w] = data1[k::w]
411 self.assertEqual(audioop.tostereo(data1, w, 1, 0), data2)
412 self.assertEqual(audioop.tostereo(data1, w, 0, 0), b'\0' * len(data2))
413 for k in range(w):
414 data2[k+w::2*w] = data1[k::w]
415 self.assertEqual(audioop.tostereo(data1, w, 1, 1), data2)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200416 self.assertEqual(audioop.tostereo(bytearray(data1), w, 1, 1), data2)
417 self.assertEqual(audioop.tostereo(memoryview(data1), w, 1, 1),
418 data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000419
Benjamin Peterson41181742008-07-02 20:22:54 +0000420 def test_findfactor(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200421 self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200422 self.assertEqual(audioop.findfactor(bytearray(datas[2]),
423 bytearray(datas[2])), 1.0)
424 self.assertEqual(audioop.findfactor(memoryview(datas[2]),
425 memoryview(datas[2])), 1.0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200426 self.assertEqual(audioop.findfactor(b'\0' * len(datas[2]), datas[2]),
427 0.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000428
Benjamin Peterson41181742008-07-02 20:22:54 +0000429 def test_findfit(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200430 self.assertEqual(audioop.findfit(datas[2], datas[2]), (0, 1.0))
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200431 self.assertEqual(audioop.findfit(bytearray(datas[2]),
432 bytearray(datas[2])), (0, 1.0))
433 self.assertEqual(audioop.findfit(memoryview(datas[2]),
434 memoryview(datas[2])), (0, 1.0))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200435 self.assertEqual(audioop.findfit(datas[2], packs[2](1, 2, 0)),
436 (1, 8038.8))
437 self.assertEqual(audioop.findfit(datas[2][:-2] * 5 + datas[2], datas[2]),
438 (30, 1.0))
Benjamin Peterson41181742008-07-02 20:22:54 +0000439
440 def test_findmax(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200441 self.assertEqual(audioop.findmax(datas[2], 1), 5)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200442 self.assertEqual(audioop.findmax(bytearray(datas[2]), 1), 5)
443 self.assertEqual(audioop.findmax(memoryview(datas[2]), 1), 5)
Benjamin Peterson41181742008-07-02 20:22:54 +0000444
445 def test_getsample(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300446 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200447 data = packs[w](0, 1, -1, maxvalues[w], minvalues[w])
448 self.assertEqual(audioop.getsample(data, w, 0), 0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200449 self.assertEqual(audioop.getsample(bytearray(data), w, 0), 0)
450 self.assertEqual(audioop.getsample(memoryview(data), w, 0), 0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200451 self.assertEqual(audioop.getsample(data, w, 1), 1)
452 self.assertEqual(audioop.getsample(data, w, 2), -1)
453 self.assertEqual(audioop.getsample(data, w, 3), maxvalues[w])
454 self.assertEqual(audioop.getsample(data, w, 4), minvalues[w])
Benjamin Peterson41181742008-07-02 20:22:54 +0000455
Serhiy Storchaka3062c9a2013-11-23 22:26:01 +0200456 def test_byteswap(self):
457 swapped_datas = {
458 1: datas[1],
459 2: packs[2](0, 0x3412, 0x6745, -0x6646, -0x81, 0x80, -1),
460 3: packs[3](0, 0x563412, -0x7698bb, 0x7798ba, -0x81, 0x80, -1),
461 4: packs[4](0, 0x78563412, -0x547698bb, 0x557698ba,
462 -0x81, 0x80, -1),
463 }
464 for w in 1, 2, 3, 4:
465 self.assertEqual(audioop.byteswap(b'', w), b'')
466 self.assertEqual(audioop.byteswap(datas[w], w), swapped_datas[w])
467 self.assertEqual(audioop.byteswap(swapped_datas[w], w), datas[w])
468 self.assertEqual(audioop.byteswap(bytearray(datas[w]), w),
469 swapped_datas[w])
470 self.assertEqual(audioop.byteswap(memoryview(datas[w]), w),
471 swapped_datas[w])
472
Georg Brandl3dbca812008-07-23 16:10:53 +0000473 def test_negativelen(self):
Georg Brandl86b2fb92008-07-16 03:43:04 +0000474 # from issue 3306, previously it segfaulted
475 self.assertRaises(audioop.error,
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200476 audioop.findmax, bytes(range(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000477
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000478 def test_issue7673(self):
479 state = None
480 for data, size in INVALID_DATA:
481 size2 = size
482 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
483 self.assertRaises(audioop.error, audioop.max, data, size)
484 self.assertRaises(audioop.error, audioop.minmax, data, size)
485 self.assertRaises(audioop.error, audioop.avg, data, size)
486 self.assertRaises(audioop.error, audioop.rms, data, size)
487 self.assertRaises(audioop.error, audioop.avgpp, data, size)
488 self.assertRaises(audioop.error, audioop.maxpp, data, size)
489 self.assertRaises(audioop.error, audioop.cross, data, size)
490 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
491 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
492 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
493 self.assertRaises(audioop.error, audioop.add, data, data, size)
494 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
495 self.assertRaises(audioop.error, audioop.reverse, data, size)
496 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
497 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
498 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000499 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000500 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100501
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200502 def test_string(self):
503 data = 'abcd'
504 size = 2
505 self.assertRaises(TypeError, audioop.getsample, data, size, 0)
506 self.assertRaises(TypeError, audioop.max, data, size)
507 self.assertRaises(TypeError, audioop.minmax, data, size)
508 self.assertRaises(TypeError, audioop.avg, data, size)
509 self.assertRaises(TypeError, audioop.rms, data, size)
510 self.assertRaises(TypeError, audioop.avgpp, data, size)
511 self.assertRaises(TypeError, audioop.maxpp, data, size)
512 self.assertRaises(TypeError, audioop.cross, data, size)
513 self.assertRaises(TypeError, audioop.mul, data, size, 1.0)
514 self.assertRaises(TypeError, audioop.tomono, data, size, 0.5, 0.5)
515 self.assertRaises(TypeError, audioop.tostereo, data, size, 0.5, 0.5)
516 self.assertRaises(TypeError, audioop.add, data, data, size)
517 self.assertRaises(TypeError, audioop.bias, data, size, 0)
518 self.assertRaises(TypeError, audioop.reverse, data, size)
519 self.assertRaises(TypeError, audioop.lin2lin, data, size, size)
520 self.assertRaises(TypeError, audioop.ratecv, data, size, 1, 1, 1, None)
521 self.assertRaises(TypeError, audioop.lin2ulaw, data, size)
522 self.assertRaises(TypeError, audioop.lin2alaw, data, size)
523 self.assertRaises(TypeError, audioop.lin2adpcm, data, size, None)
524
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100525 def test_wrongsize(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200526 data = b'abcdefgh'
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100527 state = None
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300528 for size in (-1, 0, 5, 1024):
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100529 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
530 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000531 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
532
Christian Heimes180510d2008-03-03 19:15:45 +0000533if __name__ == '__main__':
Serhiy Storchaka6e9e4fe2013-10-20 17:24:42 +0300534 unittest.main()