comparison tests/test_AudioSource.py @ 240:173ffca58d23

Read data from all available channels in AudioSource
author Amine Sehili <amine.sehili@gmail.com>
date Thu, 25 Jul 2019 20:50:52 +0100
parents f16fc2c3d12b
children 10b725735637
comparison
equal deleted inserted replaced
239:6c3b56eb8052 240:173ffca58d23
10 DATA_FORMAT, 10 DATA_FORMAT,
11 BufferAudioSource, 11 BufferAudioSource,
12 RawAudioSource, 12 RawAudioSource,
13 WaveAudioSource, 13 WaveAudioSource,
14 ) 14 )
15 from test_util import PURE_TONE_DICT 15 from test_util import PURE_TONE_DICT, _sample_generator
16 16
17 17
18 def audio_source_read_all_gen(audio_source, size=None): 18 def audio_source_read_all_gen(audio_source, size=None):
19 if size is None: 19 if size is None:
20 size = int(audio_source.sr * 0.1) # 100ms 20 size = int(audio_source.sr * 0.1) # 100ms
29 class TestAudioSource(unittest.TestCase): 29 class TestAudioSource(unittest.TestCase):
30 30
31 # TODO when use_channel is None, return samples from all channels 31 # TODO when use_channel is None, return samples from all channels
32 32
33 @genty_dataset( 33 @genty_dataset(
34 mono_default=("mono_400Hz", 1, None, 400), 34 mono=("mono_400Hz", (400,)),
35 mono_mix=("mono_400Hz", 1, "mix", 400), 35 multichannel=("3channel_400-800-1600Hz", (400, 800, 1600)),
36 mono_channel_selection=("mono_400Hz", 1, 2, 400),
37 multichannel_default=("3channel_400-800-1600Hz", 3, None, 400),
38 multichannel_channel_select_1st=("3channel_400-800-1600Hz", 3, 1, 400),
39 multichannel_channel_select_2nd=("3channel_400-800-1600Hz", 3, 2, 800),
40 multichannel_channel_select_3rd=(
41 "3channel_400-800-1600Hz",
42 3,
43 3,
44 1600,
45 ),
46 ) 36 )
47 def test_BufferAudioSource_read_all( 37 def test_BufferAudioSource_read_all(self, file_suffix, frequencies):
48 self, file_suffix, channels, use_channel, frequency
49 ):
50 file = "tests/data/test_16KHZ_{}.raw".format(file_suffix) 38 file = "tests/data/test_16KHZ_{}.raw".format(file_suffix)
51 with open(file, "rb") as fp: 39 with open(file, "rb") as fp:
52 expected = fp.read() 40 expected = fp.read()
53 audio_source = BufferAudioSource(expected, 16000, 2, channels) 41 channels = len(frequencies)
54 audio_source.open() 42 audio_source = BufferAudioSource(expected, 16000, 2, channels)
55 data = audio_source.read(None) 43 audio_source.open()
56 self.assertEqual(data, expected) 44 data = audio_source.read(None)
57 audio_source.rewind() 45 self.assertEqual(data, expected)
58 data = audio_source.read(-10) 46 audio_source.rewind()
59 self.assertEqual(data, expected) 47 data = audio_source.read(-10)
60 audio_source.close() 48 self.assertEqual(data, expected)
61 49 audio_source.close()
62 50
63 @genty_dataset( 51 @genty_dataset(
64 mono_default=("mono_400Hz", 1, None, 400), 52 mono=("mono_400Hz", (400,)),
65 mono_mix=("mono_400Hz", 1, "mix", 400), 53 multichannel=("3channel_400-800-1600Hz", (400, 800, 1600)),
66 mono_channel_selection=("mono_400Hz", 1, 2, 400),
67 multichannel_default=("3channel_400-800-1600Hz", 3, None, 400),
68 multichannel_channel_select_1st=("3channel_400-800-1600Hz", 3, 1, 400),
69 multichannel_channel_select_2nd=("3channel_400-800-1600Hz", 3, 2, 800),
70 multichannel_channel_select_3rd=(
71 "3channel_400-800-1600Hz",
72 3,
73 3,
74 1600,
75 ),
76 ) 54 )
77 def test_RawAudioSource( 55 def test_RawAudioSource(self, file_suffix, frequencies):
78 self, file_suffix, channels, use_channel, frequency
79 ):
80 file = "tests/data/test_16KHZ_{}.raw".format(file_suffix) 56 file = "tests/data/test_16KHZ_{}.raw".format(file_suffix)
81 audio_source = RawAudioSource(file, 16000, 2, channels, use_channel) 57 channels = len(frequencies)
58 audio_source = RawAudioSource(file, 16000, 2, channels)
82 audio_source.open() 59 audio_source.open()
83 data = b"".join(audio_source_read_all_gen(audio_source)) 60 data_read_all = b"".join(audio_source_read_all_gen(audio_source))
84 audio_source.close() 61 audio_source.close()
85 expected = _array_to_bytes(PURE_TONE_DICT[frequency]) 62 mono_channels = [PURE_TONE_DICT[freq] for freq in frequencies]
86 self.assertEqual(data, expected) 63 fmt = DATA_FORMAT[audio_source.sample_width]
64 expected = _array_to_bytes(
65 array(fmt, _sample_generator(*mono_channels))
66 )
67
68 self.assertEqual(data_read_all, expected)
87 69
88 # assert read all data with None 70 # assert read all data with None
89 audio_source = RawAudioSource(file, 16000, 2, channels, use_channel) 71 audio_source = RawAudioSource(file, 16000, 2, channels)
90 audio_source.open() 72 audio_source.open()
91 data_read_all = audio_source.read(None) 73 data_read_all = audio_source.read(None)
92 audio_source.close() 74 audio_source.close()
93 self.assertEqual(data_read_all, expected) 75 self.assertEqual(data_read_all, expected)
94 76
95 # assert read all data with a negative size 77 # assert read all data with a negative size
96 audio_source = RawAudioSource(file, 16000, 2, channels, use_channel) 78 audio_source = RawAudioSource(file, 16000, 2, channels)
97 audio_source.open() 79 audio_source.open()
98 data_read_all = audio_source.read(-10) 80 data_read_all = audio_source.read(-10)
99 audio_source.close() 81 audio_source.close()
100 self.assertEqual(data_read_all, expected) 82 self.assertEqual(data_read_all, expected)
101 83
102 84 @genty_dataset(
103 def test_RawAudioSource_mix(self): 85 mono=("mono_400Hz", (400,)),
104 file = "tests/data/test_16KHZ_3channel_400-800-1600Hz.raw" 86 multichannel=("3channel_400-800-1600Hz", (400, 800, 1600)),
105 audio_source = RawAudioSource(file, 16000, 2, 3, use_channel="mix") 87 )
88 def test_WaveAudioSource(self, file_suffix, frequencies):
89 file = "tests/data/test_16KHZ_{}.wav".format(file_suffix)
90 audio_source = WaveAudioSource(file)
106 audio_source.open() 91 audio_source.open()
107 data = b"".join(audio_source_read_all_gen(audio_source)) 92 data = b"".join(audio_source_read_all_gen(audio_source))
108 audio_source.close() 93 audio_source.close()
109 94 mono_channels = [PURE_TONE_DICT[freq] for freq in frequencies]
110 mono_channels = [PURE_TONE_DICT[freq] for freq in [400, 800, 1600]] 95 fmt = DATA_FORMAT[audio_source.sample_width]
111 fmt = DATA_FORMAT[2]
112 expected = _array_to_bytes( 96 expected = _array_to_bytes(
113 array(fmt, (sum(samples) // 3 for samples in zip(*mono_channels))) 97 array(fmt, _sample_generator(*mono_channels))
114 ) 98 )
115 expected = expected 99
116 self.assertEqual(data, expected) 100 self.assertEqual(data, expected)
117 101
118 @genty_dataset(
119 mono_default=("mono_400Hz", 1, None, 400),
120 mono_mix=("mono_400Hz", 1, "mix", 400),
121 mono_channel_selection=("mono_400Hz", 1, 2, 400),
122 multichannel_default=("3channel_400-800-1600Hz", 3, None, 400),
123 multichannel_channel_select_1st=("3channel_400-800-1600Hz", 3, 1, 400),
124 multichannel_channel_select_2nd=("3channel_400-800-1600Hz", 3, 2, 800),
125 multichannel_channel_select_3rd=(
126 "3channel_400-800-1600Hz",
127 3,
128 3,
129 1600,
130 ),
131 )
132 def test_WaveAudioSource(
133 self, file_suffix, channels, use_channel, frequency
134 ):
135 file = "tests/data/test_16KHZ_{}.wav".format(file_suffix)
136 audio_source = WaveAudioSource(file, use_channel)
137 audio_source.open()
138 data = b"".join(audio_source_read_all_gen(audio_source))
139 audio_source.close()
140 expected = _array_to_bytes(PURE_TONE_DICT[frequency])
141 self.assertEqual(data, expected)
142
143 # assert read all data with None 102 # assert read all data with None
144 audio_source = WaveAudioSource(file, use_channel) 103 audio_source = WaveAudioSource(file)
145 audio_source.open() 104 audio_source.open()
146 data_read_all = audio_source.read(None) 105 data_read_all = audio_source.read(None)
147 audio_source.close() 106 audio_source.close()
148 self.assertEqual(data_read_all, expected) 107 self.assertEqual(data_read_all, expected)
149 108
150 # assert read all data with a negative size 109 # assert read all data with a negative size
151 audio_source = WaveAudioSource(file, use_channel) 110 audio_source = WaveAudioSource(file)
152 audio_source.open() 111 audio_source.open()
153 data_read_all = audio_source.read(-10) 112 data_read_all = audio_source.read(-10)
154 audio_source.close() 113 audio_source.close()
155 self.assertEqual(data_read_all, expected) 114 self.assertEqual(data_read_all, expected)
156
157 def test_WaveAudioSource_mix(self):
158 file = "tests/data/test_16KHZ_3channel_400-800-1600Hz.wav"
159 audio_source = WaveAudioSource(file, use_channel="mix")
160 audio_source.open()
161 data = b"".join(audio_source_read_all_gen(audio_source))
162 audio_source.close()
163
164 mono_channels = [PURE_TONE_DICT[freq] for freq in [400, 800, 1600]]
165 fmt = DATA_FORMAT[2]
166 expected = _array_to_bytes(
167 array(fmt, (sum(samples) // 3 for samples in zip(*mono_channels)))
168 )
169 self.assertEqual(data, expected)
170 115
171 116
172 @genty 117 @genty
173 class TestBufferAudioSource_SR10_SW1_CH1(unittest.TestCase): 118 class TestBufferAudioSource_SR10_SW1_CH1(unittest.TestCase):
174 def setUp(self): 119 def setUp(self):