History

Merge branch 'master' into feature/pitchshift

Paul Brossier committed 7 years ago

Commit d0f19a72 parents 34d4232 0045668101 files · +1797 −1448Browse files

Unified · Split

101 files
  1. .appveyor.yml +1 −1
  2. .circleci/config.yml +8 −8
  3. .gitignore +2 −0
  4. .travis.yml +1 −0
  5. MANIFEST.in +1 −3
  6. Makefile +4 −6
  7. doc/py_analysis.rst +15 −0
  8. doc/py_spectral.rst +34 −0
  9. doc/py_synth.rst +9 −0
  10. doc/py_temporal.rst +8 −0
  11. doc/python.rst +4 −0
  12. doc/python_module.rst +8 −7
  13. examples/aubiomfcc.c +1 −1
  14. examples/aubionotes.c +1 −1
  15. examples/aubioonset.c +1 −1
  16. examples/aubiopitch.c +1 −1
  17. examples/aubioquiet.c +1 −1
  18. examples/aubiotrack.c +1 −1
  19. nose2.cfg +0 −6
  20. python/README.md +1 −1
  21. python/ext/aubio-docstrings.h +143 −0
  22. python/ext/aubio-types.h +1 −0
  23. python/ext/aubiomodule.c +2 −2
  24. python/ext/py-cvec.c +1 −1
  25. python/ext/py-fft.c +19 −1
  26. python/ext/py-filter.c +55 −4
  27. python/ext/py-filterbank.c +209 −9
  28. python/ext/py-musicutils.c +10 −10
  29. python/lib/gen_code.py +13 −3
  30. python/tests/__init__.py +0 −1
  31. python/tests/_tools.py +41 −0
  32. python/tests/run_all_tests +0 −5
  33. python/tests/test_aubio.py +1 −2
  34. python/tests/test_aubio_cmd.py +2 −2
  35. python/tests/test_aubio_cut.py +1 −1
  36. python/tests/test_cvec.py +1 −1
  37. python/tests/test_dct.py +4 −0
  38. python/tests/test_fft.py +1 −1
  39. python/tests/test_filter.py +2 −2
  40. python/tests/test_filterbank.py +3 −3
  41. python/tests/test_filterbank_mel.py +14 −15
  42. python/tests/test_fvec.py +1 −1
  43. python/tests/test_fvec_shift.py +1 −1
  44. python/tests/test_hztomel.py +11 −8
  45. python/tests/test_mathutils.py +1 −1
  46. python/tests/test_mfcc.py +17 −21
  47. python/tests/test_midi2note.py +11 −12
  48. python/tests/test_musicutils.py +2 −2
  49. python/tests/test_note2midi.py +24 −19
  50. python/tests/test_notes.py +6 −7
  51. python/tests/test_onset.py +1 −1
  52. python/tests/test_phasevoc.py +13 −8
  53. python/tests/test_pitch.py +5 −5
  54. python/tests/test_sink.py +16 −22
  55. python/tests/test_slicing.py +3 −3
  56. python/tests/test_source.py +56 −53
  57. python/tests/test_source_channels.py +1 −1
  58. python/tests/test_specdesc.py +1 −1
  59. python/tests/test_zero_crossing_rate.py +1 −1
  60. python/tests/utils.py +6 −12
  61. requirements.txt +1 −1
  62. scripts/get_waf.sh +1 −1
  63. setup.py +0 −4
  64. src/aubio_priv.h +7 −0
  65. src/io/ioutils.c +36 −0
  66. src/io/ioutils.h +27 −0
  67. src/io/sink.c +4 −4
  68. src/io/sink_apple_audio.c +62 −42
  69. src/io/sink_sndfile.c +27 −39
  70. src/io/sink_wavwrite.c +24 −29
  71. src/io/source.c +4 −3
  72. src/io/source.h +0 −1
  73. src/io/source_apple_audio.c +30 −45
  74. src/io/source_avcodec.c +10 −2
  75. src/io/source_sndfile.c +1 −2
  76. src/io/source_wavread.c +1 −2
  77. src/io/utils_apple_audio.c +4 −3
  78. tests/src/io/base-sink_custom.h +167 −0
  79. tests/src/io/base-source_custom.h +125 −0
  80. tests/src/io/test-sink-multi.c +0 −72
  81. tests/src/io/test-sink.c +121 −28
  82. tests/src/io/test-sink_apple_audio-multi.c +0 −78
  83. tests/src/io/test-sink_apple_audio.c +19 −57
  84. tests/src/io/test-sink_sndfile-multi.c +0 −78
  85. tests/src/io/test-sink_sndfile.c +19 −57
  86. tests/src/io/test-sink_wavwrite-multi.c +0 −78
  87. tests/src/io/test-sink_wavwrite.c +19 −57
  88. tests/src/io/test-source.c +58 −8
  89. tests/src/io/test-source_apple_audio.c +20 −53
  90. tests/src/io/test-source_avcodec.c +20 −53
  91. tests/src/io/test-source_multi.c +0 −57
  92. tests/src/io/test-source_seek.c +0 −92
  93. tests/src/io/test-source_sndfile.c +20 −53
  94. tests/src/io/test-source_wavread.c +20 −53
  95. tests/src/onset/test-onset.c +9 −12
  96. tests/src/spectral/test-mfcc.c +80 −21
  97. tests/src/tempo/test-tempo.c +7 −14
  98. tests/src/temporal/test-filter.c +7 −12
  99. tests/src/test-delnull.c +0 −24
  100. tests/utils_tests.h +11 −12
  101. wscript +34 −21
.appveyor.yml+1−1
@@ -75,4 +75,4 @@ build_script: · 74 unmodified lines
75 75
76test_script:76test_script:
77 - "python python\\demos\\demo_create_test_sounds.py"77 - "python python\\demos\\demo_create_test_sounds.py"
78 - "nose2 --verbose"78 - "pytest --verbose"
.circleci/config.yml+8−8
@@ -19,16 +19,16 @@ install-wheel: &install-wheel · 18 unmodified lines
19 command: |19 command: |
20 pip install --user dist/aubio*.whl20 pip install --user dist/aubio*.whl
21 21
22test-nose2: &test-nose222test-pytest: &test-pytest
23 name: Test python wheel23 name: Test python wheel
24 command: |24 command: |
25 make create_test_sounds25 make create_test_sounds
26 PATH=/home/circleci/.local/bin:$PATH nose2 -v26 PATH=/home/circleci/.local/bin:$PATH pytest -v
27 27
28test-nose2-nosounds: &test-nose2-nosounds28test-pytest-nosounds: &test-pytest-nosounds
29 name: Test python wheel29 name: Test python wheel
30 command: |30 command: |
31 PATH=/home/circleci/.local/bin:$PATH nose2 -v31 PATH=/home/circleci/.local/bin:$PATH pytest -v
32 32
33uninstall-wheel: &uninstall-wheel33uninstall-wheel: &uninstall-wheel
34 name: Uninstall python wheel34 name: Uninstall python wheel
@@ -47,7 +47,7 @@ jobs: · 12 unmodified lines
47 - run: *pip-install47 - run: *pip-install
48 - run: *build-wheel48 - run: *build-wheel
49 - run: *install-wheel49 - run: *install-wheel
50 - run: *test-nose250 - run: *test-pytest
51 - run: *uninstall-wheel51 - run: *uninstall-wheel
52 - store_artifacts:52 - store_artifacts:
53 path: dist/53 path: dist/
@@ -61,7 +61,7 @@ jobs: · 7 unmodified lines
61 - run: *pip-install61 - run: *pip-install
62 - run: *build-wheel62 - run: *build-wheel
63 - run: *install-wheel63 - run: *install-wheel
64 - run: *test-nose264 - run: *test-pytest
65 - run: *uninstall-wheel65 - run: *uninstall-wheel
66 - store_artifacts:66 - store_artifacts:
67 path: dist/67 path: dist/
@@ -75,7 +75,7 @@ jobs: · 7 unmodified lines
75 - run: *pip-install75 - run: *pip-install
76 - run: *build-wheel76 - run: *build-wheel
77 - run: *install-wheel77 - run: *install-wheel
78 - run: *test-nose278 - run: *test-pytest
79 - run: *uninstall-wheel79 - run: *uninstall-wheel
80 - store_artifacts:80 - store_artifacts:
81 path: dist/81 path: dist/
@@ -88,7 +88,7 @@ jobs: · 6 unmodified lines
88 - run: *pip-install88 - run: *pip-install
89 - run: *build-wheel89 - run: *build-wheel
90 - run: *install-wheel90 - run: *install-wheel
91 - run: *test-nose2-nosounds91 - run: *test-pytest-nosounds
92 - run: *uninstall-wheel92 - run: *uninstall-wheel
93 - store_artifacts:93 - store_artifacts:
94 path: dist/94 path: dist/
.gitignore+2−0
@@ -5,6 +5,8 @@ · 4 unmodified lines
5# gcov generated files5# gcov generated files
6*.gcno6*.gcno
7*.gcda7*.gcda
8python/lib/aubio/_aubio.*.so
9.coverage
8 10
9# ignore compiled examples11# ignore compiled examples
10RE:examples/[a-z]*12RE:examples/[a-z]*
.travis.yml+1−0
@@ -88,6 +88,7 @@ install: · 87 unmodified lines
88 - travis_retry make getwaf expandwaf deps_python88 - travis_retry make getwaf expandwaf deps_python
89 - which pip89 - which pip
90 - pip --version90 - pip --version
91 - pip install coverage
91 92
92script:93script:
93 - make create_test_sounds94 - make create_test_sounds
MANIFEST.in+1−3
@@ -6,16 +6,14 @@ include waf · 5 unmodified lines
6recursive-include waflib *.py6recursive-include waflib *.py
7include Makefile wscript */wscript_build7include Makefile wscript */wscript_build
8include aubio.pc.in8include aubio.pc.in
9include nose2.cfg
10include requirements.txt9include requirements.txt
11include src/*.c src/*.h10include src/*.c src/*.h
12include src/*/*.c src/*/*.h11include src/*/*.c src/*/*.h
13include examples/*.c examples/*.h12include examples/*.c examples/*.h
14include tests/*.h tests/*/*.c tests/*/*/*.c13recursive-include tests *.h *.c *.py
15include python/ext/*.h14include python/ext/*.h
16recursive-include python *.py15recursive-include python *.py
17include python/README.md16include python/README.md
18include python/tests/run_all_tests
19include python/tests/eval_pitch17include python/tests/eval_pitch
20include python/tests/*.expected18include python/tests/*.expected
21include doc/*.txt doc/*.rst doc/*.cfg doc/Makefile doc/make.bat doc/conf.py19include doc/*.txt doc/*.rst doc/*.cfg doc/Makefile doc/make.bat doc/conf.py
Makefile+4−6
@@ -35,8 +35,8 @@ INCLUDEDIR?=$(PREFIX)/include · 34 unmodified lines
35DATAROOTDIR?=$(PREFIX)/share35DATAROOTDIR?=$(PREFIX)/share
36MANDIR?=$(DATAROOTDIR)/man36MANDIR?=$(DATAROOTDIR)/man
37 37
38# default nose2 command38# default python test command
39NOSE2?=nose2 -N 4 --verbose39PYTEST?=pytest --verbose
40 40
41SOX=sox41SOX=sox
42 42
@@ -140,9 +140,7 @@ test_python: export LD_LIBRARY_PATH=$(DESTDIR)/$(LIBDIR) · 97 unmodified lines
140test_python: export PYTHONPATH=$(PYDESTDIR)/$(LIBDIR)140test_python: export PYTHONPATH=$(PYDESTDIR)/$(LIBDIR)
141test_python: local_dylib141test_python: local_dylib
142 # run test with installed package142 # run test with installed package
143 # ./python/tests/run_all_tests --verbose143 $(PYTEST)
144 # run with nose2, multiple processes
145 $(NOSE2)
146 144
147clean_python:145clean_python:
148 ./setup.py clean146 ./setup.py clean
@@ -253,7 +251,7 @@ coverage: force_uninstall_python deps_python \ · 104 unmodified lines
253 # build and test python251 # build and test python
254 pip install -v -e .252 pip install -v -e .
255 # run tests, with python coverage253 # run tests, with python coverage
256 coverage run `which nose2`254 coverage run `which pytest`
257 # capture coverage again255 # capture coverage again
258 lcov $(LCOVOPTS) --capture --no-external --directory . \256 lcov $(LCOVOPTS) --capture --no-external --directory . \
259 --output-file build/coverage_python.info257 --output-file build/coverage_python.info
doc/py_analysis.rst+15−0
@@ -0,0 +1,15 @@
1.. currentmodule:: aubio
2.. default-domain:: py
3
4Analysis
5--------
6
7.. members of generated classes are not shown
8
9.. autoclass:: onset
10
11.. autoclass:: pitch
12
13.. autoclass:: tempo
14
15.. autoclass:: notes
doc/py_spectral.rst+34−0
@@ -0,0 +1,34 @@
1.. currentmodule:: aubio
2.. default-domain:: py
3
4.. members of generated classes are not yet documented
5
6Spectral features
7-----------------
8
9This section contains the documentation for:
10
11- :class:`dct`
12- :class:`fft`
13- :class:`filterbank`
14- :class:`mfcc`
15- :class:`pvoc`
16- :class:`specdesc`
17- :class:`tss`
18
19.. autoclass:: dct
20
21.. autoclass:: fft
22 :members:
23
24.. autoclass:: filterbank
25 :members:
26
27.. autoclass:: mfcc
28
29.. autoclass:: pvoc
30 :members:
31
32.. autoclass:: specdesc
33
34.. autoclass:: tss
doc/py_synth.rst+9−0
@@ -0,0 +1,9 @@
1.. currentmodule:: aubio
2.. default-domain:: py
3
4Synthesis
5---------
6
7.. autoclass:: sampler
8
9.. autoclass:: wavetable
doc/py_temporal.rst+8−0
@@ -0,0 +1,8 @@
1.. currentmodule:: aubio
2.. default-domain:: py
3
4Digital filters
5---------------
6
7.. autoclass:: digital_filter
8 :members:
doc/python.rst+4−0
@@ -30,6 +30,10 @@ Contents · 29 unmodified lines
30 30
31 py_datatypes31 py_datatypes
32 py_io32 py_io
33 py_temporal
34 py_spectral
35 py_analysis
36 py_synth
33 py_utils37 py_utils
34 py_examples38 py_examples
35 39
doc/python_module.rst+8−7
@@ -89,14 +89,15 @@ The command line `aubio` is also installed: · 88 unmodified lines
89Python tests89Python tests
90------------90------------
91 91
92A number of Python tests are provided in the `python tests`_. To run them,92A number of Python tests are provided in the `python/tests`_ folder. To run
93install `nose2`_ and run the script ``python/tests/run_all_tests``:93them, install `pytest`_ and run it from the aubio source directory:
94 94
95.. code-block:: console95.. code-block:: console
96 96
97 $ pip install nose297 $ pip install pytest
98 $ ./python/tests/run_all_tests98 $ git clone https://git.aubio.org/aubio/aubio
99 $ cd aubio
100 $ pytest
99 101
100.. _demo_filter.py: https://github.com/aubio/aubio/blob/master/python/demos/demo_filter.py102.. _python/tests: https://github.com/aubio/aubio/blob/master/python/tests
101.. _python tests: https://github.com/aubio/aubio/blob/master/python/tests103.. _pytest: https://pytest.org
102.. _nose2: https://github.com/nose-devs/nose2
examples/aubiomfcc.c+1−1
@@ -68,7 +68,7 @@ int main(int argc, char **argv) { · 67 unmodified lines
68 goto beach;68 goto beach;
69 }69 }
70 70
71 examples_common_process((aubio_process_func_t)process_block, process_print);71 examples_common_process(process_block, process_print);
72 72
73 del_aubio_pvoc (pv);73 del_aubio_pvoc (pv);
74 del_cvec (fftgrain);74 del_cvec (fftgrain);
examples/aubionotes.c+1−1
@@ -90,7 +90,7 @@ int main(int argc, char **argv) { · 89 unmodified lines
90 }90 }
91 }91 }
92 92
93 examples_common_process((aubio_process_func_t)process_block, process_print);93 examples_common_process(process_block, process_print);
94 94
95 // send a last note off if required95 // send a last note off if required
96 if (lastmidi) {96 if (lastmidi) {
examples/aubioonset.c+1−1
@@ -86,7 +86,7 @@ int main(int argc, char **argv) { · 85 unmodified lines
86 aubio_wavetable_set_freq ( wavetable, 2450.);86 aubio_wavetable_set_freq ( wavetable, 2450.);
87 //aubio_sampler_load (sampler, "/archives/sounds/woodblock.aiff");87 //aubio_sampler_load (sampler, "/archives/sounds/woodblock.aiff");
88 88
89 examples_common_process((aubio_process_func_t)process_block, process_print);89 examples_common_process(process_block, process_print);
90 90
91 // send a last note off91 // send a last note off
92 if (usejack) {92 if (usejack) {
examples/aubiopitch.c+1−1
@@ -79,7 +79,7 @@ int main(int argc, char **argv) { · 78 unmodified lines
79 wavetable = new_aubio_wavetable (samplerate, hop_size);79 wavetable = new_aubio_wavetable (samplerate, hop_size);
80 aubio_wavetable_play ( wavetable );80 aubio_wavetable_play ( wavetable );
81 81
82 examples_common_process((aubio_process_func_t)process_block,process_print);82 examples_common_process(process_block, process_print);
83 83
84 del_aubio_pitch (o);84 del_aubio_pitch (o);
85 del_aubio_wavetable (wavetable);85 del_aubio_wavetable (wavetable);
examples/aubioquiet.c+1−1
@@ -55,7 +55,7 @@ int main(int argc, char **argv) { · 54 unmodified lines
55 verbmsg ("using source: %s at %dHz\n", source_uri, samplerate);55 verbmsg ("using source: %s at %dHz\n", source_uri, samplerate);
56 verbmsg ("buffer_size: %d, ", buffer_size);56 verbmsg ("buffer_size: %d, ", buffer_size);
57 verbmsg ("hop_size: %d\n", hop_size);57 verbmsg ("hop_size: %d\n", hop_size);
58 examples_common_process((aubio_process_func_t)process_block,process_print);58 examples_common_process(process_block, process_print);
59 examples_common_del();59 examples_common_del();
60 return 0;60 return 0;
61}61}
examples/aubiotrack.c+1−1
@@ -87,7 +87,7 @@ int main(int argc, char **argv) { · 86 unmodified lines
87 aubio_wavetable_set_freq ( wavetable, 2450.);87 aubio_wavetable_set_freq ( wavetable, 2450.);
88 //aubio_sampler_load (sampler, "/archives/sounds/woodblock.aiff");88 //aubio_sampler_load (sampler, "/archives/sounds/woodblock.aiff");
89 89
90 examples_common_process((aubio_process_func_t)process_block,process_print);90 examples_common_process(process_block, process_print);
91 91
92 // send a last note off92 // send a last note off
93 if (usejack) {93 if (usejack) {
nose2.cfg+0−6
@@ -1,6 +0,0 @@
1[unittest]
2start-dir = python/tests/
3plugins = nose2.plugins.mp
4
5[multiprocess]
6always-on = false
python/README.md+1−1
@@ -27,7 +27,7 @@ Links · 26 unmodified lines
27Demos27Demos
28-----28-----
29 29
30Some examples are available in the [`python/demos`][demos_dir] folder. Each30Some examples are available in the [`python/demos` folder][demos_dir]. Each
31script is a command line program which accepts one ore more argument.31script is a command line program which accepts one ore more argument.
32 32
33**Notes**: installing additional modules is required to run some of the demos.33**Notes**: installing additional modules is required to run some of the demos.
python/ext/aubio-docstrings.h+143−0
@@ -0,0 +1,143 @@
1#define PYAUBIO_dct_doc \
2 "dct(size=1024)\n"\
3 "\n"\
4 "Compute Discrete Fourier Transorms of Type-II.\n"\
5 "\n"\
6 "Parameters\n"\
7 "----------\n"\
8 "size : int\n"\
9 " size of the DCT to compute\n"\
10 "\n"\
11 "Example\n"\
12 "-------\n"\
13 ">>> d = aubio.dct(16)\n"\
14 ">>> d.size\n"\
15 "16\n"\
16 ">>> x = aubio.fvec(np.ones(d.size))\n"\
17 ">>> d(x)\n"\
18 "array([4., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n"\
19 " dtype=float32)\n"\
20 ">>> d.rdo(d(x))\n"\
21 "array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n"\
22 " dtype=float32)\n"\
23 "\n"\
24 "References\n"\
25 "----------\n"\
26 "`DCT-II in Discrete Cosine Transform\n"\
27 "<https://en.wikipedia.org/wiki/Discrete_cosine_transform#DCT-II>`_\n"\
28 "on Wikipedia.\n"
29
30#define PYAUBIO_mfcc_doc \
31 "mfcc(buf_size=1024, n_filters=40, n_coeffs=13, samplerate=44100)\n"\
32 "\n"\
33 "Compute Mel Frequency Cepstrum Coefficients (MFCC).\n"\
34 "\n"\
35 "`mfcc` creates a callable which takes a `cvec` as input.\n"\
36 "\n"\
37 "If `n_filters = 40`, the filterbank will be initialized with\n"\
38 ":meth:`filterbank.set_mel_coeffs_slaney`. Otherwise, if `n_filters`\n"\
39 "is greater than `0`, it will be initialized with\n"\
40 ":meth:`filterbank.set_mel_coeffs` using `fmin = 0`,\n"\
41 "`fmax = samplerate/`.\n"\
42 "\n"\
43 "Example\n"\
44 "-------\n"\
45 ">>> buf_size = 2048; n_filters = 128; n_coeffs = 13; samplerate = 44100\n"\
46 ">>> mf = aubio.mfcc(buf_size, n_filters, n_coeffs, samplerate)\n"\
47 ">>> fftgrain = aubio.cvec(buf_size)\n"\
48 ">>> mf(fftgrain).shape\n"\
49 "(13,)\n"\
50 ""
51
52#define PYAUBIO_notes_doc \
53 "notes(method=\"default\", buf_size=1024, hop_size=512, samplerate=44100)\n"\
54 "\n"\
55 "Note detection\n"
56
57#define PYAUBIO_onset_doc \
58 "onset(method=\"default\", buf_size=1024, hop_size=512, samplerate=44100)\n"\
59 "\n"\
60 "Onset detection object. `method` should be one of method supported by\n"\
61 ":class:`specdesc`.\n"
62
63#define PYAUBIO_pitch_doc \
64 "pitch(method=\"default\", buf_size=1024, hop_size=512, samplerate=44100)\n"\
65 "\n"\
66 "Pitch detection.\n"\
67 "\n"\
68 "Supported methods: `yinfft`, `yin`, `yinfast`, `fcomb`, `mcomb`,\n"\
69 "`schmitt`, `specacf`, `default` (`yinfft`).\n"
70
71#define PYAUBIO_sampler_doc \
72 "sampler(hop_size=512, samplerate=44100)\n"\
73 "\n"\
74 "Sampler.\n"
75
76#define PYAUBIO_specdesc_doc \
77 "specdesc(method=\"default\", buf_size=1024)\n"\
78 "\n"\
79 "Spectral description functions. Creates a callable that takes a\n"\
80 ":class:`cvec` as input, typically created by :class:`pvoc` for\n"\
81 "overlap and windowing, and returns a single float.\n"\
82 "\n"\
83 "`method` can be any of the values listed below. If `default` is used\n"\
84 "the `hfc` function will be selected.\n"\
85 "\n"\
86 "Onset novelty functions:\n"\
87 "\n"\
88 "- `energy`: local energy,\n"\
89 "- `hfc`: high frequency content,\n"\
90 "- `complex`: complex domain,\n"\
91 "- `phase`: phase-based method,\n"\
92 "- `wphase`: weighted phase deviation,\n"\
93 "- `specdiff`: spectral difference,\n"\
94 "- `kl`: Kullback-Liebler,\n"\
95 "- `mkl`: modified Kullback-Liebler,\n"\
96 "- `specflux`: spectral flux.\n"\
97 "\n"\
98 "Spectral shape functions:\n"\
99 "\n"\
100 "- `centroid`: spectral centroid (barycenter of the norm vector),\n"\
101 "- `spread`: variance around centroid,\n"\
102 "- `skewness`: third order moment,\n"\
103 "- `kurtosis`: a measure of the flatness of the spectrum,\n"\
104 "- `slope`: decreasing rate of the amplitude,\n"\
105 "- `decrease`: perceptual based measurement of the decreasing rate,\n"\
106 "- `rolloff`: 95th energy percentile.\n"\
107 "\n"\
108 "Parameters\n"\
109 "----------\n"\
110 "method : str\n"\
111 " Onset novelty or spectral shape function.\n"\
112 "buf_size : int\n"\
113 " Length of the input frame.\n"\
114 "\n"\
115 "Example\n"\
116 "-------\n"\
117 ">>> win_s = 1024; hop_s = win_s // 2\n"\
118 ">>> pv = aubio.pvoc(win_s, hop_s)\n"\
119 ">>> sd = aubio.specdesc(\"mkl\", win_s)\n"\
120 ">>> sd(pv(aubio.fvec(hop_s))).shape\n"\
121 "(1,)\n"\
122 "\n"\
123 "References\n"\
124 "----------\n"\
125 "`Detailed description "\
126 "<https://aubio.org/doc/latest/specdesc_8h.html#details>`_ in\n"\
127 "`aubio API documentation <https://aubio.org/doc/latest/index.html>`_.\n"\
128 ""
129
130#define PYAUBIO_tempo_doc \
131 "tempo(method=\"default\", buf_size=1024, hop_size=512, samplerate=44100)\n"\
132 "\n"\
133 "Tempo detection and beat tracking.\n"
134
135#define PYAUBIO_tss_doc \
136 "tss(buf_size=1024, hop_size=512)\n"\
137 "\n"\
138 "Transient/Steady-state separation.\n"
139
140#define PYAUBIO_wavetable_doc \
141 "wavetable(samplerate=44100, hop_size=512)\n"\
142 "\n"\
143 "Wavetable synthesis.\n"
python/ext/aubio-types.h+1−0
@@ -1,6 +1,7 @@
1#include <Python.h>1#include <Python.h>
2#include <structmember.h>2#include <structmember.h>
3 3
4#include "aubio-docstrings.h"
4#include "aubio-generated.h"5#include "aubio-generated.h"
5 6
6#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION7#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
python/ext/aubiomodule.c+2−2
@@ -223,7 +223,7 @@ Py_alpha_norm (PyObject * self, PyObject * args) · 222 unmodified lines
223 }223 }
224 224
225 // compute the function225 // compute the function
226 result = Py_BuildValue (AUBIO_NPY_SMPL_CHR, fvec_alpha_norm (&vec, alpha));226 result = PyFloat_FromDouble(fvec_alpha_norm (&vec, alpha));
227 if (result == NULL) {227 if (result == NULL) {
228 return NULL;228 return NULL;
229 }229 }
@@ -319,7 +319,7 @@ Py_zero_crossing_rate (PyObject * self, PyObject * args) · 89 unmodified lines
319 }319 }
320 320
321 // compute the function321 // compute the function
322 result = Py_BuildValue (AUBIO_NPY_SMPL_CHR, aubio_zero_crossing_rate (&vec));322 result = PyFloat_FromDouble(aubio_zero_crossing_rate (&vec));
323 if (result == NULL) {323 if (result == NULL) {
324 return NULL;324 return NULL;
325 }325 }
python/ext/py-cvec.c+1−1
@@ -136,7 +136,7 @@ Py_cvec_repr (Py_cvec * self, PyObject * unused) · 135 unmodified lines
136 goto fail;136 goto fail;
137 }137 }
138 138
139 args = Py_BuildValue ("I", self->length);139 args = PyLong_FromLong(self->length);
140 if (args == NULL) {140 if (args == NULL) {
141 goto fail;141 goto fail;
142 }142 }
python/ext/py-fft.c+19−1
@@ -1,6 +1,24 @@
1#include "aubio-types.h"1#include "aubio-types.h"
2 2
3static char Py_fft_doc[] = "fft object";3static char Py_fft_doc[] = ""
4"fft(size=1024)\n"
5"\n"
6"Compute Fast Fourier Transorms.\n"
7"\n"
8"Parameters\n"
9"----------\n"
10"size : int\n"
11" size of the FFT to compute\n"
12"\n"
13"Example\n"
14"-------\n"
15">>> x = aubio.fvec(512)\n"
16">>> f = aubio.fft(512)\n"
17">>> c = f(x); c\n"
18"aubio cvec of 257 elements\n"
19">>> x2 = f.rdo(c); x2.shape\n"
20"(512,)\n"
21"";
4 22
5typedef struct23typedef struct
6{24{
python/ext/py-filter.c+55−4
@@ -10,7 +10,58 @@ typedef struct · 9 unmodified lines
10 fvec_t c_out;10 fvec_t c_out;
11} Py_filter;11} Py_filter;
12 12
13static char Py_filter_doc[] = "filter object";13static char Py_filter_doc[] = ""
14"digital_filter(order=7)\n"
15"\n"
16"Create a digital filter.\n"
17"";
18
19static char Py_filter_set_c_weighting_doc[] = ""
20"set_c_weighting(samplerate)\n"
21"\n"
22"Set filter coefficients to C-weighting.\n"
23"\n"
24"`samplerate` should be one of 8000, 11025, 16000, 22050, 24000, 32000,\n"
25"44100, 48000, 88200, 96000, or 192000. `order` of the filter should be 5.\n"
26"\n"
27"Parameters\n"
28"----------\n"
29"samplerate : int\n"
30" Sampling-rate of the input signal, in Hz.\n"
31"";
32
33static char Py_filter_set_a_weighting_doc[] = ""
34"set_a_weighting(samplerate)\n"
35"\n"
36"Set filter coefficients to A-weighting.\n"
37"\n"
38"`samplerate` should be one of 8000, 11025, 16000, 22050, 24000, 32000,\n"
39"44100, 48000, 88200, 96000, or 192000. `order` of the filter should be 7.\n"
40"\n"
41"Parameters\n"
42"----------\n"
43"samplerate : int\n"
44" Sampling-rate of the input signal.\n"
45"";
46
47static char Py_filter_set_biquad_doc[] = ""
48"set_biquad(b0, b1, b2, a1, a2)\n"
49"\n"
50"Set biquad coefficients. `order` of the filter should be 3.\n"
51"\n"
52"Parameters\n"
53"----------\n"
54"b0 : float\n"
55" Forward filter coefficient.\n"
56"b1 : float\n"
57" Forward filter coefficient.\n"
58"b2 : float\n"
59" Forward filter coefficient.\n"
60"a1 : float\n"
61" Feedback filter coefficient.\n"
62"a2 : float\n"
63" Feedback filter coefficient.\n"
64"";
14 65
15static PyObject *66static PyObject *
16Py_filter_new (PyTypeObject * type, PyObject * args, PyObject * kwds)67Py_filter_new (PyTypeObject * type, PyObject * args, PyObject * kwds)
@@ -156,11 +207,11 @@ static PyMemberDef Py_filter_members[] = { · 139 unmodified lines
156 207
157static PyMethodDef Py_filter_methods[] = {208static PyMethodDef Py_filter_methods[] = {
158 {"set_c_weighting", (PyCFunction) Py_filter_set_c_weighting, METH_VARARGS,209 {"set_c_weighting", (PyCFunction) Py_filter_set_c_weighting, METH_VARARGS,
159 "set filter coefficients to C-weighting"},210 Py_filter_set_c_weighting_doc},
160 {"set_a_weighting", (PyCFunction) Py_filter_set_a_weighting, METH_VARARGS,211 {"set_a_weighting", (PyCFunction) Py_filter_set_a_weighting, METH_VARARGS,
161 "set filter coefficients to A-weighting"},212 Py_filter_set_a_weighting_doc},
162 {"set_biquad", (PyCFunction) Py_filter_set_biquad, METH_VARARGS,213 {"set_biquad", (PyCFunction) Py_filter_set_biquad, METH_VARARGS,
163 "set b0, b1, b2, a1, a2 biquad coefficients"},214 Py_filter_set_biquad_doc},
164 {NULL}215 {NULL}
165};216};
166 217
python/ext/py-filterbank.c+209−9
@@ -1,6 +1,188 @@
1#include "aubio-types.h"1#include "aubio-types.h"
2 2
3static char Py_filterbank_doc[] = "filterbank object";3static char Py_filterbank_doc[] = ""
4"filterbank(n_filters=40, win_s=1024)\n"
5"\n"
6"Create a bank of spectral filters. Each instance is a callable\n"
7"that holds a matrix of coefficients.\n"
8"\n"
9"See also :meth:`set_mel_coeffs`, :meth:`set_mel_coeffs_htk`,\n"
10":meth:`set_mel_coeffs_slaney`, :meth:`set_triangle_bands`, and\n"
11":meth:`set_coeffs`.\n"
12"\n"
13"Parameters\n"
14"----------\n"
15"n_filters : int\n"
16" Number of filters to create.\n"
17"win_s : int\n"
18" Size of the input spectrum to process.\n"
19"\n"
20"Examples\n"
21"--------\n"
22">>> f = aubio.filterbank(128, 1024)\n"
23">>> f.set_mel_coeffs(44100, 0, 10000)\n"
24">>> c = aubio.cvec(1024)\n"
25">>> f(c).shape\n"
26"(128, )\n"
27"";
28
29static char Py_filterbank_set_triangle_bands_doc[] =""
30"set_triangle_bands(freqs, samplerate)\n"
31"\n"
32"Set triangular bands. The coefficients will be set to triangular\n"
33"overlapping windows using the boundaries specified by `freqs`.\n"
34"\n"
35"`freqs` should contain `n_filters + 2` frequencies in Hz, ordered\n"
36"by value, from smallest to largest. The first element should be greater\n"
37"or equal to zero; the last element should be smaller or equal to\n"
38"`samplerate / 2`.\n"
39"\n"
40"Parameters\n"
41"----------\n"
42"freqs: fvec\n"
43" List of frequencies, in Hz.\n"
44"samplerate : float\n"
45" Sampling-rate of the expected input.\n"
46"\n"
47"Example\n"
48"-------\n"
49">>> fb = aubio.filterbank(n_filters=100, win_s=2048)\n"
50">>> samplerate = 44100; freqs = np.linspace(0, 20200, 102)\n"
51">>> fb.set_triangle_bands(aubio.fvec(freqs), samplerate)\n"
52"";
53
54static char Py_filterbank_set_mel_coeffs_slaney_doc[] = ""
55"set_mel_coeffs_slaney(samplerate)\n"
56"\n"
57"Set coefficients of filterbank to match Slaney's Auditory Toolbox.\n"
58"\n"
59"The filter coefficients will be set as in Malcolm Slaney's\n"
60"implementation. The filterbank should have been created with\n"
61"`n_filters = 40`.\n"
62"\n"
63"This is approximately equivalent to using :meth:`set_mel_coeffs` with\n"
64"`fmin = 400./3., fmax = 6853.84`.\n"
65"\n"
66"Parameters\n"
67"----------\n"
68"samplerate : float\n"
69" Sampling-rate of the expected input.\n"
70"\n"
71"References\n"
72"----------\n"
73"\n"
74"Malcolm Slaney, `Auditory Toolbox Version 2, Technical Report #1998-010\n"
75"<https://engineering.purdue.edu/~malcolm/interval/1998-010/>`_\n"
76"";
77
78static char Py_filterbank_set_mel_coeffs_doc[] = ""
79"set_mel_coeffs(samplerate, fmin, fmax)\n"
80"\n"
81"Set coefficients of filterbank to linearly spaced mel scale.\n"
82"\n"
83"Parameters\n"
84"----------\n"
85"samplerate : float\n"
86" Sampling-rate of the expected input.\n"
87"fmin : float\n"
88" Lower frequency boundary of the first filter.\n"
89"fmax : float\n"
90" Upper frequency boundary of the last filter.\n"
91"\n"
92"See also\n"
93"--------\n"
94"hztomel\n"
95"";
96
97static char Py_filterbank_set_mel_coeffs_htk_doc[] = ""
98"set_mel_coeffs_htk(samplerate, fmin, fmax)\n"
99"\n"
100"Set coefficients of the filters to be linearly spaced in the HTK mel scale.\n"
101"\n"
102"Parameters\n"
103"----------\n"
104"samplerate : float\n"
105" Sampling-rate of the expected input.\n"
106"fmin : float\n"
107" Lower frequency boundary of the first filter.\n"
108"fmax : float\n"
109" Upper frequency boundary of the last filter.\n"
110"\n"
111"See also\n"
112"--------\n"
113"hztomel with `htk=True`\n"
114"";
115
116static char Py_filterbank_get_coeffs_doc[] = ""
117"get_coeffs()\n"
118"\n"
119"Get coefficients matrix of filterbank.\n"
120"\n"
121"Returns\n"
122"-------\n"
123"array_like\n"
124" Array of shape (n_filters, win_s/2+1) containing the coefficients.\n"
125"";
126
127static char Py_filterbank_set_coeffs_doc[] = ""
128"set_coeffs(coeffs)\n"
129"\n"
130"Set coefficients of filterbank.\n"
131"\n"
132"Parameters\n"
133"----------\n"
134"coeffs : fmat\n"
135" Array of shape (n_filters, win_s/2+1) containing the coefficients.\n"
136"";
137
138static char Py_filterbank_set_power_doc[] = ""
139"set_power(power)\n"
140"\n"
141"Set power applied to input spectrum of filterbank.\n"
142"\n"
143"Parameters\n"
144"----------\n"
145"power : float\n"
146" Power to raise input spectrum to before computing the filters.\n"
147"";
148
149static char Py_filterbank_get_power_doc[] = ""
150"get_power()\n"
151"\n"
152"Get power applied to filterbank.\n"
153"\n"
154"Returns\n"
155"-------\n"
156"float\n"
157" Power parameter.\n"
158"";
159
160static char Py_filterbank_set_norm_doc[] = ""
161"set_norm(norm)\n"
162"\n"
163"Set norm parameter. If set to `0`, the filters will not be normalized.\n"
164"If set to `1`, the filters will be normalized to one. Default to `1`.\n"
165"\n"
166"This function should be called *before* :meth:`set_triangle_bands`,\n"
167":meth:`set_mel_coeffs`, :meth:`set_mel_coeffs_htk`, or\n"
168":meth:`set_mel_coeffs_slaney`.\n"
169"\n"
170"Parameters\n"
171"----------\n"
172"norm : int\n"
173" `0` to disable, `1` to enable\n"
174"";
175
176static char Py_filterbank_get_norm_doc[] = ""
177"get_norm()\n"
178"\n"
179"Get norm parameter of filterbank.\n"
180"\n"
181"Returns\n"
182"-------\n"
183"float\n"
184" Norm parameter.\n"
185"";
4 186
5typedef struct187typedef struct
6{188{
@@ -288,6 +470,13 @@ Py_filterbank_set_power(Py_filterbank *self, PyObject *args) · 281 unmodified lines
288 Py_RETURN_NONE;470 Py_RETURN_NONE;
289}471}
290 472
473static PyObject *
474Py_filterbank_get_power (Py_filterbank * self, PyObject *unused)
475{
476 smpl_t power = aubio_filterbank_get_power(self->o);
477 return (PyObject *)PyFloat_FromDouble (power);
478}
479
291static PyObject *480static PyObject *
292Py_filterbank_set_norm(Py_filterbank *self, PyObject *args)481Py_filterbank_set_norm(Py_filterbank *self, PyObject *args)
293{482{
@@ -311,23 +500,34 @@ Py_filterbank_set_norm(Py_filterbank *self, PyObject *args) · 17 unmodified lines
311 Py_RETURN_NONE;500 Py_RETURN_NONE;
312}501}
313 502
503static PyObject *
504Py_filterbank_get_norm (Py_filterbank * self, PyObject *unused)
505{
506 smpl_t norm = aubio_filterbank_get_norm(self->o);
507 return (PyObject *)PyFloat_FromDouble (norm);
508}
509
314static PyMethodDef Py_filterbank_methods[] = {510static PyMethodDef Py_filterbank_methods[] = {
315 {"set_triangle_bands", (PyCFunction) Py_filterbank_set_triangle_bands,511 {"set_triangle_bands", (PyCFunction) Py_filterbank_set_triangle_bands,
316 METH_VARARGS, "set coefficients of filterbanks"},512 METH_VARARGS, Py_filterbank_set_triangle_bands_doc},
317 {"set_mel_coeffs_slaney", (PyCFunction) Py_filterbank_set_mel_coeffs_slaney,513 {"set_mel_coeffs_slaney", (PyCFunction) Py_filterbank_set_mel_coeffs_slaney,
318 METH_VARARGS, "set coefficients of filterbank as in Auditory Toolbox"},514 METH_VARARGS, Py_filterbank_set_mel_coeffs_slaney_doc},
319 {"set_mel_coeffs", (PyCFunction) Py_filterbank_set_mel_coeffs,515 {"set_mel_coeffs", (PyCFunction) Py_filterbank_set_mel_coeffs,
320 METH_VARARGS, "set coefficients of filterbank to linearly spaced mel scale"},516 METH_VARARGS, Py_filterbank_set_mel_coeffs_doc},
321 {"set_mel_coeffs_htk", (PyCFunction) Py_filterbank_set_mel_coeffs_htk,517 {"set_mel_coeffs_htk", (PyCFunction) Py_filterbank_set_mel_coeffs_htk,
322 METH_VARARGS, "set coefficients of filterbank to linearly spaced mel scale"},518 METH_VARARGS, Py_filterbank_set_mel_coeffs_htk_doc},
323 {"get_coeffs", (PyCFunction) Py_filterbank_get_coeffs,519 {"get_coeffs", (PyCFunction) Py_filterbank_get_coeffs,
324 METH_NOARGS, "get coefficients of filterbank"},520 METH_NOARGS, Py_filterbank_get_coeffs_doc},
325 {"set_coeffs", (PyCFunction) Py_filterbank_set_coeffs,521 {"set_coeffs", (PyCFunction) Py_filterbank_set_coeffs,
326 METH_VARARGS, "set coefficients of filterbank"},522 METH_VARARGS, Py_filterbank_set_coeffs_doc},
327 {"set_power", (PyCFunction) Py_filterbank_set_power,523 {"set_power", (PyCFunction) Py_filterbank_set_power,
328 METH_VARARGS, "set power applied to filterbank input spectrum"},524 METH_VARARGS, Py_filterbank_set_power_doc},
525 {"get_power", (PyCFunction) Py_filterbank_get_power,
526 METH_NOARGS, Py_filterbank_get_power_doc},
329 {"set_norm", (PyCFunction) Py_filterbank_set_norm,527 {"set_norm", (PyCFunction) Py_filterbank_set_norm,
330 METH_VARARGS, "set norm applied to filterbank input spectrum"},528 METH_VARARGS, Py_filterbank_set_norm_doc},
529 {"get_norm", (PyCFunction) Py_filterbank_get_norm,
530 METH_NOARGS, Py_filterbank_get_norm_doc},
331 {NULL}531 {NULL}
332};532};
333 533
python/ext/py-musicutils.c+10−10
@@ -39,7 +39,7 @@ Py_aubio_level_lin(PyObject *self, PyObject *args) · 38 unmodified lines
39 return NULL;39 return NULL;
40 }40 }
41 41
42 level_lin = Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_level_lin(&vec));42 level_lin = PyFloat_FromDouble(aubio_level_lin(&vec));
43 if (level_lin == NULL) {43 if (level_lin == NULL) {
44 PyErr_SetString (PyExc_ValueError, "failed computing level_lin");44 PyErr_SetString (PyExc_ValueError, "failed computing level_lin");
45 return NULL;45 return NULL;
@@ -67,7 +67,7 @@ Py_aubio_db_spl(PyObject *self, PyObject *args) · 21 unmodified lines
67 return NULL;67 return NULL;
68 }68 }
69 69
70 db_spl = Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_db_spl(&vec));70 db_spl = PyFloat_FromDouble(aubio_db_spl(&vec));
71 if (db_spl == NULL) {71 if (db_spl == NULL) {
72 PyErr_SetString (PyExc_ValueError, "failed computing db_spl");72 PyErr_SetString (PyExc_ValueError, "failed computing db_spl");
73 return NULL;73 return NULL;
@@ -96,7 +96,7 @@ Py_aubio_silence_detection(PyObject *self, PyObject *args) · 22 unmodified lines
96 return NULL;96 return NULL;
97 }97 }
98 98
99 silence_detection = Py_BuildValue("I", aubio_silence_detection(&vec, threshold));99 silence_detection = PyLong_FromLong(aubio_silence_detection(&vec, threshold));
100 if (silence_detection == NULL) {100 if (silence_detection == NULL) {
101 PyErr_SetString (PyExc_ValueError, "failed computing silence_detection");101 PyErr_SetString (PyExc_ValueError, "failed computing silence_detection");
102 return NULL;102 return NULL;
@@ -125,7 +125,7 @@ Py_aubio_level_detection(PyObject *self, PyObject *args) · 22 unmodified lines
125 return NULL;125 return NULL;
126 }126 }
127 127
128 level_detection = Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_level_detection(&vec, threshold));128 level_detection = PyFloat_FromDouble(aubio_level_detection(&vec, threshold));
129 if (level_detection == NULL) {129 if (level_detection == NULL) {
130 PyErr_SetString (PyExc_ValueError, "failed computing level_detection");130 PyErr_SetString (PyExc_ValueError, "failed computing level_detection");
131 return NULL;131 return NULL;
@@ -194,9 +194,9 @@ Py_aubio_hztomel(PyObject *self, PyObject *args, PyObject *kwds) · 62 unmodified lines
194 return NULL;194 return NULL;
195 }195 }
196 if (htk != NULL && PyObject_IsTrue(htk) == 1)196 if (htk != NULL && PyObject_IsTrue(htk) == 1)
197 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_hztomel_htk(v));197 return PyFloat_FromDouble(aubio_hztomel_htk(v));
198 else198 else
199 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_hztomel(v));199 return PyFloat_FromDouble(aubio_hztomel(v));
200}200}
201 201
202PyObject*202PyObject*
@@ -211,9 +211,9 @@ Py_aubio_meltohz(PyObject *self, PyObject *args, PyObject *kwds) · 8 unmodified lines
211 return NULL;211 return NULL;
212 }212 }
213 if (htk != NULL && PyObject_IsTrue(htk) == 1)213 if (htk != NULL && PyObject_IsTrue(htk) == 1)
214 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_meltohz_htk(v));214 return PyFloat_FromDouble(aubio_meltohz_htk(v));
215 else215 else
216 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_meltohz(v));216 return PyFloat_FromDouble(aubio_meltohz(v));
217}217}
218 218
219PyObject*219PyObject*
@@ -223,7 +223,7 @@ Py_aubio_hztomel_htk(PyObject *self, PyObject *args) · 3 unmodified lines
223 if (!PyArg_ParseTuple(args, AUBIO_NPY_SMPL_CHR, &v)) {223 if (!PyArg_ParseTuple(args, AUBIO_NPY_SMPL_CHR, &v)) {
224 return NULL;224 return NULL;
225 }225 }
226 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_hztomel_htk(v));226 return PyFloat_FromDouble(aubio_hztomel_htk(v));
227}227}
228 228
229PyObject*229PyObject*
@@ -233,5 +233,5 @@ Py_aubio_meltohz_htk(PyObject *self, PyObject *args) · 3 unmodified lines
233 if (!PyArg_ParseTuple(args, AUBIO_NPY_SMPL_CHR, &v)) {233 if (!PyArg_ParseTuple(args, AUBIO_NPY_SMPL_CHR, &v)) {
234 return NULL;234 return NULL;
235 }235 }
236 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_meltohz_htk(v));236 return PyFloat_FromDouble(aubio_meltohz_htk(v));
237}237}
python/lib/gen_code.py+13−3
@@ -234,11 +234,21 @@ typedef struct{{ · 233 unmodified lines
234 return out.format(do_inputs_list = do_inputs_list, **self.__dict__)234 return out.format(do_inputs_list = do_inputs_list, **self.__dict__)
235 235
236 def gen_doc(self):236 def gen_doc(self):
237 sig = []
238 for p in self.input_params:
239 name = p['name']
240 defval = aubiodefvalue[name].replace('"','\\\"')
241 sig.append("{name}={defval}".format(defval=defval, name=name))
237 out = """242 out = """
238// TODO: add documentation243#ifndef PYAUBIO_{shortname}_doc
239static char Py_{shortname}_doc[] = \"undefined\";244#define PYAUBIO_{shortname}_doc "{shortname}({sig})"
245#endif /* PYAUBIO_{shortname}_doc */
246
247static char Py_{shortname}_doc[] = ""
248PYAUBIO_{shortname}_doc
249"";
240"""250"""
241 return out.format(**self.__dict__)251 return out.format(sig=', '.join(sig), **self.__dict__)
242 252
243 def gen_new(self):253 def gen_new(self):
244 out = """254 out = """
python/tests/__init__.py+0−1
@@ -1 +0,0 @@
1
python/tests/_tools.py+41−0
@@ -0,0 +1,41 @@
1"""
2This file imports test methods from different testing modules, in this
3order:
4
5 - try importing 'pytest'
6 - if it fails, fallback to 'numpy.testing'
7
8Nose2 support was removed because of lacking assertWarns on py2.7.
9
10"""
11
12import sys
13
14_has_pytest = False
15
16# check if we have pytest
17try:
18 import pytest
19 parametrize = pytest.mark.parametrize
20 assert_raises = pytest.raises
21 assert_warns = pytest.warns
22 skipTest = pytest.skip
23 _has_pytest = True
24 def run_module_suite():
25 import sys, pytest
26 pytest.main(sys.argv)
27except:
28 pass
29
30# otherwise fallback on numpy.testing
31if not _has_pytest:
32 from numpy.testing import dec, assert_raises, assert_warns
33 from numpy.testing import SkipTest
34 parametrize = dec.parametrize
35 def skipTest(msg):
36 raise SkipTest(msg)
37 from numpy.testing import run_module_suite
38
39# always use numpy's assert_equal
40import numpy
41assert_equal = numpy.testing.assert_equal
python/tests/run_all_tests+0−5
@@ -1,5 +0,0 @@
1#! /usr/bin/env python
2
3if __name__ == '__main__':
4 import nose2.main
5 nose2.discover()
python/tests/test_aubio.py+1−2
@@ -1,6 +1,5 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4from numpy.testing import TestCase3from numpy.testing import TestCase
5 4
6class aubiomodule_test_case(TestCase):5class aubiomodule_test_case(TestCase):
@@ -15,5 +14,5 @@ class aubiomodule_test_case(TestCase): · 8 unmodified lines
15 self.assertEqual('0', aubio.version[0])14 self.assertEqual('0', aubio.version[0])
16 15
17if __name__ == '__main__':16if __name__ == '__main__':
17 from unittest import main
18 main()18 main()
19
python/tests/test_aubio_cmd.py+2−2
@@ -1,8 +1,7 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3import aubio.cmd
4from nose2 import main
5from numpy.testing import TestCase3from numpy.testing import TestCase
4import aubio.cmd
6 5
7class aubio_cmd(TestCase):6class aubio_cmd(TestCase):
8 7
@@ -31,4 +30,5 @@ class aubio_cmd_utils(TestCase): · 22 unmodified lines
31 "3200\t")30 "3200\t")
32 31
33if __name__ == '__main__':32if __name__ == '__main__':
33 from unittest import main
34 main()34 main()
python/tests/test_aubio_cut.py+1−1
@@ -1,7 +1,6 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3import aubio.cut3import aubio.cut
4from nose2 import main
5from numpy.testing import TestCase4from numpy.testing import TestCase
6 5
7class aubio_cut(TestCase):6class aubio_cut(TestCase):
@@ -13,4 +12,5 @@ class aubio_cut(TestCase): · 5 unmodified lines
13 assert self.a_parser.parse_args(['-v']).verbose12 assert self.a_parser.parse_args(['-v']).verbose
14 13
15if __name__ == '__main__':14if __name__ == '__main__':
15 from unittest import main
16 main()16 main()
python/tests/test_cvec.py+1−1
@@ -1,6 +1,5 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4import numpy as np3import numpy as np
5from numpy.testing import TestCase, assert_equal4from numpy.testing import TestCase, assert_equal
6from aubio import cvec, fvec, float_type5from aubio import cvec, fvec, float_type
@@ -141,4 +140,5 @@ class aubio_cvec_wrong_norm_input(TestCase): · 134 unmodified lines
141 a.norm = np.zeros((512//2+1, 2), dtype = float_type)140 a.norm = np.zeros((512//2+1, 2), dtype = float_type)
142 141
143if __name__ == '__main__':142if __name__ == '__main__':
143 from unittest import main
144 main()144 main()
python/tests/test_dct.py+4−0
@@ -66,3 +66,7 @@ class aubio_dct(TestCase): · 65 unmodified lines
66 aubio.dct(size)66 aubio.dct(size)
67 except AssertionError:67 except AssertionError:
68 self.skipTest('creating aubio.dct with size %d did not fail' % size)68 self.skipTest('creating aubio.dct with size %d did not fail' % size)
69
70if __name__ == '__main__':
71 from unittest import main
72 main()
python/tests/test_fft.py+1−1
@@ -1,6 +1,5 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4from numpy.testing import TestCase3from numpy.testing import TestCase
5from numpy.testing import assert_equal, assert_almost_equal4from numpy.testing import assert_equal, assert_almost_equal
6import numpy as np5import numpy as np
@@ -212,4 +211,5 @@ class aubio_fft_wrong_params(TestCase): · 205 unmodified lines
212 fft(win_s)211 fft(win_s)
213 212
214if __name__ == '__main__':213if __name__ == '__main__':
214 from unittest import main
215 main()215 main()
python/tests/test_filter.py+2−2
@@ -1,9 +1,8 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4from numpy.testing import TestCase, assert_equal, assert_almost_equal3from numpy.testing import TestCase, assert_equal, assert_almost_equal
5from aubio import fvec, digital_filter4from aubio import fvec, digital_filter
6from .utils import array_from_text_file5from utils import array_from_text_file
7 6
8class aubio_filter_test_case(TestCase):7class aubio_filter_test_case(TestCase):
9 8
@@ -94,4 +93,5 @@ class aubio_filter_wrong_params(TestCase): · 84 unmodified lines
94 digital_filter(-1)93 digital_filter(-1)
95 94
96if __name__ == '__main__':95if __name__ == '__main__':
96 from unittest import main
97 main()97 main()
python/tests/test_filterbank.py+3−3
@@ -4,7 +4,7 @@ import numpy as np · 3 unmodified lines
4from numpy.testing import TestCase, assert_equal, assert_almost_equal4from numpy.testing import TestCase, assert_equal, assert_almost_equal
5 5
6from aubio import cvec, filterbank, float_type6from aubio import cvec, filterbank, float_type
7from .utils import array_from_text_file7from utils import array_from_text_file
8 8
9class aubio_filterbank_test_case(TestCase):9class aubio_filterbank_test_case(TestCase):
10 10
@@ -87,5 +87,5 @@ class aubio_filterbank_wrong_values(TestCase): · 76 unmodified lines
87 f(cvec(256))87 f(cvec(256))
88 88
89if __name__ == '__main__':89if __name__ == '__main__':
90 import nose290 from unittest import main
91 nose2.main()91 main()
python/tests/test_filterbank_mel.py+14−15
@@ -2,12 +2,10 @@ · 1 unmodified line
2 2
3import numpy as np3import numpy as np
4from numpy.testing import TestCase, assert_equal, assert_almost_equal4from numpy.testing import TestCase, assert_equal, assert_almost_equal
5from _tools import assert_warns
5 6
6from aubio import fvec, cvec, filterbank, float_type7from aubio import fvec, cvec, filterbank, float_type
7 8
8import warnings
9warnings.filterwarnings('ignore', category=UserWarning, append=True)
10
11class aubio_filterbank_mel_test_case(TestCase):9class aubio_filterbank_mel_test_case(TestCase):
12 10
13 def test_slaney(self):11 def test_slaney(self):
@@ -75,40 +73,41 @@ class aubio_filterbank_mel_test_case(TestCase): · 61 unmodified lines
75 samplerate = 2205073 samplerate = 22050
76 freq_list = [0, samplerate//4, samplerate // 2 + 1]74 freq_list = [0, samplerate//4, samplerate // 2 + 1]
77 f = filterbank(len(freq_list)-2, 1024)75 f = filterbank(len(freq_list)-2, 1024)
78 # TODO add assert_warns76 with assert_warns(UserWarning):
79 f.set_triangle_bands(fvec(freq_list), samplerate)77 f.set_triangle_bands(fvec(freq_list), samplerate)
80 78
81 def test_triangle_freqs_with_not_enough_filters(self):79 def test_triangle_freqs_with_not_enough_filters(self):
82 """make sure set_triangle_bands warns when not enough filters"""80 """make sure set_triangle_bands warns when not enough filters"""
83 samplerate = 2205081 samplerate = 22050
84 freq_list = [0, 100, 1000, 4000, 8000, 10000]82 freq_list = [0, 100, 1000, 4000, 8000, 10000]
85 f = filterbank(len(freq_list)-3, 1024)83 f = filterbank(len(freq_list)-3, 1024)
86 # TODO add assert_warns84 with assert_warns(UserWarning):
87 f.set_triangle_bands(fvec(freq_list), samplerate)85 f.set_triangle_bands(fvec(freq_list), samplerate)
88 86
89 def test_triangle_freqs_with_too_many_filters(self):87 def test_triangle_freqs_with_too_many_filters(self):
90 """make sure set_triangle_bands warns when too many filters"""88 """make sure set_triangle_bands warns when too many filters"""
91 samplerate = 2205089 samplerate = 22050
92 freq_list = [0, 100, 1000, 4000, 8000, 10000]90 freq_list = [0, 100, 1000, 4000, 8000, 10000]
93 f = filterbank(len(freq_list)-1, 1024)91 f = filterbank(len(freq_list)-1, 1024)
94 # TODO add assert_warns92 with assert_warns(UserWarning):
95 f.set_triangle_bands(fvec(freq_list), samplerate)93 f.set_triangle_bands(fvec(freq_list), samplerate)
96 94
97 def test_triangle_freqs_with_double_value(self):95 def test_triangle_freqs_with_double_value(self):
98 """make sure set_triangle_bands works with 2 duplicate freqs"""96 """make sure set_triangle_bands works with 2 duplicate freqs"""
99 samplerate = 2205097 samplerate = 22050
100 freq_list = [0, 100, 1000, 4000, 4000, 4000, 10000]98 freq_list = [0, 100, 1000, 4000, 4000, 4000, 10000]
101 f = filterbank(len(freq_list)-2, 1024)99 f = filterbank(len(freq_list)-2, 1024)
102 # TODO add assert_warns100 with assert_warns(UserWarning):
103 f.set_triangle_bands(fvec(freq_list), samplerate)101 f.set_triangle_bands(fvec(freq_list), samplerate)
104 102
105 def test_triangle_freqs_with_triple(self):103 def test_triangle_freqs_with_triple(self):
106 """make sure set_triangle_bands works with 3 duplicate freqs"""104 """make sure set_triangle_bands works with 3 duplicate freqs"""
107 samplerate = 22050105 samplerate = 22050
108 freq_list = [0, 100, 1000, 4000, 4000, 4000, 10000]106 freq_list = [0, 100, 1000, 4000, 4000, 4000, 10000]
109 f = filterbank(len(freq_list)-2, 1024)107 f = filterbank(len(freq_list)-2, 1024)
110 # TODO add assert_warns108 with assert_warns(UserWarning):
111 f.set_triangle_bands(fvec(freq_list), samplerate)109 f.set_triangle_bands(fvec(freq_list), samplerate)
110
112 111
113 def test_triangle_freqs_without_norm(self):112 def test_triangle_freqs_without_norm(self):
114 """make sure set_triangle_bands works without """113 """make sure set_triangle_bands works without """
@@ -168,5 +167,5 @@ class aubio_filterbank_mel_test_case(TestCase): · 53 unmodified lines
168 167
169 168
170if __name__ == '__main__':169if __name__ == '__main__':
171 import nose2170 from unittest import main
172 nose2.main()171 main()
python/tests/test_fvec.py+1−1
@@ -1,6 +1,5 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4import numpy as np3import numpy as np
5from numpy.testing import TestCase, assert_equal, assert_almost_equal4from numpy.testing import TestCase, assert_equal, assert_almost_equal
6from aubio import fvec, zero_crossing_rate, alpha_norm, min_removal5from aubio import fvec, zero_crossing_rate, alpha_norm, min_removal
@@ -148,4 +147,5 @@ class aubio_fvec_test_memory(TestCase): · 141 unmodified lines
148 del c147 del c
149 148
150if __name__ == '__main__':149if __name__ == '__main__':
150 from unittest import main
151 main()151 main()
python/tests/test_fvec_shift.py+1−1
@@ -30,6 +30,6 @@ class aubio_shift_test_case(TestCase): · 29 unmodified lines
30 def test_can_shift_fvec_odd(self):30 def test_can_shift_fvec_odd(self):
31 self.run_shift_ishift(7)31 self.run_shift_ishift(7)
32 32
33from unittest import main
34if __name__ == '__main__':33if __name__ == '__main__':
34 from unittest import main
35 main()35 main()
python/tests/test_hztomel.py+11−8
@@ -3,6 +3,7 @@ · 2 unmodified lines
3from unittest import main3from unittest import main
4from numpy.testing import TestCase4from numpy.testing import TestCase
5from numpy.testing import assert_equal, assert_almost_equal5from numpy.testing import assert_equal, assert_almost_equal
6from _tools import assert_warns
6import numpy as np7import numpy as np
7import aubio8import aubio
8 9
@@ -37,12 +38,12 @@ class aubio_hztomel_test_case(TestCase): · 28 unmodified lines
37 assert_almost_equal(meltohz(hztomel(f)) - f, 0, decimal=1)38 assert_almost_equal(meltohz(hztomel(f)) - f, 0, decimal=1)
38 39
39 def test_meltohz_negative(self):40 def test_meltohz_negative(self):
40 # TODO add assert_warns41 with assert_warns(UserWarning):
41 assert_equal(meltohz(-1), 0)42 assert_equal(meltohz(-1), 0)
42 43
43 def test_hztomel_negative(self):44 def test_hztomel_negative(self):
44 # TODO add assert_warns45 with assert_warns(UserWarning):
45 assert_equal(hztomel(-1), 0)46 assert_equal(hztomel(-1), 0)
46 47
47 48
48class aubio_hztomel_htk_test_case(TestCase):49class aubio_hztomel_htk_test_case(TestCase):
@@ -57,14 +58,16 @@ class aubio_hztomel_htk_test_case(TestCase): · 8 unmodified lines
57 assert_almost_equal(hztomel(6300, htk=True), 2595., decimal=1)58 assert_almost_equal(hztomel(6300, htk=True), 2595., decimal=1)
58 59
59 def test_meltohz_negative(self):60 def test_meltohz_negative(self):
60 # TODO add assert_warns61 with assert_warns(UserWarning):
61 assert_equal(meltohz(-1, htk=True), 0)62 assert_equal(meltohz(-1, htk=True), 0)
62 assert_almost_equal(meltohz(2000, htk=True), 3428.7, decimal=1)63 assert_almost_equal(meltohz(2000, htk=True), 3428.7, decimal=1)
63 assert_almost_equal(meltohz(1000, htk=True), 1000., decimal=1)64 assert_almost_equal(meltohz(1000, htk=True), 1000., decimal=1)
64 65
65 def test_hztomel_negative(self):66 def test_hztomel_negative(self):
66 # TODO add assert_warns67 with assert_warns(UserWarning):
67 assert_equal(hztomel(-1, htk=True), 0)68 assert_equal(meltohz(-1, htk=True), 0)
69 with assert_warns(UserWarning):
70 assert_equal(hztomel(-1, htk=True), 0)
68 assert_almost_equal(hztomel(1000, htk=True), 1000., decimal=1)71 assert_almost_equal(hztomel(1000, htk=True), 1000., decimal=1)
69 72
70 def test_hztomel_htk(self):73 def test_hztomel_htk(self):
python/tests/test_mathutils.py+1−1
@@ -1,6 +1,5 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4from numpy.testing import TestCase, assert_equal3from numpy.testing import TestCase, assert_equal
5from numpy import array, arange, isnan, isinf4from numpy import array, arange, isnan, isinf
6from aubio import bintomidi, miditobin, freqtobin, bintofreq, freqtomidi, miditofreq5from aubio import bintomidi, miditobin, freqtobin, bintofreq, freqtomidi, miditofreq
@@ -101,4 +100,5 @@ class aubio_mathutils(TestCase): · 94 unmodified lines
101 assert_equal ( array(b) < 0, False )100 assert_equal ( array(b) < 0, False )
102 101
103if __name__ == '__main__':102if __name__ == '__main__':
103 from unittest import main
104 main()104 main()
python/tests/test_mfcc.py+17−21
@@ -1,7 +1,6 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from nose2 import main3from _tools import parametrize, assert_raises
4from nose2.tools import params
5from numpy import random, count_nonzero4from numpy import random, count_nonzero
6from numpy.testing import TestCase5from numpy.testing import TestCase
7from aubio import mfcc, cvec, float_type6from aubio import mfcc, cvec, float_type
@@ -15,28 +14,21 @@ samplerate = 44100 · 7 unmodified lines
15new_params = ['buf_size', 'n_filters', 'n_coeffs', 'samplerate']14new_params = ['buf_size', 'n_filters', 'n_coeffs', 'samplerate']
16new_deflts = [1024, 40, 13, 44100]15new_deflts = [1024, 40, 13, 44100]
17 16
18class aubio_mfcc(TestCase):17class Test_aubio_mfcc(object):
19 18
20 def setUp(self):19 members_args = 'name'
21 self.o = mfcc()
22 20
23 def test_default_creation(self):21 @parametrize(members_args, new_params)
24 pass
25
26 def test_delete(self):
27 del self.o
28
29 @params(*new_params)
30 def test_read_only_member(self, name):22 def test_read_only_member(self, name):
31 o = self.o23 o = mfcc()
32 with self.assertRaises((TypeError, AttributeError)):24 with assert_raises((TypeError, AttributeError)):
33 setattr(o, name, 0)25 setattr(o, name, 0)
34 26
35 @params(*zip(new_params, new_deflts))27 @parametrize('name, expected', zip(new_params, new_deflts))
36 def test_default_param(self, name, expected):28 def test_default_param(self, name, expected):
37 """ test mfcc.{:s} = {:d} """.format(name, expected)29 """ test mfcc.{:s} = {:d} """.format(name, expected)
38 o = self.o30 o = mfcc()
39 self.assertEqual( getattr(o, name), expected)31 assert getattr(o, name) == expected
40 32
41class aubio_mfcc_wrong_params(TestCase):33class aubio_mfcc_wrong_params(TestCase):
42 34
@@ -82,9 +74,9 @@ class aubio_mfcc_compute(TestCase): · 39 unmodified lines
82 #print coeffs74 #print coeffs
83 75
84 76
85class aubio_mfcc_all_parameters(TestCase):77class Test_aubio_mfcc_all_parameters(object):
86 78
87 @params(79 run_values = [
88 (2048, 40, 13, 44100),80 (2048, 40, 13, 44100),
89 (1024, 40, 13, 44100),81 (1024, 40, 13, 44100),
90 (512, 40, 13, 44100),82 (512, 40, 13, 44100),
@@ -100,7 +92,10 @@ class aubio_mfcc_all_parameters(TestCase): · 9 unmodified lines
100 #(1024, 30, 20, 44100),92 #(1024, 30, 20, 44100),
101 (1024, 40, 40, 44100),93 (1024, 40, 40, 44100),
102 (1024, 40, 3, 44100),94 (1024, 40, 3, 44100),
103 )95 ]
96 run_args = ['buf_size', 'n_filters', 'n_coeffs', 'samplerate']
97
98 @parametrize(run_args, run_values)
104 def test_run_with_params(self, buf_size, n_filters, n_coeffs, samplerate):99 def test_run_with_params(self, buf_size, n_filters, n_coeffs, samplerate):
105 " check mfcc can run with reasonable parameters "100 " check mfcc can run with reasonable parameters "
106 o = mfcc(buf_size, n_filters, n_coeffs, samplerate)101 o = mfcc(buf_size, n_filters, n_coeffs, samplerate)
@@ -148,4 +143,5 @@ class aubio_mfcc_fb_params(TestCase): · 41 unmodified lines
148 assert m.get_scale() == 1143 assert m.get_scale() == 1
149 144
150if __name__ == '__main__':145if __name__ == '__main__':
151 main()146 from _tools import run_module_suite
147 run_module_suite()
python/tests/test_midi2note.py+11−12
@@ -2,8 +2,7 @@ · 1 unmodified line
2# -*- coding: utf-8 -*-2# -*- coding: utf-8 -*-
3 3
4from aubio import midi2note4from aubio import midi2note
5from nose2.tools import params5from _tools import parametrize, assert_raises
6import unittest
7 6
8list_of_known_midis = (7list_of_known_midis = (
9 ( 0, 'C-1' ),8 ( 0, 'C-1' ),
@@ -15,31 +14,31 @@ list_of_known_midis = ( · 5 unmodified lines
15 ( 127, 'G9' ),14 ( 127, 'G9' ),
16 )15 )
17 16
18class midi2note_good_values(unittest.TestCase):17class Test_midi2note_good_values(object):
19 18
20 @params(*list_of_known_midis)19 @parametrize('midi, note', list_of_known_midis)
21 def test_midi2note_known_values(self, midi, note):20 def test_midi2note_known_values(self, midi, note):
22 " known values are correctly converted "21 " known values are correctly converted "
23 self.assertEqual ( midi2note(midi), note )22 assert midi2note(midi) == (note)
24 23
25class midi2note_wrong_values(unittest.TestCase):24class Test_midi2note_wrong_values(object):
26 25
27 def test_midi2note_negative_value(self):26 def test_midi2note_negative_value(self):
28 " fails when passed a negative value "27 " fails when passed a negative value "
29 self.assertRaises(ValueError, midi2note, -2)28 assert_raises(ValueError, midi2note, -2)
30 29
31 def test_midi2note_large(self):30 def test_midi2note_large(self):
32 " fails when passed a value greater than 127 "31 " fails when passed a value greater than 127 "
33 self.assertRaises(ValueError, midi2note, 128)32 assert_raises(ValueError, midi2note, 128)
34 33
35 def test_midi2note_floating_value(self):34 def test_midi2note_floating_value(self):
36 " fails when passed a floating point "35 " fails when passed a floating point "
37 self.assertRaises(TypeError, midi2note, 69.2)36 assert_raises(TypeError, midi2note, 69.2)
38 37
39 def test_midi2note_character_value(self):38 def test_midi2note_character_value(self):
40 " fails when passed a value that can not be transformed to integer "39 " fails when passed a value that can not be transformed to integer "
41 self.assertRaises(TypeError, midi2note, "a")40 assert_raises(TypeError, midi2note, "a")
42 41
43if __name__ == '__main__':42if __name__ == '__main__':
44 import nose243 from _tools import run_module_suite
45 nose2.main()44 run_module_suite()
python/tests/test_musicutils.py+2−2
@@ -1,9 +1,8 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4import numpy as np3import numpy as np
5from numpy.testing import TestCase4from numpy.testing import TestCase
6from numpy.testing.utils import assert_equal, assert_almost_equal5from numpy.testing import assert_equal, assert_almost_equal
7from aubio import window, level_lin, db_spl, silence_detection, level_detection6from aubio import window, level_lin, db_spl, silence_detection, level_detection
8from aubio import fvec, float_type7from aubio import fvec, float_type
9 8
@@ -85,4 +84,5 @@ class aubio_level_detection(TestCase): · 75 unmodified lines
85 assert level_detection(ones(1024, dtype = float_type), -70) == 084 assert level_detection(ones(1024, dtype = float_type), -70) == 0
86 85
87if __name__ == '__main__':86if __name__ == '__main__':
87 from unittest import main
88 main()88 main()
python/tests/test_note2midi.py+24−19
@@ -4,8 +4,8 @@ · 3 unmodified lines
4from __future__ import unicode_literals4from __future__ import unicode_literals
5 5
6from aubio import note2midi, freq2note, note2freq, float_type6from aubio import note2midi, freq2note, note2freq, float_type
7from nose2.tools import params7from numpy.testing import TestCase
8import unittest8from _tools import parametrize, assert_raises, skipTest
9 9
10list_of_known_notes = (10list_of_known_notes = (
11 ( 'C-1', 0 ),11 ( 'C-1', 0 ),
@@ -44,29 +44,32 @@ list_of_unknown_notes = ( · 32 unmodified lines
44 ( '2' ),44 ( '2' ),
45 )45 )
46 46
47class note2midi_good_values(unittest.TestCase):47class Test_note2midi_good_values(object):
48 48
49 @params(*list_of_known_notes)49 @parametrize('note, midi', list_of_known_notes)
50 def test_note2midi_known_values(self, note, midi):50 def test_note2midi_known_values(self, note, midi):
51 " known values are correctly converted "51 " known values are correctly converted "
52 self.assertEqual ( note2midi(note), midi )52 assert note2midi(note) == midi
53 53
54 @params(*list_of_known_notes_with_unicode_issues)54 @parametrize('note, midi', list_of_known_notes_with_unicode_issues)
55 def test_note2midi_known_values_with_unicode_issues(self, note, midi):55 def test_note2midi_known_values_with_unicode_issues(self, note, midi):
56 " known values are correctly converted, unless decoding is expected to fail"56 " difficult values are correctly converted unless expected failure "
57 try:57 try:
58 self.assertEqual ( note2midi(note), midi )58 assert note2midi(note) == midi
59 except UnicodeEncodeError as e:59 except UnicodeEncodeError as e:
60 # platforms with decoding failures include:
61 # - osx: python <= 2.7.10
62 # - win: python <= 2.7.12
60 import sys63 import sys
61 strfmt = "len(u'\\U0001D12A') != 1, excpected decoding failure | {:s} | {:s} {:s}"64 strmsg = "len(u'\\U0001D12A') != 1, expected decoding failure"
62 strres = strfmt.format(e, sys.platform, sys.version)65 strmsg += " | upgrade to Python 3 to fix"
63 # happens with: darwin 2.7.10, windows 2.7.1266 strmsg += " | {:s} | {:s} {:s}"
64 if len('\U0001D12A') != 1 and sys.version[0] == '2':67 if len('\U0001D12A') != 1 and sys.version[0] == '2':
65 self.skipTest(strres + " | upgrade to Python 3 to fix")68 skipTest(strmsg.format(repr(e), sys.platform, sys.version))
66 else:69 else:
67 raise70 raise
68 71
69class note2midi_wrong_values(unittest.TestCase):72class note2midi_wrong_values(TestCase):
70 73
71 def test_note2midi_missing_octave(self):74 def test_note2midi_missing_octave(self):
72 " fails when passed only one character"75 " fails when passed only one character"
@@ -104,12 +107,14 @@ class note2midi_wrong_values(unittest.TestCase): · 31 unmodified lines
104 " fails when passed a note with a note name longer than expected"107 " fails when passed a note with a note name longer than expected"
105 self.assertRaises(ValueError, note2midi, 'CB+-3')108 self.assertRaises(ValueError, note2midi, 'CB+-3')
106 109
107 @params(*list_of_unknown_notes)110class Test_note2midi_unknown_values(object):
111
112 @parametrize('note', list_of_unknown_notes)
108 def test_note2midi_unknown_values(self, note):113 def test_note2midi_unknown_values(self, note):
109 " unknown values throw out an error "114 " unknown values throw out an error "
110 self.assertRaises(ValueError, note2midi, note)115 assert_raises(ValueError, note2midi, note)
111 116
112class freq2note_simple_test(unittest.TestCase):117class freq2note_simple_test(TestCase):
113 118
114 def test_freq2note_above(self):119 def test_freq2note_above(self):
115 " make sure freq2note(441) == A4 "120 " make sure freq2note(441) == A4 "
@@ -119,7 +124,7 @@ class freq2note_simple_test(unittest.TestCase): · 3 unmodified lines
119 " make sure freq2note(439) == A4 "124 " make sure freq2note(439) == A4 "
120 self.assertEqual("A4", freq2note(439))125 self.assertEqual("A4", freq2note(439))
121 126
122class note2freq_simple_test(unittest.TestCase):127class note2freq_simple_test(TestCase):
123 128
124 def test_note2freq(self):129 def test_note2freq(self):
125 " make sure note2freq('A3') == 220"130 " make sure note2freq('A3') == 220"
@@ -133,5 +138,5 @@ class note2freq_simple_test(unittest.TestCase): · 7 unmodified lines
133 self.assertLess(abs(note2freq("A4")-440), 1.e-12)138 self.assertLess(abs(note2freq("A4")-440), 1.e-12)
134 139
135if __name__ == '__main__':140if __name__ == '__main__':
136 import nose2141 from _tools import run_module_suite
137 nose2.main()142 run_module_suite()
python/tests/test_notes.py+6−7
@@ -1,8 +1,11 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4from numpy.testing import TestCase, assert_equal, assert_almost_equal3from numpy.testing import TestCase, assert_equal, assert_almost_equal
5from aubio import notes4from aubio import notes, source
5import numpy as np
6from utils import list_all_sounds
7
8list_of_sounds = list_all_sounds('sounds')
6 9
7AUBIO_DEFAULT_NOTES_SILENCE = -70.10AUBIO_DEFAULT_NOTES_SILENCE = -70.
8AUBIO_DEFAULT_NOTES_RELEASE_DROP = 10.11AUBIO_DEFAULT_NOTES_RELEASE_DROP = 10.
@@ -52,14 +55,9 @@ class aubio_notes_params(TestCase): · 43 unmodified lines
52 with self.assertRaises(ValueError):55 with self.assertRaises(ValueError):
53 self.o.set_release_drop(val)56 self.o.set_release_drop(val)
54 57
55from .utils import list_all_sounds
56list_of_sounds = list_all_sounds('sounds')
57
58class aubio_notes_sinewave(TestCase):58class aubio_notes_sinewave(TestCase):
59 59
60 def analyze_file(self, filepath, samplerate=0):60 def analyze_file(self, filepath, samplerate=0):
61 from aubio import source
62 import numpy as np
63 win_s = 512 # fft size61 win_s = 512 # fft size
64 hop_s = 256 # hop size62 hop_s = 256 # hop size
65 63
@@ -92,4 +90,5 @@ class aubio_notes_sinewave(TestCase): · 26 unmodified lines
92 assert_equal (results[0][1], [69, 123, -1])90 assert_equal (results[0][1], [69, 123, -1])
93 91
94if __name__ == '__main__':92if __name__ == '__main__':
93 from unittest import main
95 main()94 main()
python/tests/test_onset.py+1−1
@@ -1,6 +1,5 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4from numpy.testing import TestCase, assert_equal, assert_almost_equal3from numpy.testing import TestCase, assert_equal, assert_almost_equal
5from aubio import onset, fvec4from aubio import onset, fvec
6 5
@@ -116,4 +115,5 @@ class aubio_onset_coverate(TestCase): · 109 unmodified lines
116 115
117 116
118if __name__ == '__main__':117if __name__ == '__main__':
118 from unittest import main
119 main()119 main()
python/tests/test_phasevoc.py+13−8
@@ -1,9 +1,8 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from numpy.testing import TestCase, assert_equal, assert_array_less3from numpy.testing import TestCase, assert_equal, assert_array_less
4from _tools import parametrize
4from aubio import fvec, cvec, pvoc, float_type5from aubio import fvec, cvec, pvoc, float_type
5from nose2 import main
6from nose2.tools import params
7import numpy as np6import numpy as np
8 7
9if float_type == 'float32':8if float_type == 'float32':
@@ -18,7 +17,7 @@ def create_sine(hop_s, freq, samplerate): · 8 unmodified lines
18def create_noise(hop_s):17def create_noise(hop_s):
19 return np.random.rand(hop_s).astype(float_type) * 2. - 1.18 return np.random.rand(hop_s).astype(float_type) * 2. - 1.
20 19
21class aubio_pvoc_test_case(TestCase):20class Test_aubio_pvoc_test_case(object):
22 """ pvoc object test case """21 """ pvoc object test case """
23 22
24 def test_members_automatic_sizes_default(self):23 def test_members_automatic_sizes_default(self):
@@ -65,7 +64,8 @@ class aubio_pvoc_test_case(TestCase): · 40 unmodified lines
65 r = f.rdo(s)64 r = f.rdo(s)
66 assert_equal ( t, 0.)65 assert_equal ( t, 0.)
67 66
68 @params(67 resynth_noise_args = "hop_s, ratio"
68 resynth_noise_values = [
69 ( 256, 8),69 ( 256, 8),
70 ( 256, 4),70 ( 256, 4),
71 ( 256, 2),71 ( 256, 2),
@@ -87,13 +87,16 @@ class aubio_pvoc_test_case(TestCase): · 15 unmodified lines
87 (8192, 8),87 (8192, 8),
88 (8192, 4),88 (8192, 4),
89 (8192, 2),89 (8192, 2),
90 )90 ]
91
92 @parametrize(resynth_noise_args, resynth_noise_values)
91 def test_resynth_steps_noise(self, hop_s, ratio):93 def test_resynth_steps_noise(self, hop_s, ratio):
92 """ check the resynthesis of a random signal is correct """94 """ check the resynthesis of a random signal is correct """
93 sigin = create_noise(hop_s)95 sigin = create_noise(hop_s)
94 self.reconstruction(sigin, hop_s, ratio)96 self.reconstruction(sigin, hop_s, ratio)
95 97
96 @params(98 resynth_sine_args = "samplerate, hop_s, ratio, freq"
99 resynth_sine_values = [
97 (44100, 256, 8, 441),100 (44100, 256, 8, 441),
98 (44100, 256, 4, 1203),101 (44100, 256, 4, 1203),
99 (44100, 256, 2, 3045),102 (44100, 256, 2, 3045),
@@ -108,7 +111,9 @@ class aubio_pvoc_test_case(TestCase): · 8 unmodified lines
108 (22050, 256, 8, 445),111 (22050, 256, 8, 445),
109 (96000, 1024, 8, 47000),112 (96000, 1024, 8, 47000),
110 (96000, 1024, 8, 20),113 (96000, 1024, 8, 20),
111 )114 ]
115
116 @parametrize(resynth_sine_args, resynth_sine_values)
112 def test_resynth_steps_sine(self, samplerate, hop_s, ratio, freq):117 def test_resynth_steps_sine(self, samplerate, hop_s, ratio, freq):
113 """ check the resynthesis of a sine is correct """118 """ check the resynthesis of a sine is correct """
114 sigin = create_sine(hop_s, freq, samplerate)119 sigin = create_sine(hop_s, freq, samplerate)
@@ -199,5 +204,5 @@ class aubio_pvoc_wrong_params(TestCase): · 84 unmodified lines
199 self.skipTest('creating aubio.pvoc with size %d did not fail' % win_s)204 self.skipTest('creating aubio.pvoc with size %d did not fail' % win_s)
200 205
201if __name__ == '__main__':206if __name__ == '__main__':
207 from unittest import main
202 main()208 main()
203
python/tests/test_pitch.py+5−5
@@ -1,7 +1,6 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import TestCase, main3from numpy.testing import TestCase, assert_equal
4from numpy.testing import assert_equal
5from numpy import sin, arange, mean, median, isnan, pi4from numpy import sin, arange, mean, median, isnan, pi
6from aubio import fvec, pitch, freqtomidi, float_type5from aubio import fvec, pitch, freqtomidi, float_type
7 6
@@ -116,10 +115,11 @@ def create_test (algo, mode): · 108 unmodified lines
116 115
117for algo in pitch_algorithms:116for algo in pitch_algorithms:
118 for mode in signal_modes:117 for mode in signal_modes:
119 test_method = create_test (algo, mode)118 _test_method = create_test (algo, mode)
120 test_method.__name__ = 'test_pitch_%s_%d_%d_%dHz_sin_%.0f' % ( algo,119 _test_method.__name__ = 'test_pitch_%s_%d_%d_%dHz_sin_%.0f' % ( algo,
121 mode[0], mode[1], mode[2], mode[3] )120 mode[0], mode[1], mode[2], mode[3] )
122 setattr (aubio_pitch_Sinusoid, test_method.__name__, test_method)121 setattr (aubio_pitch_Sinusoid, _test_method.__name__, _test_method)
123 122
124if __name__ == '__main__':123if __name__ == '__main__':
124 from unittest import main
125 main()125 main()
python/tests/test_sink.py+16−22
@@ -1,13 +1,9 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from nose2 import main
4from nose2.tools import params
5from numpy.testing import TestCase3from numpy.testing import TestCase
6from aubio import fvec, source, sink4from aubio import fvec, source, sink
7from .utils import list_all_sounds, get_tmp_sink_path, del_tmp_sink_path5from utils import list_all_sounds, get_tmp_sink_path, del_tmp_sink_path
8 6from _tools import parametrize, skipTest, assert_raises
9import warnings
10warnings.filterwarnings('ignore', category=UserWarning, append=True)
11 7
12list_of_sounds = list_all_sounds('sounds')8list_of_sounds = list_all_sounds('sounds')
13samplerates = [0, 44100, 8000, 32000]9samplerates = [0, 44100, 8000, 32000]
@@ -23,30 +19,26 @@ for soundfile in list_of_sounds: · 9 unmodified lines
23 for samplerate in samplerates:19 for samplerate in samplerates:
24 all_params.append((hop_size, samplerate, soundfile))20 all_params.append((hop_size, samplerate, soundfile))
25 21
26class aubio_sink_test_case(TestCase):22class Test_aubio_sink(object):
27
28 def setUp(self):
29 if not len(list_of_sounds):
30 self.skipTest('add some sound files in \'python/tests/sounds\'')
31 23
32 def test_wrong_filename(self):24 def test_wrong_filename(self):
33 with self.assertRaises(RuntimeError):25 with assert_raises(RuntimeError):
34 sink('')26 sink('')
35 27
36 def test_wrong_samplerate(self):28 def test_wrong_samplerate(self):
37 with self.assertRaises(RuntimeError):29 with assert_raises(RuntimeError):
38 sink(get_tmp_sink_path(), -1)30 sink(get_tmp_sink_path(), -1)
39 31
40 def test_wrong_samplerate_too_large(self):32 def test_wrong_samplerate_too_large(self):
41 with self.assertRaises(RuntimeError):33 with assert_raises(RuntimeError):
42 sink(get_tmp_sink_path(), 1536001, 2)34 sink(get_tmp_sink_path(), 1536001, 2)
43 35
44 def test_wrong_channels(self):36 def test_wrong_channels(self):
45 with self.assertRaises(RuntimeError):37 with assert_raises(RuntimeError):
46 sink(get_tmp_sink_path(), 44100, -1)38 sink(get_tmp_sink_path(), 44100, -1)
47 39
48 def test_wrong_channels_too_large(self):40 def test_wrong_channels_too_large(self):
49 with self.assertRaises(RuntimeError):41 with assert_raises(RuntimeError):
50 sink(get_tmp_sink_path(), 44100, 202020)42 sink(get_tmp_sink_path(), 44100, 202020)
51 43
52 def test_many_sinks(self):44 def test_many_sinks(self):
@@ -66,13 +58,13 @@ class aubio_sink_test_case(TestCase): · 13 unmodified lines
66 g.close()58 g.close()
67 shutil.rmtree(tmpdir)59 shutil.rmtree(tmpdir)
68 60
69 @params(*all_params)61 @parametrize('hop_size, samplerate, path', all_params)
70 def test_read_and_write(self, hop_size, samplerate, path):62 def test_read_and_write(self, hop_size, samplerate, path):
71
72 try:63 try:
73 f = source(path, samplerate, hop_size)64 f = source(path, samplerate, hop_size)
74 except RuntimeError as e:65 except RuntimeError as e:
75 self.skipTest('failed opening with hop_s = {:d}, samplerate = {:d} ({:s})'.format(hop_size, samplerate, str(e)))66 err_msg = '{:s} (hop_s = {:d}, samplerate = {:d})'
67 skipTest(err_msg.format(str(e), hop_size, samplerate))
76 if samplerate == 0: samplerate = f.samplerate68 if samplerate == 0: samplerate = f.samplerate
77 sink_path = get_tmp_sink_path()69 sink_path = get_tmp_sink_path()
78 g = sink(sink_path, samplerate)70 g = sink(sink_path, samplerate)
@@ -84,12 +76,13 @@ class aubio_sink_test_case(TestCase): · 5 unmodified lines
84 if read < f.hop_size: break76 if read < f.hop_size: break
85 del_tmp_sink_path(sink_path)77 del_tmp_sink_path(sink_path)
86 78
87 @params(*all_params)79 @parametrize('hop_size, samplerate, path', all_params)
88 def test_read_and_write_multi(self, hop_size, samplerate, path):80 def test_read_and_write_multi(self, hop_size, samplerate, path):
89 try:81 try:
90 f = source(path, samplerate, hop_size)82 f = source(path, samplerate, hop_size)
91 except RuntimeError as e:83 except RuntimeError as e:
92 self.skipTest('failed opening with hop_s = {:d}, samplerate = {:d} ({:s})'.format(hop_size, samplerate, str(e)))84 err_msg = '{:s} (hop_s = {:d}, samplerate = {:d})'
85 skipTest(err_msg.format(str(e), hop_size, samplerate))
93 if samplerate == 0: samplerate = f.samplerate86 if samplerate == 0: samplerate = f.samplerate
94 sink_path = get_tmp_sink_path()87 sink_path = get_tmp_sink_path()
95 g = sink(sink_path, samplerate, channels = f.channels)88 g = sink(sink_path, samplerate, channels = f.channels)
@@ -125,4 +118,5 @@ class aubio_sink_test_case(TestCase): · 29 unmodified lines
125 g(vec, 128)118 g(vec, 128)
126 119
127if __name__ == '__main__':120if __name__ == '__main__':
128 main()121 from _tools import run_module_suite
122 run_module_suite()
python/tests/test_slicing.py+3−3
@@ -1,10 +1,9 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4from numpy.testing import TestCase, assert_equal3from numpy.testing import TestCase, assert_equal
5from aubio import slice_source_at_stamps4from aubio import slice_source_at_stamps
6from .utils import count_files_in_directory, get_default_test_sound5from utils import count_files_in_directory, get_default_test_sound
7from .utils import count_samples_in_directory, count_samples_in_file6from utils import count_samples_in_directory, count_samples_in_file
8 7
9import tempfile8import tempfile
10import shutil9import shutil
@@ -167,4 +166,5 @@ class aubio_slicing_wrong_ends_test_case(TestCase): · 156 unmodified lines
167 shutil.rmtree(self.output_dir)166 shutil.rmtree(self.output_dir)
168 167
169if __name__ == '__main__':168if __name__ == '__main__':
169 from unittest import main
170 main()170 main()
python/tests/test_source.py+56−53
@@ -1,19 +1,17 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from nose2 import main3
4from nose2.tools import params
5from numpy.testing import TestCase, assert_equal4from numpy.testing import TestCase, assert_equal
6from aubio import source5from aubio import source
7from .utils import list_all_sounds6from utils import list_all_sounds
8 7import unittest
9import warnings8from _tools import parametrize, assert_raises, assert_equal, skipTest
10warnings.filterwarnings('ignore', category=UserWarning, append=True)
11 9
12list_of_sounds = list_all_sounds('sounds')10list_of_sounds = list_all_sounds('sounds')
13samplerates = [0, 44100, 8000, 32000]11samplerates = [0, 44100, 8000, 32000]
14hop_sizes = [512, 1024, 64]12hop_sizes = [512, 1024, 64]
15 13
16path = None14default_test_sound = len(list_of_sounds) and list_of_sounds[0] or None
17 15
18all_params = []16all_params = []
19for soundfile in list_of_sounds:17for soundfile in list_of_sounds:
@@ -21,24 +19,20 @@ for soundfile in list_of_sounds: · 1 unmodified line
21 for samplerate in samplerates:19 for samplerate in samplerates:
22 all_params.append((hop_size, samplerate, soundfile))20 all_params.append((hop_size, samplerate, soundfile))
23 21
22no_sounds_msg = "no test sounds, add some in 'python/tests/sounds/'!"
24 23
25class aubio_source_test_case_base(TestCase):24_debug = False
26
27 def setUp(self):
28 if not len(list_of_sounds):
29 self.skipTest('add some sound files in \'python/tests/sounds\'')
30 self.default_test_sound = list_of_sounds[0]
31 25
32class aubio_source_test_case(aubio_source_test_case_base):26class Test_aubio_source_test_case(object):
33 27
34 @params(*list_of_sounds)28 @parametrize('filename', list_of_sounds)
35 def test_close_file(self, filename):29 def test_close_file(self, filename):
36 samplerate = 0 # use native samplerate30 samplerate = 0 # use native samplerate
37 hop_size = 25631 hop_size = 256
38 f = source(filename, samplerate, hop_size)32 f = source(filename, samplerate, hop_size)
39 f.close()33 f.close()
40 34
41 @params(*list_of_sounds)35 @parametrize('filename', list_of_sounds)
42 def test_close_file_twice(self, filename):36 def test_close_file_twice(self, filename):
43 samplerate = 0 # use native samplerate37 samplerate = 0 # use native samplerate
44 hop_size = 25638 hop_size = 256
@@ -46,7 +40,7 @@ class aubio_source_test_case(aubio_source_test_case_base): · 1 unmodified line
46 f.close()40 f.close()
47 f.close()41 f.close()
48 42
49class aubio_source_read_test_case(aubio_source_test_case_base):43class Test_aubio_source_read(object):
50 44
51 def read_from_source(self, f):45 def read_from_source(self, f):
52 total_frames = 046 total_frames = 0
@@ -56,47 +50,51 @@ class aubio_source_read_test_case(aubio_source_test_case_base): · 3 unmodified lines
56 if read < f.hop_size:50 if read < f.hop_size:
57 assert_equal(samples[read:], 0)51 assert_equal(samples[read:], 0)
58 break52 break
59 #result_str = "read {:.2f}s ({:d} frames in {:d} blocks at {:d}Hz) from {:s}"53 if _debug:
60 #result_params = total_frames / float(f.samplerate), total_frames, total_frames//f.hop_size, f.samplerate, f.uri54 result_str = "read {:.2f}s ({:d} frames"
61 #print (result_str.format(*result_params))55 result_str += " in {:d} blocks at {:d}Hz) from {:s}"
56 result_params = total_frames / float(f.samplerate), total_frames, \
57 total_frames//f.hop_size, f.samplerate, f.uri
58 print (result_str.format(*result_params))
62 return total_frames59 return total_frames
63 60
64 @params(*all_params)61 @parametrize('hop_size, samplerate, soundfile', all_params)
65 def test_samplerate_hopsize(self, hop_size, samplerate, soundfile):62 def test_samplerate_hopsize(self, hop_size, samplerate, soundfile):
66 try:63 try:
67 f = source(soundfile, samplerate, hop_size)64 f = source(soundfile, samplerate, hop_size)
68 except RuntimeError as e:65 except RuntimeError as e:
69 self.skipTest('failed opening with hop_s = {:d}, samplerate = {:d} ({:s})'.format(hop_size, samplerate, str(e)))66 err_msg = 'failed opening with hop_s={:d}, samplerate={:d} ({:s})'
67 skipTest(err_msg.format(hop_size, samplerate, str(e)))
70 assert f.samplerate != 068 assert f.samplerate != 0
71 read_frames = self.read_from_source(f)69 read_frames = self.read_from_source(f)
72 if 'f_' in soundfile and samplerate == 0:70 if 'f_' in soundfile and samplerate == 0:
73 import re71 import re
74 f = re.compile('.*_\([0:9]*f\)_.*')72 f = re.compile(r'.*_\([0:9]*f\)_.*')
75 match_f = re.findall('([0-9]*)f_', soundfile)73 match_f = re.findall('([0-9]*)f_', soundfile)
76 if len(match_f) == 1:74 if len(match_f) == 1:
77 expected_frames = int(match_f[0])75 expected_frames = int(match_f[0])
78 self.assertEqual(expected_frames, read_frames)76 assert_equal(expected_frames, read_frames)
79 77
80 @params(*list_of_sounds)78 @parametrize('p', list_of_sounds)
81 def test_samplerate_none(self, p):79 def test_samplerate_none(self, p):
82 f = source(p)80 f = source(p)
83 assert f.samplerate != 081 assert f.samplerate != 0
84 self.read_from_source(f)82 self.read_from_source(f)
85 83
86 @params(*list_of_sounds)84 @parametrize('p', list_of_sounds)
87 def test_samplerate_0(self, p):85 def test_samplerate_0(self, p):
88 f = source(p, 0)86 f = source(p, 0)
89 assert f.samplerate != 087 assert f.samplerate != 0
90 self.read_from_source(f)88 self.read_from_source(f)
91 89
92 @params(*list_of_sounds)90 @parametrize('p', list_of_sounds)
93 def test_zero_hop_size(self, p):91 def test_zero_hop_size(self, p):
94 f = source(p, 0, 0)92 f = source(p, 0, 0)
95 assert f.samplerate != 093 assert f.samplerate != 0
96 assert f.hop_size != 094 assert f.hop_size != 0
97 self.read_from_source(f)95 self.read_from_source(f)
98 96
99 @params(*list_of_sounds)97 @parametrize('p', list_of_sounds)
100 def test_seek_to_half(self, p):98 def test_seek_to_half(self, p):
101 from random import randint99 from random import randint
102 f = source(p, 0, 0)100 f = source(p, 0, 0)
@@ -108,7 +106,7 @@ class aubio_source_read_test_case(aubio_source_test_case_base): · 5 unmodified lines
108 b = self.read_from_source(f)106 b = self.read_from_source(f)
109 assert a == b + c107 assert a == b + c
110 108
111 @params(*list_of_sounds)109 @parametrize('p', list_of_sounds)
112 def test_duration(self, p):110 def test_duration(self, p):
113 total_frames = 0111 total_frames = 0
114 f = source(p)112 f = source(p)
@@ -117,43 +115,44 @@ class aubio_source_read_test_case(aubio_source_test_case_base): · 2 unmodified lines
117 _, read = f()115 _, read = f()
118 total_frames += read116 total_frames += read
119 if read < f.hop_size: break117 if read < f.hop_size: break
120 self.assertEqual(duration, total_frames)118 assert_equal (duration, total_frames)
121 119
122 120
123class aubio_source_test_wrong_params(TestCase):121class Test_aubio_source_wrong_params(object):
124 122
125 def test_wrong_file(self):123 def test_wrong_file(self):
126 with self.assertRaises(RuntimeError):124 with assert_raises(RuntimeError):
127 source('path_to/unexisting file.mp3')125 source('path_to/unexisting file.mp3')
128 126
129class aubio_source_test_wrong_params_with_file(aubio_source_test_case_base):127@unittest.skipIf(default_test_sound is None, no_sounds_msg)
128class Test_aubio_source_wrong_params_with_file(TestCase):
130 129
131 def test_wrong_samplerate(self):130 def test_wrong_samplerate(self):
132 with self.assertRaises(ValueError):131 with assert_raises(ValueError):
133 source(self.default_test_sound, -1)132 source(default_test_sound, -1)
134 133
135 def test_wrong_hop_size(self):134 def test_wrong_hop_size(self):
136 with self.assertRaises(ValueError):135 with assert_raises(ValueError):
137 source(self.default_test_sound, 0, -1)136 source(default_test_sound, 0, -1)
138 137
139 def test_wrong_channels(self):138 def test_wrong_channels(self):
140 with self.assertRaises(ValueError):139 with assert_raises(ValueError):
141 source(self.default_test_sound, 0, 0, -1)140 source(default_test_sound, 0, 0, -1)
142 141
143 def test_wrong_seek(self):142 def test_wrong_seek(self):
144 f = source(self.default_test_sound)143 f = source(default_test_sound)
145 with self.assertRaises(ValueError):144 with assert_raises(ValueError):
146 f.seek(-1)145 f.seek(-1)
147 146
148 def test_wrong_seek_too_large(self):147 def test_wrong_seek_too_large(self):
149 f = source(self.default_test_sound)148 f = source(default_test_sound)
150 try:149 try:
151 with self.assertRaises(ValueError):150 with assert_raises(ValueError):
152 f.seek(f.duration + f.samplerate * 10)151 f.seek(f.duration + f.samplerate * 10)
153 except AssertionError:152 except:
154 self.skipTest('seeking after end of stream failed raising ValueError')153 skipTest('seeking after end of stream failed raising ValueError')
155 154
156class aubio_source_readmulti_test_case(aubio_source_read_test_case):155class Test_aubio_source_readmulti(Test_aubio_source_read):
157 156
158 def read_from_source(self, f):157 def read_from_source(self, f):
159 total_frames = 0158 total_frames = 0
@@ -163,15 +162,18 @@ class aubio_source_readmulti_test_case(aubio_source_read_test_case): · 3 unmodified lines
163 if read < f.hop_size:162 if read < f.hop_size:
164 assert_equal(samples[:,read:], 0)163 assert_equal(samples[:,read:], 0)
165 break164 break
166 #result_str = "read {:.2f}s ({:d} frames in {:d} channels and {:d} blocks at {:d}Hz) from {:s}"165 if _debug:
167 #result_params = total_frames / float(f.samplerate), total_frames, f.channels, int(total_frames/f.hop_size), f.samplerate, f.uri166 result_str = "read {:.2f}s ({:d} frames in {:d} channels"
168 #print (result_str.format(*result_params))167 result_str += " and {:d} blocks at {:d}Hz) from {:s}"
168 result_params = total_frames / float(f.samplerate), total_frames, \
169 f.channels, int(total_frames/f.hop_size), \
170 f.samplerate, f.uri
171 print (result_str.format(*result_params))
169 return total_frames172 return total_frames
170 173
171class aubio_source_with(aubio_source_test_case_base):174class Test_aubio_source_with(object):
172 175
173 #@params(*list_of_sounds)176 @parametrize('filename', list_of_sounds)
174 @params(*list_of_sounds)
175 def test_read_from_mono(self, filename):177 def test_read_from_mono(self, filename):
176 total_frames = 0178 total_frames = 0
177 hop_size = 2048179 hop_size = 2048
@@ -185,4 +187,5 @@ class aubio_source_with(aubio_source_test_case_base): · 7 unmodified lines
185 assert_equal(total_frames, input_source.duration)187 assert_equal(total_frames, input_source.duration)
186 188
187if __name__ == '__main__':189if __name__ == '__main__':
188 main()190 from _tools import run_module_suite
191 run_module_suite()
python/tests/test_source_channels.py+1−1
@@ -8,7 +8,7 @@ import unittest · 7 unmodified lines
8import aubio8import aubio
9import numpy as np9import numpy as np
10from numpy.testing import assert_equal10from numpy.testing import assert_equal
11from .utils import get_tmp_sink_path11from utils import get_tmp_sink_path
12 12
13class aubio_source_test_case(unittest.TestCase):13class aubio_source_test_case(unittest.TestCase):
14 14
python/tests/test_specdesc.py+1−1
@@ -1,6 +1,5 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4from numpy.testing import TestCase, assert_equal, assert_almost_equal3from numpy.testing import TestCase, assert_equal, assert_almost_equal
5from numpy import random, arange, log, zeros4from numpy import random, arange, log, zeros
6from aubio import specdesc, cvec, float_type5from aubio import specdesc, cvec, float_type
@@ -229,4 +228,5 @@ class aubio_specdesc_wrong(TestCase): · 222 unmodified lines
229 specdesc("unknown", 512)228 specdesc("unknown", 512)
230 229
231if __name__ == '__main__':230if __name__ == '__main__':
231 from unittest import main
232 main()232 main()
python/tests/test_zero_crossing_rate.py+1−1
@@ -1,6 +1,5 @@
1#! /usr/bin/env python1#! /usr/bin/env python
2 2
3from unittest import main
4from numpy.testing import TestCase3from numpy.testing import TestCase
5from aubio import fvec, zero_crossing_rate4from aubio import fvec, zero_crossing_rate
6 5
@@ -43,4 +42,5 @@ class zero_crossing_rate_test_case(TestCase): · 36 unmodified lines
43 self.assertEqual(2./buf_size, zero_crossing_rate(self.vector))42 self.assertEqual(2./buf_size, zero_crossing_rate(self.vector))
44 43
45if __name__ == '__main__':44if __name__ == '__main__':
45 from unittest import main
46 main()46 main()
python/tests/utils.py+6−12
@@ -8,11 +8,8 @@ from tempfile import mkstemp · 7 unmodified lines
8DEFAULT_SOUND = '22050Hz_5s_brownnoise.wav'8DEFAULT_SOUND = '22050Hz_5s_brownnoise.wav'
9 9
10def array_from_text_file(filename, dtype = 'float'):10def array_from_text_file(filename, dtype = 'float'):
11 filename = os.path.join(os.path.dirname(__file__), filename)11 realpathname = os.path.join(os.path.dirname(__file__), filename)
12 with open(filename) as f:12 return np.loadtxt(realpathname, dtype = dtype)
13 lines = f.readlines()
14 return np.array([line.split() for line in lines],
15 dtype = dtype)
16 13
17def list_all_sounds(rel_dir):14def list_all_sounds(rel_dir):
18 datadir = os.path.join(os.path.dirname(__file__), rel_dir)15 datadir = os.path.join(os.path.dirname(__file__), rel_dir)
@@ -38,13 +35,10 @@ def del_tmp_sink_path(path): · 19 unmodified lines
38 try:35 try:
39 os.unlink(path)36 os.unlink(path)
40 except WindowsError as e:37 except WindowsError as e:
41 print("deleting {:s} failed ({:s}), reopening".format(path, repr(e)))38 # removing the temporary directory sometimes fails on windows
42 with open(path, 'wb') as f:39 import warnings
43 f.close()40 errmsg = "failed deleting temporary file {:s} ({:s})"
44 try:41 warnings.warn(UserWarning(errmsg.format(path, repr(e))))
45 os.unlink(path)
46 except WindowsError as f:
47 print("deleting {:s} failed ({:s}), aborting".format(path, repr(e)))
48 42
49def array_from_yaml_file(filename):43def array_from_yaml_file(filename):
50 import yaml44 import yaml
requirements.txt+1−1
@@ -1,2 +1,2 @@
1numpy1numpy
2nose22pytest
scripts/get_waf.sh+1−1
@@ -3,7 +3,7 @@ · 2 unmodified lines
3set -e3set -e
4#set -x4#set -x
5 5
6WAFVERSION=2.0.126WAFVERSION=2.0.13
7WAFTARBALL=waf-$WAFVERSION.tar.bz27WAFTARBALL=waf-$WAFVERSION.tar.bz2
8WAFURL=https://waf.io/$WAFTARBALL8WAFURL=https://waf.io/$WAFTARBALL
9WAFUPSTREAMKEY=https://gitlab.com/ita1024/waf/raw/master/utils/pubkey.asc9WAFUPSTREAMKEY=https://gitlab.com/ita1024/waf/raw/master/utils/pubkey.asc
setup.py+0−4
@@ -95,8 +95,4 @@ distrib = setup(name='aubio', · 94 unmodified lines
95 'aubiocut = aubio.cut:main',95 'aubiocut = aubio.cut:main',
96 ],96 ],
97 },97 },
98 test_suite = 'nose2.collector.collector',
99 extras_require = {
100 'tests': ['numpy'],
101 },
102 )98 )
src/aubio_priv.h+7−0
@@ -367,4 +367,11 @@ uint_t aubio_log(sint_t level, const char_t *fmt, ...); · 366 unmodified lines
367#endif367#endif
368#endif /* __STRICT_ANSI__ */368#endif /* __STRICT_ANSI__ */
369 369
370#if defined(DEBUG)
371#include <assert.h>
372#define AUBIO_ASSERT(x) assert(x)
373#else
374#define AUBIO_ASSERT(x)
375#endif /* DEBUG */
376
370#endif /* AUBIO_PRIV_H */377#endif /* AUBIO_PRIV_H */
src/io/ioutils.c+36−0
@@ -51,3 +51,39 @@ aubio_io_validate_channels(const char_t *kind, const char_t *path, uint_t channe · 50 unmodified lines
51 }51 }
52 return AUBIO_OK;52 return AUBIO_OK;
53}53}
54
55uint_t
56aubio_sink_validate_input_length(const char_t *kind, const char_t *path,
57 uint_t max_size, uint_t write_data_length, uint_t write)
58{
59 uint_t can_write = write;
60
61 if (write > max_size) {
62 AUBIO_WRN("%s: partial write to %s, trying to write %d frames,"
63 " at most %d can be written at once\n", kind, path, write, max_size);
64 can_write = max_size;
65 }
66
67 if (can_write > write_data_length) {
68 AUBIO_WRN("%s: partial write to %s, trying to write %d frames,"
69 " but found input of length %d\n", kind, path, write,
70 write_data_length);
71 can_write = write_data_length;
72 }
73
74 return can_write;
75}
76
77uint_t
78aubio_sink_validate_input_channels(const char_t *kind, const char_t *path,
79 uint_t sink_channels, uint_t write_data_height)
80{
81 uint_t channels = sink_channels;
82 if (write_data_height < sink_channels) {
83 AUBIO_WRN("%s: partial write to %s, trying to write %d channels,"
84 " but found input of height %d\n", kind, path, sink_channels,
85 write_data_height);
86 channels = write_data_height;
87 }
88 return channels;
89}
src/io/ioutils.h+27−0
@@ -53,6 +53,33 @@ uint_t aubio_io_validate_samplerate(const char_t *kind, const char_t *path, · 52 unmodified lines
53uint_t aubio_io_validate_channels(const char_t *kind, const char_t *path,53uint_t aubio_io_validate_channels(const char_t *kind, const char_t *path,
54 uint_t channels);54 uint_t channels);
55 55
56/** validate length of input
57
58 \param kind the object kind to report on
59 \param path the path to report on
60 \param max_size maximum number of frames that can be written
61 \param write_data_length actual length of input vector/matrix
62 \param write number of samples asked
63
64 \return write or the maximum number of frames that can be written
65*/
66uint_t
67aubio_sink_validate_input_length(const char_t *kind, const char_t *path,
68 uint_t max_size, uint_t write_data_length, uint_t write);
69
70/** validate height of input
71
72 \param kind the object kind to report on
73 \param path the path to report on
74 \param max_size maximum number of channels that can be written
75 \param write_data_height actual height of input matrix
76
77 \return write_data_height or the maximum number of channels
78*/
79uint_t
80aubio_sink_validate_input_channels(const char_t *kind, const char_t *path,
81 uint_t sink_channels, uint_t write_data_height);
82
56#ifdef __cplusplus83#ifdef __cplusplus
57}84}
58#endif85#endif
src/io/sink.c+4−4
@@ -102,7 +102,7 @@ aubio_sink_t * new_aubio_sink(const char_t * uri, uint_t samplerate) { · 101 unmodified lines
102 !defined(HAVE_SINK_APPLE_AUDIO)102 !defined(HAVE_SINK_APPLE_AUDIO)
103 AUBIO_ERROR("sink: failed creating '%s' at %dHz (no sink built-in)\n", uri, samplerate);103 AUBIO_ERROR("sink: failed creating '%s' at %dHz (no sink built-in)\n", uri, samplerate);
104#endif104#endif
105 AUBIO_FREE(s);105 del_aubio_sink(s);
106 return NULL;106 return NULL;
107}107}
108 108
@@ -135,8 +135,8 @@ uint_t aubio_sink_close(aubio_sink_t *s) { · 26 unmodified lines
135}135}
136 136
137void del_aubio_sink(aubio_sink_t * s) {137void del_aubio_sink(aubio_sink_t * s) {
138 if (!s) return;138 AUBIO_ASSERT(s);
139 s->s_del((void *)s->sink);139 if (s->s_del && s->sink)
140 s->s_del((void *)s->sink);
140 AUBIO_FREE(s);141 AUBIO_FREE(s);
141 return;
142}142}
src/io/sink_apple_audio.c+62−42
@@ -31,9 +31,7 @@ · 30 unmodified lines
31// ExtAudioFileRef, AudioStreamBasicDescription, AudioBufferList, ...31// ExtAudioFileRef, AudioStreamBasicDescription, AudioBufferList, ...
32#include <AudioToolbox/AudioToolbox.h>32#include <AudioToolbox/AudioToolbox.h>
33 33
34#define FLOAT_TO_SHORT(x) (short)(x * 32768)34extern int createAudioBufferList(AudioBufferList *bufferList, int channels, int segmentSize);
35
36extern int createAubioBufferList(AudioBufferList *bufferList, int channels, int segmentSize);
37extern void freeAudioBufferList(AudioBufferList *bufferList);35extern void freeAudioBufferList(AudioBufferList *bufferList);
38extern CFURLRef createURLFromPath(const char * path);36extern CFURLRef createURLFromPath(const char * path);
39char_t *getPrintableOSStatusError(char_t *str, OSStatus error);37char_t *getPrintableOSStatusError(char_t *str, OSStatus error);
@@ -61,11 +59,11 @@ aubio_sink_apple_audio_t * new_aubio_sink_apple_audio(const char_t * uri, uint_t · 21 unmodified lines
61 s->max_frames = MAX_SIZE;59 s->max_frames = MAX_SIZE;
62 s->async = false;60 s->async = false;
63 61
64 if ( (uri == NULL) || (strlen(uri) < 1) ) {62 if ( (uri == NULL) || (strnlen(uri, PATH_MAX) < 1) ) {
65 AUBIO_ERROR("sink_apple_audio: Aborted opening null path\n");63 AUBIO_ERROR("sink_apple_audio: Aborted opening null path\n");
66 goto beach;64 goto beach;
67 }65 }
68 if (s->path != NULL) AUBIO_FREE(s->path);66
69 s->path = AUBIO_ARRAY(char_t, strnlen(uri, PATH_MAX) + 1);67 s->path = AUBIO_ARRAY(char_t, strnlen(uri, PATH_MAX) + 1);
70 strncpy(s->path, uri, strnlen(uri, PATH_MAX) + 1);68 strncpy(s->path, uri, strnlen(uri, PATH_MAX) + 1);
71 69
@@ -76,6 +74,7 @@ aubio_sink_apple_audio_t * new_aubio_sink_apple_audio(const char_t * uri, uint_t · 4 unmodified lines
76 if ((sint_t)samplerate == 0) {74 if ((sint_t)samplerate == 0) {
77 return s;75 return s;
78 }76 }
77
79 // invalid samplerate given, abort78 // invalid samplerate given, abort
80 if (aubio_io_validate_samplerate("sink_apple_audio", s->path, samplerate)) {79 if (aubio_io_validate_samplerate("sink_apple_audio", s->path, samplerate)) {
81 goto beach;80 goto beach;
@@ -91,7 +90,7 @@ aubio_sink_apple_audio_t * new_aubio_sink_apple_audio(const char_t * uri, uint_t · 9 unmodified lines
91 90
92 return s;91 return s;
93beach:92beach:
94 AUBIO_FREE(s);93 del_aubio_sink_apple_audio(s);
95 return NULL;94 return NULL;
96}95}
97 96
@@ -102,7 +101,7 @@ uint_t aubio_sink_apple_audio_preset_samplerate(aubio_sink_apple_audio_t *s, uin · 4 unmodified lines
102 }101 }
103 s->samplerate = samplerate;102 s->samplerate = samplerate;
104 // automatically open when both samplerate and channels have been set103 // automatically open when both samplerate and channels have been set
105 if (s->samplerate != 0 && s->channels != 0) {104 if (/* s->samplerate != 0 && */ s->channels != 0) {
106 return aubio_sink_apple_audio_open(s);105 return aubio_sink_apple_audio_open(s);
107 }106 }
108 return AUBIO_OK;107 return AUBIO_OK;
@@ -115,7 +114,7 @@ uint_t aubio_sink_apple_audio_preset_channels(aubio_sink_apple_audio_t *s, uint_ · 6 unmodified lines
115 }114 }
116 s->channels = channels;115 s->channels = channels;
117 // automatically open when both samplerate and channels have been set116 // automatically open when both samplerate and channels have been set
118 if (s->samplerate != 0 && s->channels != 0) {117 if (s->samplerate != 0 /* && s->channels != 0 */) {
119 return aubio_sink_apple_audio_open(s);118 return aubio_sink_apple_audio_open(s);
120 }119 }
121 return AUBIO_OK;120 return AUBIO_OK;
@@ -150,6 +149,18 @@ uint_t aubio_sink_apple_audio_open(aubio_sink_apple_audio_t *s) { · 28 unmodified lines
150 AudioFileTypeID fileType = kAudioFileWAVEType;149 AudioFileTypeID fileType = kAudioFileWAVEType;
151 CFURLRef fileURL = createURLFromPath(s->path);150 CFURLRef fileURL = createURLFromPath(s->path);
152 bool overwrite = true;151 bool overwrite = true;
152
153 // set the in-memory format
154 AudioStreamBasicDescription inputFormat;
155 memset(&inputFormat, 0, sizeof(AudioStreamBasicDescription));
156 inputFormat.mFormatID = kAudioFormatLinearPCM;
157 inputFormat.mSampleRate = (Float64)(s->samplerate);
158 inputFormat.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked;
159 inputFormat.mChannelsPerFrame = s->channels;
160 inputFormat.mBitsPerChannel = sizeof(smpl_t) * 8;
161 inputFormat.mFramesPerPacket = 1;
162 inputFormat.mBytesPerFrame = inputFormat.mBitsPerChannel * inputFormat.mChannelsPerFrame / 8;
163 inputFormat.mBytesPerPacket = inputFormat.mFramesPerPacket * inputFormat.mBytesPerFrame;
153 OSStatus err = noErr;164 OSStatus err = noErr;
154 err = ExtAudioFileCreateWithURL(fileURL, fileType, &clientFormat, NULL,165 err = ExtAudioFileCreateWithURL(fileURL, fileType, &clientFormat, NULL,
155 overwrite ? kAudioFileFlags_EraseFile : 0, &s->audioFile);166 overwrite ? kAudioFileFlags_EraseFile : 0, &s->audioFile);
@@ -161,7 +172,18 @@ uint_t aubio_sink_apple_audio_open(aubio_sink_apple_audio_t *s) { · 5 unmodified lines
161 getPrintableOSStatusError(errorstr, err));172 getPrintableOSStatusError(errorstr, err));
162 goto beach;173 goto beach;
163 }174 }
164 if (createAubioBufferList(&s->bufferList, s->channels, s->max_frames * s->channels)) {175
176 err = ExtAudioFileSetProperty(s->audioFile,
177 kExtAudioFileProperty_ClientDataFormat,
178 sizeof(AudioStreamBasicDescription), &inputFormat);
179 if (err) {
180 char_t errorstr[20];
181 AUBIO_ERR("sink_apple_audio: error when trying to set output format on %s "
182 "(%s)\n", s->path, getPrintableOSStatusError(errorstr, err));
183 goto beach;
184 }
185
186 if (createAudioBufferList(&s->bufferList, s->channels, s->max_frames * s->channels)) {
165 AUBIO_ERR("sink_apple_audio: error when creating buffer list for %s, "187 AUBIO_ERR("sink_apple_audio: error when creating buffer list for %s, "
166 "out of memory? \n", s->path);188 "out of memory? \n", s->path);
167 goto beach;189 goto beach;
@@ -174,46 +196,42 @@ beach: · 6 unmodified lines
174 196
175void aubio_sink_apple_audio_do(aubio_sink_apple_audio_t * s, fvec_t * write_data, uint_t write) {197void aubio_sink_apple_audio_do(aubio_sink_apple_audio_t * s, fvec_t * write_data, uint_t write) {
176 UInt32 c, v;198 UInt32 c, v;
177 short *data = (short*)s->bufferList.mBuffers[0].mData;199 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData;
178 if (write > s->max_frames) {200 uint_t length = aubio_sink_validate_input_length("sink_apple_audio", s->path,
179 AUBIO_WRN("sink_apple_audio: trying to write %d frames, max %d\n", write, s->max_frames);201 s->max_frames, write_data->length, write);
180 write = s->max_frames;202
181 }203 for (c = 0; c < s->channels; c++) {
182 smpl_t *buf = write_data->data;204 for (v = 0; v < length; v++) {
183 205 data[v * s->channels + c] = write_data->data[v];
184 if (buf) {206 }
185 for (c = 0; c < s->channels; c++) {
186 for (v = 0; v < write; v++) {
187 data[v * s->channels + c] =
188 FLOAT_TO_SHORT(buf[ v * s->channels + c]);
189 }
190 }
191 }207 }
192 aubio_sink_apple_audio_write(s, write);208
209 aubio_sink_apple_audio_write(s, length);
193}210}
194 211
195void aubio_sink_apple_audio_do_multi(aubio_sink_apple_audio_t * s, fmat_t * write_data, uint_t write) {212void aubio_sink_apple_audio_do_multi(aubio_sink_apple_audio_t * s, fmat_t * write_data, uint_t write) {
196 UInt32 c, v;213 UInt32 c, v;
197 short *data = (short*)s->bufferList.mBuffers[0].mData;214 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData;
198 if (write > s->max_frames) {215 uint_t channels = aubio_sink_validate_input_channels("sink_apple_audio",
199 AUBIO_WRN("sink_apple_audio: trying to write %d frames, max %d\n", write, s->max_frames);216 s->path, s->channels, write_data->height);
200 write = s->max_frames;217 uint_t length = aubio_sink_validate_input_length("sink_apple_audio", s->path,
201 }218 s->max_frames, write_data->length, write);
202 smpl_t **buf = write_data->data;219
203 220 for (c = 0; c < channels; c++) {
204 if (buf) {221 for (v = 0; v < length; v++) {
205 for (c = 0; c < s->channels; c++) {222 data[v * s->channels + c] = write_data->data[c][v];
206 for (v = 0; v < write; v++) {223 }
207 data[v * s->channels + c] =
208 FLOAT_TO_SHORT(buf[c][v]);
209 }
210 }
211 }224 }
212 aubio_sink_apple_audio_write(s, write);225
226 aubio_sink_apple_audio_write(s, length);
213}227}
214 228
215void aubio_sink_apple_audio_write(aubio_sink_apple_audio_t *s, uint_t write) {229void aubio_sink_apple_audio_write(aubio_sink_apple_audio_t *s, uint_t write) {
216 OSStatus err = noErr;230 OSStatus err = noErr;
231 // set mDataByteSize to match the number of frames to be written
232 // see https://www.mail-archive.com/coreaudio-api@lists.apple.com/msg01109.html
233 s->bufferList.mBuffers[0].mDataByteSize = write * s->channels
234 * sizeof(smpl_t);
217 if (s->async) {235 if (s->async) {
218 err = ExtAudioFileWriteAsync(s->audioFile, write, &s->bufferList);236 err = ExtAudioFileWriteAsync(s->audioFile, write, &s->bufferList);
219 if (err) {237 if (err) {
@@ -257,11 +275,13 @@ uint_t aubio_sink_apple_audio_close(aubio_sink_apple_audio_t * s) { · 37 unmodified lines
257}275}
258 276
259void del_aubio_sink_apple_audio(aubio_sink_apple_audio_t * s) {277void del_aubio_sink_apple_audio(aubio_sink_apple_audio_t * s) {
260 if (s->audioFile) aubio_sink_apple_audio_close (s);278 AUBIO_ASSERT(s);
261 if (s->path) AUBIO_FREE(s->path);279 if (s->audioFile)
280 aubio_sink_apple_audio_close (s);
281 if (s->path)
282 AUBIO_FREE(s->path);
262 freeAudioBufferList(&s->bufferList);283 freeAudioBufferList(&s->bufferList);
263 AUBIO_FREE(s);284 AUBIO_FREE(s);
264 return;
265}285}
266 286
267#endif /* HAVE_SINK_APPLE_AUDIO */287#endif /* HAVE_SINK_APPLE_AUDIO */
src/io/sink_sndfile.c+27−39
@@ -58,10 +58,9 @@ aubio_sink_sndfile_t * new_aubio_sink_sndfile(const char_t * path, uint_t sample · 57 unmodified lines
58 58
59 if (path == NULL) {59 if (path == NULL) {
60 AUBIO_ERR("sink_sndfile: Aborted opening null path\n");60 AUBIO_ERR("sink_sndfile: Aborted opening null path\n");
61 return NULL;61 goto beach;
62 }62 }
63 63
64 if (s->path) AUBIO_FREE(s->path);
65 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);64 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);
66 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);65 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);
67 66
@@ -97,7 +96,7 @@ uint_t aubio_sink_sndfile_preset_samplerate(aubio_sink_sndfile_t *s, uint_t samp · 29 unmodified lines
97 }96 }
98 s->samplerate = samplerate;97 s->samplerate = samplerate;
99 // automatically open when both samplerate and channels have been set98 // automatically open when both samplerate and channels have been set
100 if (s->samplerate != 0 && s->channels != 0) {99 if (/* s->samplerate != 0 && */ s->channels != 0) {
101 return aubio_sink_sndfile_open(s);100 return aubio_sink_sndfile_open(s);
102 }101 }
103 return AUBIO_OK;102 return AUBIO_OK;
@@ -110,7 +109,7 @@ uint_t aubio_sink_sndfile_preset_channels(aubio_sink_sndfile_t *s, uint_t channe · 6 unmodified lines
110 }109 }
111 s->channels = channels;110 s->channels = channels;
112 // automatically open when both samplerate and channels have been set111 // automatically open when both samplerate and channels have been set
113 if (s->samplerate != 0 && s->channels != 0) {112 if (s->samplerate != 0 /* && s->channels != 0 */) {
114 return aubio_sink_sndfile_open(s);113 return aubio_sink_sndfile_open(s);
115 }114 }
116 return AUBIO_OK;115 return AUBIO_OK;
@@ -147,8 +146,7 @@ uint_t aubio_sink_sndfile_open(aubio_sink_sndfile_t *s) { · 30 unmodified lines
147 s->scratch_size = s->max_size*s->channels;146 s->scratch_size = s->max_size*s->channels;
148 /* allocate data for de/interleaving reallocated when needed. */147 /* allocate data for de/interleaving reallocated when needed. */
149 if (s->scratch_size >= MAX_SIZE * AUBIO_MAX_CHANNELS) {148 if (s->scratch_size >= MAX_SIZE * AUBIO_MAX_CHANNELS) {
150 abort();149 AUBIO_ERR("sink_sndfile: %d x %d exceeds maximum buffer size %d\n",
151 AUBIO_ERR("sink_sndfile: %d x %d exceeds maximum aubio_sink_sndfile buffer size %d\n",
152 s->max_size, s->channels, MAX_SIZE * AUBIO_MAX_CHANNELS);150 s->max_size, s->channels, MAX_SIZE * AUBIO_MAX_CHANNELS);
153 return AUBIO_FAIL;151 return AUBIO_FAIL;
154 }152 }
@@ -158,24 +156,17 @@ uint_t aubio_sink_sndfile_open(aubio_sink_sndfile_t *s) { · 3 unmodified lines
158}156}
159 157
160void aubio_sink_sndfile_do(aubio_sink_sndfile_t *s, fvec_t * write_data, uint_t write){158void aubio_sink_sndfile_do(aubio_sink_sndfile_t *s, fvec_t * write_data, uint_t write){
161 uint_t i, j, channels = s->channels;159 uint_t i, j;
162 int nsamples = 0;
163 smpl_t *pwrite;
164 sf_count_t written_frames;160 sf_count_t written_frames;
165 161 uint_t channels = s->channels;
166 if (write > s->max_size) {162 uint_t length = aubio_sink_validate_input_length("sink_sndfile", s->path,
167 AUBIO_WRN("sink_sndfile: trying to write %d frames, but only %d can be written at a time\n",163 s->max_size, write_data->length, write);
168 write, s->max_size);164 int nsamples = channels * length;
169 write = s->max_size;
170 }
171
172 nsamples = channels * write;
173 165
174 /* interleaving data */166 /* interleaving data */
175 for ( i = 0; i < channels; i++) {167 for ( i = 0; i < channels; i++) {
176 pwrite = (smpl_t *)write_data->data;168 for (j = 0; j < length; j++) {
177 for (j = 0; j < write; j++) {169 s->scratch_data[channels*j+i] = write_data->data[j];
178 s->scratch_data[channels*j+i] = pwrite[j];
179 }170 }
180 }171 }
181 172
@@ -188,24 +179,18 @@ void aubio_sink_sndfile_do(aubio_sink_sndfile_t *s, fvec_t * write_data, uint_t · 6 unmodified lines
188}179}
189 180
190void aubio_sink_sndfile_do_multi(aubio_sink_sndfile_t *s, fmat_t * write_data, uint_t write){181void aubio_sink_sndfile_do_multi(aubio_sink_sndfile_t *s, fmat_t * write_data, uint_t write){
191 uint_t i, j, channels = s->channels;182 uint_t i, j;
192 int nsamples = 0;
193 smpl_t *pwrite;
194 sf_count_t written_frames;183 sf_count_t written_frames;
195 184 uint_t channels = aubio_sink_validate_input_channels("sink_sndfile", s->path,
196 if (write > s->max_size) {185 s->channels, write_data->height);
197 AUBIO_WRN("sink_sndfile: trying to write %d frames, but only %d can be written at a time\n",186 uint_t length = aubio_sink_validate_input_length("sink_sndfile", s->path,
198 write, s->max_size);187 s->max_size, write_data->length, write);
199 write = s->max_size;188 int nsamples = channels * length;
200 }
201
202 nsamples = channels * write;
203 189
204 /* interleaving data */190 /* interleaving data */
205 for ( i = 0; i < write_data->height; i++) {191 for ( i = 0; i < channels; i++) {
206 pwrite = (smpl_t *)write_data->data[i];192 for (j = 0; j < length; j++) {
207 for (j = 0; j < write; j++) {193 s->scratch_data[channels*j+i] = write_data->data[i][j];
208 s->scratch_data[channels*j+i] = pwrite[j];
209 }194 }
210 }195 }
211 196
@@ -230,10 +215,13 @@ uint_t aubio_sink_sndfile_close (aubio_sink_sndfile_t *s) { · 18 unmodified lines
230}215}
231 216
232void del_aubio_sink_sndfile(aubio_sink_sndfile_t * s){217void del_aubio_sink_sndfile(aubio_sink_sndfile_t * s){
233 if (!s) return;218 AUBIO_ASSERT(s);
234 if (s->path) AUBIO_FREE(s->path);219 if (s->handle)
235 aubio_sink_sndfile_close(s);220 aubio_sink_sndfile_close(s);
236 AUBIO_FREE(s->scratch_data);221 if (s->path)
222 AUBIO_FREE(s->path);
223 if (s->scratch_data)
224 AUBIO_FREE(s->scratch_data);
237 AUBIO_FREE(s);225 AUBIO_FREE(s);
238}226}
239 227
src/io/sink_wavwrite.c+24−29
@@ -87,12 +87,7 @@ aubio_sink_wavwrite_t * new_aubio_sink_wavwrite(const char_t * path, uint_t samp · 86 unmodified lines
87 AUBIO_ERR("sink_wavwrite: Aborted opening null path\n");87 AUBIO_ERR("sink_wavwrite: Aborted opening null path\n");
88 goto beach;88 goto beach;
89 }89 }
90 if ((sint_t)samplerate < 0) {
91 AUBIO_ERR("sink_wavwrite: Can not create %s with samplerate %d\n", path, samplerate);
92 goto beach;
93 }
94 90
95 if (s->path) AUBIO_FREE(s->path);
96 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);91 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);
97 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);92 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);
98 93
@@ -135,7 +130,7 @@ uint_t aubio_sink_wavwrite_preset_samplerate(aubio_sink_wavwrite_t *s, uint_t sa · 36 unmodified lines
135 }130 }
136 s->samplerate = samplerate;131 s->samplerate = samplerate;
137 // automatically open when both samplerate and channels have been set132 // automatically open when both samplerate and channels have been set
138 if (s->samplerate != 0 && s->channels != 0) {133 if (/* s->samplerate != 0 && */ s->channels != 0) {
139 return aubio_sink_wavwrite_open(s);134 return aubio_sink_wavwrite_open(s);
140 }135 }
141 return AUBIO_OK;136 return AUBIO_OK;
@@ -148,7 +143,7 @@ uint_t aubio_sink_wavwrite_preset_channels(aubio_sink_wavwrite_t *s, uint_t chan · 6 unmodified lines
148 }143 }
149 s->channels = channels;144 s->channels = channels;
150 // automatically open when both samplerate and channels have been set145 // automatically open when both samplerate and channels have been set
151 if (s->samplerate != 0 && s->channels != 0) {146 if (s->samplerate != 0 /* && s->channels != 0 */) {
152 return aubio_sink_wavwrite_open(s);147 return aubio_sink_wavwrite_open(s);
153 }148 }
154 return AUBIO_OK;149 return AUBIO_OK;
@@ -233,18 +228,16 @@ beach: · 78 unmodified lines
233 228
234 229
235void aubio_sink_wavwrite_do(aubio_sink_wavwrite_t *s, fvec_t * write_data, uint_t write){230void aubio_sink_wavwrite_do(aubio_sink_wavwrite_t *s, fvec_t * write_data, uint_t write){
236 uint_t i = 0, written_frames = 0;231 uint_t c = 0, i = 0, written_frames = 0;
237 232 uint_t length = aubio_sink_validate_input_length("sink_wavwrite", s->path,
238 if (write > s->max_size) {233 s->max_size, write_data->length, write);
239 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, "
240 "but only %d can be written at a time\n", write, s->path, s->max_size);
241 write = s->max_size;
242 }
243 234
244 for (i = 0; i < write; i++) {235 for (c = 0; c < s->channels; c++) {
245 s->scratch_data[i] = HTOLES(FLOAT_TO_SHORT(write_data->data[i]));236 for (i = 0; i < length; i++) {
237 s->scratch_data[i * s->channels + c] = HTOLES(FLOAT_TO_SHORT(write_data->data[i]));
238 }
246 }239 }
247 written_frames = fwrite(s->scratch_data, 2, write, s->fid);240 written_frames = fwrite(s->scratch_data, 2, length * s->channels, s->fid);
248 241
249 if (written_frames != write) {242 if (written_frames != write) {
250 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, "243 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, "
@@ -257,18 +250,17 @@ void aubio_sink_wavwrite_do(aubio_sink_wavwrite_t *s, fvec_t * write_data, uint_ · 6 unmodified lines
257void aubio_sink_wavwrite_do_multi(aubio_sink_wavwrite_t *s, fmat_t * write_data, uint_t write){250void aubio_sink_wavwrite_do_multi(aubio_sink_wavwrite_t *s, fmat_t * write_data, uint_t write){
258 uint_t c = 0, i = 0, written_frames = 0;251 uint_t c = 0, i = 0, written_frames = 0;
259 252
260 if (write > s->max_size) {253 uint_t channels = aubio_sink_validate_input_channels("sink_wavwrite", s->path,
261 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, "254 s->channels, write_data->height);
262 "but only %d can be written at a time\n", write, s->path, s->max_size);255 uint_t length = aubio_sink_validate_input_length("sink_wavwrite", s->path,
263 write = s->max_size;256 s->max_size, write_data->length, write);
264 }
265 257
266 for (c = 0; c < s->channels; c++) {258 for (c = 0; c < channels; c++) {
267 for (i = 0; i < write; i++) {259 for (i = 0; i < length; i++) {
268 s->scratch_data[i * s->channels + c] = HTOLES(FLOAT_TO_SHORT(write_data->data[c][i]));260 s->scratch_data[i * s->channels + c] = HTOLES(FLOAT_TO_SHORT(write_data->data[c][i]));
269 }261 }
270 }262 }
271 written_frames = fwrite(s->scratch_data, 2, write * s->channels, s->fid);263 written_frames = fwrite(s->scratch_data, 2, length * s->channels, s->fid);
272 264
273 if (written_frames != write * s->channels) {265 if (written_frames != write * s->channels) {
274 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, "266 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, "
@@ -297,10 +289,13 @@ uint_t aubio_sink_wavwrite_close(aubio_sink_wavwrite_t * s) { · 22 unmodified lines
297}289}
298 290
299void del_aubio_sink_wavwrite(aubio_sink_wavwrite_t * s){291void del_aubio_sink_wavwrite(aubio_sink_wavwrite_t * s){
300 if (!s) return;292 AUBIO_ASSERT(s);
301 aubio_sink_wavwrite_close(s);293 if (s->fid)
302 if (s->path) AUBIO_FREE(s->path);294 aubio_sink_wavwrite_close(s);
303 AUBIO_FREE(s->scratch_data);295 if (s->path)
296 AUBIO_FREE(s->path);
297 if (s->scratch_data)
298 AUBIO_FREE(s->scratch_data);
304 AUBIO_FREE(s);299 AUBIO_FREE(s);
305}300}
306 301
src/io/source.c+4−3
@@ -121,7 +121,7 @@ aubio_source_t * new_aubio_source(const char_t * uri, uint_t samplerate, uint_t · 120 unmodified lines
121 AUBIO_ERROR("source: failed creating with %s at %dHz with hop size %d"121 AUBIO_ERROR("source: failed creating with %s at %dHz with hop size %d"
122 " (no source built-in)\n", uri, samplerate, hop_size);122 " (no source built-in)\n", uri, samplerate, hop_size);
123#endif123#endif
124 AUBIO_FREE(s);124 del_aubio_source(s);
125 return NULL;125 return NULL;
126}126}
127 127
@@ -138,8 +138,9 @@ uint_t aubio_source_close(aubio_source_t * s) { · 10 unmodified lines
138}138}
139 139
140void del_aubio_source(aubio_source_t * s) {140void del_aubio_source(aubio_source_t * s) {
141 if (!s) return;141 AUBIO_ASSERT(s);
142 s->s_del((void *)s->source);142 if (s->s_del && s->source)
143 s->s_del((void *)s->source);
143 AUBIO_FREE(s);144 AUBIO_FREE(s);
144}145}
145 146
src/io/source.h+0−1
@@ -59,7 +59,6 @@ · 58 unmodified lines
59 A simple source to read from 16-bits PCM RIFF encoded WAV files.59 A simple source to read from 16-bits PCM RIFF encoded WAV files.
60 60
61 \example io/test-source.c61 \example io/test-source.c
62 \example io/test-source_multi.c
63 62
64*/63*/
65 64
src/io/source_apple_audio.c+30−45
@@ -34,8 +34,6 @@ · 33 unmodified lines
34#define RT_BYTE3( a ) ( ((a) >> 16) & 0xff )34#define RT_BYTE3( a ) ( ((a) >> 16) & 0xff )
35#define RT_BYTE4( a ) ( ((a) >> 24) & 0xff )35#define RT_BYTE4( a ) ( ((a) >> 24) & 0xff )
36 36
37#define SHORT_TO_FLOAT(x) (smpl_t)(x * 3.0517578125e-05)
38
39struct _aubio_source_apple_audio_t {37struct _aubio_source_apple_audio_t {
40 uint_t channels;38 uint_t channels;
41 uint_t samplerate; //< requested samplerate39 uint_t samplerate; //< requested samplerate
@@ -48,7 +46,7 @@ struct _aubio_source_apple_audio_t { · 6 unmodified lines
48 AudioBufferList bufferList;46 AudioBufferList bufferList;
49};47};
50 48
51extern int createAubioBufferList(AudioBufferList *bufferList, int channels, int max_source_samples);49extern int createAudioBufferList(AudioBufferList *bufferList, int channels, int max_source_samples);
52extern void freeAudioBufferList(AudioBufferList *bufferList);50extern void freeAudioBufferList(AudioBufferList *bufferList);
53extern CFURLRef createURLFromPath(const char * path);51extern CFURLRef createURLFromPath(const char * path);
54char_t *getPrintableOSStatusError(char_t *str, OSStatus error);52char_t *getPrintableOSStatusError(char_t *str, OSStatus error);
@@ -59,7 +57,7 @@ aubio_source_apple_audio_t * new_aubio_source_apple_audio(const char_t * path, u · 4 unmodified lines
59{57{
60 aubio_source_apple_audio_t * s = AUBIO_NEW(aubio_source_apple_audio_t);58 aubio_source_apple_audio_t * s = AUBIO_NEW(aubio_source_apple_audio_t);
61 59
62 if (path == NULL) {60 if (path == NULL || strnlen(path, PATH_MAX) < 1) {
63 AUBIO_ERROR("source_apple_audio: Aborted opening null path\n");61 AUBIO_ERROR("source_apple_audio: Aborted opening null path\n");
64 goto beach;62 goto beach;
65 }63 }
@@ -85,7 +83,7 @@ aubio_source_apple_audio_t * new_aubio_source_apple_audio(const char_t * path, u · 19 unmodified lines
85 return s;83 return s;
86 84
87beach:85beach:
88 AUBIO_FREE(s);86 del_aubio_source_apple_audio(s);
89 return NULL;87 return NULL;
90}88}
91 89
@@ -94,7 +92,6 @@ uint_t aubio_source_apple_audio_open (aubio_source_apple_audio_t *s, const char_ · 2 unmodified lines
94 OSStatus err = noErr;92 OSStatus err = noErr;
95 UInt32 propSize;93 UInt32 propSize;
96 94
97 if (s->path) AUBIO_FREE(s->path);
98 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);95 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);
99 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);96 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);
100 97
@@ -139,17 +136,16 @@ uint_t aubio_source_apple_audio_open (aubio_source_apple_audio_t *s, const char_ · 38 unmodified lines
139 s->channels = fileFormat.mChannelsPerFrame;136 s->channels = fileFormat.mChannelsPerFrame;
140 137
141 AudioStreamBasicDescription clientFormat;138 AudioStreamBasicDescription clientFormat;
142 propSize = sizeof(clientFormat);139 propSize = sizeof(AudioStreamBasicDescription);
143 memset(&clientFormat, 0, sizeof(AudioStreamBasicDescription));140 memset(&clientFormat, 0, sizeof(AudioStreamBasicDescription));
144 clientFormat.mFormatID = kAudioFormatLinearPCM;141 clientFormat.mFormatID = kAudioFormatLinearPCM;
145 clientFormat.mSampleRate = (Float64)(s->samplerate);142 clientFormat.mSampleRate = (Float64)(s->samplerate);
146 clientFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;143 clientFormat.mFormatFlags = kAudioFormatFlagIsFloat;
147 clientFormat.mChannelsPerFrame = s->channels;144 clientFormat.mChannelsPerFrame = s->channels;
148 clientFormat.mBitsPerChannel = sizeof(short) * 8;145 clientFormat.mBitsPerChannel = sizeof(smpl_t) * 8;
149 clientFormat.mFramesPerPacket = 1;146 clientFormat.mFramesPerPacket = 1;
150 clientFormat.mBytesPerFrame = clientFormat.mBitsPerChannel * clientFormat.mChannelsPerFrame / 8;147 clientFormat.mBytesPerFrame = clientFormat.mBitsPerChannel * clientFormat.mChannelsPerFrame / 8;
151 clientFormat.mBytesPerPacket = clientFormat.mFramesPerPacket * clientFormat.mBytesPerFrame;148 clientFormat.mBytesPerPacket = clientFormat.mFramesPerPacket * clientFormat.mBytesPerFrame;
152 clientFormat.mReserved = 0;
153 149
154 // set the client format description150 // set the client format description
155 err = ExtAudioFileSetProperty(s->audioFile, kExtAudioFileProperty_ClientDataFormat,151 err = ExtAudioFileSetProperty(s->audioFile, kExtAudioFileProperty_ClientDataFormat,
@@ -187,7 +183,7 @@ uint_t aubio_source_apple_audio_open (aubio_source_apple_audio_t *s, const char_ · 31 unmodified lines
187 183
188 // allocate the AudioBufferList184 // allocate the AudioBufferList
189 freeAudioBufferList(&s->bufferList);185 freeAudioBufferList(&s->bufferList);
190 if (createAubioBufferList(&s->bufferList, s->channels, s->block_size * s->channels)) {186 if (createAudioBufferList(&s->bufferList, s->channels, s->block_size * s->channels)) {
191 AUBIO_ERR("source_apple_audio: failed creating bufferList\n");187 AUBIO_ERR("source_apple_audio: failed creating bufferList\n");
192 goto beach;188 goto beach;
193 }189 }
@@ -196,60 +192,51 @@ beach: · 2 unmodified lines
196 return err;192 return err;
197}193}
198 194
199void aubio_source_apple_audio_do(aubio_source_apple_audio_t *s, fvec_t * read_to, uint_t * read) {195static UInt32 aubio_source_apple_audio_read_frame(aubio_source_apple_audio_t *s)
200 UInt32 c, v, loadedPackets = s->block_size;196{
197 UInt32 loadedPackets = s->block_size;
201 OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList);198 OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList);
202 if (err) {199 if (err) {
203 char_t errorstr[20];200 char_t errorstr[20];
204 AUBIO_ERROR("source_apple_audio: error while reading %s "201 AUBIO_ERROR("source_apple_audio: error while reading %s "
205 "with ExtAudioFileRead (%s)\n", s->path,202 "with ExtAudioFileRead (%s)\n", s->path,
206 getPrintableOSStatusError(errorstr, err));203 getPrintableOSStatusError(errorstr, err));
207 goto beach;
208 }204 }
205 return loadedPackets;
206}
209 207
210 short *data = (short*)s->bufferList.mBuffers[0].mData;208void aubio_source_apple_audio_do(aubio_source_apple_audio_t *s, fvec_t * read_to,
211 209 uint_t * read) {
212 smpl_t *buf = read_to->data;210 uint_t c, v;
211 UInt32 loadedPackets = aubio_source_apple_audio_read_frame(s);
212 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData;
213 213
214 for (v = 0; v < loadedPackets; v++) {214 for (v = 0; v < loadedPackets; v++) {
215 buf[v] = 0.;215 read_to->data[v] = 0.;
216 for (c = 0; c < s->channels; c++) {216 for (c = 0; c < s->channels; c++) {
217 buf[v] += SHORT_TO_FLOAT(data[ v * s->channels + c]);217 read_to->data[v] += data[ v * s->channels + c];
218 }218 }
219 buf[v] /= (smpl_t)s->channels;219 read_to->data[v] /= (smpl_t)s->channels;
220 }220 }
221 // short read, fill with zeros221 // short read, fill with zeros
222 if (loadedPackets < s->block_size) {222 if (loadedPackets < s->block_size) {
223 for (v = loadedPackets; v < s->block_size; v++) {223 for (v = loadedPackets; v < s->block_size; v++) {
224 buf[v] = 0.;224 read_to->data[v] = 0.;
225 }225 }
226 }226 }
227 227
228 *read = (uint_t)loadedPackets;228 *read = (uint_t)loadedPackets;
229 return;229 return;
230beach:
231 *read = 0;
232 return;
233}230}
234 231
235void aubio_source_apple_audio_do_multi(aubio_source_apple_audio_t *s, fmat_t * read_to, uint_t * read) {232void aubio_source_apple_audio_do_multi(aubio_source_apple_audio_t *s, fmat_t * read_to, uint_t * read) {
236 UInt32 c, v, loadedPackets = s->block_size;233 uint_t c, v;
237 OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList);234 UInt32 loadedPackets = aubio_source_apple_audio_read_frame(s);
238 if (err) {235 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData;
239 char_t errorstr[20];
240 AUBIO_ERROR("source_apple_audio: error while reading %s "
241 "with ExtAudioFileRead (%s)\n", s->path,
242 getPrintableOSStatusError(errorstr, err));
243 goto beach;
244 }
245
246 short *data = (short*)s->bufferList.mBuffers[0].mData;
247
248 smpl_t **buf = read_to->data;
249 236
250 for (v = 0; v < loadedPackets; v++) {237 for (v = 0; v < loadedPackets; v++) {
251 for (c = 0; c < read_to->height; c++) {238 for (c = 0; c < read_to->height; c++) {
252 buf[c][v] = SHORT_TO_FLOAT(data[ v * s->channels + c]);239 read_to->data[c][v] = data[ v * s->channels + c];
253 }240 }
254 }241 }
255 // if read_data has more channels than the file242 // if read_data has more channels than the file
@@ -257,7 +244,7 @@ void aubio_source_apple_audio_do_multi(aubio_source_apple_audio_t *s, fmat_t * r · 1 unmodified line
257 // copy last channel to all additional channels244 // copy last channel to all additional channels
258 for (v = 0; v < loadedPackets; v++) {245 for (v = 0; v < loadedPackets; v++) {
259 for (c = s->channels; c < read_to->height; c++) {246 for (c = s->channels; c < read_to->height; c++) {
260 buf[c][v] = SHORT_TO_FLOAT(data[ v * s->channels + (s->channels - 1)]);247 read_to->data[c][v] = data[ v * s->channels + (s->channels - 1)];
261 }248 }
262 }249 }
263 }250 }
@@ -265,15 +252,13 @@ void aubio_source_apple_audio_do_multi(aubio_source_apple_audio_t *s, fmat_t * r · 1 unmodified line
265 if (loadedPackets < s->block_size) {252 if (loadedPackets < s->block_size) {
266 for (v = loadedPackets; v < s->block_size; v++) {253 for (v = loadedPackets; v < s->block_size; v++) {
267 for (c = 0; c < read_to->height; c++) {254 for (c = 0; c < read_to->height; c++) {
268 buf[c][v] = 0.;255 read_to->data[c][v] = 0.;
269 }256 }
270 }257 }
271 }258 }
259
272 *read = (uint_t)loadedPackets;260 *read = (uint_t)loadedPackets;
273 return;261 return;
274beach:
275 *read = 0;
276 return;
277}262}
278 263
279uint_t aubio_source_apple_audio_close (aubio_source_apple_audio_t *s)264uint_t aubio_source_apple_audio_close (aubio_source_apple_audio_t *s)
@@ -293,11 +278,11 @@ uint_t aubio_source_apple_audio_close (aubio_source_apple_audio_t *s) · 13 unmodified lines
293}278}
294 279
295void del_aubio_source_apple_audio(aubio_source_apple_audio_t * s){280void del_aubio_source_apple_audio(aubio_source_apple_audio_t * s){
281 AUBIO_ASSERT(s);
296 aubio_source_apple_audio_close (s);282 aubio_source_apple_audio_close (s);
297 if (s->path) AUBIO_FREE(s->path);283 if (s->path) AUBIO_FREE(s->path);
298 freeAudioBufferList(&s->bufferList);284 freeAudioBufferList(&s->bufferList);
299 AUBIO_FREE(s);285 AUBIO_FREE(s);
300 return;
301}286}
302 287
303uint_t aubio_source_apple_audio_seek (aubio_source_apple_audio_t * s, uint_t pos) {288uint_t aubio_source_apple_audio_seek (aubio_source_apple_audio_t * s, uint_t pos) {
@@ -323,7 +308,7 @@ uint_t aubio_source_apple_audio_seek (aubio_source_apple_audio_t * s, uint_t pos · 19 unmodified lines
323 }308 }
324 // after a short read, the bufferList size needs to resetted to prepare for a full read309 // after a short read, the bufferList size needs to resetted to prepare for a full read
325 AudioBufferList *bufferList = &s->bufferList;310 AudioBufferList *bufferList = &s->bufferList;
326 bufferList->mBuffers[0].mDataByteSize = s->block_size * s->channels * sizeof (short);311 bufferList->mBuffers[0].mDataByteSize = s->block_size * s->channels * sizeof (smpl_t);
327 // do the actual seek312 // do the actual seek
328 err = ExtAudioFileSeek(s->audioFile, resampled_pos);313 err = ExtAudioFileSeek(s->audioFile, resampled_pos);
329 if (err) {314 if (err) {
src/io/source_avcodec.c+10−2
@@ -46,6 +46,10 @@ · 45 unmodified lines
46#define HAVE_AUBIO_LIBAVCODEC_DEPRECATED 146#define HAVE_AUBIO_LIBAVCODEC_DEPRECATED 1
47#endif47#endif
48 48
49#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58,3,102)
50#define HAVE_AUBIO_LIBAVCODEC_TIMEBASE_FIX 1
51#endif
52
49#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,1)53#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,1)
50#warning "libavcodec < 56 is deprecated"54#warning "libavcodec < 56 is deprecated"
51#define av_frame_alloc avcodec_alloc_frame55#define av_frame_alloc avcodec_alloc_frame
@@ -143,7 +147,6 @@ aubio_source_avcodec_t * new_aubio_source_avcodec(const char_t * path, · 91 unmodified lines
143 s->hop_size = hop_size;147 s->hop_size = hop_size;
144 s->channels = 1;148 s->channels = 1;
145 149
146 if (s->path) AUBIO_FREE(s->path);
147 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);150 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);
148 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);151 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);
149 152
@@ -239,6 +242,11 @@ aubio_source_avcodec_t * new_aubio_source_avcodec(const char_t * path, · 89 unmodified lines
239 av_get_media_type_string(AVMEDIA_TYPE_AUDIO), s->path);242 av_get_media_type_string(AVMEDIA_TYPE_AUDIO), s->path);
240 goto beach;243 goto beach;
241 }244 }
245#if HAVE_AUBIO_LIBAVCODEC_TIMEBASE_FIX
246 // avoids 'skipped frames warning' with avecodec < 58, deprecated after
247 av_codec_set_pkt_timebase(avCodecCtx,
248 avFormatCtx->streams[selected_stream]->time_base);
249#endif
242#endif250#endif
243 251
244 if ( ( err = avcodec_open2(avCodecCtx, codec, NULL) ) < 0) {252 if ( ( err = avcodec_open2(avCodecCtx, codec, NULL) ) < 0) {
@@ -630,7 +638,7 @@ uint_t aubio_source_avcodec_close(aubio_source_avcodec_t * s) { · 385 unmodified lines
630}638}
631 639
632void del_aubio_source_avcodec(aubio_source_avcodec_t * s){640void del_aubio_source_avcodec(aubio_source_avcodec_t * s){
633 if (!s) return;641 AUBIO_ASSERT(s);
634 aubio_source_avcodec_close(s);642 aubio_source_avcodec_close(s);
635 if (s->output != NULL) {643 if (s->output != NULL) {
636 av_free(s->output);644 av_free(s->output);
src/io/source_sndfile.c+1−2
@@ -86,7 +86,6 @@ aubio_source_sndfile_t * new_aubio_source_sndfile(const char_t * path, uint_t sa · 85 unmodified lines
86 s->hop_size = hop_size;86 s->hop_size = hop_size;
87 s->channels = 1;87 s->channels = 1;
88 88
89 if (s->path) AUBIO_FREE(s->path);
90 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);89 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);
91 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);90 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);
92 91
@@ -331,7 +330,7 @@ uint_t aubio_source_sndfile_close (aubio_source_sndfile_t *s) { · 238 unmodified lines
331}330}
332 331
333void del_aubio_source_sndfile(aubio_source_sndfile_t * s){332void del_aubio_source_sndfile(aubio_source_sndfile_t * s){
334 if (!s) return;333 AUBIO_ASSERT(s);
335 aubio_source_sndfile_close(s);334 aubio_source_sndfile_close(s);
336#ifdef HAVE_SAMPLERATE335#ifdef HAVE_SAMPLERATE
337 if (s->resamplers != NULL) {336 if (s->resamplers != NULL) {
src/io/source_wavread.c+1−2
@@ -91,7 +91,6 @@ aubio_source_wavread_t * new_aubio_source_wavread(const char_t * path, uint_t sa · 90 unmodified lines
91 goto beach;91 goto beach;
92 }92 }
93 93
94 if (s->path) AUBIO_FREE(s->path);
95 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);94 s->path = AUBIO_ARRAY(char_t, strnlen(path, PATH_MAX) + 1);
96 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);95 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);
97 96
@@ -471,7 +470,7 @@ uint_t aubio_source_wavread_close (aubio_source_wavread_t * s) { · 373 unmodified lines
471}470}
472 471
473void del_aubio_source_wavread(aubio_source_wavread_t * s) {472void del_aubio_source_wavread(aubio_source_wavread_t * s) {
474 if (!s) return;473 AUBIO_ASSERT(s);
475 aubio_source_wavread_close(s);474 aubio_source_wavread_close(s);
476 if (s->short_output) AUBIO_FREE(s->short_output);475 if (s->short_output) AUBIO_FREE(s->short_output);
477 if (s->output) del_fmat(s->output);476 if (s->output) del_fmat(s->output);
src/io/utils_apple_audio.c+4−3
@@ -12,11 +12,12 @@ void freeAudioBufferList(AudioBufferList *bufferList); · 11 unmodified lines
12CFURLRef getURLFromPath(const char * path);12CFURLRef getURLFromPath(const char * path);
13char_t *getPrintableOSStatusError(char_t *str, OSStatus error);13char_t *getPrintableOSStatusError(char_t *str, OSStatus error);
14 14
15int createAubioBufferList(AudioBufferList * bufferList, int channels, int max_source_samples) {15int createAudioBufferList(AudioBufferList * bufferList, int channels,
16 int max_source_samples) {
16 bufferList->mNumberBuffers = 1;17 bufferList->mNumberBuffers = 1;
17 bufferList->mBuffers[0].mNumberChannels = channels;18 bufferList->mBuffers[0].mNumberChannels = channels;
18 bufferList->mBuffers[0].mData = AUBIO_ARRAY(short, max_source_samples);19 bufferList->mBuffers[0].mData = AUBIO_ARRAY(smpl_t, max_source_samples);
19 bufferList->mBuffers[0].mDataByteSize = max_source_samples * sizeof(short);20 bufferList->mBuffers[0].mDataByteSize = max_source_samples * sizeof(smpl_t);
20 return 0;21 return 0;
21}22}
22 23
tests/src/io/base-sink_custom.h+167−0
@@ -0,0 +1,167 @@
1// this should be included *after* custom functions have been defined
2
3#ifndef aubio_sink_custom
4#define aubio_sink_custom "undefined"
5#endif /* aubio_sink_custom */
6
7#ifdef HAVE_AUBIO_SINK_CUSTOM
8int test_wrong_params(void);
9
10int base_main(int argc, char **argv)
11{
12 uint_t err = 0;
13 if (argc < 3 || argc >= 6) {
14 PRINT_ERR("wrong number of arguments, running tests\n");
15 err = test_wrong_params();
16 PRINT_MSG("usage: %s <input_path> <output_path> [samplerate] [hop_size]\n",
17 argv[0]);
18 return err;
19 }
20
21 uint_t samplerate = 0;
22 uint_t hop_size = 512;
23 uint_t n_frames = 0, read = 0;
24
25 char_t *source_path = argv[1];
26 char_t *sink_path = argv[2];
27
28 aubio_source_t *src = NULL;
29 aubio_sink_custom_t *snk = NULL;
30
31 if ( argc >= 4 ) samplerate = atoi(argv[3]);
32 if ( argc >= 5 ) hop_size = atoi(argv[4]);
33
34 fvec_t *vec = new_fvec(hop_size);
35 if (!vec) { err = 1; goto failure; }
36
37 src = new_aubio_source(source_path, samplerate, hop_size);
38 if (!src) { err = 1; goto failure; }
39 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(src);
40
41 snk = new_aubio_sink_custom(sink_path, samplerate);
42 if (!snk) { err = 1; goto failure; }
43
44 do {
45 aubio_source_do(src, vec, &read);
46 aubio_sink_custom_do(snk, vec, read);
47 n_frames += read;
48 } while ( read == hop_size );
49
50 PRINT_MSG("%d frames at %dHz (%d blocks) read from %s, wrote to %s\n",
51 n_frames, samplerate, n_frames / hop_size,
52 source_path, sink_path);
53
54 // close sink now (optional)
55 aubio_sink_custom_close(snk);
56
57failure:
58 if (snk)
59 del_aubio_sink_custom(snk);
60 if (src)
61 del_aubio_source(src);
62 if (vec)
63 del_fvec(vec);
64
65 return err;
66}
67
68int test_wrong_params(void)
69{
70 fvec_t *vec;
71 fmat_t *mat;
72 aubio_sink_custom_t *s;
73 char_t sink_path[PATH_MAX] = "tmp_aubio_XXXXXX";
74 uint_t samplerate = 44100;
75 uint_t hop_size = 256;
76 uint_t oversized_hop_size = 4097;
77 uint_t oversized_samplerate = 192000 * 8 + 1;
78 uint_t channels = 3;
79 uint_t oversized_channels = 1025;
80 // create temp file
81 int fd = create_temp_sink(sink_path);
82
83 if (!fd) return 1;
84
85 if (new_aubio_sink_custom( 0, samplerate)) return 1;
86 if (new_aubio_sink_custom("\0", samplerate)) return 1;
87 if (new_aubio_sink_custom(sink_path, -1)) return 1;
88
89 s = new_aubio_sink_custom(sink_path, 0);
90
91 // check setting wrong parameters fails
92 if (!aubio_sink_custom_preset_samplerate(s, oversized_samplerate)) return 1;
93 if (!aubio_sink_custom_preset_channels(s, oversized_channels)) return 1;
94 if (!aubio_sink_custom_preset_channels(s, -1)) return 1;
95
96 // check setting valid parameters passes
97 if (aubio_sink_custom_preset_samplerate(s, samplerate)) return 1;
98 if (aubio_sink_custom_preset_channels(s, 1)) return 1;
99
100 // check writing a vector with valid length
101 vec = new_fvec(hop_size);
102 aubio_sink_custom_do(s, vec, hop_size);
103 // check writing more than in the input
104 aubio_sink_custom_do(s, vec, hop_size+1);
105 // check write 0 frames
106 aubio_sink_custom_do(s, vec, 0);
107 del_fvec(vec);
108
109 // check writing an oversized vector
110 vec = new_fvec(oversized_hop_size);
111 aubio_sink_custom_do(s, vec, oversized_hop_size);
112 del_fvec(vec);
113
114 // test delete without closing
115 del_aubio_sink_custom(s);
116
117 s = new_aubio_sink_custom(sink_path, 0);
118
119 // preset channels first
120 if (aubio_sink_custom_preset_channels(s, channels)) return 1;
121 if (aubio_sink_custom_preset_samplerate(s, samplerate)) return 1;
122
123 if (aubio_sink_custom_get_samplerate(s) != samplerate) return 1;
124 if (aubio_sink_custom_get_channels(s) != channels) return 1;
125
126 mat = new_fmat(channels, hop_size);
127 // check writing a vector with valid length
128 aubio_sink_custom_do_multi(s, mat, hop_size);
129 // check writing 0 frames
130 aubio_sink_custom_do_multi(s, mat, 0);
131 // check writing more than in the input
132 aubio_sink_custom_do_multi(s, mat, hop_size+1);
133 del_fmat(mat);
134
135 // check writing oversized input
136 mat = new_fmat(channels, oversized_hop_size);
137 aubio_sink_custom_do_multi(s, mat, oversized_hop_size);
138 del_fmat(mat);
139
140 // check writing undersized input
141 mat = new_fmat(channels - 1, hop_size);
142 aubio_sink_custom_do_multi(s, mat, hop_size);
143 del_fmat(mat);
144
145 aubio_sink_custom_close(s);
146 // test closing twice
147 aubio_sink_custom_close(s);
148
149 del_aubio_sink_custom(s);
150
151 // delete temp file
152 close_temp_sink(sink_path, fd);
153
154 return run_on_default_source_and_sink(base_main);
155}
156
157#else /* HAVE_AUBIO_SINK_CUSTOM */
158
159int base_main(int argc, char** argv)
160{
161 PRINT_ERR("aubio was not compiled with aubio_sink_"
162 aubio_sink_custom ", failed running %s with %d args\n",
163 argv[0], argc);
164 return 0;
165}
166
167#endif /* HAVE_AUBIO_SINK_CUSTOM */
tests/src/io/base-source_custom.h+125−0
@@ -0,0 +1,125 @@
1// this should be included *after* custom functions have been defined
2
3#ifndef aubio_source_custom
4#define aubio_source_custom "undefined"
5#endif /* aubio_source_custom */
6
7#ifdef HAVE_AUBIO_SOURCE_CUSTOM
8int test_wrong_params(void);
9
10int base_main(int argc, char **argv)
11{
12 uint_t err = 0;
13 if (argc < 2) {
14 PRINT_ERR("not enough arguments, running tests\n");
15 err = test_wrong_params();
16 PRINT_MSG("read a wave file as a mono vector\n");
17 PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]);
18 PRINT_MSG("examples:\n");
19 PRINT_MSG(" - read file.wav at original samplerate\n");
20 PRINT_MSG(" %s file.wav\n", argv[0]);
21 PRINT_MSG(" - read file.wav at 32000Hz\n");
22 PRINT_MSG(" %s file.aif 32000\n", argv[0]);
23 PRINT_MSG(" - read file.wav at original samplerate with 4096 blocks\n");
24 PRINT_MSG(" %s file.wav 0 4096 \n", argv[0]);
25 return err;
26 }
27
28 uint_t samplerate = 0;
29 uint_t hop_size = 256;
30 uint_t n_frames = 0, read = 0;
31 if ( argc >= 3 ) samplerate = atoi(argv[2]);
32 if ( argc >= 4 ) hop_size = atoi(argv[3]);
33
34 char_t *source_path = argv[1];
35
36 aubio_source_custom_t * s =
37 new_aubio_source_custom(source_path, samplerate, hop_size);
38 fvec_t *vec = new_fvec(hop_size);
39 if (!s || !vec) { err = 1; goto beach; }
40
41 uint_t n_frames_expected = aubio_source_custom_get_duration(s);
42
43 samplerate = aubio_source_custom_get_samplerate(s);
44
45 do {
46 aubio_source_custom_do(s, vec, &read);
47 fvec_print (vec);
48 n_frames += read;
49 } while ( read == hop_size );
50
51 PRINT_MSG("read %d frames (expected %d) at %dHz (%d blocks) from %s\n",
52 n_frames, n_frames_expected, samplerate, n_frames / hop_size,
53 source_path);
54
55 // close the file (optional)
56 aubio_source_custom_close(s);
57
58beach:
59 if (vec)
60 del_fvec(vec);
61 if (s)
62 del_aubio_source_custom(s);
63 return err;
64}
65
66int test_wrong_params(void)
67{
68 char_t *uri = DEFINEDSTRING(AUBIO_TESTS_SOURCE);
69 uint_t samplerate = 44100;
70 uint_t hop_size = 512;
71 uint_t channels, read = 0;
72 fvec_t *vec;
73 fmat_t *mat;
74 aubio_source_custom_t *s;
75
76 if (new_aubio_source_custom(0, samplerate, hop_size)) return 1;
77 if (new_aubio_source_custom("\0", samplerate, hop_size)) return 1;
78 if (new_aubio_source_custom(uri, -1, hop_size)) return 1;
79 if (new_aubio_source_custom(uri, 0, 0)) return 1;
80
81 s = new_aubio_source_custom(uri, samplerate, hop_size);
82 if (!s) return 1;
83 channels = aubio_source_custom_get_channels(s);
84
85 // vector to read downmixed samples
86 vec = new_fvec(hop_size);
87 // matrix to read individual channels
88 mat = new_fmat(channels, hop_size);
89
90 if (aubio_source_custom_get_samplerate(s) != samplerate) return 1;
91
92 // read first hop_size frames
93 aubio_source_custom_do(s, vec, &read);
94 if (read != hop_size) return 1;
95
96 // seek to 0
97 if(aubio_source_custom_seek(s, 0)) return 1;
98
99 // read again as multiple channels
100 aubio_source_custom_do_multi(s, mat, &read);
101 if (read != hop_size) return 1;
102
103 // close the file (optional)
104 aubio_source_custom_close(s);
105 // test closing the file a second time
106 aubio_source_custom_close(s);
107
108 del_aubio_source_custom(s);
109 del_fmat(mat);
110 del_fvec(vec);
111
112 return run_on_default_source(base_main);
113}
114
115#else /* HAVE_AUBIO_SOURCE_CUSTOM */
116
117int base_main(int argc, char** argv)
118{
119 PRINT_ERR("aubio was not compiled with aubio_source_"
120 aubio_source_custom ", failed running %s with %d args\n",
121 argv[0], argc);
122 return 0;
123}
124
125#endif /* HAVE_AUBIO_SOURCE_CUSTOM */
tests/src/io/test-sink-multi.c+0−72
@@ -1,72 +0,0 @@
1#include <aubio.h>
2#include "utils_tests.h"
3
4// same as test-sink.c, but uses aubio_source_do_multi to read multiple
5// channels
6
7int main (int argc, char **argv)
8{
9 sint_t err = 0;
10
11 if (argc < 3) {
12 PRINT_ERR("not enough arguments, running tests\n");
13 err = run_on_default_source_and_sink(main);
14 PRINT_MSG("usage: %s <input_path> <output_path> [samplerate] [channels] [hop_size]\n", argv[0]);
15 return err;
16 }
17
18 uint_t samplerate = 0;
19 uint_t channels = 0;
20 uint_t hop_size = 512;
21 uint_t n_frames = 0, read = 0;
22
23 char_t *source_path = argv[1];
24 char_t *sink_path = argv[2];
25
26 if ( argc >= 4 ) samplerate = atoi(argv[3]);
27 if ( argc >= 5 ) channels = atoi(argv[4]);
28 if ( argc >= 6 ) hop_size = atoi(argv[5]);
29 if ( argc >= 7 ) {
30 err = 2;
31 PRINT_ERR("too many arguments\n");
32 return err;
33 }
34
35 aubio_source_t *i = new_aubio_source(source_path, samplerate, hop_size);
36 if (!i) { err = 1; goto beach_source; }
37
38 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(i);
39 if (channels == 0 ) channels = aubio_source_get_channels(i);
40
41 fmat_t *mat = new_fmat(channels, hop_size);
42 if (!mat) { err = 1; goto beach_fmat; }
43
44 aubio_sink_t *o = new_aubio_sink(sink_path, 0);
45 if (!o) { err = 1; goto beach_sink; }
46 err = aubio_sink_preset_samplerate(o, samplerate);
47 if (err) { goto beach; }
48 err = aubio_sink_preset_channels(o, channels);
49 if (err) { goto beach; }
50
51 do {
52 aubio_source_do_multi(i, mat, &read);
53 aubio_sink_do_multi(o, mat, read);
54 n_frames += read;
55 } while ( read == hop_size );
56
57 PRINT_MSG("read %d frames at %dHz in %d channels (%d blocks) from %s written to %s\n",
58 n_frames, samplerate, channels, n_frames / hop_size,
59 source_path, sink_path);
60 PRINT_MSG("wrote %s with %dHz in %d channels\n", sink_path,
61 aubio_sink_get_samplerate(o),
62 aubio_sink_get_channels(o) );
63
64beach:
65 del_aubio_sink(o);
66beach_sink:
67 del_fmat(mat);
68beach_fmat:
69 del_aubio_source(i);
70beach_source:
71 return err;
72}
tests/src/io/test-sink.c+121−28
@@ -1,14 +1,16 @@
1#include <aubio.h>1#include <aubio.h>
2#include "utils_tests.h"2#include "utils_tests.h"
3 3
4int main (int argc, char **argv)4int test_wrong_params(void);
5{
6 sint_t err = 0;
7 5
8 if (argc < 3) {6int main(int argc, char **argv)
9 PRINT_ERR("not enough arguments, running tests\n");7{
10 err = run_on_default_source_and_sink(main);8 uint_t err = 0;
11 PRINT_MSG("usage: %s <input_path> <output_path> [samplerate] [hop_size]\n", argv[0]);9 if (argc < 3 || argc >= 6) {
10 PRINT_ERR("wrong number of arguments, running tests\n");
11 err = test_wrong_params();
12 PRINT_MSG("usage: %s <input_path> <output_path> [samplerate] [hop_size]\n",
13 argv[0]);
12 return err;14 return err;
13 }15 }
14 16
@@ -19,40 +21,131 @@ int main (int argc, char **argv) · 4 unmodified lines
19 char_t *source_path = argv[1];21 char_t *source_path = argv[1];
20 char_t *sink_path = argv[2];22 char_t *sink_path = argv[2];
21 23
24 aubio_source_t *src = NULL;
25 aubio_sink_t *snk = NULL;
26
22 if ( argc >= 4 ) samplerate = atoi(argv[3]);27 if ( argc >= 4 ) samplerate = atoi(argv[3]);
23 if ( argc >= 5 ) hop_size = atoi(argv[4]);28 if ( argc >= 5 ) hop_size = atoi(argv[4]);
24 if ( argc >= 6 ) {
25 err = 2;
26 PRINT_ERR("too many arguments\n");
27 return err;
28 }
29 29
30 fvec_t *vec = new_fvec(hop_size);30 fvec_t *vec = new_fvec(hop_size);
31 if (!vec) { err = 1; goto beach_fvec; }31 if (!vec) { err = 1; goto failure; }
32
33 aubio_source_t *i = new_aubio_source(source_path, samplerate, hop_size);
34 if (!i) { err = 1; goto beach_source; }
35 32
36 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(i);33 src = new_aubio_source(source_path, samplerate, hop_size);
34 if (!src) { err = 1; goto failure; }
35 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(src);
37 36
38 aubio_sink_t *o = new_aubio_sink(sink_path, samplerate);37 snk = new_aubio_sink(sink_path, samplerate);
39 if (!o) { err = 1; goto beach_sink; }38 if (!snk) { err = 1; goto failure; }
40 39
41 do {40 do {
42 aubio_source_do(i, vec, &read);41 aubio_source_do(src, vec, &read);
43 aubio_sink_do(o, vec, read);42 aubio_sink_do(snk, vec, read);
44 n_frames += read;43 n_frames += read;
45 } while ( read == hop_size );44 } while ( read == hop_size );
46 45
47 PRINT_MSG("read %d frames at %dHz (%d blocks) from %s written to %s\n",46 PRINT_MSG("%d frames read at %dHz (%d blocks) from %s and written to %s\n",
48 n_frames, samplerate, n_frames / hop_size,47 n_frames, samplerate, n_frames / hop_size,
49 source_path, sink_path);48 source_path, sink_path);
50 49
51 del_aubio_sink(o);50 // close sink now (optional)
52beach_sink:51 aubio_sink_close(snk);
53 del_aubio_source(i);52
54beach_source:53failure:
55 del_fvec(vec);54 if (snk)
56beach_fvec:55 del_aubio_sink(snk);
56 if (src)
57 del_aubio_source(src);
58 if (vec)
59 del_fvec(vec);
60
57 return err;61 return err;
58}62}
63
64int test_wrong_params(void)
65{
66 fvec_t *vec;
67 fmat_t *mat;
68 aubio_sink_t *s;
69 char_t sink_path[PATH_MAX] = "tmp_aubio_XXXXXX";
70 uint_t samplerate = 44100;
71 uint_t hop_size = 256;
72 uint_t oversized_hop_size = 4097;
73 uint_t oversized_samplerate = 192000 * 8 + 1;
74 uint_t channels = 3;
75 uint_t oversized_channels = 1025;
76 // create temp file
77 int fd = create_temp_sink(sink_path);
78
79 if (!fd) return 1;
80
81 if (new_aubio_sink( 0, samplerate)) return 1;
82 if (new_aubio_sink("\0", samplerate)) return 1;
83 if (new_aubio_sink(sink_path, -1)) return 1;
84
85 s = new_aubio_sink(sink_path, 0);
86
87 // check setting wrong parameters fails
88 if (!aubio_sink_preset_samplerate(s, oversized_samplerate)) return 1;
89 if (!aubio_sink_preset_channels(s, oversized_channels)) return 1;
90 if (!aubio_sink_preset_channels(s, -1)) return 1;
91
92 // check setting valid parameters passes
93 if (aubio_sink_preset_samplerate(s, samplerate)) return 1;
94 if (aubio_sink_preset_channels(s, 1)) return 1;
95
96 // check writing a vector with valid length
97 vec = new_fvec(hop_size);
98 aubio_sink_do(s, vec, hop_size);
99 // check writing more than in the input
100 aubio_sink_do(s, vec, hop_size+1);
101 // check write 0 frames
102 aubio_sink_do(s, vec, 0);
103 del_fvec(vec);
104
105 // check writing an oversized vector
106 vec = new_fvec(oversized_hop_size);
107 aubio_sink_do(s, vec, oversized_hop_size);
108 del_fvec(vec);
109
110 // test delete without closing
111 del_aubio_sink(s);
112
113 s = new_aubio_sink(sink_path, 0);
114
115 // preset channels first
116 if (aubio_sink_preset_channels(s, channels)) return 1;
117 if (aubio_sink_preset_samplerate(s, samplerate)) return 1;
118
119 if (aubio_sink_get_samplerate(s) != samplerate) return 1;
120 if (aubio_sink_get_channels(s) != channels) return 1;
121
122 mat = new_fmat(channels, hop_size);
123 // check writing a vector with valid length
124 aubio_sink_do_multi(s, mat, hop_size);
125 // check writing 0 frames
126 aubio_sink_do_multi(s, mat, 0);
127 // check writing more than in the input
128 aubio_sink_do_multi(s, mat, hop_size+1);
129 del_fmat(mat);
130
131 // check writing oversized input
132 mat = new_fmat(channels, oversized_hop_size);
133 aubio_sink_do_multi(s, mat, oversized_hop_size);
134 del_fmat(mat);
135
136 // check writing undersized input
137 mat = new_fmat(channels - 1, hop_size);
138 aubio_sink_do_multi(s, mat, hop_size);
139 del_fmat(mat);
140
141 aubio_sink_close(s);
142 // test closing twice
143 aubio_sink_close(s);
144
145 del_aubio_sink(s);
146
147 // delete temp file
148 close_temp_sink(sink_path, fd);
149
150 return run_on_default_source_and_sink(main);
151}
tests/src/io/test-sink_apple_audio-multi.c+0−78
@@ -1,78 +0,0 @@
1#define AUBIO_UNSTABLE 1
2#include <aubio.h>
3#include "utils_tests.h"
4
5// this file uses the unstable aubio api to test aubio_sink_apple_audio, please
6// use aubio_sink instead see src/io/sink.h and tests/src/sink/test-sink.c
7
8int main (int argc, char **argv)
9{
10 sint_t err = 0;
11
12 if (argc < 3) {
13 PRINT_ERR("not enough arguments, running tests\n");
14 err = run_on_default_source_and_sink(main);
15 PRINT_MSG("usage: %s <input_path> <output_path> [samplerate] [channels] [hop_size]\n", argv[0]);
16 return err;
17 }
18
19#ifdef HAVE_SINK_APPLE_AUDIO
20 uint_t samplerate = 0;
21 uint_t channels = 0;
22 uint_t hop_size = 512;
23 uint_t n_frames = 0, read = 0;
24
25 char_t *source_path = argv[1];
26 char_t *sink_path = argv[2];
27
28 if ( argc >= 4 ) samplerate = atoi(argv[3]);
29 if ( argc >= 5 ) channels = atoi(argv[4]);
30 if ( argc >= 6 ) hop_size = atoi(argv[5]);
31 if ( argc >= 7 ) {
32 err = 2;
33 PRINT_ERR("too many arguments\n");
34 return err;
35 }
36
37 aubio_source_t *i = new_aubio_source(source_path, samplerate, hop_size);
38 if (!i) { err = 1; goto beach_source; }
39
40 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(i);
41 if (channels == 0 ) channels = aubio_source_get_channels(i);
42
43 fmat_t *mat = new_fmat(channels, hop_size);
44 if (!mat) { err = 1; goto beach_fmat; }
45
46 aubio_sink_apple_audio_t *o = new_aubio_sink_apple_audio(sink_path, 0);
47 if (!o) { err = 1; goto beach_sink; }
48 err = aubio_sink_apple_audio_preset_samplerate(o, samplerate);
49 if (err) { goto beach; }
50 err = aubio_sink_apple_audio_preset_channels(o, channels);
51 if (err) { goto beach; }
52
53 do {
54 aubio_source_do_multi(i, mat, &read);
55 aubio_sink_apple_audio_do_multi(o, mat, read);
56 n_frames += read;
57 } while ( read == hop_size );
58
59 PRINT_MSG("read %d frames at %dHz in %d channels (%d blocks) from %s written to %s\n",
60 n_frames, samplerate, channels, n_frames / hop_size,
61 source_path, sink_path);
62 PRINT_MSG("wrote %s with %dHz in %d channels\n", sink_path,
63 aubio_sink_apple_audio_get_samplerate(o),
64 aubio_sink_apple_audio_get_channels(o) );
65
66beach:
67 del_aubio_sink_apple_audio(o);
68beach_sink:
69 del_fmat(mat);
70beach_fmat:
71 del_aubio_source(i);
72beach_source:
73#else /* HAVE_SINK_APPLE_AUDIO */
74 err = 0;
75 PRINT_ERR("aubio was not compiled with aubio_sink_apple_audio\n");
76#endif /* HAVE_SINK_APPLE_AUDIO */
77 return err;
78}
tests/src/io/test-sink_apple_audio.c+19−57
@@ -2,66 +2,28 @@ · 1 unmodified line
2#include <aubio.h>2#include <aubio.h>
3#include "utils_tests.h"3#include "utils_tests.h"
4 4
5// this file uses the unstable aubio api, please use aubio_sink instead5#define aubio_sink_custom "apple_audio"
6// see src/io/sink.h and tests/src/sink/test-sink.c
7
8int main (int argc, char **argv)
9{
10 sint_t err = 0;
11
12 if (argc < 3) {
13 PRINT_ERR("not enough arguments, running tests\n");
14 err = run_on_default_source_and_sink(main);
15 PRINT_MSG("usage: %s <input_path> <output_path> [samplerate] [hop_size]\n", argv[0]);
16 return err;
17 }
18 6
19#ifdef HAVE_SINK_APPLE_AUDIO7#ifdef HAVE_SINK_APPLE_AUDIO
20 uint_t samplerate = 0;8#define HAVE_AUBIO_SINK_CUSTOM
21 uint_t hop_size = 512;9#define aubio_sink_custom_t aubio_sink_apple_audio_t
22 uint_t n_frames = 0, read = 0;10#define new_aubio_sink_custom new_aubio_sink_apple_audio
23 11#define del_aubio_sink_custom del_aubio_sink_apple_audio
24 char_t *source_path = argv[1];12#define aubio_sink_custom_do aubio_sink_apple_audio_do
25 char_t *sink_path = argv[2];13#define aubio_sink_custom_do_multi aubio_sink_apple_audio_do_multi
26 14#define aubio_sink_custom_close aubio_sink_apple_audio_close
27 if ( argc >= 4 ) samplerate = atoi(argv[3]);15#define aubio_sink_custom_preset_samplerate aubio_sink_apple_audio_preset_samplerate
28 if ( argc >= 5 ) hop_size = atoi(argv[4]);16#define aubio_sink_custom_preset_channels aubio_sink_apple_audio_preset_channels
29 if ( argc >= 6 ) {17#define aubio_sink_custom_get_samplerate aubio_sink_apple_audio_get_samplerate
30 err = 2;18#define aubio_sink_custom_get_channels aubio_sink_apple_audio_get_channels
31 PRINT_ERR("too many arguments\n");19#endif /* HAVE_SINK_APPLE_AUDIO */
32 return err;
33 }
34
35 fvec_t *vec = new_fvec(hop_size);
36 if (!vec) { err = 1; goto beach_fvec; }
37
38 aubio_source_t *i = new_aubio_source(source_path, samplerate, hop_size);
39 if (!i) { err = 1; goto beach_source; }
40
41 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(i);
42
43 aubio_sink_apple_audio_t *o = new_aubio_sink_apple_audio(sink_path, samplerate);
44 if (!o) { err = 1; goto beach_sink; }
45 20
46 do {21#include "base-sink_custom.h"
47 aubio_source_do(i, vec, &read);
48 aubio_sink_apple_audio_do(o, vec, read);
49 n_frames += read;
50 } while ( read == hop_size );
51 22
52 PRINT_MSG("read %d frames at %dHz (%d blocks) from %s written to %s\n",23// this file uses the unstable aubio api, please use aubio_sink instead
53 n_frames, samplerate, n_frames / hop_size,24// see src/io/sink.h and tests/src/sink/test-sink.c
54 source_path, sink_path);
55 25
56 del_aubio_sink_apple_audio(o);26int main (int argc, char **argv)
57beach_sink:27{
58 del_aubio_source(i);28 return base_main(argc, argv);
59beach_source:
60 del_fvec(vec);
61beach_fvec:
62#else /* HAVE_SINK_APPLE_AUDIO */
63 err = 0;
64 PRINT_ERR("aubio was not compiled with aubio_source_apple_audio\n");
65#endif /* HAVE_SINK_APPLE_AUDIO */
66 return err;
67}29}
tests/src/io/test-sink_sndfile-multi.c+0−78
@@ -1,78 +0,0 @@
1#define AUBIO_UNSTABLE 1
2#include <aubio.h>
3#include "utils_tests.h"
4
5// this file uses the unstable aubio api to test aubio_sink_sndfile, please
6// use aubio_sink instead see src/io/sink.h and tests/src/sink/test-sink.c
7
8int main (int argc, char **argv)
9{
10 sint_t err = 0;
11
12 if (argc < 3) {
13 PRINT_ERR("not enough arguments, running tests\n");
14 err = run_on_default_source_and_sink(main);
15 PRINT_MSG("usage: %s <input_path> <output_path> [samplerate] [channels] [hop_size]\n", argv[0]);
16 return err;
17 }
18
19#ifdef HAVE_SNDFILE
20 uint_t samplerate = 0;
21 uint_t channels = 0;
22 uint_t hop_size = 512;
23 uint_t n_frames = 0, read = 0;
24
25 char_t *source_path = argv[1];
26 char_t *sink_path = argv[2];
27
28 if ( argc >= 4 ) samplerate = atoi(argv[3]);
29 if ( argc >= 5 ) channels = atoi(argv[4]);
30 if ( argc >= 6 ) hop_size = atoi(argv[5]);
31 if ( argc >= 7 ) {
32 err = 2;
33 PRINT_ERR("too many arguments\n");
34 return err;
35 }
36
37 aubio_source_t *i = new_aubio_source(source_path, samplerate, hop_size);
38 if (!i) { err = 1; goto beach_source; }
39
40 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(i);
41 if (channels == 0 ) channels = aubio_source_get_channels(i);
42
43 fmat_t *mat = new_fmat(channels, hop_size);
44 if (!mat) { err = 1; goto beach_fmat; }
45
46 aubio_sink_sndfile_t *o = new_aubio_sink_sndfile(sink_path, 0);
47 if (!o) { err = 1; goto beach_sink; }
48 err = aubio_sink_sndfile_preset_samplerate(o, samplerate);
49 if (err) { goto beach; }
50 err = aubio_sink_sndfile_preset_channels(o, channels);
51 if (err) { goto beach; }
52
53 do {
54 aubio_source_do_multi(i, mat, &read);
55 aubio_sink_sndfile_do_multi(o, mat, read);
56 n_frames += read;
57 } while ( read == hop_size );
58
59 PRINT_MSG("read %d frames at %dHz in %d channels (%d blocks) from %s written to %s\n",
60 n_frames, samplerate, channels, n_frames / hop_size,
61 source_path, sink_path);
62 PRINT_MSG("wrote %s with %dHz in %d channels\n", sink_path,
63 aubio_sink_sndfile_get_samplerate(o),
64 aubio_sink_sndfile_get_channels(o) );
65
66beach:
67 del_aubio_sink_sndfile(o);
68beach_sink:
69 del_fmat(mat);
70beach_fmat:
71 del_aubio_source(i);
72beach_source:
73#else
74 err = 0;
75 PRINT_ERR("aubio was not compiled with aubio_sink_sndfile\n");
76#endif /* HAVE_SNDFILE */
77 return err;
78}
tests/src/io/test-sink_sndfile.c+19−57
@@ -2,66 +2,28 @@ · 1 unmodified line
2#include <aubio.h>2#include <aubio.h>
3#include "utils_tests.h"3#include "utils_tests.h"
4 4
5// this file uses the unstable aubio api, please use aubio_sink instead5#define aubio_sink_custom "sndfile"
6// see src/io/sink.h and tests/src/sink/test-sink.c
7
8int main (int argc, char **argv)
9{
10 sint_t err = 0;
11
12 if (argc < 3) {
13 PRINT_ERR("not enough arguments, running tests\n");
14 err = run_on_default_source_and_sink(main);
15 PRINT_MSG("usage: %s <input_path> <output_path> [samplerate] [hop_size]\n", argv[0]);
16 return err;
17 }
18 6
19#ifdef HAVE_SNDFILE7#ifdef HAVE_SNDFILE
20 uint_t samplerate = 0;8#define HAVE_AUBIO_SINK_CUSTOM
21 uint_t hop_size = 512;9#define aubio_sink_custom_t aubio_sink_sndfile_t
22 uint_t n_frames = 0, read = 0;10#define new_aubio_sink_custom new_aubio_sink_sndfile
23 11#define del_aubio_sink_custom del_aubio_sink_sndfile
24 char_t *source_path = argv[1];12#define aubio_sink_custom_do aubio_sink_sndfile_do
25 char_t *sink_path = argv[2];13#define aubio_sink_custom_do_multi aubio_sink_sndfile_do_multi
26 14#define aubio_sink_custom_close aubio_sink_sndfile_close
27 if ( argc >= 4 ) samplerate = atoi(argv[3]);15#define aubio_sink_custom_preset_samplerate aubio_sink_sndfile_preset_samplerate
28 if ( argc >= 5 ) hop_size = atoi(argv[4]);16#define aubio_sink_custom_preset_channels aubio_sink_sndfile_preset_channels
29 if ( argc >= 6 ) {17#define aubio_sink_custom_get_samplerate aubio_sink_sndfile_get_samplerate
30 err = 2;18#define aubio_sink_custom_get_channels aubio_sink_sndfile_get_channels
31 PRINT_ERR("too many arguments\n");19#endif /* HAVE_SNDFILE */
32 return err;
33 }
34
35 fvec_t *vec = new_fvec(hop_size);
36 if (!vec) { err = 1; goto beach_fvec; }
37
38 aubio_source_t *i = new_aubio_source(source_path, samplerate, hop_size);
39 if (!i) { err = 1; goto beach_source; }
40
41 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(i);
42
43 aubio_sink_sndfile_t *o = new_aubio_sink_sndfile(sink_path, samplerate);
44 if (!o) { err = 1; goto beach_sink; }
45 20
46 do {21#include "base-sink_custom.h"
47 aubio_source_do(i, vec, &read);
48 aubio_sink_sndfile_do(o, vec, read);
49 n_frames += read;
50 } while ( read == hop_size );
51 22
52 PRINT_MSG("read %d frames at %dHz (%d blocks) from %s written to %s\n",23// this file uses the unstable aubio api, please use aubio_sink instead
53 n_frames, samplerate, n_frames / hop_size,24// see src/io/sink.h and tests/src/sink/test-sink.c
54 source_path, sink_path);
55 25
56 del_aubio_sink_sndfile(o);26int main (int argc, char **argv)
57beach_sink:27{
58 del_aubio_source(i);28 return base_main(argc, argv);
59beach_source:
60 del_fvec(vec);
61beach_fvec:
62#else
63 err = 0;
64 PRINT_ERR("aubio was not compiled with aubio_source_sndfile\n");
65#endif /* HAVE_SNDFILE */
66 return err;
67}29}
tests/src/io/test-sink_wavwrite-multi.c+0−78
@@ -1,78 +0,0 @@
1#define AUBIO_UNSTABLE 1
2#include <aubio.h>
3#include "utils_tests.h"
4
5// this file uses the unstable aubio api to test aubio_sink_wavwrite, please
6// use aubio_sink instead see src/io/sink.h and tests/src/sink/test-sink.c
7
8int main (int argc, char **argv)
9{
10 sint_t err = 0;
11
12 if (argc < 3) {
13 PRINT_ERR("not enough arguments, running tests\n");
14 err = run_on_default_source_and_sink(main);
15 PRINT_MSG("usage: %s <input_path> <output_path> [samplerate] [channels] [hop_size]\n", argv[0]);
16 return err;
17 }
18
19#ifdef HAVE_WAVWRITE
20 uint_t samplerate = 0;
21 uint_t channels = 0;
22 uint_t hop_size = 512;
23 uint_t n_frames = 0, read = 0;
24
25 char_t *source_path = argv[1];
26 char_t *sink_path = argv[2];
27
28 if ( argc >= 4 ) samplerate = atoi(argv[3]);
29 if ( argc >= 5 ) channels = atoi(argv[4]);
30 if ( argc >= 6 ) hop_size = atoi(argv[5]);
31 if ( argc >= 7 ) {
32 err = 2;
33 PRINT_ERR("too many arguments\n");
34 return err;
35 }
36
37 aubio_source_t *i = new_aubio_source(source_path, samplerate, hop_size);
38 if (!i) { err = 1; goto beach_source; }
39
40 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(i);
41 if (channels == 0 ) channels = aubio_source_get_channels(i);
42
43 fmat_t *mat = new_fmat(channels, hop_size);
44 if (!mat) { err = 1; goto beach_fmat; }
45
46 aubio_sink_wavwrite_t *o = new_aubio_sink_wavwrite(sink_path, 0);
47 if (!o) { err = 1; goto beach_sink; }
48 err = aubio_sink_wavwrite_preset_samplerate(o, samplerate);
49 if (err) { goto beach; }
50 err = aubio_sink_wavwrite_preset_channels(o, channels);
51 if (err) { goto beach; }
52
53 do {
54 aubio_source_do_multi(i, mat, &read);
55 aubio_sink_wavwrite_do_multi(o, mat, read);
56 n_frames += read;
57 } while ( read == hop_size );
58
59 PRINT_MSG("read %d frames at %dHz in %d channels (%d blocks) from %s written to %s\n",
60 n_frames, samplerate, channels, n_frames / hop_size,
61 source_path, sink_path);
62 PRINT_MSG("wrote %s with %dHz in %d channels\n", sink_path,
63 aubio_sink_wavwrite_get_samplerate(o),
64 aubio_sink_wavwrite_get_channels(o) );
65
66beach:
67 del_aubio_sink_wavwrite(o);
68beach_sink:
69 del_fmat(mat);
70beach_fmat:
71 del_aubio_source(i);
72beach_source:
73#else
74 err = 0;
75 PRINT_ERR("aubio was not compiled with aubio_sink_wavwrite\n");
76#endif /* HAVE_WAVWRITE */
77 return err;
78}
tests/src/io/test-sink_wavwrite.c+19−57
@@ -2,66 +2,28 @@ · 1 unmodified line
2#include <aubio.h>2#include <aubio.h>
3#include "utils_tests.h"3#include "utils_tests.h"
4 4
5// this file uses the unstable aubio api, please use aubio_sink instead5#define aubio_sink_custom "wavwrite"
6// see src/io/sink.h and tests/src/sink/test-sink.c
7
8int main (int argc, char **argv)
9{
10 sint_t err = 0;
11
12 if (argc < 3) {
13 PRINT_ERR("not enough arguments, running tests\n");
14 err = run_on_default_source_and_sink(main);
15 PRINT_MSG("usage: %s <input_path> <output_path> [samplerate] [hop_size]\n", argv[0]);
16 return err;
17 }
18 6
19#ifdef HAVE_WAVWRITE7#ifdef HAVE_WAVWRITE
20 uint_t samplerate = 0;8#define HAVE_AUBIO_SINK_CUSTOM
21 uint_t hop_size = 512;9#define aubio_sink_custom_t aubio_sink_wavwrite_t
22 uint_t n_frames = 0, read = 0;10#define new_aubio_sink_custom new_aubio_sink_wavwrite
23 11#define del_aubio_sink_custom del_aubio_sink_wavwrite
24 char_t *source_path = argv[1];12#define aubio_sink_custom_do aubio_sink_wavwrite_do
25 char_t *sink_path = argv[2];13#define aubio_sink_custom_do_multi aubio_sink_wavwrite_do_multi
26 14#define aubio_sink_custom_close aubio_sink_wavwrite_close
27 if ( argc >= 4 ) samplerate = atoi(argv[3]);15#define aubio_sink_custom_preset_samplerate aubio_sink_wavwrite_preset_samplerate
28 if ( argc >= 5 ) hop_size = atoi(argv[4]);16#define aubio_sink_custom_preset_channels aubio_sink_wavwrite_preset_channels
29 if ( argc >= 6 ) {17#define aubio_sink_custom_get_samplerate aubio_sink_wavwrite_get_samplerate
30 err = 2;18#define aubio_sink_custom_get_channels aubio_sink_wavwrite_get_channels
31 PRINT_ERR("too many arguments\n");19#endif /* HAVE_WAVWRITE */
32 return err;
33 }
34
35 fvec_t *vec = new_fvec(hop_size);
36 if (!vec) { err = 1; goto beach_fvec; }
37
38 aubio_source_t *i = new_aubio_source(source_path, samplerate, hop_size);
39 if (!i) { err = 1; goto beach_source; }
40
41 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(i);
42
43 aubio_sink_wavwrite_t *o = new_aubio_sink_wavwrite(sink_path, samplerate);
44 if (!o) { err = 1; goto beach_sink; }
45 20
46 do {21#include "base-sink_custom.h"
47 aubio_source_do(i, vec, &read);
48 aubio_sink_wavwrite_do(o, vec, read);
49 n_frames += read;
50 } while ( read == hop_size );
51 22
52 PRINT_MSG("read %d frames at %dHz (%d blocks) from %s written to %s\n",23// this file uses the unstable aubio api, please use aubio_sink instead
53 n_frames, samplerate, n_frames / hop_size,24// see src/io/sink.h and tests/src/sink/test-sink.c
54 source_path, sink_path);
55 25
56 del_aubio_sink_wavwrite(o);26int main (int argc, char **argv)
57beach_sink:27{
58 del_aubio_source(i);28 return base_main(argc, argv);
59beach_source:
60 del_fvec(vec);
61beach_fvec:
62#else
63 err = 0;
64 PRINT_ERR("aubio was not compiled with aubio_sink_wavwrite\n");
65#endif /* HAVE_WAVWRITE */
66 return err;
67}29}
tests/src/io/test-source.c+58−8
@@ -1,12 +1,14 @@
1#include <aubio.h>1#include <aubio.h>
2#include "utils_tests.h"2#include "utils_tests.h"
3 3
4int main (int argc, char **argv)4int test_wrong_params(void);
5
6int main(int argc, char **argv)
5{7{
6 uint_t err = 0;8 uint_t err = 0;
7 if (argc < 2) {9 if (argc < 2) {
8 PRINT_ERR("not enough arguments, running tests\n");10 PRINT_ERR("not enough arguments, running tests\n");
9 err = run_on_default_source(main);11 err = test_wrong_params();
10 PRINT_MSG("read a wave file as a mono vector\n");12 PRINT_MSG("read a wave file as a mono vector\n");
11 PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]);13 PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]);
12 PRINT_MSG("examples:\n");14 PRINT_MSG("examples:\n");
@@ -27,11 +29,10 @@ int main (int argc, char **argv) · 14 unmodified lines
27 29
28 char_t *source_path = argv[1];30 char_t *source_path = argv[1];
29 31
30
31 aubio_source_t* s =32 aubio_source_t* s =
32 new_aubio_source(source_path, samplerate, hop_size);33 new_aubio_source(source_path, samplerate, hop_size);
33 if (!s) { err = 1; goto beach; }
34 fvec_t *vec = new_fvec(hop_size);34 fvec_t *vec = new_fvec(hop_size);
35 if (!s || !vec) { err = 1; goto beach; }
35 36
36 uint_t n_frames_expected = aubio_source_get_duration(s);37 uint_t n_frames_expected = aubio_source_get_duration(s);
37 38
@@ -49,11 +50,60 @@ int main (int argc, char **argv) · 11 unmodified lines
49 50
50 // close the file (optional)51 // close the file (optional)
51 aubio_source_close(s);52 aubio_source_close(s);
52 // test closing the file a second time
53 aubio_source_close(s);
54 53
55 del_fvec (vec);
56 del_aubio_source (s);
57beach:54beach:
55 if (vec)
56 del_fvec(vec);
57 if (s)
58 del_aubio_source(s);
58 return err;59 return err;
59}60}
61
62int test_wrong_params(void)
63{
64 char_t *uri = DEFINEDSTRING(AUBIO_TESTS_SOURCE);
65 uint_t samplerate = 44100;
66 uint_t hop_size = 512;
67 uint_t channels, read = 0;
68 fvec_t *vec;
69 fmat_t *mat;
70 aubio_source_t *s;
71
72 if (new_aubio_source(0, samplerate, hop_size)) return 1;
73 if (new_aubio_source("\0", samplerate, hop_size)) return 1;
74 if (new_aubio_source(uri, -1, hop_size)) return 1;
75 if (new_aubio_source(uri, 0, 0)) return 1;
76
77 s = new_aubio_source(uri, samplerate, hop_size);
78 if (!s) return 1;
79 channels = aubio_source_get_channels(s);
80
81 // vector to read downmixed samples
82 vec = new_fvec(hop_size);
83 // matrix to read individual channels
84 mat = new_fmat(channels, hop_size);
85
86 if (aubio_source_get_samplerate(s) != samplerate) return 1;
87
88 // read first hop_size frames
89 aubio_source_do(s, vec, &read);
90 if (read != hop_size) return 1;
91
92 // seek to 0
93 if(aubio_source_seek(s, 0)) return 1;
94
95 // read again as multiple channels
96 aubio_source_do_multi(s, mat, &read);
97 if (read != hop_size) return 1;
98
99 // close the file (optional)
100 aubio_source_close(s);
101 // test closing the file a second time
102 aubio_source_close(s);
103
104 del_aubio_source(s);
105 del_fmat(mat);
106 del_fvec(vec);
107
108 return run_on_default_source(main);
109}
tests/src/io/test-source_apple_audio.c+20−53
@@ -2,62 +2,29 @@ · 1 unmodified line
2#include <aubio.h>2#include <aubio.h>
3#include "utils_tests.h"3#include "utils_tests.h"
4 4
5#define aubio_source_custom "apple_audio"
6
7#ifdef HAVE_SOURCE_APPLE_AUDIO
8#define HAVE_AUBIO_SOURCE_CUSTOM
9#define aubio_source_custom_t aubio_source_apple_audio_t
10#define new_aubio_source_custom new_aubio_source_apple_audio
11#define del_aubio_source_custom del_aubio_source_apple_audio
12#define aubio_source_custom_get_samplerate aubio_source_apple_audio_get_samplerate
13#define aubio_source_custom_get_duration aubio_source_apple_audio_get_duration
14#define aubio_source_custom_do aubio_source_apple_audio_do
15#define aubio_source_custom_do_multi aubio_source_apple_audio_do_multi
16#define aubio_source_custom_seek aubio_source_apple_audio_seek
17#define aubio_source_custom_close aubio_source_apple_audio_close
18#define aubio_source_custom_get_channels aubio_source_apple_audio_get_channels
19#define aubio_source_custom_get_samplerate aubio_source_apple_audio_get_samplerate
20#endif /* HAVE_SOURCE_APPLE_AUDIO */
21
22#include "base-source_custom.h"
23
5// this file uses the unstable aubio api, please use aubio_source instead24// this file uses the unstable aubio api, please use aubio_source instead
6// see src/io/source.h and tests/src/source/test-source.c25// see src/io/source.h and tests/src/source/test-source.c
7 26
8int main (int argc, char **argv)27int main (int argc, char **argv)
9{28{
10 uint_t err = 0;29 return base_main(argc, argv);
11 if (argc < 2) {
12 PRINT_ERR("not enough arguments, running tests\n");
13 err = run_on_default_source(main);
14 PRINT_MSG("read a wave file as a mono vector\n");
15 PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]);
16 PRINT_MSG("examples:\n");
17 PRINT_MSG(" - read file.wav at original samplerate\n");
18 PRINT_MSG(" %s file.wav\n", argv[0]);
19 PRINT_MSG(" - read file.aif at 32000Hz\n");
20 PRINT_MSG(" %s file.aif 32000\n", argv[0]);
21 PRINT_MSG(" - read file.mp3 at original samplerate with 4096 blocks\n");
22 PRINT_MSG(" %s file.mp3 0 4096 \n", argv[0]);
23 return err;
24 }
25
26#if HAVE_SOURCE_APPLE_AUDIO
27 uint_t samplerate = 0;
28 uint_t hop_size = 256;
29 uint_t n_frames = 0, read = 0;
30 if ( argc >= 3 ) samplerate = atoi(argv[2]);
31 if ( argc >= 4 ) hop_size = atoi(argv[3]);
32
33 char_t *source_path = argv[1];
34
35
36 aubio_source_apple_audio_t * s =
37 new_aubio_source_apple_audio(source_path, samplerate, hop_size);
38 if (!s) { err = 1; goto beach; }
39 fvec_t *vec = new_fvec(hop_size);
40
41 uint_t n_frames_expected = aubio_source_apple_audio_get_duration(s);
42
43 samplerate = aubio_source_apple_audio_get_samplerate(s);
44
45 do {
46 aubio_source_apple_audio_do(s, vec, &read);
47 fvec_print (vec);
48 n_frames += read;
49 } while ( read == hop_size );
50
51 PRINT_MSG("read %d frames (expected %d) at %dHz (%d blocks) from %s\n",
52 n_frames, n_frames_expected, samplerate, n_frames / hop_size,
53 source_path);
54
55 del_fvec (vec);
56 del_aubio_source_apple_audio (s);
57beach:
58#else /* HAVE_SOURCE_APPLE_AUDIO */
59 err = 0;
60 PRINT_ERR("aubio was not compiled with aubio_source_apple_audio\n");
61#endif /* HAVE_SOURCE_APPLE_AUDIO */
62 return err;
63}30}
tests/src/io/test-source_avcodec.c+20−53
@@ -2,62 +2,29 @@ · 1 unmodified line
2#include <aubio.h>2#include <aubio.h>
3#include "utils_tests.h"3#include "utils_tests.h"
4 4
5// this file uses the unstable aubio api, please use aubio_source instead5#define aubio_source_custom "avcodec"
6// see src/io/source.h and tests/src/source/test-source.c
7
8int main (int argc, char **argv)
9{
10 uint_t err = 0;
11 if (argc < 2) {
12 PRINT_ERR("not enough arguments, running tests\n");
13 err = run_on_default_source(main);
14 PRINT_MSG("read a wave file as a mono vector\n");
15 PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]);
16 PRINT_MSG("examples:\n");
17 PRINT_MSG(" - read file.wav at original samplerate\n");
18 PRINT_MSG(" %s file.wav\n", argv[0]);
19 PRINT_MSG(" - read file.wav at 32000Hz\n");
20 PRINT_MSG(" %s file.aif 32000\n", argv[0]);
21 PRINT_MSG(" - read file.wav at original samplerate with 4096 blocks\n");
22 PRINT_MSG(" %s file.wav 0 4096 \n", argv[0]);
23 return err;
24 }
25 6
26#ifdef HAVE_LIBAV7#ifdef HAVE_LIBAV
27 uint_t samplerate = 0;8#define HAVE_AUBIO_SOURCE_CUSTOM
28 uint_t hop_size = 256;9#define aubio_source_custom_t aubio_source_avcodec_t
29 uint_t n_frames = 0, read = 0;10#define new_aubio_source_custom new_aubio_source_avcodec
30 if ( argc >= 3 ) samplerate = atoi(argv[2]);11#define del_aubio_source_custom del_aubio_source_avcodec
31 if ( argc >= 4 ) hop_size = atoi(argv[3]);12#define aubio_source_custom_get_samplerate aubio_source_avcodec_get_samplerate
32 13#define aubio_source_custom_get_duration aubio_source_avcodec_get_duration
33 char_t *source_path = argv[1];14#define aubio_source_custom_do aubio_source_avcodec_do
34 15#define aubio_source_custom_do_multi aubio_source_avcodec_do_multi
35 16#define aubio_source_custom_seek aubio_source_avcodec_seek
36 aubio_source_avcodec_t * s =17#define aubio_source_custom_close aubio_source_avcodec_close
37 new_aubio_source_avcodec(source_path, samplerate, hop_size);18#define aubio_source_custom_get_channels aubio_source_avcodec_get_channels
38 if (!s) { err = 1; goto beach; }19#define aubio_source_custom_get_samplerate aubio_source_avcodec_get_samplerate
39 fvec_t *vec = new_fvec(hop_size);20#endif /* HAVE_LIBAV */
40
41 uint_t n_frames_expected = aubio_source_avcodec_get_duration(s);
42
43 samplerate = aubio_source_avcodec_get_samplerate(s);
44 21
45 do {22#include "base-source_custom.h"
46 aubio_source_avcodec_do(s, vec, &read);
47 fvec_print (vec);
48 n_frames += read;
49 } while ( read == hop_size );
50 23
51 PRINT_MSG("read %d frames (expected %d) at %dHz (%d blocks) from %s\n",24// this file uses the unstable aubio api, please use aubio_source instead
52 n_frames, n_frames_expected, samplerate, n_frames / hop_size,25// see src/io/source.h and tests/src/source/test-source.c
53 source_path);
54 26
55 del_fvec (vec);27int main (int argc, char **argv)
56 del_aubio_source_avcodec (s);28{
57beach:29 return base_main(argc, argv);
58#else /* HAVE_LIBAV */
59 err = 0;
60 PRINT_ERR("aubio was not compiled with aubio_source_avcodec\n");
61#endif /* HAVE_LIBAV */
62 return err;
63}30}
tests/src/io/test-source_multi.c+0−57
@@ -1,57 +0,0 @@
1#include <aubio.h>
2#include "utils_tests.h"
3
4int main (int argc, char **argv)
5{
6 sint_t err = 0;
7 if (argc < 2) {
8 PRINT_ERR("not enough arguments, running tests\n");
9 err = run_on_default_source(main);
10 PRINT_MSG("read a wave file as a mono vector\n");
11 PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]);
12 PRINT_MSG("examples:\n");
13 PRINT_MSG(" - read file.wav at original samplerate\n");
14 PRINT_MSG(" %s file.wav\n", argv[0]);
15 PRINT_MSG(" - read file.wav at 32000Hz\n");
16 PRINT_MSG(" %s file.aif 32000\n", argv[0]);
17 PRINT_MSG(" - read file.wav at original samplerate with 4096 blocks\n");
18 PRINT_MSG(" %s file.wav 0 4096 \n", argv[0]);
19 PRINT_MSG(" - read file.wav at original samplerate with 256 frames blocks, mono\n");
20 PRINT_MSG(" %s file.wav 0 4096 1\n", argv[0]);
21 return err;
22 }
23
24 uint_t samplerate = 0;
25 uint_t hop_size = 256;
26 uint_t n_frames = 0, read = 0;
27 uint_t n_channels = 0;
28 if ( argc >= 3 ) samplerate = atoi(argv[2]);
29 if ( argc >= 4 ) hop_size = atoi(argv[3]);
30 if ( argc >= 5 ) n_channels = atoi(argv[4]);
31
32 char_t *source_path = argv[1];
33
34 aubio_source_t* s = new_aubio_source(source_path, samplerate, hop_size);
35 if (!s) { err = -1; goto beach; }
36
37 if ( samplerate == 0 ) samplerate = aubio_source_get_samplerate(s);
38
39 if ( n_channels == 0 ) n_channels = aubio_source_get_channels(s);
40
41 fmat_t *mat = new_fmat(n_channels, hop_size);
42
43 do {
44 aubio_source_do_multi (s, mat, &read);
45 fmat_print (mat);
46 n_frames += read;
47 } while ( read == hop_size );
48
49 PRINT_MSG("read %d frames in %d channels at %dHz (%d blocks) from %s\n",
50 n_frames, n_channels, samplerate, n_frames / hop_size, source_path);
51
52 del_fmat (mat);
53 del_aubio_source (s);
54beach:
55
56 return err;
57}
tests/src/io/test-source_seek.c+0−92
@@ -1,92 +0,0 @@
1#include <aubio.h>
2#include "utils_tests.h"
3
4int main (int argc, char **argv)
5{
6 uint_t err = 0;
7 if (argc < 2) {
8 PRINT_ERR("not enough arguments, running tests\n");
9 err = run_on_default_source(main);
10 PRINT_MSG("read a wave file as a mono vector\n");
11 PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]);
12 PRINT_MSG("examples:\n");
13 PRINT_MSG(" - read file.wav at original samplerate\n");
14 PRINT_MSG(" %s file.wav\n", argv[0]);
15 PRINT_MSG(" - read file.wav at 32000Hz\n");
16 PRINT_MSG(" %s file.aif 32000\n", argv[0]);
17 PRINT_MSG(" - read file.wav at original samplerate with 4096 blocks\n");
18 PRINT_MSG(" %s file.wav 0 4096 \n", argv[0]);
19 return err;
20 }
21
22 uint_t samplerate = 0;
23 uint_t hop_size = 256;
24 uint_t n_frames = 0, read = 0;
25 uint_t old_n_frames_1 = 0, old_n_frames_2 = 0, old_n_frames_3 = 0;
26 if ( argc >= 3 ) samplerate = atoi(argv[2]);
27 if ( argc >= 4 ) hop_size = atoi(argv[3]);
28
29 char_t *source_path = argv[1];
30
31 fvec_t *vec = new_fvec(hop_size);
32
33 aubio_source_t* s = new_aubio_source(source_path, samplerate, hop_size);
34 if (!s) { err = 1; goto beach; }
35
36 if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(s);
37
38 do {
39 aubio_source_do(s, vec, &read);
40 //fvec_print (vec);
41 n_frames += read;
42 } while ( read == hop_size );
43
44 PRINT_MSG("read %.2fs, %d frames at %dHz (%d blocks) from %s\n",
45 n_frames * 1. / samplerate,
46 n_frames, samplerate,
47 n_frames / hop_size, source_path);
48
49 old_n_frames_1 = n_frames;
50
51 aubio_source_seek (s, 0);
52
53 n_frames = 0;
54 do {
55 aubio_source_do(s, vec, &read);
56 //fvec_print (vec);
57 n_frames += read;
58 } while ( read == hop_size );
59
60 PRINT_MSG("read %.2fs, %d frames at %dHz (%d blocks) from %s\n",
61 n_frames * 1. / samplerate,
62 n_frames, samplerate,
63 n_frames / hop_size, source_path);
64
65 old_n_frames_2 = n_frames;
66
67 aubio_source_seek (s, old_n_frames_1 / 2);
68
69 n_frames = 0;
70 do {
71 aubio_source_do(s, vec, &read);
72 //fvec_print (vec);
73 n_frames += read;
74 } while ( read == hop_size );
75
76 PRINT_MSG("read %.2fs, %d frames at %dHz (%d blocks) from %s\n",
77 n_frames * 1. / samplerate,
78 n_frames, samplerate,
79 n_frames / hop_size, source_path);
80
81 old_n_frames_3 = n_frames;
82
83 del_aubio_source (s);
84beach:
85 del_fvec (vec);
86
87 // check that we got exactly the same number of frames
88 assert ( old_n_frames_2 == old_n_frames_1 );
89 // check that we got about half the frames, with 3 decimals
90 assert ( roundf(1.e3 * old_n_frames_1 / old_n_frames_3) / 1.e3 == 2.);
91 return err;
92}
tests/src/io/test-source_sndfile.c+20−53
@@ -2,62 +2,29 @@ · 1 unmodified line
2#include <aubio.h>2#include <aubio.h>
3#include "utils_tests.h"3#include "utils_tests.h"
4 4
5#define aubio_source_custom "sndfile"
6
7#ifdef HAVE_SNDFILE
8#define HAVE_AUBIO_SOURCE_CUSTOM
9#define aubio_source_custom_t aubio_source_sndfile_t
10#define new_aubio_source_custom new_aubio_source_sndfile
11#define del_aubio_source_custom del_aubio_source_sndfile
12#define aubio_source_custom_get_samplerate aubio_source_sndfile_get_samplerate
13#define aubio_source_custom_get_duration aubio_source_sndfile_get_duration
14#define aubio_source_custom_do aubio_source_sndfile_do
15#define aubio_source_custom_do_multi aubio_source_sndfile_do_multi
16#define aubio_source_custom_seek aubio_source_sndfile_seek
17#define aubio_source_custom_close aubio_source_sndfile_close
18#define aubio_source_custom_get_channels aubio_source_sndfile_get_channels
19#define aubio_source_custom_get_samplerate aubio_source_sndfile_get_samplerate
20#endif /* HAVE_LIBAV */
21
22#include "base-source_custom.h"
23
5// this file uses the unstable aubio api, please use aubio_source instead24// this file uses the unstable aubio api, please use aubio_source instead
6// see src/io/source.h and tests/src/source/test-source.c25// see src/io/source.h and tests/src/source/test-source.c
7 26
8int main (int argc, char **argv)27int main (int argc, char **argv)
9{28{
10 uint_t err = 0;29 return base_main(argc, argv);
11 if (argc < 2) {
12 PRINT_ERR("not enough arguments, running tests\n");
13 err = run_on_default_source(main);
14 PRINT_MSG("read a wave file as a mono vector\n");
15 PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]);
16 PRINT_MSG("examples:\n");
17 PRINT_MSG(" - read file.wav at original samplerate\n");
18 PRINT_MSG(" %s file.wav\n", argv[0]);
19 PRINT_MSG(" - read file.wav at 32000Hz\n");
20 PRINT_MSG(" %s file.aif 32000\n", argv[0]);
21 PRINT_MSG(" - read file.wav at original samplerate with 4096 blocks\n");
22 PRINT_MSG(" %s file.wav 0 4096 \n", argv[0]);
23 return err;
24 }
25
26#ifdef HAVE_SNDFILE
27 uint_t samplerate = 0;
28 uint_t hop_size = 256;
29 uint_t n_frames = 0, read = 0;
30 if ( argc >= 3 ) samplerate = atoi(argv[2]);
31 if ( argc >= 4 ) hop_size = atoi(argv[3]);
32
33 char_t *source_path = argv[1];
34
35
36 aubio_source_sndfile_t * s =
37 new_aubio_source_sndfile(source_path, samplerate, hop_size);
38 if (!s) { err = 1; goto beach; }
39 fvec_t *vec = new_fvec(hop_size);
40
41 uint_t n_frames_expected = aubio_source_sndfile_get_duration(s);
42
43 samplerate = aubio_source_sndfile_get_samplerate(s);
44
45 do {
46 aubio_source_sndfile_do(s, vec, &read);
47 fvec_print (vec);
48 n_frames += read;
49 } while ( read == hop_size );
50
51 PRINT_MSG("read %d frames (expected %d) at %dHz (%d blocks) from %s\n",
52 n_frames, n_frames_expected, samplerate, n_frames / hop_size,
53 source_path);
54
55 del_fvec (vec);
56 del_aubio_source_sndfile (s);
57beach:
58#else
59 err = 0;
60 PRINT_ERR("aubio was not compiled with aubio_source_sndfile\n");
61#endif /* HAVE_SNDFILE */
62 return err;
63}30}
tests/src/io/test-source_wavread.c+20−53
@@ -2,62 +2,29 @@ · 1 unmodified line
2#include <aubio.h>2#include <aubio.h>
3#include "utils_tests.h"3#include "utils_tests.h"
4 4
5// this file uses the unstable aubio api, please use aubio_source instead5#define aubio_source_custom "wavread"
6// see src/io/source.h and tests/src/source/test-source.c
7
8int main (int argc, char **argv)
9{
10 uint_t err = 0;
11 if (argc < 2) {
12 PRINT_ERR("not enough arguments, running tests\n");
13 err = run_on_default_source(main);
14 PRINT_MSG("read a wave file as a mono vector\n");
15 PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]);
16 PRINT_MSG("examples:\n");
17 PRINT_MSG(" - read file.wav at original samplerate\n");
18 PRINT_MSG(" %s file.wav\n", argv[0]);
19 PRINT_MSG(" - read file.wav at 32000Hz\n");
20 PRINT_MSG(" %s file.aif 32000\n", argv[0]);
21 PRINT_MSG(" - read file.wav at original samplerate with 4096 blocks\n");
22 PRINT_MSG(" %s file.wav 0 4096 \n", argv[0]);
23 return err;
24 }
25 6
26#ifdef HAVE_WAVREAD7#ifdef HAVE_WAVREAD
27 uint_t samplerate = 0;8#define HAVE_AUBIO_SOURCE_CUSTOM
28 uint_t hop_size = 256;9#define aubio_source_custom_t aubio_source_wavread_t
29 uint_t n_frames = 0, read = 0;10#define new_aubio_source_custom new_aubio_source_wavread
30 if ( argc >= 3 ) samplerate = atoi(argv[2]);11#define del_aubio_source_custom del_aubio_source_wavread
31 if ( argc >= 4 ) hop_size = atoi(argv[3]);12#define aubio_source_custom_get_samplerate aubio_source_wavread_get_samplerate
32 13#define aubio_source_custom_get_duration aubio_source_wavread_get_duration
33 char_t *source_path = argv[1];14#define aubio_source_custom_do aubio_source_wavread_do
34 15#define aubio_source_custom_do_multi aubio_source_wavread_do_multi
35 16#define aubio_source_custom_seek aubio_source_wavread_seek
36 aubio_source_wavread_t * s =17#define aubio_source_custom_close aubio_source_wavread_close
37 new_aubio_source_wavread(source_path, samplerate, hop_size);18#define aubio_source_custom_get_channels aubio_source_wavread_get_channels
38 if (!s) { err = 1; goto beach; }19#define aubio_source_custom_get_samplerate aubio_source_wavread_get_samplerate
39 fvec_t *vec = new_fvec(hop_size);20#endif /* HAVE_WAVREAD */
40
41 uint_t n_frames_expected = aubio_source_wavread_get_duration(s);
42
43 samplerate = aubio_source_wavread_get_samplerate(s);
44 21
45 do {22#include "base-source_custom.h"
46 aubio_source_wavread_do(s, vec, &read);
47 fvec_print (vec);
48 n_frames += read;
49 } while ( read == hop_size );
50 23
51 PRINT_MSG("read %d frames (expected %d) at %dHz (%d blocks) from %s\n",24// this file uses the unstable aubio api, please use aubio_source instead
52 n_frames, n_frames_expected, samplerate, n_frames / hop_size,25// see src/io/source.h and tests/src/source/test-source.c
53 source_path);
54 26
55 del_fvec (vec);27int main (int argc, char **argv)
56 del_aubio_source_wavread (s);28{
57beach:29 return base_main(argc, argv);
58#else
59 err = 0;
60 PRINT_ERR("aubio was not compiled with aubio_source_wavread\n");
61#endif /* HAVE_WAVREAD */
62 return err;
63}30}
tests/src/onset/test-onset.c+9−12
@@ -69,21 +69,19 @@ int test_wrong_params(void) · 68 unmodified lines
69 uint_t hop_size = win_size / 2;69 uint_t hop_size = win_size / 2;
70 uint_t samplerate = 44100;70 uint_t samplerate = 44100;
71 // hop_size < 171 // hop_size < 1
72 if (new_aubio_onset("default", 5, 0, samplerate))72 if (new_aubio_onset("default", 5, 0, samplerate)) return 1;
73 return 1;73
74 // buf_size < 274 // buf_size < 2
75 if (new_aubio_onset("default", 1, 1, samplerate))75 if (new_aubio_onset("default", 1, 1, samplerate)) return 1;
76 return 1;76
77 // buf_size < hop_size77 // buf_size < hop_size
78 if (new_aubio_onset("default", hop_size, win_size, samplerate))78 if (new_aubio_onset("default", hop_size, win_size, samplerate)) return 1;
79 return 1;79
80 // samplerate < 180 // samplerate < 1
81 if (new_aubio_onset("default", 1024, 512, 0))81 if (new_aubio_onset("default", 1024, 512, 0)) return 1;
82 return 1;
83 82
84 // specdesc creation failed83 // specdesc creation failed
85 if (new_aubio_onset("abcd", win_size, win_size/2, samplerate))84 if (new_aubio_onset("abcd", win_size, win_size/2, samplerate)) return 1;
86 return 1;
87 85
88 aubio_onset_t *o;86 aubio_onset_t *o;
89 87
@@ -92,8 +90,7 @@ int test_wrong_params(void) · 2 unmodified lines
92 if (o) del_aubio_onset(o);90 if (o) del_aubio_onset(o);
93 91
94 o = new_aubio_onset("default", win_size, hop_size, samplerate);92 o = new_aubio_onset("default", win_size, hop_size, samplerate);
95 if (!aubio_onset_set_default_parameters(o, "wrong_type"))93 if (!aubio_onset_set_default_parameters(o, "wrong_type")) return 1;
96 return 1;
97 del_aubio_onset(o);94 del_aubio_onset(o);
98 95
99 return run_on_default_source(main);96 return run_on_default_source(main);
tests/src/spectral/test-mfcc.c+80−21
@@ -1,35 +1,94 @@
1#include <aubio.h>1#include <aubio.h>
2#include "utils_tests.h"
2 3
3int main (void)4int test_wrong_params(void);
5
6int main (int argc, char** argv)
7{
8 sint_t err = 0;
9
10 if (argc < 2) {
11 err = 2;
12 PRINT_WRN("no arguments, running tests\n");
13 err = test_wrong_params();
14 PRINT_MSG("usage: %s <input_path> [samplerate] [hop_size]\n", argv[0]);
15 return err;
16 }
17
18 uint_t win_s; // fft size
19 uint_t hop_s = 256; // block size
20 uint_t samplerate = 0; // samplerate
21 uint_t n_filters = 40; // number of filters
22 uint_t n_coeffs = 13; // number of coefficients
23 uint_t read = 0;
24
25 char_t *source_path = argv[1];
26
27 if ( argc >= 3 ) samplerate = atoi(argv[2]);
28 if ( argc >= 4 ) hop_s = atoi(argv[3]);
29
30 win_s = 2 * hop_s;
31
32 aubio_source_t *source = 0;
33 aubio_pvoc_t *pv = 0;
34 aubio_mfcc_t *mfcc = 0;
35
36 fvec_t *in = new_fvec (win_s); // input buffer
37 cvec_t *fftgrain = new_cvec (win_s); // input buffer
38 fvec_t *out = new_fvec (n_coeffs); // output coefficients
39
40 if (!in || !fftgrain || !out) { err = 1; goto failure; }
41
42 // source
43 source = new_aubio_source(source_path, samplerate, hop_s);
44 if (!source) { err = 1; goto failure; }
45 if (samplerate == 0) samplerate = aubio_source_get_samplerate(source);
46
47 // phase vocoder
48 pv = new_aubio_pvoc(win_s, hop_s);
49 if (!pv) { err = 1; goto failure; }
50
51 // mfcc object
52 mfcc = new_aubio_mfcc (win_s, n_filters, n_coeffs, samplerate);
53 if (!mfcc) { err = 1; goto failure; }
54
55 // processing loop
56 do {
57 aubio_source_do(source, in, &read);
58 aubio_pvoc_do(pv, in, fftgrain);
59 aubio_mfcc_do(mfcc, fftgrain, out);
60 fvec_print(out);
61 } while (read == hop_s);
62
63failure:
64
65 if (mfcc)
66 del_aubio_mfcc(mfcc);
67 if (pv)
68 del_aubio_pvoc(pv);
69 if (source)
70 del_aubio_source(source);
71 if (in)
72 del_fvec(in);
73 if (fftgrain)
74 del_cvec(fftgrain);
75 if (out)
76 del_fvec(out);
77 aubio_cleanup();
78 return err;
79}
80
81int test_wrong_params()
4{82{
5 uint_t win_s = 512; // fft size83 uint_t win_s = 512; // fft size
6 uint_t n_filters = 40; // number of filters84 uint_t n_filters = 40; // number of filters
7 uint_t n_coeffs = 13; // number of coefficients85 uint_t n_coeffs = 13; // number of coefficients
8 smpl_t samplerate = 16000.; // samplerate86 smpl_t samplerate = 16000.; // samplerate
9 cvec_t *in = new_cvec (win_s); // input buffer
10 fvec_t *out = new_fvec (n_coeffs); // output coefficients
11 87
12 if (new_aubio_mfcc( 0, n_filters, n_coeffs, samplerate)) return 1;88 if (new_aubio_mfcc( 0, n_filters, n_coeffs, samplerate)) return 1;
13 if (new_aubio_mfcc(win_s, 0, n_coeffs, samplerate)) return 1;89 if (new_aubio_mfcc(win_s, 0, n_coeffs, samplerate)) return 1;
14 if (new_aubio_mfcc(win_s, n_filters, 0, samplerate)) return 1;90 if (new_aubio_mfcc(win_s, n_filters, 0, samplerate)) return 1;
15 if (new_aubio_mfcc(win_s, n_filters, n_coeffs, 0)) return 1;91 if (new_aubio_mfcc(win_s, n_filters, n_coeffs, 0)) return 1;
16 92
17 // create mfcc object93 return run_on_default_source(main);
18 aubio_mfcc_t *o = new_aubio_mfcc (win_s, n_filters, n_coeffs, samplerate);
19
20 cvec_norm_set_all (in, 1.);
21 aubio_mfcc_do (o, in, out);
22 fvec_print (out);
23
24 cvec_norm_set_all (in, .5);
25 aubio_mfcc_do (o, in, out);
26 fvec_print (out);
27
28 // clean up
29 del_aubio_mfcc (o);
30 del_cvec (in);
31 del_fvec (out);
32 aubio_cleanup ();
33
34 return 0;
35}94}
tests/src/tempo/test-tempo.c+7−14
@@ -81,35 +81,28 @@ int test_wrong_params(void) · 80 unmodified lines
81 uint_t i;81 uint_t i;
82 82
83 // test wrong method fails83 // test wrong method fails
84 if (new_aubio_tempo("unexisting_method", win_size, hop_size, samplerate))84 if (new_aubio_tempo("undefined", win_size, hop_size, samplerate)) return 1;
85 return 1;
86 85
87 // test hop > win fails86 // test hop > win fails
88 if (new_aubio_tempo("default", hop_size, win_size, samplerate))87 if (new_aubio_tempo("default", hop_size, win_size, samplerate)) return 1;
89 return 1;
90 88
91 // test null hop_size fails89 // test null hop_size fails
92 if (new_aubio_tempo("default", win_size, 0, samplerate))90 if (new_aubio_tempo("default", win_size, 0, samplerate)) return 1;
93 return 1;
94 91
95 // test 1 buf_size fails92 // test 1 buf_size fails
96 if (new_aubio_tempo("default", 1, 1, samplerate))93 if (new_aubio_tempo("default", 1, 1, samplerate)) return 1;
97 return 1;
98 94
99 // test null samplerate fails95 // test null samplerate fails
100 if (new_aubio_tempo("default", win_size, hop_size, 0))96 if (new_aubio_tempo("default", win_size, hop_size, 0)) return 1;
101 return 1;
102 97
103 // test short sizes workaround98 // test short sizes workaround
104 t = new_aubio_tempo("default", 2048, 2048, 500);99 t = new_aubio_tempo("default", 2048, 2048, 500);
105 if (!t)100 if (!t) return 1;
106 return 1;
107 101
108 del_aubio_tempo(t);102 del_aubio_tempo(t);
109 103
110 t = new_aubio_tempo("default", win_size, hop_size, samplerate);104 t = new_aubio_tempo("default", win_size, hop_size, samplerate);
111 if (!t)105 if (!t) return 1;
112 return 1;
113 106
114 in = new_fvec(hop_size);107 in = new_fvec(hop_size);
115 out = new_fvec(1);108 out = new_fvec(1);
tests/src/temporal/test-filter.c+7−12
@@ -9,17 +9,13 @@ int main (void) · 8 unmodified lines
9 9
10 aubio_filter_t *o = new_aubio_filter_c_weighting (44100);10 aubio_filter_t *o = new_aubio_filter_c_weighting (44100);
11 11
12 if (new_aubio_filter(0))12 if (new_aubio_filter(0)) return 1;
13 return 1;
14 13
15 if (aubio_filter_get_samplerate(o) != 44100)14 if (aubio_filter_get_samplerate(o) != 44100) return 1;
16 return 1;
17 15
18 if (aubio_filter_set_c_weighting (o, -1) == 0)16 if (aubio_filter_set_c_weighting (o, -1) == 0) return 1;
19 return 1;
20 17
21 if (aubio_filter_set_c_weighting (0, 32000) == 0)18 if (aubio_filter_set_c_weighting (0, 32000) == 0) return 1;
22 return 1;
23 19
24 in->data[impulse_at] = 0.5;20 in->data[impulse_at] = 0.5;
25 fvec_print (in);21 fvec_print (in);
@@ -29,10 +25,9 @@ int main (void) · 3 unmodified lines
29 25
30 o = new_aubio_filter_a_weighting (32000);26 o = new_aubio_filter_a_weighting (32000);
31 27
32 if (aubio_filter_set_a_weighting (o, -1) == 0)28 if (aubio_filter_set_a_weighting (o, -1) == 0) return 1;
33 return 1;29
34 if (aubio_filter_set_a_weighting (0, 32000) == 0)30 if (aubio_filter_set_a_weighting (0, 32000) == 0) return 1;
35 return 1;
36 31
37 in->data[impulse_at] = 0.5;32 in->data[impulse_at] = 0.5;
38 fvec_print (in);33 fvec_print (in);
tests/src/test-delnull.c+0−24
@@ -1,24 +0,0 @@
1#include <stdlib.h>
2#include "aubio.h"
3
4// When creating an aubio object, the user should check whether the object is
5// set NULL, indicating the creation failed and the object was not allocated.
6
7int main (void)
8{
9 uint_t return_code = 0;
10 fvec_t *f = new_fvec(-12);
11 cvec_t *c = new_cvec(-12);
12 lvec_t *l = new_lvec(-12);
13 aubio_fft_t *fft = new_aubio_fft(-12);
14 if (f != NULL) {
15 return_code = 1;
16 } else if (c != NULL) {
17 return_code = 2;
18 } else if (l != NULL) {
19 return_code = 3;
20 } else if (fft != NULL) {
21 return_code = 3;
22 }
23 return return_code;
24}
tests/utils_tests.h+11−12
@@ -55,21 +55,20 @@ · 54 unmodified lines
55#define RAND_MAX 3276755#define RAND_MAX 32767
56#endif56#endif
57 57
58// are we on windows ? or are we using -std=c99 ?58#if defined(HAVE_WIN_HACKS)
59#if defined(HAVE_WIN_HACKS) || defined(__STRICT_ANSI__)
60// http://en.wikipedia.org/wiki/Linear_congruential_generator
61// no srandom/random on win32
62 59
63uint_t srandom_seed = 1029;60// use srand/rand on windows
61#define srandom srand
62#define random rand
64 63
65void srandom(uint_t new_seed) {64#elif defined(__STRICT_ANSI__)
66 srandom_seed = new_seed;65
67}66// workaround to build with -std=c99 (for instance with older cygwin),
67// assuming libbc is recent enough to supports these functions.
68extern void srandom(unsigned);
69extern int random(void);
70extern char mkstemp(const char *pat);
68 71
69uint_t random(void) {
70 srandom_seed = 1664525 * srandom_seed + 1013904223;
71 return srandom_seed;
72}
73#endif72#endif
74 73
75void utils_init_random (void);74void utils_init_random (void);
wscript+34−21
@@ -555,32 +555,45 @@ def doxygen(bld): · 554 unmodified lines
555 # build documentation from source files using doxygen555 # build documentation from source files using doxygen
556 if bld.env['DOXYGEN']:556 if bld.env['DOXYGEN']:
557 bld.env.VERSION = VERSION557 bld.env.VERSION = VERSION
558 rule = '( cat ${SRC} && echo PROJECT_NUMBER=${VERSION}; )'558 rule = '( cat ${SRC[0]} && echo PROJECT_NUMBER=${VERSION}'
559 rule += ' && echo OUTPUT_DIRECTORY=%s && echo HTML_OUTPUT=%s )'
559 rule += ' | doxygen - > /dev/null'560 rule += ' | doxygen - > /dev/null'
561 rule %= (os.path.abspath(out), 'api')
560 bld( name = 'doxygen', rule = rule,562 bld( name = 'doxygen', rule = rule,
561 source = 'doc/web.cfg',563 source = ['doc/web.cfg']
562 target = '../doc/web/html/index.html',564 + bld.path.find_dir('src').ant_glob('**/*.h'),
563 cwd = 'doc')565 target = bld.path.find_or_declare('api/index.html'),
564 bld.install_files( '${DATAROOTDIR}' + '/doc/libaubio-doc',566 cwd = bld.path.find_dir('doc'))
565 bld.path.ant_glob('doc/web/html/**'),567 # evaluate nodes lazily to prevent build directory traversal warnings
566 cwd = bld.path.find_dir ('doc/web'),568 bld.install_files('${DATAROOTDIR}/doc/libaubio-doc/api',
567 relative_trick = True)569 bld.path.find_or_declare('api').ant_glob('**/*',
570 generator=True), cwd=bld.path.find_or_declare('api'),
571 relative_trick=True)
568 572
569def sphinx(bld):573def sphinx(bld):
570 # build documentation from source files using sphinx-build note: build in574 # build documentation from source files using sphinx-build
571 # ../doc/_build/html, otherwise waf wont install unsigned files575 try:
572 if bld.env['SPHINX']:576 import aubio
577 has_aubio = True
578 except ImportError:
579 from waflib import Logs
580 Logs.pprint('YELLOW', "Sphinx manual: install aubio first")
581 has_aubio = False
582 if bld.env['SPHINX'] and has_aubio:
573 bld.env.VERSION = VERSION583 bld.env.VERSION = VERSION
574 bld( name = 'sphinx',584 rule = '${SPHINX} -b html -D release=${VERSION}' \
575 rule = '${SPHINX} -b html -D release=${VERSION}' \585 ' -D version=${VERSION} -W -a -q' \
576 ' -D version=${VERSION} -a -q' \586 ' -d %s ' % os.path.join(os.path.abspath(out), 'doctrees')
577 ' `dirname ${SRC}` `dirname ${TGT}`',587 rule += ' . %s' % os.path.join(os.path.abspath(out), 'manual')
578 source = 'doc/conf.py',588 bld( name = 'sphinx', rule = rule,
579 target = '../doc/_build/html/index.html')589 cwd = bld.path.find_dir('doc'),
580 bld.install_files( '${DATAROOTDIR}' + '/doc/libaubio-doc/sphinx',590 source = bld.path.find_dir('doc').ant_glob('*.rst'),
581 bld.path.ant_glob('doc/_build/html/**'),591 target = bld.path.find_or_declare('manual/index.html'))
582 cwd = bld.path.find_dir('doc/_build/html'),592 # evaluate nodes lazily to prevent build directory traversal warnings
583 relative_trick = True)593 bld.install_files('${DATAROOTDIR}/doc/libaubio-doc/manual',
594 bld.path.find_or_declare('manual').ant_glob('**/*',
595 generator=True), cwd=bld.path.find_or_declare('manual'),
596 relative_trick=True)
584 597
585# register the previous rules as build rules598# register the previous rules as build rules
586from waflib.Build import BuildContext599from waflib.Build import BuildContext

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t