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