1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
#include "aubio-types.h"
PyObject *
new_py_fvec(uint_t length) {
npy_intp dims[] = { length, 1 };
return PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
}
PyObject *
new_py_fmat(uint_t height, uint_t length) {
npy_intp dims[] = { height, length, 1 };
return PyArray_ZEROS(2, dims, AUBIO_NPY_SMPL, 0);
}
PyObject *
PyAubio_CFvecToArray (fvec_t * self)
{
npy_intp dims[] = { self->length, 1 };
return PyArray_SimpleNewFromData (1, dims, AUBIO_NPY_SMPL, self->data);
}
int
PyAubio_IsValidVector (PyObject * input) {
npy_intp length;
if (input == NULL) {
PyErr_SetString (PyExc_ValueError, "input array is not a python object");
return 0;
}
// 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");
return 0;
} else if (PyArray_NDIM ((PyArrayObject *)input) > 1) {
PyErr_SetString (PyExc_ValueError,
"input array has more than one dimensions");
return 0;
}
if (!PyArray_ISFLOAT ((PyArrayObject *)input)) {
PyErr_SetString (PyExc_ValueError, "input array should be float");
return 0;
} else if (PyArray_TYPE ((PyArrayObject *)input) != AUBIO_NPY_SMPL) {
PyErr_SetString (PyExc_ValueError, "input array should be " AUBIO_NPY_SMPL_STR);
return 0;
}
length = PyArray_SIZE ((PyArrayObject *)input);
if (length <= 0) {
PyErr_SetString (PyExc_ValueError, "input array size should be greater than 0");
return 0;
}
} else if (PyObject_TypeCheck (input, &PyList_Type)) {
PyErr_SetString (PyExc_ValueError, "does not convert from list yet");
return 0;
} else {
PyErr_SetString (PyExc_ValueError, "can only accept vector of float as input");
return 0;
}
return 1;
}
int
PyAubio_ArrayToCFvec (PyObject *input, fvec_t *out) {
if (!PyAubio_IsValidVector(input)){
return 0;
}
out->length = (uint_t) PyArray_SIZE ((PyArrayObject *)input);
out->data = (smpl_t *) PyArray_GETPTR1 ((PyArrayObject *)input, 0);
return 1;
}
PyObject *
PyAubio_CFmatToArray (fmat_t * input)
{
PyObject *array = NULL;
uint_t i;
npy_intp dims[] = { input->length, 1 };
PyObject *concat = PyList_New (0), *tmp = NULL;
for (i = 0; i < input->height; i++) {
tmp = PyArray_SimpleNewFromData (1, dims, AUBIO_NPY_SMPL, input->data[i]);
PyList_Append (concat, tmp);
Py_DECREF (tmp);
}
array = PyArray_FromObject (concat, AUBIO_NPY_SMPL, 2, 2);
Py_DECREF (concat);
return array;
}
int
PyAubio_ArrayToCFmat (PyObject *input, fmat_t *mat) {
uint_t i, new_height;
npy_intp length, height;
if (input == NULL) {
PyErr_SetString (PyExc_ValueError, "input array is not a python object");
return 0;
}
// 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");
return 0;
} else if (PyArray_NDIM ((PyArrayObject *)input) > 2) {
PyErr_SetString (PyExc_ValueError,
"input array has more than two dimensions");
return 0;
}
if (!PyArray_ISFLOAT ((PyArrayObject *)input)) {
PyErr_SetString (PyExc_ValueError, "input array should be float");
return 0;
} else if (PyArray_TYPE ((PyArrayObject *)input) != AUBIO_NPY_SMPL) {
PyErr_SetString (PyExc_ValueError, "input array should be " AUBIO_NPY_SMPL_STR);
return 0;
}
// no need to really allocate fvec, just its struct member
length = PyArray_DIM ((PyArrayObject *)input, 1);
if (length <= 0) {
PyErr_SetString (PyExc_ValueError, "input array dimension 1 should be greater than 0");
return 0;
}
height = PyArray_DIM ((PyArrayObject *)input, 0);
if (height <= 0) {
PyErr_SetString (PyExc_ValueError, "input array dimension 0 should be greater than 0");
return 0;
}
} else if (PyObject_TypeCheck (input, &PyList_Type)) {
PyErr_SetString (PyExc_ValueError, "can not convert list to fmat");
return 0;
} else {
PyErr_SetString (PyExc_ValueError, "can only accept matrix of float as input");
return 0;
}
new_height = (uint_t)PyArray_DIM ((PyArrayObject *)input, 0);
if (mat->height != new_height) {
if (mat->data) {
free(mat->data);
}
mat->data = (smpl_t **)malloc(sizeof(smpl_t*) * new_height);
}
mat->height = new_height;
mat->length = (uint_t)PyArray_DIM ((PyArrayObject *)input, 1);
for (i=0; i< mat->height; i++) {
mat->data[i] = (smpl_t*)PyArray_GETPTR1 ((PyArrayObject *)input, i);
}
return 1;
}
|