Home | History | Annotate | Download | only in test
      1 import audioop
      2 import sys
      3 import unittest
      4 
      5 def pack(width, data):
      6     return b''.join(v.to_bytes(width, sys.byteorder, signed=True) for v in data)
      7 
      8 def 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 
     12 packs = {w: (lambda *data, width=w: pack(width, data)) for w in (1, 2, 3, 4)}
     13 maxvalues = {w: (1 << (8 * w - 1)) - 1 for w in (1, 2, 3, 4)}
     14 minvalues = {w: -1 << (8 * w - 1) for w in (1, 2, 3, 4)}
     15 
     16 datas = {
     17     1: b'\x00\x12\x45\xbb\x7f\x80\xff',
     18     2: packs[2](0, 0x1234, 0x4567, -0x4567, 0x7fff, -0x8000, -1),
     19     3: packs[3](0, 0x123456, 0x456789, -0x456789, 0x7fffff, -0x800000, -1),
     20     4: packs[4](0, 0x12345678, 0x456789ab, -0x456789ab,
     21                 0x7fffffff, -0x80000000, -1),
     22 }
     23 
     24 INVALID_DATA = [
     25     (b'abc', 0),
     26     (b'abc', 2),
     27     (b'ab', 3),
     28     (b'abc', 4),
     29 ]
     30 
     31 
     32 class TestAudioop(unittest.TestCase):
     33 
     34     def test_max(self):
     35         for w in 1, 2, 3, 4:
     36             self.assertEqual(audioop.max(b'', w), 0)
     37             self.assertEqual(audioop.max(bytearray(), w), 0)
     38             self.assertEqual(audioop.max(memoryview(b''), w), 0)
     39             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])
     45 
     46     def test_minmax(self):
     47         for w in 1, 2, 3, 4:
     48             self.assertEqual(audioop.minmax(b'', w),
     49                              (0x7fffffff, -0x80000000))
     50             self.assertEqual(audioop.minmax(bytearray(), w),
     51                              (0x7fffffff, -0x80000000))
     52             self.assertEqual(audioop.minmax(memoryview(b''), w),
     53                              (0x7fffffff, -0x80000000))
     54             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]))
     63 
     64     def test_maxpp(self):
     65         for w in 1, 2, 3, 4:
     66             self.assertEqual(audioop.maxpp(b'', w), 0)
     67             self.assertEqual(audioop.maxpp(bytearray(), w), 0)
     68             self.assertEqual(audioop.maxpp(memoryview(b''), w), 0)
     69             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])
     73 
     74     def test_avg(self):
     75         for w in 1, 2, 3, 4:
     76             self.assertEqual(audioop.avg(b'', w), 0)
     77             self.assertEqual(audioop.avg(bytearray(), w), 0)
     78             self.assertEqual(audioop.avg(memoryview(b''), w), 0)
     79             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)
     91 
     92     def test_avgpp(self):
     93         for w in 1, 2, 3, 4:
     94             self.assertEqual(audioop.avgpp(b'', w), 0)
     95             self.assertEqual(audioop.avgpp(bytearray(), w), 0)
     96             self.assertEqual(audioop.avgpp(memoryview(b''), w), 0)
     97             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)
    101         self.assertEqual(audioop.avgpp(datas[3], 3), 12937096)
    102         self.assertEqual(audioop.avgpp(datas[4], 4), 3311897002)
    103 
    104     def test_rms(self):
    105         for w in 1, 2, 3, 4:
    106             self.assertEqual(audioop.rms(b'', w), 0)
    107             self.assertEqual(audioop.rms(bytearray(), w), 0)
    108             self.assertEqual(audioop.rms(memoryview(b''), w), 0)
    109             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)
    117         self.assertEqual(audioop.rms(datas[3], 3), 5120523)
    118         self.assertEqual(audioop.rms(datas[4], 4), 1310854152)
    119 
    120     def test_cross(self):
    121         for w in 1, 2, 3, 4:
    122             self.assertEqual(audioop.cross(b'', w), -1)
    123             self.assertEqual(audioop.cross(bytearray(), w), -1)
    124             self.assertEqual(audioop.cross(memoryview(b''), w), -1)
    125             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)
    131 
    132     def test_add(self):
    133         for w in 1, 2, 3, 4:
    134             self.assertEqual(audioop.add(b'', b'', w), b'')
    135             self.assertEqual(audioop.add(bytearray(), bytearray(), w), b'')
    136             self.assertEqual(audioop.add(memoryview(b''), memoryview(b''), w), b'')
    137             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))
    143         self.assertEqual(audioop.add(datas[3], datas[3], 3),
    144                 packs[3](0, 0x2468ac, 0x7fffff, -0x800000,
    145                        0x7fffff, -0x800000, -2))
    146         self.assertEqual(audioop.add(datas[4], datas[4], 4),
    147                 packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000,
    148                        0x7fffffff, -0x80000000, -2))
    149 
    150     def test_bias(self):
    151         for w in 1, 2, 3, 4:
    152             for bias in 0, 1, -1, 127, -128, 0x7fffffff, -0x80000000:
    153                 self.assertEqual(audioop.bias(b'', w, bias), b'')
    154                 self.assertEqual(audioop.bias(bytearray(), w, bias), b'')
    155                 self.assertEqual(audioop.bias(memoryview(b''), w, bias), b'')
    156         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])
    172         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])
    183         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))
    195 
    196     def test_lin2lin(self):
    197         for w in 1, 2, 3, 4:
    198             self.assertEqual(audioop.lin2lin(datas[w], w, w), datas[w])
    199             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])
    203 
    204         self.assertEqual(audioop.lin2lin(datas[1], 1, 2),
    205             packs[2](0, 0x1200, 0x4500, -0x4500, 0x7f00, -0x8000, -0x100))
    206         self.assertEqual(audioop.lin2lin(datas[1], 1, 3),
    207             packs[3](0, 0x120000, 0x450000, -0x450000,
    208                      0x7f0000, -0x800000, -0x10000))
    209         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')
    214         self.assertEqual(audioop.lin2lin(datas[2], 2, 3),
    215             packs[3](0, 0x123400, 0x456700, -0x456700,
    216                      0x7fff00, -0x800000, -0x100))
    217         self.assertEqual(audioop.lin2lin(datas[2], 2, 4),
    218             packs[4](0, 0x12340000, 0x45670000, -0x45670000,
    219                      0x7fff0000, -0x80000000, -0x10000))
    220         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))
    227         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))
    231         self.assertEqual(audioop.lin2lin(datas[4], 4, 3),
    232             packs[3](0, 0x123456, 0x456789, -0x45678a,
    233                      0x7fffff, -0x800000, -1))
    234 
    235     def test_adpcm2lin(self):
    236         self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 1, None),
    237                          (b'\x00\x00\x00\xff\x00\xff', (-179, 40)))
    238         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)))
    242         self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 2, None),
    243                          (packs[2](0, 0xb, 0x29, -0x16, 0x72, -0xb3), (-179, 40)))
    244         self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 3, None),
    245                          (packs[3](0, 0xb00, 0x2900, -0x1600, 0x7200,
    246                                    -0xb300), (-179, 40)))
    247         self.assertEqual(audioop.adpcm2lin(b'\x07\x7f\x7f', 4, None),
    248                          (packs[4](0, 0xb0000, 0x290000, -0x160000, 0x720000,
    249                                    -0xb30000), (-179, 40)))
    250 
    251         # Very cursory test
    252         for w in 1, 2, 3, 4:
    253             self.assertEqual(audioop.adpcm2lin(b'\0' * 5, w, None),
    254                              (b'\0' * w * 10, (0, 0)))
    255 
    256     def test_lin2adpcm(self):
    257         self.assertEqual(audioop.lin2adpcm(datas[1], 1, None),
    258                          (b'\x07\x7f\x7f', (-221, 39)))
    259         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)))
    263         for w in 2, 3, 4:
    264             self.assertEqual(audioop.lin2adpcm(datas[w], w, None),
    265                              (b'\x07\x7f\x7f', (31, 39)))
    266 
    267         # Very cursory test
    268         for w in 1, 2, 3, 4:
    269             self.assertEqual(audioop.lin2adpcm(b'\0' * w * 10, w, None),
    270                              (b'\0' * 5, (0, 0)))
    271 
    272     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         # Issues #24456, #24457: index out of range
    277         self.assertRaises(ValueError, audioop.adpcm2lin, b'\0', 1, (0, -1))
    278         self.assertRaises(ValueError, audioop.adpcm2lin, b'\0', 1, (0, 89))
    279         self.assertRaises(ValueError, audioop.lin2adpcm, b'\0', 1, (0, -1))
    280         self.assertRaises(ValueError, audioop.lin2adpcm, b'\0', 1, (0, 89))
    281         # value out of range
    282         self.assertRaises(ValueError, audioop.adpcm2lin, b'\0', 1, (-0x8001, 0))
    283         self.assertRaises(ValueError, audioop.adpcm2lin, b'\0', 1, (0x8000, 0))
    284         self.assertRaises(ValueError, audioop.lin2adpcm, b'\0', 1, (-0x8001, 0))
    285         self.assertRaises(ValueError, audioop.lin2adpcm, b'\0', 1, (0x8000, 0))
    286 
    287     def test_lin2alaw(self):
    288         self.assertEqual(audioop.lin2alaw(datas[1], 1),
    289                          b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
    290         self.assertEqual(audioop.lin2alaw(bytearray(datas[1]), 1),
    291                          b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
    292         self.assertEqual(audioop.lin2alaw(memoryview(datas[1]), 1),
    293                          b'\xd5\x87\xa4\x24\xaa\x2a\x5a')
    294         for w in 2, 3, 4:
    295             self.assertEqual(audioop.lin2alaw(datas[w], w),
    296                              b'\xd5\x87\xa4\x24\xaa\x2a\x55')
    297 
    298     def test_alaw2lin(self):
    299         encoded = b'\x00\x03\x24\x2a\x51\x54\x55\x58\x6b\x71\x7f'\
    300                   b'\x80\x83\xa4\xaa\xd1\xd4\xd5\xd8\xeb\xf1\xff'
    301         src = [-688, -720, -2240, -4032, -9, -3, -1, -27, -244, -82, -106,
    302                688, 720, 2240, 4032, 9, 3, 1, 27, 244, 82, 106]
    303         for w in 1, 2, 3, 4:
    304             decoded = packs[w](*(x << (w * 8) >> 13 for x in src))
    305             self.assertEqual(audioop.alaw2lin(encoded, w), decoded)
    306             self.assertEqual(audioop.alaw2lin(bytearray(encoded), w), decoded)
    307             self.assertEqual(audioop.alaw2lin(memoryview(encoded), w), decoded)
    308 
    309         encoded = bytes(range(256))
    310         for w in 2, 3, 4:
    311             decoded = audioop.alaw2lin(encoded, w)
    312             self.assertEqual(audioop.lin2alaw(decoded, w), encoded)
    313 
    314     def test_lin2ulaw(self):
    315         self.assertEqual(audioop.lin2ulaw(datas[1], 1),
    316                          b'\xff\xad\x8e\x0e\x80\x00\x67')
    317         self.assertEqual(audioop.lin2ulaw(bytearray(datas[1]), 1),
    318                          b'\xff\xad\x8e\x0e\x80\x00\x67')
    319         self.assertEqual(audioop.lin2ulaw(memoryview(datas[1]), 1),
    320                          b'\xff\xad\x8e\x0e\x80\x00\x67')
    321         for w in 2, 3, 4:
    322             self.assertEqual(audioop.lin2ulaw(datas[w], w),
    323                              b'\xff\xad\x8e\x0e\x80\x00\x7e')
    324 
    325     def test_ulaw2lin(self):
    326         encoded = b'\x00\x0e\x28\x3f\x57\x6a\x76\x7c\x7e\x7f'\
    327                   b'\x80\x8e\xa8\xbf\xd7\xea\xf6\xfc\xfe\xff'
    328         src = [-8031, -4447, -1471, -495, -163, -53, -18, -6, -2, 0,
    329                8031, 4447, 1471, 495, 163, 53, 18, 6, 2, 0]
    330         for w in 1, 2, 3, 4:
    331             decoded = packs[w](*(x << (w * 8) >> 14 for x in src))
    332             self.assertEqual(audioop.ulaw2lin(encoded, w), decoded)
    333             self.assertEqual(audioop.ulaw2lin(bytearray(encoded), w), decoded)
    334             self.assertEqual(audioop.ulaw2lin(memoryview(encoded), w), decoded)
    335 
    336         # Current u-law implementation has two codes fo 0: 0x7f and 0xff.
    337         encoded = bytes(range(127)) + bytes(range(128, 256))
    338         for w in 2, 3, 4:
    339             decoded = audioop.ulaw2lin(encoded, w)
    340             self.assertEqual(audioop.lin2ulaw(decoded, w), encoded)
    341 
    342     def test_mul(self):
    343         for w in 1, 2, 3, 4:
    344             self.assertEqual(audioop.mul(b'', w, 2), b'')
    345             self.assertEqual(audioop.mul(bytearray(), w, 2), b'')
    346             self.assertEqual(audioop.mul(memoryview(b''), w, 2), b'')
    347             self.assertEqual(audioop.mul(datas[w], w, 0),
    348                              b'\0' * len(datas[w]))
    349             self.assertEqual(audioop.mul(datas[w], w, 1),
    350                              datas[w])
    351         self.assertEqual(audioop.mul(datas[1], 1, 2),
    352                          b'\x00\x24\x7f\x80\x7f\x80\xfe')
    353         self.assertEqual(audioop.mul(datas[2], 2, 2),
    354                 packs[2](0, 0x2468, 0x7fff, -0x8000, 0x7fff, -0x8000, -2))
    355         self.assertEqual(audioop.mul(datas[3], 3, 2),
    356                 packs[3](0, 0x2468ac, 0x7fffff, -0x800000,
    357                          0x7fffff, -0x800000, -2))
    358         self.assertEqual(audioop.mul(datas[4], 4, 2),
    359                 packs[4](0, 0x2468acf0, 0x7fffffff, -0x80000000,
    360                          0x7fffffff, -0x80000000, -2))
    361 
    362     def test_ratecv(self):
    363         for w in 1, 2, 3, 4:
    364             self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 8000, None),
    365                              (b'', (-1, ((0, 0),))))
    366             self.assertEqual(audioop.ratecv(bytearray(), w, 1, 8000, 8000, None),
    367                              (b'', (-1, ((0, 0),))))
    368             self.assertEqual(audioop.ratecv(memoryview(b''), w, 1, 8000, 8000, None),
    369                              (b'', (-1, ((0, 0),))))
    370             self.assertEqual(audioop.ratecv(b'', w, 5, 8000, 8000, None),
    371                              (b'', (-1, ((0, 0),) * 5)))
    372             self.assertEqual(audioop.ratecv(b'', w, 1, 8000, 16000, None),
    373                              (b'', (-2, ((0, 0),))))
    374             self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None)[0],
    375                              datas[w])
    376             self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 1, 0)[0],
    377                              datas[w])
    378 
    379         state = None
    380         d1, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
    381         d2, state = audioop.ratecv(b'\x00\x01\x02', 1, 1, 8000, 16000, state)
    382         self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002')
    383 
    384         for w in 1, 2, 3, 4:
    385             d0, state0 = audioop.ratecv(datas[w], w, 1, 8000, 16000, None)
    386             d, state = b'', None
    387             for i in range(0, len(datas[w]), w):
    388                 d1, state = audioop.ratecv(datas[w][i:i + w], w, 1,
    389                                            8000, 16000, state)
    390                 d += d1
    391             self.assertEqual(d, d0)
    392             self.assertEqual(state, state0)
    393 
    394         expected = {
    395             1: packs[1](0, 0x0d, 0x37, -0x26, 0x55, -0x4b, -0x14),
    396             2: packs[2](0, 0x0da7, 0x3777, -0x2630, 0x5673, -0x4a64, -0x129a),
    397             3: packs[3](0, 0x0da740, 0x377776, -0x262fca,
    398                         0x56740c, -0x4a62fd, -0x1298c0),
    399             4: packs[4](0, 0x0da740da, 0x37777776, -0x262fc962,
    400                         0x56740da6, -0x4a62fc96, -0x1298bf26),
    401         }
    402         for w in 1, 2, 3, 4:
    403             self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 3, 1)[0],
    404                              expected[w])
    405             self.assertEqual(audioop.ratecv(datas[w], w, 1, 8000, 8000, None, 30, 10)[0],
    406                              expected[w])
    407 
    408         self.assertRaises(TypeError, audioop.ratecv, b'', 1, 1, 8000, 8000, 42)
    409         self.assertRaises(TypeError, audioop.ratecv,
    410                           b'', 1, 1, 8000, 8000, (1, (42,)))
    411 
    412     def test_reverse(self):
    413         for w in 1, 2, 3, 4:
    414             self.assertEqual(audioop.reverse(b'', w), b'')
    415             self.assertEqual(audioop.reverse(bytearray(), w), b'')
    416             self.assertEqual(audioop.reverse(memoryview(b''), w), b'')
    417             self.assertEqual(audioop.reverse(packs[w](0, 1, 2), w),
    418                              packs[w](2, 1, 0))
    419 
    420     def test_tomono(self):
    421         for w in 1, 2, 3, 4:
    422             data1 = datas[w]
    423             data2 = bytearray(2 * len(data1))
    424             for k in range(w):
    425                 data2[k::2*w] = data1[k::w]
    426             self.assertEqual(audioop.tomono(data2, w, 1, 0), data1)
    427             self.assertEqual(audioop.tomono(data2, w, 0, 1), b'\0' * len(data1))
    428             for k in range(w):
    429                 data2[k+w::2*w] = data1[k::w]
    430             self.assertEqual(audioop.tomono(data2, w, 0.5, 0.5), data1)
    431             self.assertEqual(audioop.tomono(bytearray(data2), w, 0.5, 0.5),
    432                              data1)
    433             self.assertEqual(audioop.tomono(memoryview(data2), w, 0.5, 0.5),
    434                              data1)
    435 
    436     def test_tostereo(self):
    437         for w in 1, 2, 3, 4:
    438             data1 = datas[w]
    439             data2 = bytearray(2 * len(data1))
    440             for k in range(w):
    441                 data2[k::2*w] = data1[k::w]
    442             self.assertEqual(audioop.tostereo(data1, w, 1, 0), data2)
    443             self.assertEqual(audioop.tostereo(data1, w, 0, 0), b'\0' * len(data2))
    444             for k in range(w):
    445                 data2[k+w::2*w] = data1[k::w]
    446             self.assertEqual(audioop.tostereo(data1, w, 1, 1), data2)
    447             self.assertEqual(audioop.tostereo(bytearray(data1), w, 1, 1), data2)
    448             self.assertEqual(audioop.tostereo(memoryview(data1), w, 1, 1),
    449                              data2)
    450 
    451     def test_findfactor(self):
    452         self.assertEqual(audioop.findfactor(datas[2], datas[2]), 1.0)
    453         self.assertEqual(audioop.findfactor(bytearray(datas[2]),
    454                                             bytearray(datas[2])), 1.0)
    455         self.assertEqual(audioop.findfactor(memoryview(datas[2]),
    456                                             memoryview(datas[2])), 1.0)
    457         self.assertEqual(audioop.findfactor(b'\0' * len(datas[2]), datas[2]),
    458                          0.0)
    459 
    460     def test_findfit(self):
    461         self.assertEqual(audioop.findfit(datas[2], datas[2]), (0, 1.0))
    462         self.assertEqual(audioop.findfit(bytearray(datas[2]),
    463                                          bytearray(datas[2])), (0, 1.0))
    464         self.assertEqual(audioop.findfit(memoryview(datas[2]),
    465                                          memoryview(datas[2])), (0, 1.0))
    466         self.assertEqual(audioop.findfit(datas[2], packs[2](1, 2, 0)),
    467                          (1, 8038.8))
    468         self.assertEqual(audioop.findfit(datas[2][:-2] * 5 + datas[2], datas[2]),
    469                          (30, 1.0))
    470 
    471     def test_findmax(self):
    472         self.assertEqual(audioop.findmax(datas[2], 1), 5)
    473         self.assertEqual(audioop.findmax(bytearray(datas[2]), 1), 5)
    474         self.assertEqual(audioop.findmax(memoryview(datas[2]), 1), 5)
    475 
    476     def test_getsample(self):
    477         for w in 1, 2, 3, 4:
    478             data = packs[w](0, 1, -1, maxvalues[w], minvalues[w])
    479             self.assertEqual(audioop.getsample(data, w, 0), 0)
    480             self.assertEqual(audioop.getsample(bytearray(data), w, 0), 0)
    481             self.assertEqual(audioop.getsample(memoryview(data), w, 0), 0)
    482             self.assertEqual(audioop.getsample(data, w, 1), 1)
    483             self.assertEqual(audioop.getsample(data, w, 2), -1)
    484             self.assertEqual(audioop.getsample(data, w, 3), maxvalues[w])
    485             self.assertEqual(audioop.getsample(data, w, 4), minvalues[w])
    486 
    487     def test_byteswap(self):
    488         swapped_datas = {
    489             1: datas[1],
    490             2: packs[2](0, 0x3412, 0x6745, -0x6646, -0x81, 0x80, -1),
    491             3: packs[3](0, 0x563412, -0x7698bb, 0x7798ba, -0x81, 0x80, -1),
    492             4: packs[4](0, 0x78563412, -0x547698bb, 0x557698ba,
    493                         -0x81, 0x80, -1),
    494         }
    495         for w in 1, 2, 3, 4:
    496             self.assertEqual(audioop.byteswap(b'', w), b'')
    497             self.assertEqual(audioop.byteswap(datas[w], w), swapped_datas[w])
    498             self.assertEqual(audioop.byteswap(swapped_datas[w], w), datas[w])
    499             self.assertEqual(audioop.byteswap(bytearray(datas[w]), w),
    500                              swapped_datas[w])
    501             self.assertEqual(audioop.byteswap(memoryview(datas[w]), w),
    502                              swapped_datas[w])
    503 
    504     def test_negativelen(self):
    505         # from issue 3306, previously it segfaulted
    506         self.assertRaises(audioop.error,
    507             audioop.findmax, bytes(range(256)), -2392392)
    508 
    509     def test_issue7673(self):
    510         state = None
    511         for data, size in INVALID_DATA:
    512             size2 = size
    513             self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
    514             self.assertRaises(audioop.error, audioop.max, data, size)
    515             self.assertRaises(audioop.error, audioop.minmax, data, size)
    516             self.assertRaises(audioop.error, audioop.avg, data, size)
    517             self.assertRaises(audioop.error, audioop.rms, data, size)
    518             self.assertRaises(audioop.error, audioop.avgpp, data, size)
    519             self.assertRaises(audioop.error, audioop.maxpp, data, size)
    520             self.assertRaises(audioop.error, audioop.cross, data, size)
    521             self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
    522             self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
    523             self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
    524             self.assertRaises(audioop.error, audioop.add, data, data, size)
    525             self.assertRaises(audioop.error, audioop.bias, data, size, 0)
    526             self.assertRaises(audioop.error, audioop.reverse, data, size)
    527             self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
    528             self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
    529             self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
    530             self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
    531             self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
    532 
    533     def test_string(self):
    534         data = 'abcd'
    535         size = 2
    536         self.assertRaises(TypeError, audioop.getsample, data, size, 0)
    537         self.assertRaises(TypeError, audioop.max, data, size)
    538         self.assertRaises(TypeError, audioop.minmax, data, size)
    539         self.assertRaises(TypeError, audioop.avg, data, size)
    540         self.assertRaises(TypeError, audioop.rms, data, size)
    541         self.assertRaises(TypeError, audioop.avgpp, data, size)
    542         self.assertRaises(TypeError, audioop.maxpp, data, size)
    543         self.assertRaises(TypeError, audioop.cross, data, size)
    544         self.assertRaises(TypeError, audioop.mul, data, size, 1.0)
    545         self.assertRaises(TypeError, audioop.tomono, data, size, 0.5, 0.5)
    546         self.assertRaises(TypeError, audioop.tostereo, data, size, 0.5, 0.5)
    547         self.assertRaises(TypeError, audioop.add, data, data, size)
    548         self.assertRaises(TypeError, audioop.bias, data, size, 0)
    549         self.assertRaises(TypeError, audioop.reverse, data, size)
    550         self.assertRaises(TypeError, audioop.lin2lin, data, size, size)
    551         self.assertRaises(TypeError, audioop.ratecv, data, size, 1, 1, 1, None)
    552         self.assertRaises(TypeError, audioop.lin2ulaw, data, size)
    553         self.assertRaises(TypeError, audioop.lin2alaw, data, size)
    554         self.assertRaises(TypeError, audioop.lin2adpcm, data, size, None)
    555 
    556     def test_wrongsize(self):
    557         data = b'abcdefgh'
    558         state = None
    559         for size in (-1, 0, 5, 1024):
    560             self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
    561             self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
    562             self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
    563 
    564 if __name__ == '__main__':
    565     unittest.main()
    566