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