Changes in / [868c6b8:dfe6ab6]
- Files:
-
- 2 added
- 4 deleted
- 70 edited
Legend:
- Unmodified
- Added
- Removed
-
.appveyor.yml
r868c6b8 rdfe6ab6 76 76 test_script: 77 77 - "python python\\demos\\demo_create_test_sounds.py" 78 - " nose2--verbose"78 - "pytest --verbose" -
.circleci/config.yml
r868c6b8 rdfe6ab6 20 20 pip install --user dist/aubio*.whl 21 21 22 test- nose2: &test-nose222 test-pytest: &test-pytest 23 23 name: Test python wheel 24 24 command: | 25 25 make create_test_sounds 26 PATH=/home/circleci/.local/bin:$PATH nose2-v26 PATH=/home/circleci/.local/bin:$PATH pytest -v 27 27 28 test- nose2-nosounds: &test-nose2-nosounds28 test-pytest-nosounds: &test-pytest-nosounds 29 29 name: Test python wheel 30 30 command: | 31 PATH=/home/circleci/.local/bin:$PATH nose2-v31 PATH=/home/circleci/.local/bin:$PATH pytest -v 32 32 33 33 uninstall-wheel: &uninstall-wheel … … 48 48 - run: *build-wheel 49 49 - run: *install-wheel 50 - run: *test- nose250 - run: *test-pytest 51 51 - run: *uninstall-wheel 52 52 - store_artifacts: … … 62 62 - run: *build-wheel 63 63 - run: *install-wheel 64 - run: *test- nose264 - run: *test-pytest 65 65 - run: *uninstall-wheel 66 66 - store_artifacts: … … 76 76 - run: *build-wheel 77 77 - run: *install-wheel 78 - run: *test- nose278 - run: *test-pytest 79 79 - run: *uninstall-wheel 80 80 - store_artifacts: … … 89 89 - run: *build-wheel 90 90 - run: *install-wheel 91 - run: *test- nose2-nosounds91 - run: *test-pytest-nosounds 92 92 - run: *uninstall-wheel 93 93 - store_artifacts: -
.travis.yml
r868c6b8 rdfe6ab6 3 3 matrix: 4 4 include: 5 - python: 3.5 6 os: linux 7 compiler: gcc 8 - python: 3.4 9 os: linux 10 compiler: gcc 11 - python: 2.7 5 - python: 3.6 12 6 os: linux 13 7 compiler: gcc … … 15 9 os: linux 16 10 compiler: gcc 17 env: CFLAGS="-Os" WAFOPTS="--disable-samplerate --disable-sndfile" 18 - python: 3.4 11 env: WAFOPTS="--build-type=debug" 12 - python: 2.7 13 os: linux 14 compiler: gcc 15 - python: "pypy3.5" 16 os: linux 17 compiler: gcc 18 env: CFLAGS="-Os" WAFOPTS="--disable-avcodec" 19 - python: 3.6 20 os: linux 21 compiler: gcc 22 env: CFLAGS="-Os" WAFOPTS="--disable-samplerate" 23 - python: 3.5 19 24 os: linux 20 25 compiler: gcc … … 86 91 - which pip 87 92 - pip --version 93 - pip install coverage 88 94 89 95 script: -
ChangeLog
r868c6b8 rdfe6ab6 1 2018-12-19 Paul Brossier <piem@aubio.org> 2 3 [ Overview ] 4 5 * VERSION: bump to 0.4.9 6 * library: improve stability, fixing potential crashes and memory leaks on 7 invalid arguments; improve library messages and reporting of system errors 8 * tests/: major clean-up, check return codes, increase code coverage 9 * python/tests/: switch to pytest (closes gh-163), check emitted warnings 10 * python/: add pages to manual with brief descriptions of classes 11 12 [ Fixes ] 13 14 * security: improve arguments validation in new_aubio_filterbank (prevent 15 possible null-pointer dereference on invalid n_filters, CVE-2018-19801), 16 new_aubio-tempo (prevent possible buffer overflow, CVE-2018-19800), and 17 new_aubio_onset (prevent null-pointer dereference, CVE-2018-19802). Thanks 18 to Guoxiang Niu (@niugx), from the EaglEye Team for reporting these issues. 19 * tempo: fix delay_ms methods 20 * filterbank: fix aubio_filterbank_get_power (thanks to @romanbsd who 21 also noticed this issue) 22 * dct: creation fail on negative sizes or invalid accelerate radix, 23 fix typo in error and warning messages, prevent possible memory leak 24 * pitch: prevent null pointer dereference in yinfast, comment out unused 25 functions in mcomb and yin, prevent possible leak in specacf 26 * mfcc: always use dct module, strengthen input validation, change 27 get_{scale,power} to return smpl_t 28 * specdesc: improve error message 29 * notes: prevent null pointer dereference 30 * hist: add validation for size argument, prevent possible leak 31 * awhitening: use shortest length available (closes gh-216) 32 * io: add macros to display system errors, add helpers to validate input 33 arguments of source and sink methods, always clean-up after failure 34 * source: validate input sizes to prevent invalid reads 35 * apple_audio: use native format conversions in source and sink, prevent 36 possible apple_audio crash on empty string, get_duration returns 0 on failure 37 * ffmpeg/avcodec: prevent deprecation warnings, read after close, and skipped 38 samples warnings, improve warning messages, only show a warning when 39 swr_convert failed, prevent possible memory leak when closing swr context 40 * wavwrite: copy to all channels if needed, check fseek and fwrite return 41 values, call fflush in open to return failure on full disk-system 42 * source_sndfile: fix reading sizes when resampling, set error message when 43 reading after close 44 * aubio_priv.h: include blas first (see gh-225), add STRERROR macros 45 46 [ Python ] 47 48 * documentation: add pages to manual, add minimal docstrings for fft, 49 digital_filter, and generated objects, improve specdesc documentation 50 * filterbank: add get_norm/power documentation 51 * source: take a copy of the last frame before resizing it, raise an 52 exception when read failed, fix compilation warning 53 * fixes: remove unneeded check convert with PyFloat_FromDouble or 54 PyFloat_FromDouble, check if sink, digital_filter, were created before 55 deleting 56 57 [ Tests ] 58 59 * python/tests/: switch to pytest (slightly slower than nose2 but better at 60 capturing warnings and parametrization), improve coding style and coverage. 61 Tests should now be run with `pytest`. 62 * tests/: Each test program in C must now return 0, otherwise the test will 63 fail. Examples have been modified to run themselves on a test audio file, 64 but can still be run with arguments. Tests for `source` and `sink` have been 65 factorised, and some code cleaning. A python script is used to create a 66 test sound file. Tested on linux, macos, and windows, improvements to 67 test-mfcc (closes gh-219). 68 69 [ Build system ] 70 71 * waf: upgrade to 2.0.14, check the return code of each test program, 72 update rules to build manual and api documentation into build/, check 73 for errno.h 74 * osx: use -Os in scripts/build_apple_frameworks 75 * Makefile: improve coverage reports 76 * appveyor, travis, circleci: switch to pytest, set one travis config to use 77 sndfile only 78 * travis: add py3.6, drop py3.4, use py3.5 to test debug mode 79 * azure: add basic configuration 80 1 81 2018-11-21 Paul Brossier <piem@aubio.org> 2 82 -
MANIFEST.in
r868c6b8 rdfe6ab6 7 7 include Makefile wscript */wscript_build 8 8 include aubio.pc.in 9 include nose2.cfg10 9 include requirements.txt 11 10 include src/*.c src/*.h … … 16 15 recursive-include python *.py 17 16 include python/README.md 18 include python/tests/run_all_tests19 17 include python/tests/eval_pitch 20 18 include python/tests/*.expected -
Makefile
r868c6b8 rdfe6ab6 36 36 MANDIR?=$(DATAROOTDIR)/man 37 37 38 # default nose2command39 NOSE2?=nose2 -N 4--verbose38 # default python test command 39 PYTEST?=pytest --verbose 40 40 41 41 SOX=sox … … 141 141 test_python: local_dylib 142 142 # run test with installed package 143 # ./python/tests/run_all_tests --verbose 144 # run with nose2, multiple processes 145 $(NOSE2) 143 $(PYTEST) 146 144 147 145 clean_python: … … 254 252 pip install -v -e . 255 253 # run tests, with python coverage 256 coverage run `which nose2`254 coverage run `which pytest` 257 255 # capture coverage again 258 256 lcov $(LCOVOPTS) --capture --no-external --directory . \ -
README.md
r868c6b8 rdfe6ab6 4 4 [![Travis build status](https://travis-ci.org/aubio/aubio.svg?branch=master)](https://travis-ci.org/aubio/aubio "Travis build status") 5 5 [![Appveyor build status](https://img.shields.io/appveyor/ci/piem/aubio/master.svg)](https://ci.appveyor.com/project/piem/aubio "Appveyor build status") 6 [![Landscape code health](https://landscape.io/github/aubio/aubio/master/landscape.svg?style=flat)](https://landscape.io/github/aubio/aubio/master "Landscape code health")7 6 [![Commits since last release](https://img.shields.io/github/commits-since/aubio/aubio/latest.svg)](https://github.com/aubio/aubio "Commits since last release") 8 7 -
VERSION
r868c6b8 rdfe6ab6 1 1 AUBIO_MAJOR_VERSION=0 2 AUBIO_MINOR_VERSION= 43 AUBIO_PATCH_VERSION= 92 AUBIO_MINOR_VERSION=5 3 AUBIO_PATCH_VERSION=0 4 4 AUBIO_VERSION_STATUS='~alpha' 5 5 LIBAUBIO_LT_CUR=5 -
azure-pipelines.yml
r868c6b8 rdfe6ab6 4 4 - job: linux 5 5 pool: 6 vmImage: ' Ubuntu16.04'6 vmImage: 'ubuntu-16.04' 7 7 steps: 8 8 - script: | … … 14 14 - job: windows 15 15 pool: 16 vmI Mage: 'VS2017-Win2016'16 vmImage: 'vs2017-win2016' 17 17 steps: 18 18 - script: | … … 25 25 - job: macos 26 26 pool: 27 vmI Mage: macOS-10.1327 vmImage: 'macos-10.13' 28 28 steps: 29 29 - script: | -
doc/python_module.rst
r868c6b8 rdfe6ab6 90 90 ------------ 91 91 92 A number of Python tests are provided in the `python tests`_. To run them,93 install `nose2`_ and run the script ``python/tests/run_all_tests``:92 A number of Python tests are provided in the `python/tests`_ folder. To run 93 them, install `pytest`_ and run it from the aubio source directory: 94 94 95 95 .. code-block:: console 96 96 97 $ pip install nose2 98 $ ./python/tests/run_all_tests 97 $ pip install pytest 98 $ 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.py 101 .. _python tests: https://github.com/aubio/aubio/blob/master/python/tests 102 .. _nose2: https://github.com/nose-devs/nose2 102 .. _python/tests: https://github.com/aubio/aubio/blob/master/python/tests 103 .. _pytest: https://pytest.org -
doc/statuslinks.rst
r868c6b8 rdfe6ab6 10 10 :alt: Appveyor build status 11 11 12 .. image:: https://landscape.io/github/aubio/aubio/master/landscape.svg?style=flat13 :target: https://landscape.io/github/aubio/aubio/master14 :alt: Landscape code health15 16 12 .. image:: https://readthedocs.org/projects/aubio/badge/?version=latest 17 13 :target: https://aubio.readthedocs.io/en/latest/?badge=latest -
examples/utils.c
r868c6b8 rdfe6ab6 185 185 186 186 del_aubio_source (this_source); 187 del_aubio_sink (this_sink); 187 if (this_sink) 188 del_aubio_sink (this_sink); 188 189 189 190 } -
python/demos/demo_wav2midi.py
r868c6b8 rdfe6ab6 64 64 if new_note[2] > 0: 65 65 track.append(Message('note_off', note=int(new_note[2]), 66 velocity=127, time= 0)66 velocity=127, time=delta) 67 67 ) 68 68 track.append(Message('note_on', -
python/ext/py-filter.c
r868c6b8 rdfe6ab6 110 110 { 111 111 Py_XDECREF(self->out); 112 del_aubio_filter (self->o); 112 if (self->o) 113 del_aubio_filter (self->o); 113 114 Py_TYPE(self)->tp_free ((PyObject *) self); 114 115 } -
python/ext/py-sink.c
r868c6b8 rdfe6ab6 151 151 Py_sink_del (Py_sink *self, PyObject *unused) 152 152 { 153 del_aubio_sink(self->o); 154 free(self->mwrite_data.data); 153 if (self->o) { 154 del_aubio_sink(self->o); 155 free(self->mwrite_data.data); 156 } 155 157 if (self->uri) { 156 158 free(self->uri); -
python/ext/py-source.c
r868c6b8 rdfe6ab6 437 437 aubio_source_do (self->o, &(self->c_read_to), &read); 438 438 439 if (PyErr_Occurred() != NULL) { 440 return NULL; 441 } 442 439 443 outputs = PyTuple_New(2); 440 444 PyTuple_SetItem( outputs, 0, self->read_to ); … … 457 461 /* compute _do function */ 458 462 aubio_source_do_multi (self->o, &(self->c_mread_to), &read); 463 464 if (PyErr_Occurred() != NULL) { 465 return NULL; 466 } 459 467 460 468 outputs = PyTuple_New(2); … … 574 582 } else if (PyLong_AsLong(size) > 0) { 575 583 // short read, return a shorter array 576 PyArrayObject *shortread = (PyArrayObject*)PyTuple_GetItem(done, 0); 584 PyObject *vec = PyTuple_GetItem(done, 0); 585 // take a copy to prevent resizing internal arrays 586 PyArrayObject *shortread = (PyArrayObject*)PyArray_FROM_OTF(vec, 587 NPY_NOTYPE, NPY_ARRAY_ENSURECOPY); 577 588 PyArray_Dims newdims; 578 589 PyObject *reshaped; … … 587 598 reshaped = PyArray_Newshape(shortread, &newdims, NPY_CORDER); 588 599 Py_DECREF(shortread); 600 Py_DECREF(vec); 589 601 return reshaped; 590 602 } else { -
python/lib/moresetuptools.py
r868c6b8 rdfe6ab6 69 69 for define_macro in ['HAVE_STDLIB_H', 'HAVE_STDIO_H', 70 70 'HAVE_MATH_H', 'HAVE_STRING_H', 71 'HAVE_ C99_VARARGS_MACROS',71 'HAVE_ERRNO_H', 'HAVE_C99_VARARGS_MACROS', 72 72 'HAVE_LIMITS_H', 'HAVE_STDARG_H', 73 73 'HAVE_MEMCPY_HACKS']: -
python/tests/test_aubio.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 from numpy.testing import TestCase 5 4 … … 16 15 17 16 if __name__ == '__main__': 17 from unittest import main 18 18 main() 19 -
python/tests/test_aubio_cmd.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from numpy.testing import TestCase 3 4 import aubio.cmd 4 from nose2 import main5 from numpy.testing import TestCase6 5 7 6 class aubio_cmd(TestCase): … … 32 31 33 32 if __name__ == '__main__': 33 from unittest import main 34 34 main() -
python/tests/test_aubio_cut.py
r868c6b8 rdfe6ab6 2 2 3 3 import aubio.cut 4 from nose2 import main5 4 from numpy.testing import TestCase 6 5 … … 14 13 15 14 if __name__ == '__main__': 15 from unittest import main 16 16 main() -
python/tests/test_cvec.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 import numpy as np 5 4 from numpy.testing import TestCase, assert_equal … … 142 141 143 142 if __name__ == '__main__': 143 from unittest import main 144 144 main() -
python/tests/test_dct.py
r868c6b8 rdfe6ab6 67 67 except AssertionError: 68 68 self.skipTest('creating aubio.dct with size %d did not fail' % size) 69 70 if __name__ == '__main__': 71 from unittest import main 72 main() -
python/tests/test_fft.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 from numpy.testing import TestCase 5 4 from numpy.testing import assert_equal, assert_almost_equal … … 213 212 214 213 if __name__ == '__main__': 214 from unittest import main 215 215 main() -
python/tests/test_filter.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 from numpy.testing import TestCase, assert_equal, assert_almost_equal 5 4 from aubio import fvec, digital_filter 6 from .utils import array_from_text_file5 from utils import array_from_text_file 7 6 8 7 class aubio_filter_test_case(TestCase): … … 95 94 96 95 if __name__ == '__main__': 96 from unittest import main 97 97 main() -
python/tests/test_filterbank.py
r868c6b8 rdfe6ab6 5 5 6 6 from aubio import cvec, filterbank, float_type 7 from .utils import array_from_text_file7 from utils import array_from_text_file 8 8 9 9 class aubio_filterbank_test_case(TestCase): … … 88 88 89 89 if __name__ == '__main__': 90 import nose291 nose2.main()90 from unittest import main 91 main() -
python/tests/test_filterbank_mel.py
r868c6b8 rdfe6ab6 3 3 import numpy as np 4 4 from numpy.testing import TestCase, assert_equal, assert_almost_equal 5 from _tools import assert_warns 5 6 6 7 from aubio import fvec, cvec, filterbank, float_type 7 8 import warnings9 warnings.filterwarnings('ignore', category=UserWarning, append=True)10 8 11 9 class aubio_filterbank_mel_test_case(TestCase): … … 76 74 freq_list = [0, samplerate//4, samplerate // 2 + 1] 77 75 f = filterbank(len(freq_list)-2, 1024) 78 # TODO add assert_warns79 f.set_triangle_bands(fvec(freq_list), samplerate)76 with assert_warns(UserWarning): 77 f.set_triangle_bands(fvec(freq_list), samplerate) 80 78 81 79 def test_triangle_freqs_with_not_enough_filters(self): … … 84 82 freq_list = [0, 100, 1000, 4000, 8000, 10000] 85 83 f = filterbank(len(freq_list)-3, 1024) 86 # TODO add assert_warns87 f.set_triangle_bands(fvec(freq_list), samplerate)84 with assert_warns(UserWarning): 85 f.set_triangle_bands(fvec(freq_list), samplerate) 88 86 89 87 def test_triangle_freqs_with_too_many_filters(self): … … 92 90 freq_list = [0, 100, 1000, 4000, 8000, 10000] 93 91 f = filterbank(len(freq_list)-1, 1024) 94 # TODO add assert_warns95 f.set_triangle_bands(fvec(freq_list), samplerate)92 with assert_warns(UserWarning): 93 f.set_triangle_bands(fvec(freq_list), samplerate) 96 94 97 95 def test_triangle_freqs_with_double_value(self): … … 100 98 freq_list = [0, 100, 1000, 4000, 4000, 4000, 10000] 101 99 f = filterbank(len(freq_list)-2, 1024) 102 # TODO add assert_warns103 f.set_triangle_bands(fvec(freq_list), samplerate)100 with assert_warns(UserWarning): 101 f.set_triangle_bands(fvec(freq_list), samplerate) 104 102 105 103 def test_triangle_freqs_with_triple(self): … … 108 106 freq_list = [0, 100, 1000, 4000, 4000, 4000, 10000] 109 107 f = filterbank(len(freq_list)-2, 1024) 110 # TODO add assert_warns 111 f.set_triangle_bands(fvec(freq_list), samplerate) 108 with assert_warns(UserWarning): 109 f.set_triangle_bands(fvec(freq_list), samplerate) 110 112 111 113 112 def test_triangle_freqs_without_norm(self): … … 169 168 170 169 if __name__ == '__main__': 171 import nose2172 nose2.main()170 from unittest import main 171 main() -
python/tests/test_fvec.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 import numpy as np 5 4 from numpy.testing import TestCase, assert_equal, assert_almost_equal … … 149 148 150 149 if __name__ == '__main__': 150 from unittest import main 151 151 main() -
python/tests/test_fvec_shift.py
r868c6b8 rdfe6ab6 31 31 self.run_shift_ishift(7) 32 32 33 from unittest import main34 33 if __name__ == '__main__': 34 from unittest import main 35 35 main() -
python/tests/test_hztomel.py
r868c6b8 rdfe6ab6 4 4 from numpy.testing import TestCase 5 5 from numpy.testing import assert_equal, assert_almost_equal 6 from _tools import assert_warns 6 7 import numpy as np 7 8 import aubio … … 38 39 39 40 def test_meltohz_negative(self): 40 # TODO add assert_warns41 assert_equal(meltohz(-1), 0)41 with assert_warns(UserWarning): 42 assert_equal(meltohz(-1), 0) 42 43 43 44 def test_hztomel_negative(self): 44 # TODO add assert_warns45 assert_equal(hztomel(-1), 0)45 with assert_warns(UserWarning): 46 assert_equal(hztomel(-1), 0) 46 47 47 48 … … 58 59 59 60 def test_meltohz_negative(self): 60 # TODO add assert_warns61 assert_equal(meltohz(-1, htk=True), 0)61 with assert_warns(UserWarning): 62 assert_equal(meltohz(-1, htk=True), 0) 62 63 assert_almost_equal(meltohz(2000, htk=True), 3428.7, decimal=1) 63 64 assert_almost_equal(meltohz(1000, htk=True), 1000., decimal=1) 64 65 65 66 def test_hztomel_negative(self): 66 # TODO add assert_warns 67 assert_equal(hztomel(-1, htk=True), 0) 67 with assert_warns(UserWarning): 68 assert_equal(meltohz(-1, htk=True), 0) 69 with assert_warns(UserWarning): 70 assert_equal(hztomel(-1, htk=True), 0) 68 71 assert_almost_equal(hztomel(1000, htk=True), 1000., decimal=1) 69 72 -
python/tests/test_mathutils.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 from numpy.testing import TestCase, assert_equal 5 4 from numpy import array, arange, isnan, isinf … … 102 101 103 102 if __name__ == '__main__': 103 from unittest import main 104 104 main() -
python/tests/test_mfcc.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from nose2 import main 4 from nose2.tools import params 3 from _tools import parametrize, assert_raises 5 4 from numpy import random, count_nonzero 6 5 from numpy.testing import TestCase … … 16 15 new_deflts = [1024, 40, 13, 44100] 17 16 18 class aubio_mfcc(TestCase):17 class Test_aubio_mfcc(object): 19 18 20 def setUp(self): 21 self.o = mfcc() 19 members_args = 'name' 22 20 23 def test_default_creation(self): 24 pass 25 26 def test_delete(self): 27 del self.o 28 29 @params(*new_params) 21 @parametrize(members_args, new_params) 30 22 def test_read_only_member(self, name): 31 o = self.o32 with self.assertRaises((TypeError, AttributeError)):23 o = mfcc() 24 with assert_raises((TypeError, AttributeError)): 33 25 setattr(o, name, 0) 34 26 35 @param s(*zip(new_params, new_deflts))27 @parametrize('name, expected', zip(new_params, new_deflts)) 36 28 def test_default_param(self, name, expected): 37 29 """ test mfcc.{:s} = {:d} """.format(name, expected) 38 o = self.o39 self.assertEqual( getattr(o, name), expected)30 o = mfcc() 31 assert getattr(o, name) == expected 40 32 41 33 class aubio_mfcc_wrong_params(TestCase): … … 83 75 84 76 85 class aubio_mfcc_all_parameters(TestCase):77 class Test_aubio_mfcc_all_parameters(object): 86 78 87 @params(79 run_values = [ 88 80 (2048, 40, 13, 44100), 89 81 (1024, 40, 13, 44100), … … 101 93 (1024, 40, 40, 44100), 102 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 99 def test_run_with_params(self, buf_size, n_filters, n_coeffs, samplerate): 105 100 " check mfcc can run with reasonable parameters " … … 149 144 150 145 if __name__ == '__main__': 151 main() 146 from _tools import run_module_suite 147 run_module_suite() -
python/tests/test_midi2note.py
r868c6b8 rdfe6ab6 3 3 4 4 from aubio import midi2note 5 from nose2.tools import params 6 import unittest 5 from _tools import parametrize, assert_raises 7 6 8 7 list_of_known_midis = ( … … 16 15 ) 17 16 18 class midi2note_good_values(unittest.TestCase):17 class Test_midi2note_good_values(object): 19 18 20 @param s(*list_of_known_midis)19 @parametrize('midi, note', list_of_known_midis) 21 20 def test_midi2note_known_values(self, midi, note): 22 21 " known values are correctly converted " 23 self.assertEqual ( midi2note(midi), note)22 assert midi2note(midi) == (note) 24 23 25 class midi2note_wrong_values(unittest.TestCase):24 class Test_midi2note_wrong_values(object): 26 25 27 26 def test_midi2note_negative_value(self): 28 27 " fails when passed a negative value " 29 self.assertRaises(ValueError, midi2note, -2)28 assert_raises(ValueError, midi2note, -2) 30 29 31 30 def test_midi2note_large(self): 32 31 " fails when passed a value greater than 127 " 33 self.assertRaises(ValueError, midi2note, 128)32 assert_raises(ValueError, midi2note, 128) 34 33 35 34 def test_midi2note_floating_value(self): 36 35 " fails when passed a floating point " 37 self.assertRaises(TypeError, midi2note, 69.2)36 assert_raises(TypeError, midi2note, 69.2) 38 37 39 38 def test_midi2note_character_value(self): 40 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 43 42 if __name__ == '__main__': 44 import nose245 nose2.main()43 from _tools import run_module_suite 44 run_module_suite() -
python/tests/test_musicutils.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 import numpy as np 5 4 from numpy.testing import TestCase 6 from numpy.testing .utilsimport assert_equal, assert_almost_equal5 from numpy.testing import assert_equal, assert_almost_equal 7 6 from aubio import window, level_lin, db_spl, silence_detection, level_detection 8 7 from aubio import fvec, float_type … … 86 85 87 86 if __name__ == '__main__': 87 from unittest import main 88 88 main() -
python/tests/test_note2midi.py
r868c6b8 rdfe6ab6 5 5 6 6 from aubio import note2midi, freq2note, note2freq, float_type 7 from n ose2.tools import params8 import unittest7 from numpy.testing import TestCase 8 from _tools import parametrize, assert_raises, skipTest 9 9 10 10 list_of_known_notes = ( … … 45 45 ) 46 46 47 class note2midi_good_values(unittest.TestCase):47 class Test_note2midi_good_values(object): 48 48 49 @param s(*list_of_known_notes)49 @parametrize('note, midi', list_of_known_notes) 50 50 def test_note2midi_known_values(self, note, midi): 51 51 " known values are correctly converted " 52 self.assertEqual ( note2midi(note), midi )52 assert note2midi(note) == midi 53 53 54 @param s(*list_of_known_notes_with_unicode_issues)54 @parametrize('note, midi', list_of_known_notes_with_unicode_issues) 55 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 57 try: 58 self.assertEqual ( note2midi(note), midi )58 assert note2midi(note) == midi 59 59 except UnicodeEncodeError as e: 60 # platforms with decoding failures include: 61 # - osx: python <= 2.7.10 62 # - win: python <= 2.7.12 60 63 import sys 61 str fmt = "len(u'\\U0001D12A') != 1, excpected decoding failure | {:s} | {:s} {:s}"62 str res = strfmt.format(e, sys.platform, sys.version)63 # happens with: darwin 2.7.10, windows 2.7.1264 strmsg = "len(u'\\U0001D12A') != 1, expected decoding failure" 65 strmsg += " | upgrade to Python 3 to fix" 66 strmsg += " | {:s} | {:s} {:s}" 64 67 if len('\U0001D12A') != 1 and sys.version[0] == '2': 65 s elf.skipTest(strres + " | upgrade to Python 3 to fix")68 skipTest(strmsg.format(repr(e), sys.platform, sys.version)) 66 69 else: 67 70 raise 68 71 69 class note2midi_wrong_values( unittest.TestCase):72 class note2midi_wrong_values(TestCase): 70 73 71 74 def test_note2midi_missing_octave(self): … … 105 108 self.assertRaises(ValueError, note2midi, 'CB+-3') 106 109 107 @params(*list_of_unknown_notes) 110 class Test_note2midi_unknown_values(object): 111 112 @parametrize('note', list_of_unknown_notes) 108 113 def test_note2midi_unknown_values(self, note): 109 114 " unknown values throw out an error " 110 self.assertRaises(ValueError, note2midi, note)115 assert_raises(ValueError, note2midi, note) 111 116 112 class freq2note_simple_test( unittest.TestCase):117 class freq2note_simple_test(TestCase): 113 118 114 119 def test_freq2note_above(self): … … 120 125 self.assertEqual("A4", freq2note(439)) 121 126 122 class note2freq_simple_test( unittest.TestCase):127 class note2freq_simple_test(TestCase): 123 128 124 129 def test_note2freq(self): … … 134 139 135 140 if __name__ == '__main__': 136 import nose2137 nose2.main()141 from _tools import run_module_suite 142 run_module_suite() -
python/tests/test_notes.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 from numpy.testing import TestCase, assert_equal, assert_almost_equal 5 from aubio import notes 4 from aubio import notes, source 5 import numpy as np 6 from utils import list_all_sounds 7 8 list_of_sounds = list_all_sounds('sounds') 6 9 7 10 AUBIO_DEFAULT_NOTES_SILENCE = -70. … … 53 56 self.o.set_release_drop(val) 54 57 55 from .utils import list_all_sounds56 list_of_sounds = list_all_sounds('sounds')57 58 58 class aubio_notes_sinewave(TestCase): 59 59 60 60 def analyze_file(self, filepath, samplerate=0): 61 from aubio import source62 import numpy as np63 61 win_s = 512 # fft size 64 62 hop_s = 256 # hop size … … 93 91 94 92 if __name__ == '__main__': 93 from unittest import main 95 94 main() -
python/tests/test_onset.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 from numpy.testing import TestCase, assert_equal, assert_almost_equal 5 4 from aubio import onset, fvec … … 117 116 118 117 if __name__ == '__main__': 118 from unittest import main 119 119 main() -
python/tests/test_phasevoc.py
r868c6b8 rdfe6ab6 2 2 3 3 from numpy.testing import TestCase, assert_equal, assert_array_less 4 from _tools import parametrize 4 5 from aubio import fvec, cvec, pvoc, float_type 5 from nose2 import main6 from nose2.tools import params7 6 import numpy as np 8 7 … … 19 18 return np.random.rand(hop_s).astype(float_type) * 2. - 1. 20 19 21 class aubio_pvoc_test_case(TestCase):20 class Test_aubio_pvoc_test_case(object): 22 21 """ pvoc object test case """ 23 22 … … 66 65 assert_equal ( t, 0.) 67 66 68 @params( 67 resynth_noise_args = "hop_s, ratio" 68 resynth_noise_values = [ 69 69 ( 256, 8), 70 70 ( 256, 4), … … 88 88 (8192, 4), 89 89 (8192, 2), 90 ) 90 ] 91 92 @parametrize(resynth_noise_args, resynth_noise_values) 91 93 def test_resynth_steps_noise(self, hop_s, ratio): 92 94 """ check the resynthesis of a random signal is correct """ … … 94 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 100 (44100, 256, 8, 441), 98 101 (44100, 256, 4, 1203), … … 109 112 (96000, 1024, 8, 47000), 110 113 (96000, 1024, 8, 20), 111 ) 114 ] 115 116 @parametrize(resynth_sine_args, resynth_sine_values) 112 117 def test_resynth_steps_sine(self, samplerate, hop_s, ratio, freq): 113 118 """ check the resynthesis of a sine is correct """ … … 200 205 201 206 if __name__ == '__main__': 207 from unittest import main 202 208 main() 203 -
python/tests/test_pitch.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import TestCase, main 4 from numpy.testing import assert_equal 3 from numpy.testing import TestCase, assert_equal 5 4 from numpy import sin, arange, mean, median, isnan, pi 6 5 from aubio import fvec, pitch, freqtomidi, float_type … … 117 116 for algo in pitch_algorithms: 118 117 for mode in signal_modes: 119 test_method = create_test (algo, mode)120 test_method.__name__ = 'test_pitch_%s_%d_%d_%dHz_sin_%.0f' % ( algo,118 _test_method = create_test (algo, mode) 119 _test_method.__name__ = 'test_pitch_%s_%d_%d_%dHz_sin_%.0f' % ( algo, 121 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 124 123 if __name__ == '__main__': 124 from unittest import main 125 125 main() -
python/tests/test_sink.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from nose2 import main4 from nose2.tools import params5 3 from numpy.testing import TestCase 6 4 from aubio import fvec, source, sink 7 from .utils import list_all_sounds, get_tmp_sink_path, del_tmp_sink_path 8 9 import warnings 10 warnings.filterwarnings('ignore', category=UserWarning, append=True) 5 from utils import list_all_sounds, get_tmp_sink_path, del_tmp_sink_path 6 from utils import parse_file_samplerate 7 from _tools import parametrize, skipTest, assert_raises, assert_warns 11 8 12 9 list_of_sounds = list_all_sounds('sounds') … … 24 21 all_params.append((hop_size, samplerate, soundfile)) 25 22 26 class aubio_sink_test_case(TestCase): 27 28 def setUp(self): 29 if not len(list_of_sounds): 30 self.skipTest('add some sound files in \'python/tests/sounds\'') 23 class Test_aubio_sink(object): 31 24 32 25 def test_wrong_filename(self): 33 with self.assertRaises(RuntimeError):26 with assert_raises(RuntimeError): 34 27 sink('') 35 28 36 29 def test_wrong_samplerate(self): 37 with self.assertRaises(RuntimeError):30 with assert_raises(RuntimeError): 38 31 sink(get_tmp_sink_path(), -1) 39 32 40 33 def test_wrong_samplerate_too_large(self): 41 with self.assertRaises(RuntimeError):34 with assert_raises(RuntimeError): 42 35 sink(get_tmp_sink_path(), 1536001, 2) 43 36 44 37 def test_wrong_channels(self): 45 with self.assertRaises(RuntimeError):38 with assert_raises(RuntimeError): 46 39 sink(get_tmp_sink_path(), 44100, -1) 47 40 48 41 def test_wrong_channels_too_large(self): 49 with self.assertRaises(RuntimeError):42 with assert_raises(RuntimeError): 50 43 sink(get_tmp_sink_path(), 44100, 202020) 51 44 … … 67 60 shutil.rmtree(tmpdir) 68 61 69 @param s(*all_params)62 @parametrize('hop_size, samplerate, path', all_params) 70 63 def test_read_and_write(self, hop_size, samplerate, path): 71 64 orig_samplerate = parse_file_samplerate(soundfile) 72 65 try: 73 f = source(path, samplerate, hop_size) 66 if orig_samplerate is not None and orig_samplerate < samplerate: 67 # upsampling should emit a warning 68 with assert_warns(UserWarning): 69 f = source(soundfile, samplerate, hop_size) 70 else: 71 f = source(soundfile, samplerate, hop_size) 74 72 except RuntimeError as e: 75 self.skipTest('failed opening with hop_s = {:d}, samplerate = {:d} ({:s})'.format(hop_size, samplerate, str(e))) 73 err_msg = '{:s} (hop_s = {:d}, samplerate = {:d})' 74 skipTest(err_msg.format(str(e), hop_size, samplerate)) 76 75 if samplerate == 0: samplerate = f.samplerate 77 76 sink_path = get_tmp_sink_path() … … 85 84 del_tmp_sink_path(sink_path) 86 85 87 @param s(*all_params)86 @parametrize('hop_size, samplerate, path', all_params) 88 87 def test_read_and_write_multi(self, hop_size, samplerate, path): 88 orig_samplerate = parse_file_samplerate(soundfile) 89 89 try: 90 f = source(path, samplerate, hop_size) 90 if orig_samplerate is not None and orig_samplerate < samplerate: 91 # upsampling should emit a warning 92 with assert_warns(UserWarning): 93 f = source(soundfile, samplerate, hop_size) 94 else: 95 f = source(soundfile, samplerate, hop_size) 91 96 except RuntimeError as e: 92 self.skipTest('failed opening with hop_s = {:d}, samplerate = {:d} ({:s})'.format(hop_size, samplerate, str(e))) 97 err_msg = '{:s} (hop_s = {:d}, samplerate = {:d})' 98 skipTest(err_msg.format(str(e), hop_size, samplerate)) 93 99 if samplerate == 0: samplerate = f.samplerate 94 100 sink_path = get_tmp_sink_path() … … 126 132 127 133 if __name__ == '__main__': 128 main() 134 from _tools import run_module_suite 135 run_module_suite() -
python/tests/test_slicing.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 from numpy.testing import TestCase, assert_equal 5 4 from aubio import slice_source_at_stamps 6 from .utils import count_files_in_directory, get_default_test_sound7 from .utils import count_samples_in_directory, count_samples_in_file5 from utils import count_files_in_directory, get_default_test_sound 6 from utils import count_samples_in_directory, count_samples_in_file 8 7 9 8 import tempfile … … 168 167 169 168 if __name__ == '__main__': 169 from unittest import main 170 170 main() -
python/tests/test_source.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from nose2 import main 4 from nose2.tools import params 3 5 4 from numpy.testing import TestCase, assert_equal 6 5 from aubio import source 7 from .utils import list_all_sounds8 9 import warnings10 warnings.filterwarnings('ignore', category=UserWarning, append=True) 6 from utils import list_all_sounds, parse_file_samplerate 7 import unittest 8 from _tools import assert_raises, assert_equal, assert_warns 9 from _tools import parametrize, skipTest 11 10 12 11 list_of_sounds = list_all_sounds('sounds') … … 14 13 hop_sizes = [512, 1024, 64] 15 14 16 path =None15 default_test_sound = len(list_of_sounds) and list_of_sounds[0] or None 17 16 18 17 all_params = [] … … 22 21 all_params.append((hop_size, samplerate, soundfile)) 23 22 24 25 class aubio_source_test_case_base(TestCase): 23 no_sounds_msg = "no test sounds, add some in 'python/tests/sounds/'!" 24 25 _debug = False 26 27 28 class Test_aubio_source_test_case(TestCase): 26 29 27 30 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 32 class aubio_source_test_case(aubio_source_test_case_base): 33 34 @params(*list_of_sounds) 35 def test_close_file(self, filename): 31 if not default_test_sound: 32 skipTest(no_sounds_msg) 33 34 def test_close_file(self): 36 35 samplerate = 0 # use native samplerate 37 36 hop_size = 256 38 f = source(filename, samplerate, hop_size) 39 f.close() 40 41 @params(*list_of_sounds) 42 def test_close_file_twice(self, filename): 37 f = source(default_test_sound, samplerate, hop_size) 38 f.close() 39 40 def test_close_file_twice(self): 43 41 samplerate = 0 # use native samplerate 44 42 hop_size = 256 45 f = source(filename, samplerate, hop_size) 46 f.close() 47 f.close() 48 49 class aubio_source_read_test_case(aubio_source_test_case_base): 43 f = source(default_test_sound, samplerate, hop_size) 44 f.close() 45 f.close() 46 47 def test_read_after_close(self): 48 samplerate = 0 # use native samplerate 49 hop_size = 256 50 f = source(default_test_sound, samplerate, hop_size) 51 read, frames = f() 52 f.close() 53 with assert_raises(RuntimeError): 54 read, frames = f() 55 with assert_raises(RuntimeError): 56 read, frames = f.do_multi() 57 58 59 class Test_aubio_source_read(object): 50 60 51 61 def read_from_source(self, f): … … 57 67 assert_equal(samples[read:], 0) 58 68 break 59 #result_str = "read {:.2f}s ({:d} frames in {:d} blocks at {:d}Hz) from {:s}" 60 #result_params = total_frames / float(f.samplerate), total_frames, total_frames//f.hop_size, f.samplerate, f.uri 61 #print (result_str.format(*result_params)) 69 if _debug: 70 result_str = "read {:.2f}s ({:d} frames" 71 result_str += " in {:d} blocks at {:d}Hz) from {:s}" 72 result_params = total_frames / float(f.samplerate), total_frames, \ 73 total_frames//f.hop_size, f.samplerate, f.uri 74 print (result_str.format(*result_params)) 62 75 return total_frames 63 76 64 @param s(*all_params)77 @parametrize('hop_size, samplerate, soundfile', all_params) 65 78 def test_samplerate_hopsize(self, hop_size, samplerate, soundfile): 79 orig_samplerate = parse_file_samplerate(soundfile) 66 80 try: 67 f = source(soundfile, samplerate, hop_size) 81 if orig_samplerate is not None and orig_samplerate < samplerate: 82 # upsampling should emit a warning 83 with assert_warns(UserWarning): 84 f = source(soundfile, samplerate, hop_size) 85 else: 86 f = source(soundfile, samplerate, hop_size) 68 87 except RuntimeError as e: 69 self.skipTest('failed opening with hop_s = {:d}, samplerate = {:d} ({:s})'.format(hop_size, samplerate, str(e))) 88 err_msg = 'failed opening with hop_s={:d}, samplerate={:d} ({:s})' 89 skipTest(err_msg.format(hop_size, samplerate, str(e))) 70 90 assert f.samplerate != 0 71 91 read_frames = self.read_from_source(f) 72 92 if 'f_' in soundfile and samplerate == 0: 73 93 import re 74 f = re.compile( '.*_\([0:9]*f\)_.*')94 f = re.compile(r'.*_\([0:9]*f\)_.*') 75 95 match_f = re.findall('([0-9]*)f_', soundfile) 76 96 if len(match_f) == 1: 77 97 expected_frames = int(match_f[0]) 78 self.assertEqual(expected_frames, read_frames)79 80 @param s(*list_of_sounds)98 assert_equal(expected_frames, read_frames) 99 100 @parametrize('p', list_of_sounds) 81 101 def test_samplerate_none(self, p): 82 102 f = source(p) … … 84 104 self.read_from_source(f) 85 105 86 @param s(*list_of_sounds)106 @parametrize('p', list_of_sounds) 87 107 def test_samplerate_0(self, p): 88 108 f = source(p, 0) … … 90 110 self.read_from_source(f) 91 111 92 @param s(*list_of_sounds)112 @parametrize('p', list_of_sounds) 93 113 def test_zero_hop_size(self, p): 94 114 f = source(p, 0, 0) … … 97 117 self.read_from_source(f) 98 118 99 @param s(*list_of_sounds)119 @parametrize('p', list_of_sounds) 100 120 def test_seek_to_half(self, p): 101 121 from random import randint … … 109 129 assert a == b + c 110 130 111 @param s(*list_of_sounds)131 @parametrize('p', list_of_sounds) 112 132 def test_duration(self, p): 113 133 total_frames = 0 … … 118 138 total_frames += read 119 139 if read < f.hop_size: break 120 self.assertEqual(duration, total_frames)121 122 123 class aubio_source_test_wrong_params(TestCase):140 assert_equal (duration, total_frames) 141 142 143 class Test_aubio_source_wrong_params(object): 124 144 125 145 def test_wrong_file(self): 126 with self.assertRaises(RuntimeError):146 with assert_raises(RuntimeError): 127 147 source('path_to/unexisting file.mp3') 128 148 129 class aubio_source_test_wrong_params_with_file(aubio_source_test_case_base): 149 @unittest.skipIf(default_test_sound is None, no_sounds_msg) 150 class Test_aubio_source_wrong_params_with_file(TestCase): 130 151 131 152 def test_wrong_samplerate(self): 132 with self.assertRaises(ValueError):133 source( self.default_test_sound, -1)153 with assert_raises(ValueError): 154 source(default_test_sound, -1) 134 155 135 156 def test_wrong_hop_size(self): 136 with self.assertRaises(ValueError):137 source( self.default_test_sound, 0, -1)157 with assert_raises(ValueError): 158 source(default_test_sound, 0, -1) 138 159 139 160 def test_wrong_channels(self): 140 with self.assertRaises(ValueError):141 source( self.default_test_sound, 0, 0, -1)161 with assert_raises(ValueError): 162 source(default_test_sound, 0, 0, -1) 142 163 143 164 def test_wrong_seek(self): 144 f = source( self.default_test_sound)145 with self.assertRaises(ValueError):165 f = source(default_test_sound) 166 with assert_raises(ValueError): 146 167 f.seek(-1) 147 168 148 169 def test_wrong_seek_too_large(self): 149 f = source( self.default_test_sound)170 f = source(default_test_sound) 150 171 try: 151 with self.assertRaises(ValueError):172 with assert_raises(ValueError): 152 173 f.seek(f.duration + f.samplerate * 10) 153 except AssertionError:154 s elf.skipTest('seeking after end of stream failed raising ValueError')155 156 class aubio_source_readmulti_test_case(aubio_source_read_test_case):174 except: 175 skipTest('seeking after end of stream failed raising ValueError') 176 177 class Test_aubio_source_readmulti(Test_aubio_source_read): 157 178 158 179 def read_from_source(self, f): … … 164 185 assert_equal(samples[:,read:], 0) 165 186 break 166 #result_str = "read {:.2f}s ({:d} frames in {:d} channels and {:d} blocks at {:d}Hz) from {:s}" 167 #result_params = total_frames / float(f.samplerate), total_frames, f.channels, int(total_frames/f.hop_size), f.samplerate, f.uri 168 #print (result_str.format(*result_params)) 187 if _debug: 188 result_str = "read {:.2f}s ({:d} frames in {:d} channels" 189 result_str += " and {:d} blocks at {:d}Hz) from {:s}" 190 result_params = total_frames / float(f.samplerate), total_frames, \ 191 f.channels, int(total_frames/f.hop_size), \ 192 f.samplerate, f.uri 193 print (result_str.format(*result_params)) 169 194 return total_frames 170 195 171 class aubio_source_with(aubio_source_test_case_base): 172 173 #@params(*list_of_sounds) 174 @params(*list_of_sounds) 196 class Test_aubio_source_with(object): 197 198 @parametrize('filename', list_of_sounds) 175 199 def test_read_from_mono(self, filename): 176 200 total_frames = 0 … … 186 210 187 211 if __name__ == '__main__': 188 main() 212 from _tools import run_module_suite 213 run_module_suite() -
python/tests/test_source_channels.py
r868c6b8 rdfe6ab6 9 9 import numpy as np 10 10 from numpy.testing import assert_equal 11 from .utils import get_tmp_sink_path11 from utils import get_tmp_sink_path 12 12 13 13 class aubio_source_test_case(unittest.TestCase): -
python/tests/test_specdesc.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 from numpy.testing import TestCase, assert_equal, assert_almost_equal 5 4 from numpy import random, arange, log, zeros … … 230 229 231 230 if __name__ == '__main__': 231 from unittest import main 232 232 main() -
python/tests/test_zero_crossing_rate.py
r868c6b8 rdfe6ab6 1 1 #! /usr/bin/env python 2 2 3 from unittest import main4 3 from numpy.testing import TestCase 5 4 from aubio import fvec, zero_crossing_rate … … 44 43 45 44 if __name__ == '__main__': 45 from unittest import main 46 46 main() -
python/tests/utils.py
r868c6b8 rdfe6ab6 2 2 3 3 import os 4 import re 4 5 import glob 5 6 import numpy as np … … 9 10 10 11 def array_from_text_file(filename, dtype = 'float'): 11 filename = os.path.join(os.path.dirname(__file__), filename) 12 with open(filename) as f: 13 lines = f.readlines() 14 return np.array([line.split() for line in lines], 15 dtype = dtype) 12 realpathname = os.path.join(os.path.dirname(__file__), filename) 13 return np.loadtxt(realpathname, dtype = dtype) 16 14 17 15 def list_all_sounds(rel_dir): … … 39 37 os.unlink(path) 40 38 except WindowsError as e: 41 print("deleting {:s} failed ({:s}), reopening".format(path, repr(e))) 42 with open(path, 'wb') as f: 43 f.close() 44 try: 45 os.unlink(path) 46 except WindowsError as f: 47 print("deleting {:s} failed ({:s}), aborting".format(path, repr(e))) 39 # removing the temporary directory sometimes fails on windows 40 import warnings 41 errmsg = "failed deleting temporary file {:s} ({:s})" 42 warnings.warn(UserWarning(errmsg.format(path, repr(e)))) 48 43 49 44 def array_from_yaml_file(filename): … … 84 79 total_files += 1 85 80 return total_files 81 82 def parse_file_samplerate(soundfile): 83 samplerate = None 84 # parse samplerate 85 re_sr = re.compile(r'/([0-9]{4,})Hz_.*') 86 match_samplerate = re_sr.findall(soundfile) 87 if match_samplerate: 88 samplerate = int(match_samplerate[0]) 89 else: 90 import warnings 91 warnings.warn(UserWarning("could not parse samplerate for {:s}" 92 .format(soundfile))) 93 return samplerate -
requirements.txt
r868c6b8 rdfe6ab6 1 1 numpy 2 nose2 2 pytest -
scripts/build_apple_frameworks
r868c6b8 rdfe6ab6 14 14 #VERSION+=+$(git log --pretty=format:"%h" -1) 15 15 16 CFLAGS="-Werror -O fast"16 CFLAGS="-Werror -Os" 17 17 WAFCONF="--disable-sndfile --disable-avcodec --disable-samplerate --enable-fat" # --disable-memcpy --disable-accelerate" 18 18 -
scripts/get_waf.sh
r868c6b8 rdfe6ab6 4 4 #set -x 5 5 6 WAFVERSION=2.0.1 36 WAFVERSION=2.0.14 7 7 WAFTARBALL=waf-$WAFVERSION.tar.bz2 8 8 WAFURL=https://waf.io/$WAFTARBALL -
setup.py
r868c6b8 rdfe6ab6 96 96 ], 97 97 }, 98 test_suite = 'nose2.collector.collector',99 extras_require = {100 'tests': ['numpy'],101 },102 98 ) -
src/aubio_priv.h
r868c6b8 rdfe6ab6 63 63 #endif 64 64 65 #ifdef HAVE_ERRNO_H 66 #include <errno.h> 67 #endif 68 65 69 #ifdef HAVE_LIMITS_H 66 70 #include <limits.h> // for CHAR_BIT, in C99 standard … … 71 75 #endif 72 76 73 #if defined(HAVE_ACCELERATE) 74 #define HAVE_ATLAS 1 75 #define HAVE_BLAS 1 76 #include <Accelerate/Accelerate.h> 77 #elif defined(HAVE_ATLAS_CBLAS_H) 78 #elif defined(HAVE_BLAS) 77 #if defined(HAVE_BLAS) // --enable-blas=true 78 // check which cblas header we found 79 79 #if defined(HAVE_ATLAS_CBLAS_H) 80 80 #define HAVE_ATLAS 1 … … 84 84 #elif defined(HAVE_CBLAS_H) 85 85 #include <cblas.h> 86 #endif 87 #endif 88 89 #ifdef HAVE_ACCELERATE 86 #elif !defined(HAVE_ACCELERATE) 87 #error "HAVE_BLAS was defined, but no blas header was found" 88 #endif /* end of cblas includes */ 89 #endif 90 91 #if defined(HAVE_ACCELERATE) 92 // include accelerate framework after blas 93 #define HAVE_ATLAS 1 94 #define HAVE_BLAS 1 90 95 #include <Accelerate/Accelerate.h> 96 91 97 #ifndef HAVE_AUBIO_DOUBLE 92 98 #define aubio_vDSP_mmov vDSP_mmov … … 325 331 #endif 326 332 333 #if !defined(_MSC_VER) 334 #define AUBIO_STRERROR(errno,buf,len) strerror_r(errno, buf, len) 335 #else 336 #define AUBIO_STRERROR(errno,buf,len) strerror_s(buf, len, errno) 337 #endif 338 339 #ifdef HAVE_C99_VARARGS_MACROS 340 #define AUBIO_STRERR(...) \ 341 char errorstr[256]; \ 342 AUBIO_STRERROR(errno, errorstr, sizeof(errorstr)); \ 343 AUBIO_ERR(__VA_ARGS__) 344 #else 345 #define AUBIO_STRERR(format, args...) \ 346 char errorstr[256]; \ 347 AUBIO_STRERROR(errno, errorstr, sizeof(errorstr)); \ 348 AUBIO_ERR(format, ##args) 349 #endif 350 327 351 /* handy shortcuts */ 328 352 #define DB2LIN(g) (POW(10.0,(g)*0.05f)) -
src/io/ioutils.c
r868c6b8 rdfe6ab6 20 20 21 21 #include "aubio_priv.h" 22 #include "fmat.h" 22 23 23 24 uint_t … … 51 52 } 52 53 return AUBIO_OK; 54 } 55 56 uint_t 57 aubio_source_validate_input_length(const char_t *kind, const char_t *path, 58 uint_t hop_size, uint_t read_data_length) 59 { 60 uint_t length = hop_size; 61 if (hop_size < read_data_length) { 62 AUBIO_WRN("%s: partial read from %s, trying to read %d frames, but" 63 " hop_size is %d\n", kind, path, read_data_length, hop_size); 64 } else if (hop_size > read_data_length) { 65 AUBIO_WRN("%s: partial read from %s, trying to read %d frames into" 66 " a buffer of length %d\n", kind, path, hop_size, read_data_length); 67 length = read_data_length; 68 } 69 return length; 70 } 71 72 uint_t 73 aubio_source_validate_input_channels(const char_t *kind, const char_t *path, 74 uint_t source_channels, uint_t read_data_height) 75 { 76 uint_t channels = source_channels; 77 if (read_data_height < source_channels) { 78 AUBIO_WRN("%s: partial read from %s, trying to read %d channels," 79 " but found output of height %d\n", kind, path, source_channels, 80 read_data_height); 81 channels = read_data_height; 82 } else if (read_data_height > source_channels) { 83 // do not show a warning when trying to read into more channels than 84 // the input source. 85 #if 0 86 AUBIO_WRN("%s: partial read from %s, trying to read %d channels," 87 " but found output of height %d\n", kind, path, source_channels, 88 read_data_height); 89 #endif 90 channels = source_channels; 91 } 92 return channels; 93 } 94 95 void 96 aubio_source_pad_output (fvec_t *read_data, uint_t source_read) 97 { 98 if (source_read < read_data->length) { 99 AUBIO_MEMSET(read_data->data + source_read, 0, 100 (read_data->length - source_read) * sizeof(smpl_t)); 101 } 102 } 103 104 void 105 aubio_source_pad_multi_output (fmat_t *read_data, 106 uint_t source_channels, uint_t source_read) { 107 uint_t i; 108 if (source_read < read_data->length) { 109 for (i = 0; i < read_data->height; i++) { 110 AUBIO_MEMSET(read_data->data[i] + source_read, 0, 111 (read_data->length - source_read) * sizeof(smpl_t)); 112 } 113 } 114 115 // destination matrix has more channels than the file 116 // copy channels from the source to extra output channels 117 if (read_data->height > source_channels) { 118 for (i = source_channels; i < read_data->height; i++) { 119 AUBIO_MEMCPY(read_data->data[i], read_data->data[i % source_channels], 120 sizeof(smpl_t) * read_data->length); 121 } 122 } 53 123 } 54 124 -
src/io/ioutils.h
r868c6b8 rdfe6ab6 54 54 uint_t channels); 55 55 56 /** validate length of input 56 /** validate length of source output 57 58 \param kind the object kind to report on 59 \param path the path to report on 60 \param hop_size number of frames to be read 61 \param read_data_length actual length of input 62 63 \return hop_size or the maximum number of frames that can be written 64 */ 65 uint_t 66 aubio_source_validate_input_length(const char_t *kind, const char_t *path, 67 uint_t hop_size, uint_t read_data_length); 68 69 /** validate height of source output 70 71 \param kind the object kind to report on 72 \param path the path to report on 73 \param source_channels maximum number of channels that can be written 74 \param read_data_height actual height of input 75 76 \return write_data_height or the maximum number of channels 77 */ 78 uint_t 79 aubio_source_validate_input_channels(const char_t *kind, const char_t *path, 80 uint_t source_channels, uint_t read_data_height); 81 82 /** pad end of source output vector with zeroes 83 84 \param read_data output vector to pad 85 \param source_read number of frames read 86 87 */ 88 void 89 aubio_source_pad_output (fvec_t *read_data, uint_t source_read); 90 91 /** pad end of source output matrix with zeroes 92 93 \param read_data output matrix to pad 94 \param source_channels number of channels in the source 95 \param source_read number of frames read 96 97 */ 98 void 99 aubio_source_pad_multi_output (fmat_t *read_data, uint_t source_channels, 100 uint_t source_read); 101 102 /** validate length of sink input 57 103 58 104 \param kind the object kind to report on 59 105 \param path the path to report on 60 106 \param max_size maximum number of frames that can be written 61 \param write_data_length actual length of input vector/matrix107 \param write_data_length actual length of input 62 108 \param write number of samples asked 63 109 … … 68 114 uint_t max_size, uint_t write_data_length, uint_t write); 69 115 70 /** validate height of input116 /** validate height of sink input 71 117 72 118 \param kind the object kind to report on 73 119 \param path the path to report on 74 \param max_sizemaximum number of channels that can be written120 \param sink_channels maximum number of channels that can be written 75 121 \param write_data_height actual height of input matrix 76 122 -
src/io/sink.c
r868c6b8 rdfe6ab6 136 136 137 137 void del_aubio_sink(aubio_sink_t * s) { 138 AUBIO_ASSERT(s);139 if (s ->s_del && s->sink)138 //AUBIO_ASSERT(s); 139 if (s && s->s_del && s->sink) 140 140 s->s_del((void *)s->sink); 141 141 AUBIO_FREE(s); -
src/io/sink_wavwrite.c
r868c6b8 rdfe6ab6 28 28 #include "io/sink_wavwrite.h" 29 29 #include "io/ioutils.h" 30 31 #include <errno.h>32 30 33 31 #define MAX_SIZE 4096 … … 163 161 unsigned char buf[5]; 164 162 uint_t byterate, blockalign; 163 size_t written = 0; 165 164 166 165 /* open output file */ 167 166 s->fid = fopen((const char *)s->path, "wb"); 168 167 if (!s->fid) { 169 AUBIO_ ERR("sink_wavwrite: could not open %s (%s)\n", s->path, strerror(errno));168 AUBIO_STRERR("sink_wavwrite: could not open %s (%s)\n", s->path, errorstr); 170 169 goto beach; 171 170 } 172 171 173 172 // ChunkID 174 fwrite("RIFF", 4, 1, s->fid);173 written += fwrite("RIFF", 4, 1, s->fid); 175 174 176 175 // ChunkSize (0 for now, actual size will be written in _close) 177 fwrite(write_little_endian(0, buf, 4), 4, 1, s->fid);176 written += fwrite(write_little_endian(0, buf, 4), 4, 1, s->fid); 178 177 179 178 // Format 180 fwrite("WAVE", 4, 1, s->fid);179 written += fwrite("WAVE", 4, 1, s->fid); 181 180 182 181 // Subchunk1ID 183 fwrite("fmt ", 4, 1, s->fid);182 written += fwrite("fmt ", 4, 1, s->fid); 184 183 185 184 // Subchunk1Size 186 fwrite(write_little_endian(16, buf, 4), 4, 1, s->fid);185 written += fwrite(write_little_endian(16, buf, 4), 4, 1, s->fid); 187 186 188 187 // AudioFormat 189 fwrite(write_little_endian(1, buf, 2), 2, 1, s->fid);188 written += fwrite(write_little_endian(1, buf, 2), 2, 1, s->fid); 190 189 191 190 // NumChannels 192 fwrite(write_little_endian(s->channels, buf, 2), 2, 1, s->fid);191 written += fwrite(write_little_endian(s->channels, buf, 2), 2, 1, s->fid); 193 192 194 193 // SampleRate 195 fwrite(write_little_endian(s->samplerate, buf, 4), 4, 1, s->fid);194 written += fwrite(write_little_endian(s->samplerate, buf, 4), 4, 1, s->fid); 196 195 197 196 // ByteRate 198 197 byterate = s->samplerate * s->channels * s->bitspersample / 8; 199 fwrite(write_little_endian(byterate, buf, 4), 4, 1, s->fid);198 written += fwrite(write_little_endian(byterate, buf, 4), 4, 1, s->fid); 200 199 201 200 // BlockAlign 202 201 blockalign = s->channels * s->bitspersample / 8; 203 fwrite(write_little_endian(blockalign, buf, 2), 2, 1, s->fid);202 written += fwrite(write_little_endian(blockalign, buf, 2), 2, 1, s->fid); 204 203 205 204 // BitsPerSample 206 fwrite(write_little_endian(s->bitspersample, buf, 2), 2, 1, s->fid);205 written += fwrite(write_little_endian(s->bitspersample, buf, 2), 2, 1, s->fid); 207 206 208 207 // Subchunk2ID 209 fwrite("data", 4, 1, s->fid);208 written += fwrite("data", 4, 1, s->fid); 210 209 211 210 // Subchunk1Size (0 for now, actual size will be written in _close) 212 fwrite(write_little_endian(0, buf, 4), 4, 1, s->fid); 211 written += fwrite(write_little_endian(0, buf, 4), 4, 1, s->fid); 212 213 // fwrite(*, *, 1, s->fid) was called 13 times, check success 214 if (written != 13 || fflush(s->fid)) { 215 AUBIO_STRERR("sink_wavwrite: writing header to %s failed" 216 " (wrote %d/%d, %s)\n", s->path, written, 13, errorstr); 217 fclose(s->fid); 218 s->fid = NULL; 219 return AUBIO_FAIL; 220 } 213 221 214 222 s->scratch_size = s->max_size * s->channels; … … 227 235 } 228 236 237 static 238 void aubio_sink_wavwrite_write_frames(aubio_sink_wavwrite_t *s, uint_t write) 239 { 240 uint_t written_frames = 0; 241 242 written_frames = fwrite(s->scratch_data, 2 * s->channels, write, s->fid); 243 244 if (written_frames != write) { 245 AUBIO_STRERR("sink_wavwrite: trying to write %d frames to %s, but only %d" 246 " could be written (%s)\n", write, s->path, written_frames, errorstr); 247 } 248 s->total_frames_written += written_frames; 249 } 229 250 230 251 void aubio_sink_wavwrite_do(aubio_sink_wavwrite_t *s, fvec_t * write_data, uint_t write){ 231 uint_t c = 0, i = 0 , written_frames = 0;252 uint_t c = 0, i = 0; 232 253 uint_t length = aubio_sink_validate_input_length("sink_wavwrite", s->path, 233 254 s->max_size, write_data->length, write); … … 238 259 } 239 260 } 240 written_frames = fwrite(s->scratch_data, 2, length * s->channels, s->fid); 241 242 if (written_frames != write) { 243 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, " 244 "but only %d could be written\n", write, s->path, written_frames); 245 } 246 s->total_frames_written += written_frames; 247 return; 261 262 aubio_sink_wavwrite_write_frames(s, length); 248 263 } 249 264 250 265 void aubio_sink_wavwrite_do_multi(aubio_sink_wavwrite_t *s, fmat_t * write_data, uint_t write){ 251 uint_t c = 0, i = 0 , written_frames = 0;266 uint_t c = 0, i = 0; 252 267 253 268 uint_t channels = aubio_sink_validate_input_channels("sink_wavwrite", s->path, … … 261 276 } 262 277 } 263 written_frames = fwrite(s->scratch_data, 2, length * s->channels, s->fid); 264 265 if (written_frames != write * s->channels) { 266 AUBIO_WRN("sink_wavwrite: trying to write %d frames to %s, " 267 "but only %d could be written\n", write, s->path, written_frames / s->channels); 268 } 269 s->total_frames_written += written_frames; 270 return; 278 279 aubio_sink_wavwrite_write_frames(s, length); 271 280 } 272 281 … … 274 283 uint_t data_size = s->total_frames_written * s->bitspersample * s->channels / 8; 275 284 unsigned char buf[5]; 285 size_t written = 0, err = 0; 276 286 if (!s->fid) return AUBIO_FAIL; 277 287 // ChunkSize 278 fseek(s->fid, 4, SEEK_SET);279 fwrite(write_little_endian(data_size + 36, buf, 4), 4, 1, s->fid);288 err += fseek(s->fid, 4, SEEK_SET); 289 written += fwrite(write_little_endian(data_size + 36, buf, 4), 4, 1, s->fid); 280 290 // Subchunk2Size 281 fseek(s->fid, 40, SEEK_SET); 282 fwrite(write_little_endian(data_size, buf, 4), 4, 1, s->fid); 291 err += fseek(s->fid, 40, SEEK_SET); 292 written += fwrite(write_little_endian(data_size, buf, 4), 4, 1, s->fid); 293 if (written != 2 || err != 0) { 294 AUBIO_STRERR("sink_wavwrite: updating header of %s failed, expected %d" 295 " write but got only %d (%s)\n", s->path, 2, written, errorstr); 296 } 283 297 // close file 284 298 if (fclose(s->fid)) { 285 AUBIO_ ERR("sink_wavwrite: Error closing file %s (%s)\n", s->path, strerror(errno));299 AUBIO_STRERR("sink_wavwrite: Error closing file %s (%s)\n", s->path, errorstr); 286 300 } 287 301 s->fid = NULL; -
src/io/source.c
r868c6b8 rdfe6ab6 139 139 140 140 void del_aubio_source(aubio_source_t * s) { 141 AUBIO_ASSERT(s);142 if (s ->s_del && s->source)141 //AUBIO_ASSERT(s); 142 if (s && s->s_del && s->source) 143 143 s->s_del((void *)s->source); 144 144 AUBIO_FREE(s); -
src/io/source_apple_audio.c
r868c6b8 rdfe6ab6 25 25 #include "fvec.h" 26 26 #include "fmat.h" 27 #include "ioutils.h" 27 28 #include "io/source_apple_audio.h" 28 29 … … 210 211 uint_t c, v; 211 212 UInt32 loadedPackets = aubio_source_apple_audio_read_frame(s); 213 uint_t length = aubio_source_validate_input_length("source_apple_audio", 214 s->path, s->block_size, read_to->length); 212 215 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData; 213 216 214 for (v = 0; v < loadedPackets; v++) { 217 length = MIN(loadedPackets, length); 218 219 for (v = 0; v < length; v++) { 215 220 read_to->data[v] = 0.; 216 221 for (c = 0; c < s->channels; c++) { … … 220 225 } 221 226 // short read, fill with zeros 222 if (loadedPackets < s->block_size) { 223 for (v = loadedPackets; v < s->block_size; v++) { 224 read_to->data[v] = 0.; 225 } 226 } 227 228 *read = (uint_t)loadedPackets; 229 return; 227 aubio_source_pad_output(read_to, length); 228 229 *read = (uint_t)length; 230 230 } 231 231 232 232 void aubio_source_apple_audio_do_multi(aubio_source_apple_audio_t *s, fmat_t * read_to, uint_t * read) { 233 233 uint_t c, v; 234 uint_t length = aubio_source_validate_input_length("source_apple_audio", 235 s->path, s->block_size, read_to->length); 236 uint_t channels = aubio_source_validate_input_channels("source_apple_audio", 237 s->path, s->channels, read_to->height); 234 238 UInt32 loadedPackets = aubio_source_apple_audio_read_frame(s); 235 239 smpl_t *data = (smpl_t*)s->bufferList.mBuffers[0].mData; 236 240 237 for (v = 0; v < loadedPackets; v++) { 238 for (c = 0; c < read_to->height; c++) { 241 length = MIN(loadedPackets, length); 242 243 for (v = 0; v < length; v++) { 244 for (c = 0; c < channels; c++) { 239 245 read_to->data[c][v] = data[ v * s->channels + c]; 240 246 } 241 247 } 242 // if read_data has more channels than the file 243 if (read_to->height > s->channels) { 244 // copy last channel to all additional channels 245 for (v = 0; v < loadedPackets; v++) { 246 for (c = s->channels; c < read_to->height; c++) { 247 read_to->data[c][v] = data[ v * s->channels + (s->channels - 1)]; 248 } 249 } 250 } 251 // short read, fill with zeros 252 if (loadedPackets < s->block_size) { 253 for (v = loadedPackets; v < s->block_size; v++) { 254 for (c = 0; c < read_to->height; c++) { 255 read_to->data[c][v] = 0.; 256 } 257 } 258 } 259 260 *read = (uint_t)loadedPackets; 261 return; 248 249 aubio_source_pad_multi_output(read_to, s->channels, (uint_t)length); 250 251 *read = (uint_t)length; 262 252 } 263 253 … … 355 345 "error in ExtAudioFileGetProperty (%s)\n", s->path, 356 346 getPrintableOSStatusError(errorstr, err)); 357 return err;347 return 0; 358 348 } 359 349 return (uint_t)fileLengthFrames; -
src/io/source_avcodec.c
r868c6b8 rdfe6ab6 31 31 #endif 32 32 #include <libavutil/opt.h> 33 #include <stdlib.h>34 33 35 34 // determine whether we use libavformat from ffmpeg or from libav … … 61 60 #include "fvec.h" 62 61 #include "fmat.h" 62 #include "ioutils.h" 63 63 #include "source_avcodec.h" 64 64 … … 120 120 uint_t samplerate, uint_t hop_size) { 121 121 aubio_source_avcodec_t * s = AUBIO_NEW(aubio_source_avcodec_t); 122 AVFormatContext *avFormatCtx = s->avFormatCtx;123 AVCodecContext *avCodecCtx = s->avCodecCtx;124 AVFrame *avFrame = s->avFrame;122 AVFormatContext *avFormatCtx = NULL; 123 AVCodecContext *avCodecCtx = NULL; 124 AVFrame *avFrame = NULL; 125 125 sint_t selected_stream = -1; 126 126 #if FF_API_LAVF_AVCTX … … 464 464 (const uint8_t **)avFrame->data, in_samples); 465 465 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 466 if (out_samples < =0) {467 AUBIO_WRN("source_avcodec: no sample found while converting frame (%s)\n",468 s->path );466 if (out_samples < 0) { 467 AUBIO_WRN("source_avcodec: error while resampling %s (%d)\n", 468 s->path, out_samples); 469 469 goto beach; 470 470 } … … 473 473 474 474 beach: 475 s->avFormatCtx = avFormatCtx;476 s->avCodecCtx = avCodecCtx;477 s->avFrame = avFrame;478 #if defined(HAVE_AVRESAMPLE) || defined(HAVE_SWRESAMPLE)479 s->avr = avr;480 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */481 s->output = output;482 483 475 av_packet_unref(&avPacket); 484 476 } … … 489 481 uint_t end = 0; 490 482 uint_t total_wrote = 0; 491 while (total_wrote < s->hop_size) { 492 end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote); 483 uint_t length = aubio_source_validate_input_length("source_avcodec", s->path, 484 s->hop_size, read_data->length); 485 if (!s->avr || !s->avFormatCtx || !s->avCodecCtx) { 486 AUBIO_ERR("source_avcodec: could not read from %s (file was closed)\n", 487 s->path); 488 *read= 0; 489 return; 490 } 491 while (total_wrote < length) { 492 end = MIN(s->read_samples - s->read_index, length - total_wrote); 493 493 for (i = 0; i < end; i++) { 494 494 read_data->data[i + total_wrote] = 0.; … … 500 500 } 501 501 total_wrote += end; 502 if (total_wrote < s->hop_size) {502 if (total_wrote < length) { 503 503 uint_t avcodec_read = 0; 504 504 aubio_source_avcodec_readframe(s, &avcodec_read); … … 512 512 } 513 513 } 514 if (total_wrote < s->hop_size) { 515 for (i = total_wrote; i < s->hop_size; i++) { 516 read_data->data[i] = 0.; 517 } 518 } 514 515 aubio_source_pad_output(read_data, total_wrote); 516 519 517 *read = total_wrote; 520 518 } … … 525 523 uint_t end = 0; 526 524 uint_t total_wrote = 0; 527 while (total_wrote < s->hop_size) { 528 end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote); 529 for (j = 0; j < read_data->height; j++) { 525 uint_t length = aubio_source_validate_input_length("source_avcodec", s->path, 526 s->hop_size, read_data->length); 527 uint_t channels = aubio_source_validate_input_channels("source_avcodec", 528 s->path, s->input_channels, read_data->height); 529 if (!s->avr || !s->avFormatCtx || !s->avCodecCtx) { 530 AUBIO_ERR("source_avcodec: could not read from %s (file was closed)\n", 531 s->path); 532 *read= 0; 533 return; 534 } 535 while (total_wrote < length) { 536 end = MIN(s->read_samples - s->read_index, length - total_wrote); 537 for (j = 0; j < channels; j++) { 530 538 for (i = 0; i < end; i++) { 531 539 read_data->data[j][i + total_wrote] = … … 534 542 } 535 543 total_wrote += end; 536 if (total_wrote < s->hop_size) {544 if (total_wrote < length) { 537 545 uint_t avcodec_read = 0; 538 546 aubio_source_avcodec_readframe(s, &avcodec_read); … … 546 554 } 547 555 } 548 if (total_wrote < s->hop_size) { 549 for (j = 0; j < read_data->height; j++) { 550 for (i = total_wrote; i < s->hop_size; i++) { 551 read_data->data[j][i] = 0.; 552 } 553 } 554 } 556 557 aubio_source_pad_multi_output(read_data, s->input_channels, total_wrote); 558 555 559 *read = total_wrote; 556 560 } … … 616 620 #ifdef HAVE_AVRESAMPLE 617 621 avresample_close( s->avr ); 622 av_free ( s->avr ); 618 623 #elif defined(HAVE_SWRESAMPLE) 619 624 swr_close ( s->avr ); 620 #endif 621 av_free ( s->avr ); 625 swr_free ( &s->avr ); 626 #endif 622 627 } 623 628 s->avr = NULL; -
src/io/source_sndfile.c
r868c6b8 rdfe6ab6 27 27 #include "fvec.h" 28 28 #include "fmat.h" 29 #include "ioutils.h" 29 30 #include "source_sndfile.h" 30 31 … … 170 171 uint_t i,j, input_channels = s->input_channels; 171 172 /* read from file into scratch_data */ 172 sf_count_t read_samples = aubio_sf_read_smpl (s->handle, s->scratch_data, s->scratch_size); 173 uint_t length = aubio_source_validate_input_length("source_sndfile", s->path, 174 s->hop_size, read_data->length); 175 sf_count_t read_samples = aubio_sf_read_smpl (s->handle, s->scratch_data, 176 s->scratch_size); 177 uint_t read_length = read_samples / s->input_channels; 173 178 174 179 /* where to store de-interleaved data */ 175 180 smpl_t *ptr_data; 181 182 if (!s->handle) { 183 AUBIO_ERR("source_sndfile: could not read from %s (file was closed)\n", 184 s->path); 185 *read = 0; 186 return; 187 } 188 176 189 #ifdef HAVE_SAMPLERATE 177 190 if (s->ratio != 1) { … … 180 193 #endif /* HAVE_SAMPLERATE */ 181 194 { 195 read_length = MIN(length, read_length); 182 196 ptr_data = read_data->data; 183 197 } 184 198 185 199 /* de-interleaving and down-mixing data */ 186 for (j = 0; j < read_ samples / input_channels; j++) {200 for (j = 0; j < read_length; j++) { 187 201 ptr_data[j] = 0; 188 202 for (i = 0; i < input_channels; i++) { … … 198 212 #endif /* HAVE_SAMPLERATE */ 199 213 200 *read = (int)FLOOR(s->ratio * read_samples / input_channels + .5); 201 202 if (*read < s->hop_size) { 203 for (j = *read; j < s->hop_size; j++) { 204 read_data->data[j] = 0; 205 } 206 } 214 *read = MIN(length, (uint_t)FLOOR(s->ratio * read_length + .5)); 215 216 aubio_source_pad_output (read_data, *read); 207 217 208 218 } … … 211 221 uint_t i,j, input_channels = s->input_channels; 212 222 /* do actual reading */ 213 sf_count_t read_samples = aubio_sf_read_smpl (s->handle, s->scratch_data, s->scratch_size); 223 uint_t length = aubio_source_validate_input_length("source_sndfile", s->path, 224 s->hop_size, read_data->length); 225 uint_t channels = aubio_source_validate_input_channels("source_sndfile", 226 s->path, s->input_channels, read_data->height); 227 sf_count_t read_samples = aubio_sf_read_smpl (s->handle, s->scratch_data, 228 s->scratch_size); 229 uint_t read_length = read_samples / s->input_channels; 214 230 215 231 /* where to store de-interleaved data */ 216 232 smpl_t **ptr_data; 233 234 if (!s->handle) { 235 AUBIO_ERR("source_sndfile: could not read from %s (file was closed)\n", 236 s->path); 237 *read = 0; 238 return; 239 } 240 217 241 #ifdef HAVE_SAMPLERATE 218 242 if (s->ratio != 1) { … … 221 245 #endif /* HAVE_SAMPLERATE */ 222 246 { 247 read_length = MIN(read_length, length); 223 248 ptr_data = read_data->data; 224 249 } 225 250 226 if (read_data->height < input_channels) { 227 // destination matrix has less channels than the file; copy only first 228 // channels of the file, de-interleaving data 229 for (j = 0; j < read_samples / input_channels; j++) { 230 for (i = 0; i < read_data->height; i++) { 231 ptr_data[i][j] = s->scratch_data[j * input_channels + i]; 232 } 233 } 234 } else { 235 // destination matrix has as many or more channels than the file; copy each 236 // channel from the file to the destination matrix, de-interleaving data 237 for (j = 0; j < read_samples / input_channels; j++) { 238 for (i = 0; i < input_channels; i++) { 239 ptr_data[i][j] = s->scratch_data[j * input_channels + i]; 240 } 241 } 242 } 243 244 if (read_data->height > input_channels) { 245 // destination matrix has more channels than the file; copy last channel 246 // of the file to each additional channels, de-interleaving data 247 for (j = 0; j < read_samples / input_channels; j++) { 248 for (i = input_channels; i < read_data->height; i++) { 249 ptr_data[i][j] = s->scratch_data[j * input_channels + (input_channels - 1)]; 250 } 251 for (j = 0; j < read_length; j++) { 252 for (i = 0; i < channels; i++) { 253 ptr_data[i][j] = s->scratch_data[j * input_channels + i]; 251 254 } 252 255 } … … 265 268 #endif /* HAVE_SAMPLERATE */ 266 269 267 *read = (int)FLOOR(s->ratio * read_samples / input_channels + .5); 268 269 if (*read < s->hop_size) { 270 for (i = 0; i < read_data->height; i++) { 271 for (j = *read; j < s->hop_size; j++) { 272 read_data->data[i][j] = 0.; 273 } 274 } 275 } 276 270 *read = MIN(length, (uint_t)FLOOR(s->ratio * read_length + .5)); 271 272 aubio_source_pad_multi_output(read_data, input_channels, *read); 277 273 } 278 274 -
src/io/source_wavread.c
r868c6b8 rdfe6ab6 25 25 #include "fvec.h" 26 26 #include "fmat.h" 27 #include "ioutils.h" 27 28 #include "source_wavread.h" 28 29 29 #include <errno.h>30 31 30 #define AUBIO_WAVREAD_BUFSIZE 1024 32 31 33 #define SHORT_TO_FLOAT(x) (smpl_t)(x * 3.0517578125e-05)32 //#define SHORT_TO_FLOAT(x) (smpl_t)(x * 3.0517578125e-05) 34 33 35 34 struct _aubio_source_wavread_t { … … 100 99 s->fid = fopen((const char *)path, "rb"); 101 100 if (!s->fid) { 102 AUBIO_ ERR("source_wavread: Failed opening %s (System error: %s)\n", s->path, strerror(errno));101 AUBIO_STRERR("source_wavread: Failed opening %s (%s)\n", s->path, errorstr); 103 102 goto beach; 104 103 } … … 133 132 bytes_junk += read_little_endian(buf, 4); 134 133 if (fseek(s->fid, bytes_read + bytes_junk, SEEK_SET) != 0) { 135 AUBIO_ ERR("source_wavread: Failed opening %s (could not seek past JUNK Chunk: %s)\n",136 s->path, strerror(errno));134 AUBIO_STRERR("source_wavread: Failed opening %s (could not seek past JUNK Chunk: %s)\n", 135 s->path, errorstr); 137 136 goto beach; 138 137 } … … 261 260 bytes_junk += read_little_endian(buf, 4); 262 261 if (fseek(s->fid, bytes_read + bytes_junk, SEEK_SET) != 0) { 263 AUBIO_ ERR("source_wavread: could not seek past unknown chunk in %s (%s)\n",264 s->path, strerror(errno));262 AUBIO_STRERR("source_wavread: could not seek past unknown chunk in %s (%s)\n", 263 s->path, errorstr); 265 264 goto beach; 266 265 } … … 348 347 uint_t end = 0; 349 348 uint_t total_wrote = 0; 349 uint_t length = aubio_source_validate_input_length("source_wavread", s->path, 350 s->hop_size, read_data->length); 350 351 if (s->fid == NULL) { 351 352 AUBIO_ERR("source_wavread: could not read from %s (file not opened)\n", … … 353 354 return; 354 355 } 355 while (total_wrote < s->hop_size) {356 end = MIN(s->read_samples - s->read_index, s->hop_size- total_wrote);356 while (total_wrote < length) { 357 end = MIN(s->read_samples - s->read_index, length - total_wrote); 357 358 for (i = 0; i < end; i++) { 358 359 read_data->data[i + total_wrote] = 0; … … 363 364 } 364 365 total_wrote += end; 365 if (total_wrote < s->hop_size) {366 if (total_wrote < length) { 366 367 uint_t wavread_read = 0; 367 368 aubio_source_wavread_readframe(s, &wavread_read); … … 375 376 } 376 377 } 377 if (total_wrote < s->hop_size) { 378 for (i = end; i < s->hop_size; i++) { 379 read_data->data[i] = 0.; 380 } 381 } 378 379 aubio_source_pad_output (read_data, total_wrote); 380 382 381 *read = total_wrote; 383 382 } … … 387 386 uint_t end = 0; 388 387 uint_t total_wrote = 0; 388 uint_t length = aubio_source_validate_input_length("source_wavread", s->path, 389 s->hop_size, read_data->length); 390 uint_t channels = aubio_source_validate_input_channels("source_wavread", 391 s->path, s->input_channels, read_data->height); 389 392 if (s->fid == NULL) { 390 393 AUBIO_ERR("source_wavread: could not read from %s (file not opened)\n", … … 392 395 return; 393 396 } 394 while (total_wrote < s->hop_size) {395 end = MIN(s->read_samples - s->read_index, s->hop_size- total_wrote);396 for (j = 0; j < read_data->height; j++) {397 while (total_wrote < length) { 398 end = MIN(s->read_samples - s->read_index, length - total_wrote); 399 for (j = 0; j < channels; j++) { 397 400 for (i = 0; i < end; i++) { 398 401 read_data->data[j][i + total_wrote] = s->output->data[j][i]; … … 400 403 } 401 404 total_wrote += end; 402 if (total_wrote < s->hop_size) {405 if (total_wrote < length) { 403 406 uint_t wavread_read = 0; 404 407 aubio_source_wavread_readframe(s, &wavread_read); … … 412 415 } 413 416 } 414 if (total_wrote < s->hop_size) { 415 for (j = 0; j < read_data->height; j++) { 416 for (i = end; i < s->hop_size; i++) { 417 read_data->data[j][i] = 0.; 418 } 419 } 420 } 417 418 aubio_source_pad_multi_output(read_data, s->input_channels, total_wrote); 419 421 420 *read = total_wrote; 422 421 } … … 442 441 ret = fseek(s->fid, s->seek_start + pos * s->blockalign, SEEK_SET); 443 442 if (ret != 0) { 444 AUBIO_ ERR("source_wavread: could not seek %s at %d (%s)\n", s->path, pos, strerror(errno));443 AUBIO_STRERR("source_wavread: could not seek %s at %d (%s)\n", s->path, pos, errorstr); 445 444 return AUBIO_FAIL; 446 445 } … … 463 462 } 464 463 if (fclose(s->fid)) { 465 AUBIO_ ERR("source_wavread: could not close %s (%s)\n", s->path, strerror(errno));464 AUBIO_STRERR("source_wavread: could not close %s (%s)\n", s->path, errorstr); 466 465 return AUBIO_FAIL; 467 466 } -
tests/src/io/base-sink_custom.h
r868c6b8 rdfe6ab6 152 152 close_temp_sink(sink_path, fd); 153 153 154 // shouldn't crash on null (bypassed, only check del_aubio_sink) 155 // del_aubio_sink_custom(NULL); 156 154 157 return run_on_default_source_and_sink(base_main); 155 158 } -
tests/src/io/base-source_custom.h
r868c6b8 rdfe6ab6 94 94 if (read != hop_size) return 1; 95 95 96 // read again in undersized vector 97 del_fvec(vec); 98 vec = new_fvec(hop_size - 1); 99 aubio_source_custom_do(s, vec, &read); 100 if (read != hop_size - 1) return 1; 101 102 // read again in oversized vector 103 del_fvec(vec); 104 vec = new_fvec(hop_size + 1); 105 aubio_source_custom_do(s, vec, &read); 106 if (read != hop_size) return 1; 107 96 108 // seek to 0 97 109 if(aubio_source_custom_seek(s, 0)) return 1; 98 110 99 111 // read again as multiple channels 112 aubio_source_custom_do_multi(s, mat, &read); 113 if (read != hop_size) return 1; 114 115 // read again as multiple channels in an undersized matrix 116 del_fmat(mat); 117 mat = new_fmat(channels - 1, hop_size); 118 aubio_source_custom_do_multi(s, mat, &read); 119 if (read != hop_size) return 1; 120 121 // read again as multiple channels in an undersized matrix 122 del_fmat(mat); 123 mat = new_fmat(channels, hop_size - 1); 124 aubio_source_custom_do_multi(s, mat, &read); 125 if (read != hop_size - 1) return 1; 126 127 // read again as multiple channels in an oversized matrix 128 del_fmat(mat); 129 mat = new_fmat(channels + 1, hop_size); 130 aubio_source_custom_do_multi(s, mat, &read); 131 if (read != hop_size) return 1; 132 133 // read again as multiple channels in an oversized matrix 134 del_fmat(mat); 135 mat = new_fmat(channels, hop_size + 1); 100 136 aubio_source_custom_do_multi(s, mat, &read); 101 137 if (read != hop_size) return 1; … … 106 142 aubio_source_custom_close(s); 107 143 144 // reading after close fails 145 del_fvec(vec); 146 vec = new_fvec(hop_size); 147 aubio_source_custom_do(s, vec, &read); 148 del_fmat(mat); 149 mat = new_fmat(channels, hop_size); 150 aubio_source_custom_do_multi(s, mat, &read); 151 108 152 del_aubio_source_custom(s); 109 153 del_fmat(mat); 110 154 del_fvec(vec); 155 156 // shouldn't crash on null (bypassed, only check del_aubio_source) 157 // del_aubio_source_custom(NULL); 111 158 112 159 return run_on_default_source(base_main); -
tests/src/io/test-sink.c
r868c6b8 rdfe6ab6 148 148 close_temp_sink(sink_path, fd); 149 149 150 // shouldn't crash on null 151 del_aubio_sink(NULL); 152 150 153 return run_on_default_source_and_sink(main); 151 154 } -
tests/src/io/test-source.c
r868c6b8 rdfe6ab6 90 90 if (read != hop_size) return 1; 91 91 92 // read again in undersized vector 93 del_fvec(vec); 94 vec = new_fvec(hop_size - 1); 95 aubio_source_do(s, vec, &read); 96 if (read != hop_size - 1) return 1; 97 98 // read again in oversized vector 99 del_fvec(vec); 100 vec = new_fvec(hop_size + 1); 101 aubio_source_do(s, vec, &read); 102 if (read != hop_size) return 1; 103 92 104 // seek to 0 93 105 if(aubio_source_seek(s, 0)) return 1; 94 106 95 107 // read again as multiple channels 108 aubio_source_do_multi(s, mat, &read); 109 if (read != hop_size) return 1; 110 111 // read again as multiple channels in an undersized matrix 112 del_fmat(mat); 113 mat = new_fmat(channels - 1, hop_size); 114 aubio_source_do_multi(s, mat, &read); 115 if (read != hop_size) return 1; 116 117 // read again as multiple channels in an undersized matrix 118 del_fmat(mat); 119 mat = new_fmat(channels, hop_size - 1); 120 aubio_source_do_multi(s, mat, &read); 121 if (read != hop_size - 1) return 1; 122 123 // read again as multiple channels in an oversized matrix 124 del_fmat(mat); 125 mat = new_fmat(channels + 1, hop_size); 126 aubio_source_do_multi(s, mat, &read); 127 if (read != hop_size) return 1; 128 129 // read again as multiple channels in an oversized matrix 130 del_fmat(mat); 131 mat = new_fmat(channels, hop_size + 1); 96 132 aubio_source_do_multi(s, mat, &read); 97 133 if (read != hop_size) return 1; … … 102 138 aubio_source_close(s); 103 139 140 // reading after close fails 141 del_fvec(vec); 142 vec = new_fvec(hop_size); 143 aubio_source_do(s, vec, &read); 144 del_fmat(mat); 145 mat = new_fmat(channels, hop_size); 146 aubio_source_do_multi(s, mat, &read); 147 104 148 del_aubio_source(s); 105 149 del_fmat(mat); 106 150 del_fvec(vec); 107 151 152 // shouldn't crash on null 153 del_aubio_source(NULL); 154 108 155 return run_on_default_source(main); 109 156 } -
tests/src/spectral/test-mfcc.c
r868c6b8 rdfe6ab6 34 34 aubio_mfcc_t *mfcc = 0; 35 35 36 fvec_t *in = new_fvec ( win_s); // input buffer37 cvec_t *fftgrain = new_cvec (win_s); // input buffer38 fvec_t *out = new_fvec (n_coeffs); // output coefficients36 fvec_t *in = new_fvec (hop_s); // phase vocoder input 37 cvec_t *fftgrain = new_cvec (win_s); // pvoc output / mfcc input 38 fvec_t *out = new_fvec (n_coeffs); // mfcc output 39 39 40 40 if (!in || !fftgrain || !out) { err = 1; goto failure; } -
tests/src/test-cvec.c
r868c6b8 rdfe6ab6 4 4 int main (void) 5 5 { 6 uint_t i, window_size = 16; // window size7 cvec_t * complex_vector = new_cvec (window_size); // input buffer8 uint_t rand_times = 4;6 uint_t i, window_size = 16; 7 cvec_t * complex_vector = new_cvec(window_size); 8 cvec_t * other_cvector = new_cvec(window_size); 9 9 10 utils_init_random(); 10 assert(cvec_norm_get_data(complex_vector) == complex_vector->norm); 11 assert(cvec_phas_get_data(complex_vector) == complex_vector->phas); 12 assert(complex_vector->length == window_size / 2 + 1); 11 13 12 while (rand_times -- ) { 13 // fill with random phas and norm 14 for ( i = 0; i < complex_vector->length; i++ ) { 15 complex_vector->norm[i] = ( 2. / RAND_MAX * random() - 1. ); 16 complex_vector->phas[i] = ( 2. / RAND_MAX * random() - 1. ) * M_PI; 17 } 18 // print the vector 19 cvec_print(complex_vector); 14 // all elements are initialized to 0 15 for ( i = 0; i < complex_vector->length; i++ ) { 16 assert( complex_vector->norm[i] == 0. ); 17 assert( complex_vector->phas[i] == 0. ); 20 18 } 21 19 22 // set all vector elements to `0` 20 cvec_norm_set_sample(complex_vector, 2., 1); 21 assert(cvec_norm_get_sample(complex_vector, 1)); 22 23 cvec_phas_set_sample(complex_vector, 2., 1); 24 assert(cvec_phas_get_sample(complex_vector, 1)); 25 26 cvec_print(complex_vector); 27 28 // set all norm and phas elements to 0 29 cvec_zeros(complex_vector); 30 for ( i = 0; i < complex_vector->length; i++ ) { 31 assert( complex_vector->norm[i] == 0. ); 32 assert( complex_vector->phas[i] == 0. ); 33 } 34 35 // set all norm elements to 1 36 cvec_norm_ones(complex_vector); 37 for ( i = 0; i < complex_vector->length; i++ ) { 38 assert( complex_vector->norm[i] == 1. ); 39 } 40 41 // set all norm elements to 0 23 42 cvec_norm_zeros(complex_vector); 24 43 for ( i = 0; i < complex_vector->length; i++ ) { 25 44 assert( complex_vector->norm[i] == 0. ); 26 // assert( complex_vector->phas[i] == 0 );27 45 } 28 cvec_print(complex_vector);29 46 30 // set all vector elements to `1`31 cvec_ norm_ones(complex_vector);47 // set all phas elements to 1 48 cvec_phas_ones(complex_vector); 32 49 for ( i = 0; i < complex_vector->length; i++ ) { 33 assert( complex_vector->norm[i] == 1. ); 34 // assert( complex_vector->phas[i] == 0 ); 50 assert( complex_vector->phas[i] == 1. ); 35 51 } 36 cvec_print(complex_vector);37 52 38 cvec_zeros(complex_vector);53 // set all phas elements to 0 39 54 cvec_phas_zeros(complex_vector); 40 cvec_norm_zeros(complex_vector); 41 cvec_norm_ones(complex_vector); 42 cvec_phas_ones(complex_vector); 55 for ( i = 0; i < complex_vector->length; i++ ) { 56 assert( complex_vector->phas[i] == 0. ); 57 } 58 59 cvec_copy(complex_vector, other_cvector); 60 // copy to self 43 61 cvec_copy(complex_vector, complex_vector); 62 // copy to a different size fails 63 del_cvec(other_cvector); 64 other_cvector = new_cvec(window_size + 2); 65 cvec_copy(complex_vector, other_cvector); 44 66 45 // destroy it 46 del_cvec(complex_vector); 67 if (complex_vector) 68 del_cvec(complex_vector); 69 if (other_cvector) 70 del_cvec(other_cvector); 71 72 // wrong parameters 73 assert(new_cvec(-1) == NULL); 74 assert(new_cvec(0) == NULL); 75 47 76 return 0; 48 77 } -
tests/src/test-fmat.c
r868c6b8 rdfe6ab6 5 5 // and j the column. 6 6 7 void assert_fmat_all_equal(fmat_t *mat, smpl_t scalar) 8 { 9 uint_t i, j; 10 for ( i = 0; i < mat->height; i++ ) { 11 for ( j = 0; j < mat->length; j++ ) { 12 assert(mat->data[i][j] == scalar); 13 } 14 } 15 } 16 7 17 int main (void) 8 18 { 9 uint_t height = 3, length = 9, i, j; 19 uint_t i, j; 20 uint_t height = 3, length = 9; 21 10 22 // create fmat_t object 11 fmat_t * mat = new_fmat (height, length); 12 for ( i = 0; i < mat->height; i++ ) { 13 for ( j = 0; j < mat->length; j++ ) { 23 fmat_t * mat = new_fmat(height, length); 24 fmat_t * other_mat = new_fmat(height, length); 25 26 assert(mat); 27 assert(other_mat); 28 29 assert(mat->length == length); 30 assert(mat->height == height); 31 32 for (i = 0; i < mat->height; i++) { 33 for (j = 0; j < mat->length; j++) { 14 34 // all elements are already initialized to 0. 15 35 assert(mat->data[i][j] == 0); 16 36 // setting element of row i, column j 17 mat->data[i][j] = i * 1 . + j *.1;37 mat->data[i][j] = i * 10. + j; 18 38 } 19 39 } 40 41 // print out matrix 42 fmat_print(mat); 43 44 // helpers 45 fmat_rev(mat); 46 fmat_print(mat); 47 for (i = 0; i < mat->height; i++) { 48 for (j = 0; j < mat->length; j++) { 49 assert(mat->data[i][j] == i * 10. + mat->length - 1. - j); 50 } 51 } 52 53 fmat_set_sample(mat, 3, 1, 1); 54 assert(fmat_get_sample(mat, 1, 1) == 3.); 55 56 fmat_ones(mat); 57 assert_fmat_all_equal(mat, 1.); 58 59 fmat_set(other_mat, .5); 60 assert_fmat_all_equal(other_mat, .5); 61 62 fmat_weight(mat, other_mat); 63 assert_fmat_all_equal(mat, .5); 64 20 65 fvec_t channel_onstack; 21 66 fvec_t *channel = &channel_onstack; 22 67 fmat_get_channel(mat, 1, channel); 23 fvec_print (channel); 24 // print out matrix 25 fmat_print(mat); 26 // destroy it 27 del_fmat(mat); 68 assert(channel->data == mat->data[1]); 69 70 // copy of the same size 71 fmat_copy(mat, other_mat); 72 del_fmat(other_mat); 73 74 // copy to undersized 75 other_mat = new_fmat(height - 1, length); 76 fmat_copy(mat, other_mat); 77 del_fmat(other_mat); 78 79 // copy from undersized 80 other_mat = new_fmat(height, length + 1); 81 fmat_copy(mat, other_mat); 82 83 // wrong parameters 84 assert(new_fmat(-1, length) == NULL); 85 assert(new_fmat(height, -1) == NULL); 86 87 // methods for wrappers with opaque structure 88 assert (fmat_get_channel_data(mat, 0) == mat->data[0]); 89 assert (fmat_get_data(mat) == mat->data); 90 91 if (mat) 92 del_fmat(mat); 93 if (other_mat) 94 del_fmat(other_mat); 28 95 return 0; 29 96 } 30 -
tests/src/test-fvec.c
r868c6b8 rdfe6ab6 2 2 #include "utils_tests.h" 3 3 4 void assert_fvec_all_equal(fvec_t *vec, smpl_t scalar) 5 { 6 uint_t i; 7 for (i = 0; i < vec->length; i++) { 8 assert(vec->data[i] == scalar); 9 } 10 } 11 4 12 int main (void) 5 13 { 6 uint_t vec_size = 10, i; 7 fvec_t * vec = new_fvec (vec_size); 14 uint_t length = 10; 15 uint_t i; 16 17 fvec_t * vec = new_fvec (length); 18 fvec_t * other_vec = new_fvec (length); 19 20 assert (vec); 21 assert (other_vec); 8 22 9 23 // vec->length matches requested size 10 assert(vec->length == vec_size);24 assert(vec->length == length); 11 25 12 26 // all elements are initialized to `0.` … … 15 29 } 16 30 31 // all elements can be set to `1.` 32 fvec_ones(vec); 33 assert_fvec_all_equal(vec, 1.); 34 17 35 // all elements can be set to `0.` 18 36 fvec_zeros(vec); 19 for ( i = 0; i < vec->length; i++ ) { 20 assert(vec->data[i] == 0.); 21 } 22 fvec_print(vec); 23 24 // all elements can be set to `1.` 25 fvec_ones(vec); 26 for ( i = 0; i < vec->length; i++ ) { 27 assert(vec->data[i] == 1.); 28 } 29 fvec_print(vec); 37 assert_fvec_all_equal(vec, 0.); 30 38 31 39 // each element can be accessed directly … … 36 44 fvec_print(vec); 37 45 46 fvec_set_sample(vec, 3, 2); 47 assert(fvec_get_sample(vec, 2) == 3); 48 49 assert(fvec_get_data(vec) == vec->data); 50 51 // wrong parameters 52 assert(new_fvec(-1) == NULL); 53 54 // copy to an identical size works 55 fvec_copy(vec, other_vec); 56 del_fvec(other_vec); 57 58 // copy to a different size fail 59 other_vec = new_fvec(length + 1); 60 fvec_copy(vec, other_vec); 61 del_fvec(other_vec); 62 63 // copy to a different size fail 64 other_vec = new_fvec(length - 1); 65 fvec_copy(vec, other_vec); 66 38 67 // now destroys the vector 39 del_fvec(vec); 40 68 if (vec) 69 del_fvec(vec); 70 if (other_vec) 71 del_fvec(other_vec); 41 72 return 0; 42 73 } 43 -
tests/src/test-lvec.c
r868c6b8 rdfe6ab6 2 2 #include "utils_tests.h" 3 3 4 void assert_lvec_all_equal(lvec_t *vec, lsmp_t scalar) 5 { 6 uint_t i; 7 for (i = 0; i < vec->length; i++) { 8 assert(vec->data[i] == scalar); 9 } 10 } 11 4 12 int main (void) 5 13 { 6 uint_t win_s = 32; // window size 7 lvec_t * sp = new_lvec (win_s); // input buffer 8 lvec_set_sample (sp, 2./3., 0); 9 PRINT_MSG(AUBIO_LSMP_FMT "\n", lvec_get_sample (sp, 0)); 10 lvec_print (sp); 11 lvec_ones (sp); 12 lvec_print (sp); 13 lvec_set_all (sp, 3./5.); 14 lvec_print (sp); 15 del_lvec(sp); 14 uint_t length = 32; // window size 15 16 lvec_t * vec = new_lvec (length); // input buffer 17 18 assert(vec); 19 20 assert(vec->length == length); 21 22 lvec_set_sample (vec, 3., 0); 23 assert(lvec_get_sample(vec, 0) == 3.); 24 25 assert(lvec_get_data(vec) == vec->data); 26 27 lvec_print (vec); 28 // note AUBIO_LSMP_FMT can be used to print lsmp_t 29 PRINT_MSG(AUBIO_LSMP_FMT "\n", lvec_get_sample (vec, 0)); 30 31 lvec_set_all (vec, 2.); 32 assert_lvec_all_equal(vec, 2.); 33 34 lvec_ones (vec); 35 assert_lvec_all_equal(vec, 1.); 36 37 lvec_zeros (vec); 38 assert_lvec_all_equal(vec, 0.); 39 40 del_lvec(vec); 41 42 // wrong parameters 43 assert(new_lvec(0) == NULL); 44 assert(new_lvec(-1) == NULL); 45 16 46 return 0; 17 47 } 18 -
tests/src/test-mathutils-window.c
r868c6b8 rdfe6ab6 8 8 uint_t lengths[4] = { 8, 10, 15, 16 }; 9 9 char *method = "default"; 10 char *window_types[1 0] = { "default",11 " rectangle", "hamming", "hanning", "hanningz",10 char *window_types[11] = { "default", 11 "ones", "rectangle", "hamming", "hanning", "hanningz", 12 12 "blackman", "blackman_harris", "gaussian", "welch", "parzen"}; 13 13 … … 27 27 } 28 28 } 29 30 assert (new_aubio_window("parzen", -1) == NULL); 31 assert (new_aubio_window(NULL, length) == NULL); 32 assert (new_aubio_window("\0", length) == NULL); 29 33 return 0; 30 34 } -
wscript
r868c6b8 rdfe6ab6 140 140 ctx.check(header_name='math.h') 141 141 ctx.check(header_name='string.h') 142 ctx.check(header_name='errno.h') 142 143 ctx.check(header_name='limits.h') 143 144 ctx.check(header_name='stdarg.h') … … 630 631 ctx.excl += ' **/.cache' 631 632 ctx.excl += ' **/**.zip **/**.tar.bz2' 632 ctx.excl += ' **.tar.bz2 '633 ctx.excl += ' **.tar.bz2**' 633 634 ctx.excl += ' **/doc/full/* **/doc/web/*' 634 635 ctx.excl += ' **/doc/full.cfg' … … 642 643 ctx.excl += ' **/.DS_Store' 643 644 ctx.excl += ' **/.travis.yml' 644 ctx.excl += ' **/.landscape.yml'645 645 ctx.excl += ' **/.appveyor.yml' 646 646 ctx.excl += ' **/.circleci/*'
Note: See TracChangeset
for help on using the changeset viewer.