blob: d5075450e63758b86f3038e3fd1c9e528a05b6e5 [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
Benjamin Peterson41181742008-07-02 20:22:54 +0000272 def test_lin2alaw(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200273 self.assertEqual(audioop.lin2alaw(datas[1], 1),
274 b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200275 self.assertEqual(audioop.lin2alaw(bytearray(datas[1]), 1),
276 b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
277 self.assertEqual(audioop.lin2alaw(memoryview(datas[1]), 1),
278 b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300279 for w in 2, 3, 4:
280 self.assertEqual(audioop.lin2alaw(datas[w], w),
281 b'\xd5\x87\xa4\x24\xaa\x2a\x55')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000282
Benjamin Peterson41181742008-07-02 20:22:54 +0000283 def test_alaw2lin(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200284 encoded = b'\x00\x03\x24\x2a\x51\x54\x55\x58\x6b\x71\x7f'\
285 b'\x80\x83\xa4\xaa\xd1\xd4\xd5\xd8\xeb\xf1\xff'
286 src = [-688, -720, -2240, -4032, -9, -3, -1, -27, -244, -82, -106,
287 688, 720, 2240, 4032, 9, 3, 1, 27, 244, 82, 106]
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300288 for w in 1, 2, 3, 4:
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200289 decoded = packs[w](*(x << (w * 8) >> 13 for x in src))
290 self.assertEqual(audioop.alaw2lin(encoded, w), decoded)
291 self.assertEqual(audioop.alaw2lin(bytearray(encoded), w), decoded)
292 self.assertEqual(audioop.alaw2lin(memoryview(encoded), w), decoded)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200293
294 encoded = bytes(range(256))
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300295 for w in 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200296 decoded = audioop.alaw2lin(encoded, w)
297 self.assertEqual(audioop.lin2alaw(decoded, w), encoded)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000298
Benjamin Peterson41181742008-07-02 20:22:54 +0000299 def test_lin2ulaw(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200300 self.assertEqual(audioop.lin2ulaw(datas[1], 1),
301 b'\xff\xad\x8e\x0e\x80\x00\x67')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200302 self.assertEqual(audioop.lin2ulaw(bytearray(datas[1]), 1),
303 b'\xff\xad\x8e\x0e\x80\x00\x67')
304 self.assertEqual(audioop.lin2ulaw(memoryview(datas[1]), 1),
305 b'\xff\xad\x8e\x0e\x80\x00\x67')
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300306 for w in 2, 3, 4:
307 self.assertEqual(audioop.lin2ulaw(datas[w], w),
308 b'\xff\xad\x8e\x0e\x80\x00\x7e')
Guido van Rossumc8504e21997-02-14 15:58:00 +0000309
Benjamin Peterson41181742008-07-02 20:22:54 +0000310 def test_ulaw2lin(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200311 encoded = b'\x00\x0e\x28\x3f\x57\x6a\x76\x7c\x7e\x7f'\
312 b'\x80\x8e\xa8\xbf\xd7\xea\xf6\xfc\xfe\xff'
313 src = [-8031, -4447, -1471, -495, -163, -53, -18, -6, -2, 0,
314 8031, 4447, 1471, 495, 163, 53, 18, 6, 2, 0]
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300315 for w in 1, 2, 3, 4:
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200316 decoded = packs[w](*(x << (w * 8) >> 14 for x in src))
317 self.assertEqual(audioop.ulaw2lin(encoded, w), decoded)
318 self.assertEqual(audioop.ulaw2lin(bytearray(encoded), w), decoded)
319 self.assertEqual(audioop.ulaw2lin(memoryview(encoded), w), decoded)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200320
321 # Current u-law implementation has two codes fo 0: 0x7f and 0xff.
322 encoded = bytes(range(127)) + bytes(range(128, 256))
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300323 for w in 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200324 decoded = audioop.ulaw2lin(encoded, w)
325 self.assertEqual(audioop.lin2ulaw(decoded, w), encoded)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000326
Benjamin Peterson41181742008-07-02 20:22:54 +0000327 def test_mul(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300328 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200329 self.assertEqual(audioop.mul(b'', w, 2), b'')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200330 self.assertEqual(audioop.mul(bytearray(), w, 2), b'')
331 self.assertEqual(audioop.mul(memoryview(b''), w, 2), b'')
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200332 self.assertEqual(audioop.mul(datas[w], w, 0),
333 b'\0' * len(datas[w]))
334 self.assertEqual(audioop.mul(datas[w], w, 1),
335 datas[w])
336 self.assertEqual(audioop.mul(datas[1], 1, 2),
337 b'\x00\x24\x7f\x80\x7f\x80\xfe')
338 self.assertEqual(audioop.mul(datas[2], 2, 2),
339 packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300340 self.assertEqual(audioop.mul(datas[3], 3, 2),
341 packs[3](0, 0x2468ac, 0x7fffff, -0x800000,
342 0x7fffff, -0x800000, -2))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200343 self.assertEqual(audioop.mul(datas[4], 4, 2),
344 packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000,
345 0x7fffffff, -0x80000000, -2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000346
Benjamin Peterson41181742008-07-02 20:22:54 +0000347 def test_ratecv(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300348 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200349 self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 8000, None),
350 (b'', (-1, ((0, 0),))))
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200351 self.assertEqual(audioop.ratecv(bytearray(), w, 1, 8000, 8000, None),
352 (b'', (-1, ((0, 0),))))
353 self.assertEqual(audioop.ratecv(memoryview(b''), w, 1, 8000, 8000, None),
354 (b'', (-1, ((0, 0),))))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200355 self.assertEqual(audioop.ratecv(b'', w, 5, 8000, 8000, None),
356 (b'', (-1, ((0, 0),) * 5)))
357 self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 16000, None),
358 (b'', (-2, ((0, 0),))))
359 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None)[0],
360 datas[w])
Benjamin Peterson41181742008-07-02 20:22:54 +0000361 state = None
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200362 d1, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
363 d2, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
Benjamin Peterson41181742008-07-02 20:22:54 +0000364 self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000365
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300366 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200367 d0, state0 = audioop.ratecv(datas[w], w, 1, 8000, 16000, None)
368 d, state = b'', None
369 for i in range(0, len(datas[w]), w):
370 d1, state = audioop.ratecv(datas[w][i:i + w], w, 1,
371 8000, 16000, state)
372 d += d1
373 self.assertEqual(d, d0)
374 self.assertEqual(state, state0)
375
Benjamin Peterson41181742008-07-02 20:22:54 +0000376 def test_reverse(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300377 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200378 self.assertEqual(audioop.reverse(b'', w), b'')
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200379 self.assertEqual(audioop.reverse(bytearray(), w), b'')
380 self.assertEqual(audioop.reverse(memoryview(b''), w), b'')
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200381 self.assertEqual(audioop.reverse(packs[w](0, 1, 2), w),
382 packs[w](2, 1, 0))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000383
Benjamin Peterson41181742008-07-02 20:22:54 +0000384 def test_tomono(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300385 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200386 data1 = datas[w]
387 data2 = bytearray(2 * len(data1))
388 for k in range(w):
389 data2[k::2*w] = data1[k::w]
390 self.assertEqual(audioop.tomono(data2, w, 1, 0), data1)
391 self.assertEqual(audioop.tomono(data2, w, 0, 1), b'\0' * len(data1))
392 for k in range(w):
393 data2[k+w::2*w] = data1[k::w]
394 self.assertEqual(audioop.tomono(data2, w, 0.5, 0.5), data1)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200395 self.assertEqual(audioop.tomono(bytearray(data2), w, 0.5, 0.5),
396 data1)
397 self.assertEqual(audioop.tomono(memoryview(data2), w, 0.5, 0.5),
398 data1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000399
Benjamin Peterson41181742008-07-02 20:22:54 +0000400 def test_tostereo(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300401 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200402 data1 = datas[w]
403 data2 = bytearray(2 * len(data1))
404 for k in range(w):
405 data2[k::2*w] = data1[k::w]
406 self.assertEqual(audioop.tostereo(data1, w, 1, 0), data2)
407 self.assertEqual(audioop.tostereo(data1, w, 0, 0), b'\0' * len(data2))
408 for k in range(w):
409 data2[k+w::2*w] = data1[k::w]
410 self.assertEqual(audioop.tostereo(data1, w, 1, 1), data2)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200411 self.assertEqual(audioop.tostereo(bytearray(data1), w, 1, 1), data2)
412 self.assertEqual(audioop.tostereo(memoryview(data1), w, 1, 1),
413 data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000414
Benjamin Peterson41181742008-07-02 20:22:54 +0000415 def test_findfactor(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200416 self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200417 self.assertEqual(audioop.findfactor(bytearray(datas[2]),
418 bytearray(datas[2])), 1.0)
419 self.assertEqual(audioop.findfactor(memoryview(datas[2]),
420 memoryview(datas[2])), 1.0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200421 self.assertEqual(audioop.findfactor(b'\0' * len(datas[2]), datas[2]),
422 0.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000423
Benjamin Peterson41181742008-07-02 20:22:54 +0000424 def test_findfit(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200425 self.assertEqual(audioop.findfit(datas[2], datas[2]), (0, 1.0))
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200426 self.assertEqual(audioop.findfit(bytearray(datas[2]),
427 bytearray(datas[2])), (0, 1.0))
428 self.assertEqual(audioop.findfit(memoryview(datas[2]),
429 memoryview(datas[2])), (0, 1.0))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200430 self.assertEqual(audioop.findfit(datas[2], packs[2](1, 2, 0)),
431 (1, 8038.8))
432 self.assertEqual(audioop.findfit(datas[2][:-2] * 5 + datas[2], datas[2]),
433 (30, 1.0))
Benjamin Peterson41181742008-07-02 20:22:54 +0000434
435 def test_findmax(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200436 self.assertEqual(audioop.findmax(datas[2], 1), 5)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200437 self.assertEqual(audioop.findmax(bytearray(datas[2]), 1), 5)
438 self.assertEqual(audioop.findmax(memoryview(datas[2]), 1), 5)
Benjamin Peterson41181742008-07-02 20:22:54 +0000439
440 def test_getsample(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300441 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200442 data = packs[w](0, 1, -1, maxvalues[w], minvalues[w])
443 self.assertEqual(audioop.getsample(data, w, 0), 0)
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200444 self.assertEqual(audioop.getsample(bytearray(data), w, 0), 0)
445 self.assertEqual(audioop.getsample(memoryview(data), w, 0), 0)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200446 self.assertEqual(audioop.getsample(data, w, 1), 1)
447 self.assertEqual(audioop.getsample(data, w, 2), -1)
448 self.assertEqual(audioop.getsample(data, w, 3), maxvalues[w])
449 self.assertEqual(audioop.getsample(data, w, 4), minvalues[w])
Benjamin Peterson41181742008-07-02 20:22:54 +0000450
Serhiy Storchaka3062c9a2013-11-23 22:26:01 +0200451 def test_byteswap(self):
452 swapped_datas = {
453 1: datas[1],
454 2: packs[2](0, 0x3412, 0x6745, -0x6646, -0x81, 0x80, -1),
455 3: packs[3](0, 0x563412, -0x7698bb, 0x7798ba, -0x81, 0x80, -1),
456 4: packs[4](0, 0x78563412, -0x547698bb, 0x557698ba,
457 -0x81, 0x80, -1),
458 }
459 for w in 1, 2, 3, 4:
460 self.assertEqual(audioop.byteswap(b'', w), b'')
461 self.assertEqual(audioop.byteswap(datas[w], w), swapped_datas[w])
462 self.assertEqual(audioop.byteswap(swapped_datas[w], w), datas[w])
463 self.assertEqual(audioop.byteswap(bytearray(datas[w]), w),
464 swapped_datas[w])
465 self.assertEqual(audioop.byteswap(memoryview(datas[w]), w),
466 swapped_datas[w])
467
Georg Brandl3dbca812008-07-23 16:10:53 +0000468 def test_negativelen(self):
Georg Brandl86b2fb92008-07-16 03:43:04 +0000469 # from issue 3306, previously it segfaulted
470 self.assertRaises(audioop.error,
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200471 audioop.findmax, bytes(range(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000472
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000473 def test_issue7673(self):
474 state = None
475 for data, size in INVALID_DATA:
476 size2 = size
477 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
478 self.assertRaises(audioop.error, audioop.max, data, size)
479 self.assertRaises(audioop.error, audioop.minmax, data, size)
480 self.assertRaises(audioop.error, audioop.avg, data, size)
481 self.assertRaises(audioop.error, audioop.rms, data, size)
482 self.assertRaises(audioop.error, audioop.avgpp, data, size)
483 self.assertRaises(audioop.error, audioop.maxpp, data, size)
484 self.assertRaises(audioop.error, audioop.cross, data, size)
485 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
486 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
487 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
488 self.assertRaises(audioop.error, audioop.add, data, data, size)
489 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
490 self.assertRaises(audioop.error, audioop.reverse, data, size)
491 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
492 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
493 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000494 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000495 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100496
Serhiy Storchaka711e91b2013-11-10 21:44:36 +0200497 def test_string(self):
498 data = 'abcd'
499 size = 2
500 self.assertRaises(TypeError, audioop.getsample, data, size, 0)
501 self.assertRaises(TypeError, audioop.max, data, size)
502 self.assertRaises(TypeError, audioop.minmax, data, size)
503 self.assertRaises(TypeError, audioop.avg, data, size)
504 self.assertRaises(TypeError, audioop.rms, data, size)
505 self.assertRaises(TypeError, audioop.avgpp, data, size)
506 self.assertRaises(TypeError, audioop.maxpp, data, size)
507 self.assertRaises(TypeError, audioop.cross, data, size)
508 self.assertRaises(TypeError, audioop.mul, data, size, 1.0)
509 self.assertRaises(TypeError, audioop.tomono, data, size, 0.5, 0.5)
510 self.assertRaises(TypeError, audioop.tostereo, data, size, 0.5, 0.5)
511 self.assertRaises(TypeError, audioop.add, data, data, size)
512 self.assertRaises(TypeError, audioop.bias, data, size, 0)
513 self.assertRaises(TypeError, audioop.reverse, data, size)
514 self.assertRaises(TypeError, audioop.lin2lin, data, size, size)
515 self.assertRaises(TypeError, audioop.ratecv, data, size, 1, 1, 1, None)
516 self.assertRaises(TypeError, audioop.lin2ulaw, data, size)
517 self.assertRaises(TypeError, audioop.lin2alaw, data, size)
518 self.assertRaises(TypeError, audioop.lin2adpcm, data, size, None)
519
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100520 def test_wrongsize(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200521 data = b'abcdefgh'
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100522 state = None
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300523 for size in (-1, 0, 5, 1024):
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100524 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
525 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000526 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
527
Christian Heimes180510d2008-03-03 19:15:45 +0000528if __name__ == '__main__':
Serhiy Storchaka6e9e4fe2013-10-20 17:24:42 +0300529 unittest.main()