blob: cf0ef7b0775a21a2582e306e0ad1705575852b96 [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)
37 p = packs[w]
38 self.assertEqual(audioop.max(p(5), w), 5)
39 self.assertEqual(audioop.max(p(5, -8, -1), w), 8)
40 self.assertEqual(audioop.max(p(maxvalues[w]), w), maxvalues[w])
41 self.assertEqual(audioop.max(p(minvalues[w]), w), -minvalues[w])
42 self.assertEqual(audioop.max(datas[w], w), -minvalues[w])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000043
Benjamin Peterson41181742008-07-02 20:22:54 +000044 def test_minmax(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030045 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020046 self.assertEqual(audioop.minmax(b'', w),
47 (0x7fffffff, -0x80000000))
48 p = packs[w]
49 self.assertEqual(audioop.minmax(p(5), w), (5, 5))
50 self.assertEqual(audioop.minmax(p(5, -8, -1), w), (-8, 5))
51 self.assertEqual(audioop.minmax(p(maxvalues[w]), w),
52 (maxvalues[w], maxvalues[w]))
53 self.assertEqual(audioop.minmax(p(minvalues[w]), w),
54 (minvalues[w], minvalues[w]))
55 self.assertEqual(audioop.minmax(datas[w], w),
56 (minvalues[w], maxvalues[w]))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000057
Benjamin Peterson41181742008-07-02 20:22:54 +000058 def test_maxpp(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030059 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020060 self.assertEqual(audioop.maxpp(b'', w), 0)
61 self.assertEqual(audioop.maxpp(packs[w](*range(100)), w), 0)
62 self.assertEqual(audioop.maxpp(packs[w](9, 10, 5, 5, 0, 1), w), 10)
63 self.assertEqual(audioop.maxpp(datas[w], w),
64 maxvalues[w] - minvalues[w])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000065
Benjamin Peterson41181742008-07-02 20:22:54 +000066 def test_avg(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030067 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020068 self.assertEqual(audioop.avg(b'', w), 0)
69 p = packs[w]
70 self.assertEqual(audioop.avg(p(5), w), 5)
71 self .assertEqual(audioop.avg(p(5, 8), w), 6)
72 self.assertEqual(audioop.avg(p(5, -8), w), -2)
73 self.assertEqual(audioop.avg(p(maxvalues[w], maxvalues[w]), w),
74 maxvalues[w])
75 self.assertEqual(audioop.avg(p(minvalues[w], minvalues[w]), w),
76 minvalues[w])
77 self.assertEqual(audioop.avg(packs[4](0x50000000, 0x70000000), 4),
78 0x60000000)
79 self.assertEqual(audioop.avg(packs[4](-0x50000000, -0x70000000), 4),
80 -0x60000000)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000081
Benjamin Peterson41181742008-07-02 20:22:54 +000082 def test_avgpp(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +030083 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020084 self.assertEqual(audioop.avgpp(b'', w), 0)
85 self.assertEqual(audioop.avgpp(packs[w](*range(100)), w), 0)
86 self.assertEqual(audioop.avgpp(packs[w](9, 10, 5, 5, 0, 1), w), 10)
87 self.assertEqual(audioop.avgpp(datas[1], 1), 196)
88 self.assertEqual(audioop.avgpp(datas[2], 2), 50534)
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +030089 self.assertEqual(audioop.avgpp(datas[3], 3), 12937096)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +020090 self.assertEqual(audioop.avgpp(datas[4], 4), 3311897002)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000091
Benjamin Peterson41181742008-07-02 20:22:54 +000092 def test_rms(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.rms(b'', w), 0)
95 p = packs[w]
96 self.assertEqual(audioop.rms(p(*range(100)), w), 57)
97 self.assertAlmostEqual(audioop.rms(p(maxvalues[w]) * 5, w),
98 maxvalues[w], delta=1)
99 self.assertAlmostEqual(audioop.rms(p(minvalues[w]) * 5, w),
100 -minvalues[w], delta=1)
101 self.assertEqual(audioop.rms(datas[1], 1), 77)
102 self.assertEqual(audioop.rms(datas[2], 2), 20001)
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300103 self.assertEqual(audioop.rms(datas[3], 3), 5120523)
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200104 self.assertEqual(audioop.rms(datas[4], 4), 1310854152)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000105
Benjamin Peterson41181742008-07-02 20:22:54 +0000106 def test_cross(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300107 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200108 self.assertEqual(audioop.cross(b'', w), -1)
109 p = packs[w]
110 self.assertEqual(audioop.cross(p(0, 1, 2), w), 0)
111 self.assertEqual(audioop.cross(p(1, 2, -3, -4), w), 1)
112 self.assertEqual(audioop.cross(p(-1, -2, 3, 4), w), 1)
113 self.assertEqual(audioop.cross(p(0, minvalues[w]), w), 1)
114 self.assertEqual(audioop.cross(p(minvalues[w], maxvalues[w]), w), 1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000115
Benjamin Peterson41181742008-07-02 20:22:54 +0000116 def test_add(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300117 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200118 self.assertEqual(audioop.add(b'', b'', w), b'')
119 self.assertEqual(audioop.add(datas[w], b'\0' * len(datas[w]), w),
120 datas[w])
121 self.assertEqual(audioop.add(datas[1], datas[1], 1),
122 b'\x00\x24\x7f\x80\x7f\x80\xfe')
123 self.assertEqual(audioop.add(datas[2], datas[2], 2),
124 packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300125 self.assertEqual(audioop.add(datas[3], datas[3], 3),
126 packs[3](0, 0x2468ac, 0x7fffff, -0x800000,
127 0x7fffff, -0x800000, -2))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200128 self.assertEqual(audioop.add(datas[4], datas[4], 4),
129 packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000,
130 0x7fffffff, -0x80000000, -2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000131
Benjamin Peterson41181742008-07-02 20:22:54 +0000132 def test_bias(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300133 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200134 for bias in 0, 1, -1, 127, -128, 0x7fffffff, -0x80000000:
135 self.assertEqual(audioop.bias(b'', w, bias), b'')
136 self.assertEqual(audioop.bias(datas[1], 1, 1),
137 b'\x01\x13\x46\xbc\x80\x81\x00')
138 self.assertEqual(audioop.bias(datas[1], 1, -1),
139 b'\xff\x11\x44\xba\x7e\x7f\xfe')
140 self.assertEqual(audioop.bias(datas[1], 1, 0x7fffffff),
141 b'\xff\x11\x44\xba\x7e\x7f\xfe')
142 self.assertEqual(audioop.bias(datas[1], 1, -0x80000000),
143 datas[1])
144 self.assertEqual(audioop.bias(datas[2], 2, 1),
145 packs[2](1, 0x1235, 0x4568, -0x4566, -0x8000, -0x7fff, 0))
146 self.assertEqual(audioop.bias(datas[2], 2, -1),
147 packs[2](-1, 0x1233, 0x4566, -0x4568, 0x7ffe, 0x7fff, -2))
148 self.assertEqual(audioop.bias(datas[2], 2, 0x7fffffff),
149 packs[2](-1, 0x1233, 0x4566, -0x4568, 0x7ffe, 0x7fff, -2))
150 self.assertEqual(audioop.bias(datas[2], 2, -0x80000000),
151 datas[2])
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300152 self.assertEqual(audioop.bias(datas[3], 3, 1),
153 packs[3](1, 0x123457, 0x45678a, -0x456788,
154 -0x800000, -0x7fffff, 0))
155 self.assertEqual(audioop.bias(datas[3], 3, -1),
156 packs[3](-1, 0x123455, 0x456788, -0x45678a,
157 0x7ffffe, 0x7fffff, -2))
158 self.assertEqual(audioop.bias(datas[3], 3, 0x7fffffff),
159 packs[3](-1, 0x123455, 0x456788, -0x45678a,
160 0x7ffffe, 0x7fffff, -2))
161 self.assertEqual(audioop.bias(datas[3], 3, -0x80000000),
162 datas[3])
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200163 self.assertEqual(audioop.bias(datas[4], 4, 1),
164 packs[4](1, 0x12345679, 0x456789ac, -0x456789aa,
165 -0x80000000, -0x7fffffff, 0))
166 self.assertEqual(audioop.bias(datas[4], 4, -1),
167 packs[4](-1, 0x12345677, 0x456789aa, -0x456789ac,
168 0x7ffffffe, 0x7fffffff, -2))
169 self.assertEqual(audioop.bias(datas[4], 4, 0x7fffffff),
170 packs[4](0x7fffffff, -0x6dcba989, -0x3a987656, 0x3a987654,
171 -2, -1, 0x7ffffffe))
172 self.assertEqual(audioop.bias(datas[4], 4, -0x80000000),
173 packs[4](-0x80000000, -0x6dcba988, -0x3a987655, 0x3a987655,
174 -1, 0, 0x7fffffff))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000175
Benjamin Peterson41181742008-07-02 20:22:54 +0000176 def test_lin2lin(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300177 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200178 self.assertEqual(audioop.lin2lin(datas[w], w, w), datas[w])
179
180 self.assertEqual(audioop.lin2lin(datas[1], 1, 2),
181 packs[2](0, 0x1200, 0x4500, -0x4500, 0x7f00, -0x8000, -0x100))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300182 self.assertEqual(audioop.lin2lin(datas[1], 1, 3),
183 packs[3](0, 0x120000, 0x450000, -0x450000,
184 0x7f0000, -0x800000, -0x10000))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200185 self.assertEqual(audioop.lin2lin(datas[1], 1, 4),
186 packs[4](0, 0x12000000, 0x45000000, -0x45000000,
187 0x7f000000, -0x80000000, -0x1000000))
188 self.assertEqual(audioop.lin2lin(datas[2], 2, 1),
189 b'\x00\x12\x45\xba\x7f\x80\xff')
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300190 self.assertEqual(audioop.lin2lin(datas[2], 2, 3),
191 packs[3](0, 0x123400, 0x456700, -0x456700,
192 0x7fff00, -0x800000, -0x100))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200193 self.assertEqual(audioop.lin2lin(datas[2], 2, 4),
194 packs[4](0, 0x12340000, 0x45670000, -0x45670000,
195 0x7fff0000, -0x80000000, -0x10000))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300196 self.assertEqual(audioop.lin2lin(datas[3], 3, 1),
197 b'\x00\x12\x45\xba\x7f\x80\xff')
198 self.assertEqual(audioop.lin2lin(datas[3], 3, 2),
199 packs[2](0, 0x1234, 0x4567, -0x4568, 0x7fff, -0x8000, -1))
200 self.assertEqual(audioop.lin2lin(datas[3], 3, 4),
201 packs[4](0, 0x12345600, 0x45678900, -0x45678900,
202 0x7fffff00, -0x80000000, -0x100))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200203 self.assertEqual(audioop.lin2lin(datas[4], 4, 1),
204 b'\x00\x12\x45\xba\x7f\x80\xff')
205 self.assertEqual(audioop.lin2lin(datas[4], 4, 2),
206 packs[2](0, 0x1234, 0x4567, -0x4568, 0x7fff, -0x8000, -1))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300207 self.assertEqual(audioop.lin2lin(datas[4], 4, 3),
208 packs[3](0, 0x123456, 0x456789, -0x45678a,
209 0x7fffff, -0x800000, -1))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000210
Benjamin Peterson41181742008-07-02 20:22:54 +0000211 def test_adpcm2lin(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200212 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 1, None),
213 (b'\x00\x00\x00\xff\x00\xff', (-179, 40)))
214 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 2, None),
215 (packs[2](0, 0xb, 0x29, -0x16, 0x72, -0xb3), (-179, 40)))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300216 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 3, None),
217 (packs[3](0, 0xb00, 0x2900, -0x1600, 0x7200,
218 -0xb300), (-179, 40)))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200219 self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 4, None),
220 (packs[4](0, 0xb0000, 0x290000, -0x160000, 0x720000,
221 -0xb30000), (-179, 40)))
222
Benjamin Peterson41181742008-07-02 20:22:54 +0000223 # Very cursory test
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300224 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200225 self.assertEqual(audioop.adpcm2lin(b'\0' * 5, w, None),
226 (b'\0' * w * 10, (0, 0)))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000227
Benjamin Peterson41181742008-07-02 20:22:54 +0000228 def test_lin2adpcm(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200229 self.assertEqual(audioop.lin2adpcm(datas[1], 1, None),
230 (b'\x07\x7f\x7f', (-221, 39)))
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300231 for w in 2, 3, 4:
232 self.assertEqual(audioop.lin2adpcm(datas[w], w, None),
233 (b'\x07\x7f\x7f', (31, 39)))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200234
Benjamin Peterson41181742008-07-02 20:22:54 +0000235 # Very cursory test
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300236 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200237 self.assertEqual(audioop.lin2adpcm(b'\0' * w * 10, w, None),
238 (b'\0' * 5, (0, 0)))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000239
Benjamin Peterson41181742008-07-02 20:22:54 +0000240 def test_lin2alaw(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200241 self.assertEqual(audioop.lin2alaw(datas[1], 1),
242 b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300243 for w in 2, 3, 4:
244 self.assertEqual(audioop.lin2alaw(datas[w], w),
245 b'\xd5\x87\xa4\x24\xaa\x2a\x55')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000246
Benjamin Peterson41181742008-07-02 20:22:54 +0000247 def test_alaw2lin(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200248 encoded = b'\x00\x03\x24\x2a\x51\x54\x55\x58\x6b\x71\x7f'\
249 b'\x80\x83\xa4\xaa\xd1\xd4\xd5\xd8\xeb\xf1\xff'
250 src = [-688, -720, -2240, -4032, -9, -3, -1, -27, -244, -82, -106,
251 688, 720, 2240, 4032, 9, 3, 1, 27, 244, 82, 106]
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.alaw2lin(encoded, w),
254 packs[w](*(x << (w * 8) >> 13 for x in src)))
255
256 encoded = bytes(range(256))
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300257 for w in 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200258 decoded = audioop.alaw2lin(encoded, w)
259 self.assertEqual(audioop.lin2alaw(decoded, w), encoded)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000260
Benjamin Peterson41181742008-07-02 20:22:54 +0000261 def test_lin2ulaw(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200262 self.assertEqual(audioop.lin2ulaw(datas[1], 1),
263 b'\xff\xad\x8e\x0e\x80\x00\x67')
Serhiy Storchakad5fd8df2013-10-20 12:49:04 +0300264 for w in 2, 3, 4:
265 self.assertEqual(audioop.lin2ulaw(datas[w], w),
266 b'\xff\xad\x8e\x0e\x80\x00\x7e')
Guido van Rossumc8504e21997-02-14 15:58:00 +0000267
Benjamin Peterson41181742008-07-02 20:22:54 +0000268 def test_ulaw2lin(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200269 encoded = b'\x00\x0e\x28\x3f\x57\x6a\x76\x7c\x7e\x7f'\
270 b'\x80\x8e\xa8\xbf\xd7\xea\xf6\xfc\xfe\xff'
271 src = [-8031, -4447, -1471, -495, -163, -53, -18, -6, -2, 0,
272 8031, 4447, 1471, 495, 163, 53, 18, 6, 2, 0]
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300273 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200274 self.assertEqual(audioop.ulaw2lin(encoded, w),
275 packs[w](*(x << (w * 8) >> 14 for x in src)))
276
277 # Current u-law implementation has two codes fo 0: 0x7f and 0xff.
278 encoded = bytes(range(127)) + bytes(range(128, 256))
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300279 for w in 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200280 decoded = audioop.ulaw2lin(encoded, w)
281 self.assertEqual(audioop.lin2ulaw(decoded, w), encoded)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000282
Benjamin Peterson41181742008-07-02 20:22:54 +0000283 def test_mul(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300284 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200285 self.assertEqual(audioop.mul(b'', w, 2), b'')
286 self.assertEqual(audioop.mul(datas[w], w, 0),
287 b'\0' * len(datas[w]))
288 self.assertEqual(audioop.mul(datas[w], w, 1),
289 datas[w])
290 self.assertEqual(audioop.mul(datas[1], 1, 2),
291 b'\x00\x24\x7f\x80\x7f\x80\xfe')
292 self.assertEqual(audioop.mul(datas[2], 2, 2),
293 packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2))
Serhiy Storchakace82eb22013-10-20 09:42:26 +0300294 self.assertEqual(audioop.mul(datas[3], 3, 2),
295 packs[3](0, 0x2468ac, 0x7fffff, -0x800000,
296 0x7fffff, -0x800000, -2))
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200297 self.assertEqual(audioop.mul(datas[4], 4, 2),
298 packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000,
299 0x7fffffff, -0x80000000, -2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000300
Benjamin Peterson41181742008-07-02 20:22:54 +0000301 def test_ratecv(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300302 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200303 self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 8000, None),
304 (b'', (-1, ((0, 0),))))
305 self.assertEqual(audioop.ratecv(b'', w, 5, 8000, 8000, None),
306 (b'', (-1, ((0, 0),) * 5)))
307 self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 16000, None),
308 (b'', (-2, ((0, 0),))))
309 self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None)[0],
310 datas[w])
Benjamin Peterson41181742008-07-02 20:22:54 +0000311 state = None
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200312 d1, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
313 d2, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
Benjamin Peterson41181742008-07-02 20:22:54 +0000314 self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000315
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300316 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200317 d0, state0 = audioop.ratecv(datas[w], w, 1, 8000, 16000, None)
318 d, state = b'', None
319 for i in range(0, len(datas[w]), w):
320 d1, state = audioop.ratecv(datas[w][i:i + w], w, 1,
321 8000, 16000, state)
322 d += d1
323 self.assertEqual(d, d0)
324 self.assertEqual(state, state0)
325
Benjamin Peterson41181742008-07-02 20:22:54 +0000326 def test_reverse(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300327 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200328 self.assertEqual(audioop.reverse(b'', w), b'')
329 self.assertEqual(audioop.reverse(packs[w](0, 1, 2), w),
330 packs[w](2, 1, 0))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000331
Benjamin Peterson41181742008-07-02 20:22:54 +0000332 def test_tomono(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300333 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200334 data1 = datas[w]
335 data2 = bytearray(2 * len(data1))
336 for k in range(w):
337 data2[k::2*w] = data1[k::w]
338 self.assertEqual(audioop.tomono(data2, w, 1, 0), data1)
339 self.assertEqual(audioop.tomono(data2, w, 0, 1), b'\0' * len(data1))
340 for k in range(w):
341 data2[k+w::2*w] = data1[k::w]
342 self.assertEqual(audioop.tomono(data2, w, 0.5, 0.5), data1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000343
Benjamin Peterson41181742008-07-02 20:22:54 +0000344 def test_tostereo(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300345 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200346 data1 = datas[w]
347 data2 = bytearray(2 * len(data1))
348 for k in range(w):
349 data2[k::2*w] = data1[k::w]
350 self.assertEqual(audioop.tostereo(data1, w, 1, 0), data2)
351 self.assertEqual(audioop.tostereo(data1, w, 0, 0), b'\0' * len(data2))
352 for k in range(w):
353 data2[k+w::2*w] = data1[k::w]
354 self.assertEqual(audioop.tostereo(data1, w, 1, 1), data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000355
Benjamin Peterson41181742008-07-02 20:22:54 +0000356 def test_findfactor(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200357 self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0)
358 self.assertEqual(audioop.findfactor(b'\0' * len(datas[2]), datas[2]),
359 0.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000360
Benjamin Peterson41181742008-07-02 20:22:54 +0000361 def test_findfit(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200362 self.assertEqual(audioop.findfit(datas[2], datas[2]), (0, 1.0))
363 self.assertEqual(audioop.findfit(datas[2], packs[2](1, 2, 0)),
364 (1, 8038.8))
365 self.assertEqual(audioop.findfit(datas[2][:-2] * 5 + datas[2], datas[2]),
366 (30, 1.0))
Benjamin Peterson41181742008-07-02 20:22:54 +0000367
368 def test_findmax(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200369 self.assertEqual(audioop.findmax(datas[2], 1), 5)
Benjamin Peterson41181742008-07-02 20:22:54 +0000370
371 def test_getsample(self):
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300372 for w in 1, 2, 3, 4:
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200373 data = packs[w](0, 1, -1, maxvalues[w], minvalues[w])
374 self.assertEqual(audioop.getsample(data, w, 0), 0)
375 self.assertEqual(audioop.getsample(data, w, 1), 1)
376 self.assertEqual(audioop.getsample(data, w, 2), -1)
377 self.assertEqual(audioop.getsample(data, w, 3), maxvalues[w])
378 self.assertEqual(audioop.getsample(data, w, 4), minvalues[w])
Benjamin Peterson41181742008-07-02 20:22:54 +0000379
Georg Brandl3dbca812008-07-23 16:10:53 +0000380 def test_negativelen(self):
Georg Brandl86b2fb92008-07-16 03:43:04 +0000381 # from issue 3306, previously it segfaulted
382 self.assertRaises(audioop.error,
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200383 audioop.findmax, bytes(range(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000384
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000385 def test_issue7673(self):
386 state = None
387 for data, size in INVALID_DATA:
388 size2 = size
389 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
390 self.assertRaises(audioop.error, audioop.max, data, size)
391 self.assertRaises(audioop.error, audioop.minmax, data, size)
392 self.assertRaises(audioop.error, audioop.avg, data, size)
393 self.assertRaises(audioop.error, audioop.rms, data, size)
394 self.assertRaises(audioop.error, audioop.avgpp, data, size)
395 self.assertRaises(audioop.error, audioop.maxpp, data, size)
396 self.assertRaises(audioop.error, audioop.cross, data, size)
397 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
398 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
399 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
400 self.assertRaises(audioop.error, audioop.add, data, data, size)
401 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
402 self.assertRaises(audioop.error, audioop.reverse, data, size)
403 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
404 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
405 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000406 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000407 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100408
409 def test_wrongsize(self):
Serhiy Storchaka01ad6222013-02-09 11:10:53 +0200410 data = b'abcdefgh'
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100411 state = None
Serhiy Storchakaeaea5e92013-10-19 21:10:46 +0300412 for size in (-1, 0, 5, 1024):
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100413 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
414 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000415 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
416
Christian Heimes180510d2008-03-03 19:15:45 +0000417if __name__ == '__main__':
Serhiy Storchaka6e9e4fe2013-10-20 17:24:42 +0300418 unittest.main()