blob: 01ed18d1c107a65b55c6b2c056c160b69872ab12 [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])
Serhiy Storchaka50451eb2015-05-30 00:53:26 +0300366 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 1, 0)[0],
367 datas[w])
368
Benjamin Peterson41181742008-07-02 20:22:54 +0000369 state = None
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200370 d1, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
371 d2, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
Benjamin Peterson41181742008-07-02 20:22:54 +0000372 self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000373
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300374 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200375 d0, state0 = audioop.ratecv(datas[w], w, 1, 8000, 16000, None)
376 d, state = b'', None
377 for i in range(0, len(datas[w]), w):
378 d1, state = audioop.ratecv(datas[w][i:i + w], w, 1,
379 8000, 16000, state)
380 d += d1
381 self.assertEqual(d, d0)
382 self.assertEqual(state, state0)
383
Serhiy Storchaka50451eb2015-05-30 00:53:26 +0300384 expected = {
385 1: packs[1](0, 0x0d, 0x37, -0x26, 0x55, -0x4b, -0x14),
386 2: packs[2](0, 0x0da7, 0x3777, -0x2630, 0x5673, -0x4a64, -0x129a),
387 3: packs[3](0, 0x0da740, 0x377776, -0x262fca,
388 0x56740c, -0x4a62fd, -0x1298c0),
389 4: packs[4](0, 0x0da740da, 0x37777776, -0x262fc962,
390 0x56740da6, -0x4a62fc96, -0x1298bf26),
391 }
392 for w in 1, 2, 3, 4:
393 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 3, 1)[0],
394 expected[w])
395 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 30, 10)[0],
396 expected[w])
397
Benjamin Peterson41181742008-07-02 20:22:54 +0000398 def test_reverse(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300399 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200400 self.assertEqual(audioop.reverse(b'', w), b'')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200401 self.assertEqual(audioop.reverse(bytearray(), w), b'')
402 self.assertEqual(audioop.reverse(memoryview(b''), w), b'')
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200403 self.assertEqual(audioop.reverse(packs[w](0, 1, 2), w),
404 packs[w](2, 1, 0))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000405
Benjamin Peterson41181742008-07-02 20:22:54 +0000406 def test_tomono(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300407 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200408 data1 = datas[w]
409 data2 = bytearray(2 * len(data1))
410 for k in range(w):
411 data2[k::2*w] = data1[k::w]
412 self.assertEqual(audioop.tomono(data2, w, 1, 0), data1)
413 self.assertEqual(audioop.tomono(data2, w, 0, 1), b'\0' * len(data1))
414 for k in range(w):
415 data2[k+w::2*w] = data1[k::w]
416 self.assertEqual(audioop.tomono(data2, w, 0.5, 0.5), data1)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200417 self.assertEqual(audioop.tomono(bytearray(data2), w, 0.5, 0.5),
418 data1)
419 self.assertEqual(audioop.tomono(memoryview(data2), w, 0.5, 0.5),
420 data1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000421
Benjamin Peterson41181742008-07-02 20:22:54 +0000422 def test_tostereo(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300423 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200424 data1 = datas[w]
425 data2 = bytearray(2 * len(data1))
426 for k in range(w):
427 data2[k::2*w] = data1[k::w]
428 self.assertEqual(audioop.tostereo(data1, w, 1, 0), data2)
429 self.assertEqual(audioop.tostereo(data1, w, 0, 0), b'\0' * len(data2))
430 for k in range(w):
431 data2[k+w::2*w] = data1[k::w]
432 self.assertEqual(audioop.tostereo(data1, w, 1, 1), data2)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200433 self.assertEqual(audioop.tostereo(bytearray(data1), w, 1, 1), data2)
434 self.assertEqual(audioop.tostereo(memoryview(data1), w, 1, 1),
435 data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000436
Benjamin Peterson41181742008-07-02 20:22:54 +0000437 def test_findfactor(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200438 self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200439 self.assertEqual(audioop.findfactor(bytearray(datas[2]),
440 bytearray(datas[2])), 1.0)
441 self.assertEqual(audioop.findfactor(memoryview(datas[2]),
442 memoryview(datas[2])), 1.0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200443 self.assertEqual(audioop.findfactor(b'\0' * len(datas[2]), datas[2]),
444 0.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000445
Benjamin Peterson41181742008-07-02 20:22:54 +0000446 def test_findfit(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200447 self.assertEqual(audioop.findfit(datas[2], datas[2]), (0, 1.0))
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200448 self.assertEqual(audioop.findfit(bytearray(datas[2]),
449 bytearray(datas[2])), (0, 1.0))
450 self.assertEqual(audioop.findfit(memoryview(datas[2]),
451 memoryview(datas[2])), (0, 1.0))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200452 self.assertEqual(audioop.findfit(datas[2], packs[2](1, 2, 0)),
453 (1, 8038.8))
454 self.assertEqual(audioop.findfit(datas[2][:-2] * 5 + datas[2], datas[2]),
455 (30, 1.0))
Benjamin Peterson41181742008-07-02 20:22:54 +0000456
457 def test_findmax(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200458 self.assertEqual(audioop.findmax(datas[2], 1), 5)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200459 self.assertEqual(audioop.findmax(bytearray(datas[2]), 1), 5)
460 self.assertEqual(audioop.findmax(memoryview(datas[2]), 1), 5)
Benjamin Peterson41181742008-07-02 20:22:54 +0000461
462 def test_getsample(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300463 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200464 data = packs[w](0, 1, -1, maxvalues[w], minvalues[w])
465 self.assertEqual(audioop.getsample(data, w, 0), 0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200466 self.assertEqual(audioop.getsample(bytearray(data), w, 0), 0)
467 self.assertEqual(audioop.getsample(memoryview(data), w, 0), 0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200468 self.assertEqual(audioop.getsample(data, w, 1), 1)
469 self.assertEqual(audioop.getsample(data, w, 2), -1)
470 self.assertEqual(audioop.getsample(data, w, 3), maxvalues[w])
471 self.assertEqual(audioop.getsample(data, w, 4), minvalues[w])
Benjamin Peterson41181742008-07-02 20:22:54 +0000472
Serhiy Storchaka3062c9a2013-11-23 22:26:01 +0200473 def test_byteswap(self):
474 swapped_datas = {
475 1: datas[1],
476 2: packs[2](0, 0x3412, 0x6745, -0x6646, -0x81, 0x80, -1),
477 3: packs[3](0, 0x563412, -0x7698bb, 0x7798ba, -0x81, 0x80, -1),
478 4: packs[4](0, 0x78563412, -0x547698bb, 0x557698ba,
479 -0x81, 0x80, -1),
480 }
481 for w in 1, 2, 3, 4:
482 self.assertEqual(audioop.byteswap(b'', w), b'')
483 self.assertEqual(audioop.byteswap(datas[w], w), swapped_datas[w])
484 self.assertEqual(audioop.byteswap(swapped_datas[w], w), datas[w])
485 self.assertEqual(audioop.byteswap(bytearray(datas[w]), w),
486 swapped_datas[w])
487 self.assertEqual(audioop.byteswap(memoryview(datas[w]), w),
488 swapped_datas[w])
489
Georg Brandl3dbca812008-07-23 16:10:53 +0000490 def test_negativelen(self):
Georg Brandl86b2fb92008-07-16 03:43:04 +0000491 # from issue 3306, previously it segfaulted
492 self.assertRaises(audioop.error,
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200493 audioop.findmax, bytes(range(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000494
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000495 def test_issue7673(self):
496 state = None
497 for data, size in INVALID_DATA:
498 size2 = size
499 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
500 self.assertRaises(audioop.error, audioop.max, data, size)
501 self.assertRaises(audioop.error, audioop.minmax, data, size)
502 self.assertRaises(audioop.error, audioop.avg, data, size)
503 self.assertRaises(audioop.error, audioop.rms, data, size)
504 self.assertRaises(audioop.error, audioop.avgpp, data, size)
505 self.assertRaises(audioop.error, audioop.maxpp, data, size)
506 self.assertRaises(audioop.error, audioop.cross, data, size)
507 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
508 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
509 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
510 self.assertRaises(audioop.error, audioop.add, data, data, size)
511 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
512 self.assertRaises(audioop.error, audioop.reverse, data, size)
513 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
514 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
515 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000516 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000517 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100518
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200519 def test_string(self):
520 data = 'abcd'
521 size = 2
522 self.assertRaises(TypeError, audioop.getsample, data, size, 0)
523 self.assertRaises(TypeError, audioop.max, data, size)
524 self.assertRaises(TypeError, audioop.minmax, data, size)
525 self.assertRaises(TypeError, audioop.avg, data, size)
526 self.assertRaises(TypeError, audioop.rms, data, size)
527 self.assertRaises(TypeError, audioop.avgpp, data, size)
528 self.assertRaises(TypeError, audioop.maxpp, data, size)
529 self.assertRaises(TypeError, audioop.cross, data, size)
530 self.assertRaises(TypeError, audioop.mul, data, size, 1.0)
531 self.assertRaises(TypeError, audioop.tomono, data, size, 0.5, 0.5)
532 self.assertRaises(TypeError, audioop.tostereo, data, size, 0.5, 0.5)
533 self.assertRaises(TypeError, audioop.add, data, data, size)
534 self.assertRaises(TypeError, audioop.bias, data, size, 0)
535 self.assertRaises(TypeError, audioop.reverse, data, size)
536 self.assertRaises(TypeError, audioop.lin2lin, data, size, size)
537 self.assertRaises(TypeError, audioop.ratecv, data, size, 1, 1, 1, None)
538 self.assertRaises(TypeError, audioop.lin2ulaw, data, size)
539 self.assertRaises(TypeError, audioop.lin2alaw, data, size)
540 self.assertRaises(TypeError, audioop.lin2adpcm, data, size, None)
541
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100542 def test_wrongsize(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200543 data = b'abcdefgh'
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100544 state = None
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300545 for size in (-1, 0, 5, 1024):
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100546 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
547 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000548 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
549
Christian Heimes180510d2008-03-03 19:15:45 +0000550if __name__ == '__main__':
Serhiy Storchaka6e9e4fe2013-10-20 17:24:42 +0300551 unittest.main()