shithub: aubio

Download patch

ref: 93004d5e0bdd2735bca41834855862eecd2d03b6
parent: 83b385ffe982db15d8d9f7224e8993a709bc8910
author: Paul Brossier <piem@piem.org>
date: Wed Jul 11 12:38:18 EDT 2012

aubioproxy.c: add PyAubio_ArrayToCFmat implementation

--- a/interfaces/python/aubioproxy.c
+++ b/interfaces/python/aubioproxy.c
@@ -11,7 +11,7 @@
   // parsing input object into a Py_fvec
   if (PyArray_Check(input)) {
 
-    // we got an array, convert it to an fvec 
+    // we got an array, convert it to an fvec
     if (PyArray_NDIM ((PyArrayObject *)input) == 0) {
       PyErr_SetString (PyExc_ValueError, "input array is a scalar");
       goto fail;
@@ -33,7 +33,7 @@
     }
 
     // vec = new_fvec (vec->length);
-    // no need to really allocate fvec, just its struct member 
+    // no need to really allocate fvec, just its struct member
     vec = (fvec_t *)malloc(sizeof(fvec_t));
     vec->length = PyArray_SIZE ((PyArrayObject *)array);
     vec->data = (smpl_t *) PyArray_GETPTR1 ((PyArrayObject *)array, 0);
@@ -61,7 +61,7 @@
 
 Py_cvec *
 PyAubio_CCvecToPyCvec (cvec_t * input) {
-  Py_cvec *vec = (Py_cvec*) PyObject_New (Py_cvec, &Py_cvecType); 
+  Py_cvec *vec = (Py_cvec*) PyObject_New (Py_cvec, &Py_cvecType);
   vec->length = input->length;
   vec->o = input;
   Py_INCREF(vec);
@@ -97,6 +97,57 @@
 
 fmat_t *
 PyAubio_ArrayToCFmat (PyObject *input) {
+  PyObject *array;
+  fmat_t *mat;
+  uint_t i;
+  if (input == NULL) {
+    PyErr_SetString (PyExc_ValueError, "input array is not a python object");
+    goto fail;
+  }
+  // parsing input object into a Py_fvec
+  if (PyArray_Check(input)) {
+
+    // we got an array, convert it to an fvec
+    if (PyArray_NDIM ((PyArrayObject *)input) == 0) {
+      PyErr_SetString (PyExc_ValueError, "input array is a scalar");
+      goto fail;
+    } else if (PyArray_NDIM ((PyArrayObject *)input) > 2) {
+      PyErr_SetString (PyExc_ValueError,
+          "input array has more than two dimensions");
+      goto fail;
+    }
+
+    if (!PyArray_ISFLOAT ((PyArrayObject *)input)) {
+      PyErr_SetString (PyExc_ValueError, "input array should be float");
+      goto fail;
+    } else if (PyArray_TYPE ((PyArrayObject *)input) != AUBIO_NPY_SMPL) {
+      PyErr_SetString (PyExc_ValueError, "input array should be float32");
+      goto fail;
+    } else {
+      // input data type is float32, nothing else to do
+      array = input;
+    }
+
+    // no need to really allocate fvec, just its struct member
+    mat = (fmat_t *)malloc(sizeof(fmat_t));
+    mat->length = PyArray_DIM ((PyArrayObject *)array, 1);
+    mat->height = PyArray_DIM ((PyArrayObject *)array, 0);
+    mat->data = (smpl_t **)malloc(sizeof(smpl_t*) * mat->height);
+    for (i=0; i< mat->height; i++) {
+      mat->data[i] = (smpl_t*)PyArray_GETPTR1 ((PyArrayObject *)array, i);
+    }
+
+  } else if (PyObject_TypeCheck (input, &PyList_Type)) {
+    PyErr_SetString (PyExc_ValueError, "can not convert list to fmat");
+    return NULL;
+  } else {
+    PyErr_SetString (PyExc_ValueError, "can only accept matrix of float as input");
+    return NULL;
+  }
+
+  return mat;
+
+fail:
   return NULL;
 }