shithub: aubio

Download patch

ref: 4615886a2207e60ba23014223b01393ee5fc2e40
parent: 5a7e2c3a1b79adc7f15e9eb3e6614349e431cfa9
author: Paul Brossier <piem@piem.org>
date: Thu Jul 9 22:08:22 EDT 2015

ext/py-musicutils.c: add db_spl

--- a/python/ext/aubiomodule.c
+++ b/python/ext/aubiomodule.c
@@ -241,6 +241,7 @@
   {"zero_crossing_rate", Py_zero_crossing_rate, METH_VARARGS, Py_zero_crossing_rate_doc},
   {"min_removal", Py_min_removal, METH_VARARGS, Py_min_removal_doc},
   {"level_lin", Py_aubio_level_lin, METH_VARARGS, Py_aubio_level_lin_doc},
+  {"db_spl", Py_aubio_db_spl, METH_VARARGS, Py_aubio_db_spl_doc},
   {"window", Py_aubio_window, METH_VARARGS, Py_aubio_window_doc},
   {NULL, NULL} /* Sentinel */
 };
--- a/python/ext/py-musicutils.c
+++ b/python/ext/py-musicutils.c
@@ -50,3 +50,33 @@
 
   return level_lin;
 }
+
+PyObject *
+Py_aubio_db_spl(PyObject *self, PyObject *args)
+{
+  PyObject *input;
+  fvec_t *vec;
+  PyObject *db_spl;
+
+  if (!PyArg_ParseTuple (args, "O:db_spl", &input)) {
+    PyErr_SetString (PyExc_ValueError, "failed parsing arguments");
+    return NULL;
+  }
+
+  if (input == NULL) {
+    return NULL;
+  }
+
+  vec = PyAubio_ArrayToCFvec (input);
+  if (vec == NULL) {
+    return NULL;
+  }
+
+  db_spl = Py_BuildValue("f", aubio_db_spl(vec));
+  if (db_spl == NULL) {
+    PyErr_SetString (PyExc_ValueError, "failed computing db_spl");
+    return NULL;
+  }
+
+  return db_spl;
+}
--- a/python/tests/test_musicutils.py
+++ b/python/tests/test_musicutils.py
@@ -5,7 +5,7 @@
 from numpy import cos, arange
 from math import pi
 
-from aubio import window, level_lin
+from aubio import window, level_lin, db_spl
 
 from aubio import fvec
 
@@ -54,6 +54,26 @@
     def test_minus_ones_is_one(self):
         from numpy import ones
         assert_equal(level_lin(-ones(1024, dtype="float32")), 1.)
+
+class aubio_db_spl(TestCase):
+    def test_accept_fvec(self):
+        db_spl(fvec(1024))
+
+    def test_fail_not_fvec(self):
+        try:
+            db_spl("default")
+        except ValueError, e:
+            pass
+        else:
+            self.fail('non-number input phase does not raise a TypeError')
+
+    def test_zeros_is_inf(self):
+        from math import isinf
+        assert isinf(db_spl(fvec(1024)))
+
+    def test_minus_ones_is_zero(self):
+        from numpy import ones
+        assert_equal(db_spl(-ones(1024, dtype="float32")), 0.)
 
 if __name__ == '__main__':
     from unittest import main