#include "aubio-types.h"
-/* cvec type definition
+/* cvec type definition
class cvec():
- def __init__(self, length = 1024):
- self.length = length
- self.norm = array(length)
- self.phas = array(length)
+ def __new__(self, length = 1024):
+ self.length = length / 2 + 1
+ self.norm = np.zeros(length / 2 + 1)
+ self.phas = np.zeros(length / 2 + 1)
*/
+// special python type for cvec
+typedef struct
+{
+ PyObject_HEAD
+ PyObject *norm;
+ PyObject *phas;
+ uint_t length;
+} Py_cvec;
+
static char Py_cvec_doc[] = "cvec object";
+PyObject *
+PyAubio_CCvecToPyCvec (cvec_t * input) {
+ if (input == NULL) {
+ PyErr_SetString (PyExc_ValueError, "PyAubio_CCvecToPyCvec got a null cvec!");
+ return NULL;
+ }
+ Py_cvec* vec = (Py_cvec*) PyObject_New (Py_cvec, &Py_cvecType);
+ npy_intp dims[] = { input->length, 1 };
+ vec->norm = PyArray_SimpleNewFromData (1, dims, AUBIO_NPY_SMPL, input->norm);
+ vec->phas = PyArray_SimpleNewFromData (1, dims, AUBIO_NPY_SMPL, input->phas);
+ vec->length = input->length;
+ return (PyObject *)vec;
+}
+
+int
+PyAubio_PyCvecToCCvec (PyObject *input, cvec_t *i) {
+ if (PyObject_TypeCheck (input, &Py_cvecType)) {
+ Py_cvec * in = (Py_cvec *)input;
+ if (in->norm == NULL) {
+ npy_intp dims[] = { in->length, 1 };
+ in->norm = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
+ }
+ if (in->phas == NULL) {
+ npy_intp dims[] = { in->length, 1 };
+ in->phas = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
+ }
+ i->norm = (smpl_t *) PyArray_GETPTR1 ((PyArrayObject *)(in->norm), 0);
+ i->phas = (smpl_t *) PyArray_GETPTR1 ((PyArrayObject *)(in->phas), 0);
+ i->length = ((Py_cvec*)input)->length;
+ return 1;
+ } else {
+ PyErr_SetString (PyExc_ValueError, "input array should be aubio.cvec");
+ return 0;
+ }
+}
+
static PyObject *
Py_cvec_new (PyTypeObject * type, PyObject * args, PyObject * kwds)
{
return NULL;
}
-
self = (Py_cvec *) type->tp_alloc (type, 0);
self->length = Py_default_vector_length / 2 + 1;
static int
Py_cvec_init (Py_cvec * self, PyObject * args, PyObject * kwds)
{
- self->o = new_cvec ((self->length - 1) * 2);
- if (self->o == NULL) {
- return -1;
- }
-
+ self->norm = NULL;
+ self->phas = NULL;
return 0;
}
static void
Py_cvec_del (Py_cvec * self)
{
- del_cvec (self->o);
+ Py_XDECREF(self->norm);
+ Py_XDECREF(self->phas);
Py_TYPE(self)->tp_free ((PyObject *) self);
}
if (args == NULL) {
goto fail;
}
- cvec_print ( self->o );
+ // hide actual norm / phas content
result = PyUnicode_Format (format, args);
}
PyObject *
-PyAubio_CvecNormToArray (Py_cvec * self)
-{
- npy_intp dims[] = { self->o->length, 1 };
- return PyArray_SimpleNewFromData (1, dims, AUBIO_NPY_SMPL, self->o->norm);
-}
-
-
-PyObject *
-PyAubio_CvecPhasToArray (Py_cvec * self)
-{
- npy_intp dims[] = { self->o->length, 1 };
- return PyArray_SimpleNewFromData (1, dims, AUBIO_NPY_SMPL, self->o->phas);
-}
-
-PyObject *
-PyAubio_ArrayToCvecPhas (PyObject * self)
-{
- return NULL;
-}
-
-PyObject *
Py_cvec_get_norm (Py_cvec * self, void *closure)
{
- return PyAubio_CvecNormToArray(self);
+ // if it norm hasn't been created, create it now
+ if (self->norm == NULL) {
+ npy_intp dims[] = { self->length, 1 };
+ self->norm = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
+ }
+ Py_INCREF(self->norm);
+ return (PyObject*)(self->norm);
}
PyObject *
Py_cvec_get_phas (Py_cvec * self, void *closure)
{
- return PyAubio_CvecPhasToArray(self);
+ // if it phas hasn't been created, create it now
+ if (self->phas == NULL) {
+ npy_intp dims[] = { self->length, 1 };
+ self->phas = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
+ }
+ Py_INCREF(self->phas);
+ return (PyObject *)(self->phas);
}
static int
goto fail;
}
if (PyArray_Check(input)) {
-
- // we got an array, convert it to a cvec.norm
+ // we got an array, convert it to a cvec.norm
if (PyArray_NDIM ((PyArrayObject *)input) == 0) {
PyErr_SetString (PyExc_ValueError, "input array is a scalar");
goto fail;
PyArray_NDIM (array));
goto fail;
} else {
- if (vec->o->length != PyArray_SIZE (array)) {
+ if (vec->length != PyArray_SIZE (array)) {
PyErr_Format (PyExc_ValueError,
"input array has length %d, but cvec has length %d",
- (int)PyArray_SIZE (array), vec->o->length);
+ (int)PyArray_SIZE (array), vec->length);
goto fail;
}
}
- vec->o->norm = (smpl_t *) PyArray_GETPTR1 (array, 0);
+ Py_XDECREF(vec->norm);
+ vec->norm = input;
+ Py_INCREF(vec->norm);
} else {
PyErr_SetString (PyExc_ValueError, "can only accept array as input");
return 1;
}
- Py_INCREF(array);
return 0;
fail:
PyArray_NDIM (array));
goto fail;
} else {
- if (vec->o->length != PyArray_SIZE (array)) {
+ if (vec->length != PyArray_SIZE (array)) {
PyErr_Format (PyExc_ValueError,
"input array has length %d, but cvec has length %d",
- (int)PyArray_SIZE (array), vec->o->length);
+ (int)PyArray_SIZE (array), vec->length);
goto fail;
}
}
- vec->o->phas = (smpl_t *) PyArray_GETPTR1 (array, 0);
+ Py_XDECREF(vec->phas);
+ vec->phas = input;
+ Py_INCREF(vec->phas);
} else {
PyErr_SetString (PyExc_ValueError, "can only accept array as input");
return 1;
}
- Py_INCREF(array);
return 0;
fail:
// do / rdo output results
cvec_t *out;
fvec_t *rout;
- // bridge for cvec output
- Py_cvec *py_out;
} Py_fft;
static PyObject *
}
self->out = new_cvec(self->win_s);
- self->py_out = (Py_cvec*) PyObject_New (Py_cvec, &Py_cvecType);
- Py_XINCREF(self->py_out);
self->rout = new_fvec(self->win_s);
return 0;
static void
Py_fft_del (Py_fft *self, PyObject *unused)
{
- Py_XDECREF((PyObject*)(self->py_out));
del_aubio_fft(self->o);
del_cvec(self->out);
del_fvec(self->rout);
// compute the function
aubio_fft_do (((Py_fft *)self)->o, &(self->vecin), self->out);
-#if 0
- Py_cvec * py_out = (Py_cvec*) PyObject_New (Py_cvec, &Py_cvecType);
- PyObject* output = PyAubio_CCvecToPyCvec(self->out, py_out);
- return output;
-#else
- // convert cvec to py_cvec, incrementing refcount to keep a copy
- return PyAubio_CCvecToPyCvec(self->out, self->py_out);
-#endif
+ // convert cvec to py_cvec
+ return PyAubio_CCvecToPyCvec(self->out);
}
static PyMemberDef Py_fft_members[] = {
return NULL;
}
- if (!PyAubio_ArrayToCCvec (input, &(self->cvecin)) ) {
+ if (!PyAubio_PyCvecToCCvec (input, &(self->cvecin)) ) {
return NULL;
}