[ca99325] | 1 | #! /usr/bin/env python |
---|
| 2 | |
---|
| 3 | """A brute force test using `sink` to create and write samples to a stereo |
---|
| 4 | file, then `source` to check the correct content is read from the files.""" |
---|
| 5 | |
---|
| 6 | import os.path |
---|
| 7 | import unittest |
---|
| 8 | import aubio |
---|
| 9 | import numpy as np |
---|
| 10 | from numpy.testing import assert_equal |
---|
[263dd04] | 11 | from utils import get_tmp_sink_path |
---|
[ca99325] | 12 | |
---|
| 13 | class aubio_source_test_case(unittest.TestCase): |
---|
| 14 | |
---|
| 15 | def test_read_from_mono(self): |
---|
| 16 | out = get_tmp_sink_path() |
---|
| 17 | samplerate = 44100 |
---|
| 18 | hop_size = 256 |
---|
| 19 | blocks = 10 |
---|
| 20 | channels = 1 |
---|
| 21 | write_samples = np.ones([channels, hop_size], dtype=aubio.float_type) |
---|
| 22 | write_samples *= .5 |
---|
| 23 | self.check_write_and_read(samplerate, channels, hop_size, blocks, |
---|
| 24 | write_samples) |
---|
| 25 | |
---|
| 26 | def test_read_from_stereo(self): |
---|
| 27 | out = get_tmp_sink_path() |
---|
| 28 | samplerate = 44100 |
---|
| 29 | hop_size = 256 |
---|
| 30 | blocks = 10 |
---|
| 31 | channels = 1 |
---|
| 32 | write_samples = np.ones([channels, hop_size], dtype=aubio.float_type) |
---|
| 33 | write_samples *= .5 |
---|
| 34 | self.check_write_and_read(samplerate, channels, hop_size, blocks, |
---|
| 35 | write_samples) |
---|
| 36 | |
---|
| 37 | def test_read_from_half_stereo(self): |
---|
| 38 | samplerate = 16000 |
---|
| 39 | channels = 2 |
---|
| 40 | hop_size = 512 |
---|
| 41 | blocks = 10 |
---|
| 42 | write_samples = np.ones([channels, hop_size], dtype=aubio.float_type) |
---|
| 43 | write_samples *= .5 |
---|
| 44 | write_samples[1, :] = 0 |
---|
| 45 | self.check_write_and_read(samplerate, channels, hop_size, blocks, |
---|
| 46 | write_samples) |
---|
| 47 | |
---|
| 48 | def test_read_from_cancelling_channels(self): |
---|
| 49 | samplerate = 16000 |
---|
| 50 | channels = 2 |
---|
| 51 | hop_size = 512 |
---|
| 52 | blocks = 10 |
---|
| 53 | write_samples = np.ones([channels, hop_size], dtype=aubio.float_type) |
---|
| 54 | write_samples *= .5 |
---|
| 55 | write_samples[1] *= -1 |
---|
| 56 | self.check_write_and_read(samplerate, channels, hop_size, blocks, |
---|
| 57 | write_samples) |
---|
| 58 | |
---|
| 59 | def test_read_from_strange_three_channels(self): |
---|
| 60 | samplerate = 8000 |
---|
| 61 | channels = 3 |
---|
| 62 | hop_size = 123 |
---|
| 63 | blocks = 10 |
---|
| 64 | write_samples = np.ones([channels, hop_size], dtype=aubio.float_type) |
---|
| 65 | write_samples *= .5 |
---|
| 66 | write_samples[1, :] = 0 |
---|
| 67 | self.check_write_and_read(samplerate, channels, hop_size, blocks, |
---|
| 68 | write_samples) |
---|
| 69 | |
---|
| 70 | def check_write_and_read(self, samplerate, channels, |
---|
| 71 | hop_size, blocks, write_samples): |
---|
| 72 | expected_mono = np.sum(write_samples, axis=0)/write_samples.shape[0] |
---|
| 73 | out = get_tmp_sink_path() |
---|
| 74 | snk = aubio.sink(out, samplerate, channels=channels) |
---|
| 75 | for i in range(blocks): |
---|
| 76 | snk.do_multi(write_samples, hop_size) |
---|
| 77 | # close the sink before reading from it |
---|
| 78 | snk.close() |
---|
| 79 | |
---|
| 80 | src = aubio.source(out, samplerate, hop_size) |
---|
| 81 | for i in range(blocks): |
---|
| 82 | read_samples, read = src.do_multi() |
---|
| 83 | assert_equal (read_samples, write_samples) |
---|
| 84 | assert_equal (read, hop_size) |
---|
| 85 | |
---|
| 86 | src.seek(0) |
---|
| 87 | for i in range(blocks): |
---|
| 88 | read_samples, read = src() |
---|
| 89 | assert_equal (read, hop_size) |
---|
| 90 | assert_equal (read_samples, expected_mono) |
---|
| 91 | |
---|
| 92 | if __name__ == '__main__': |
---|
| 93 | unittest.main() |
---|