History

python/ext/aubio-types.h: add new_py_ functions to create PyObjects instead of fvec_t, apply to py-fft.c

Paul Brossier committed 10 years ago

Commit ede5d381 parent ee092a84 files · +54 −33Browse files

Showing the changes to python/ext (4 of 4 files). Show all

Unified · Split

4 files
  1. python/ext/aubio-types.h +4 −0
  2. python/ext/aubioproxy.c +12 −0
  3. python/ext/py-cvec.c +18 −22
  4. python/ext/py-fft.c +20 −11
python/ext/aubio-types.h+4−0
@@ -52,6 +52,10 @@ · 51 unmodified lines
5252
5353 extern PyTypeObject Py_cvecType;
5454
55+PyObject * new_py_fvec(uint_t length);
56+PyObject * new_py_cvec(uint_t length);
57+PyObject * new_py_fmat(uint_t height, uint_t length);
58+
5559 // defined in aubio-proxy.c
5660 extern PyObject *PyAubio_CFvecToArray (fvec_t * self);
5761 extern int PyAubio_ArrayToCFvec (PyObject * self, fvec_t *out);
python/ext/aubioproxy.c+12−0
@@ -1,5 +1,17 @@
11 #include "aubio-types.h"
22
3+PyObject *
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 *
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+
315 PyObject *
416 PyAubio_CFvecToArray (fvec_t * self)
517 {
python/ext/py-cvec.c+18−22
@@ -21,6 +21,17 @@ typedef struct · 20 unmodified lines
2121
2222 static char Py_cvec_doc[] = "cvec object";
2323
24+
25+PyObject *
26+new_py_cvec(uint_t length) {
27+ Py_cvec* vec = (Py_cvec*) PyObject_New (Py_cvec, &Py_cvecType);
28+ npy_intp dims[] = { length / 2 + 1, 1 };
29+ vec->norm = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
30+ vec->phas = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
31+ vec->length = length / 2 + 1;
32+ return (PyObject*)vec;
33+}
34+
2435 PyObject *
2536 PyAubio_CCvecToPyCvec (cvec_t * input) {
2637 if (input == NULL) {
@@ -39,14 +50,6 @@ int · 12 unmodified lines
3950 PyAubio_PyCvecToCCvec (PyObject *input, cvec_t *i) {
4051 if (PyObject_TypeCheck (input, &Py_cvecType)) {
4152 Py_cvec * in = (Py_cvec *)input;
42− if (in->norm == NULL) {
43− npy_intp dims[] = { in->length, 1 };
44− in->norm = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
45− }
46− if (in->phas == NULL) {
47− npy_intp dims[] = { in->length, 1 };
48− in->phas = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
49− }
5053 i->norm = (smpl_t *) PyArray_GETPTR1 ((PyArrayObject *)(in->norm), 0);
5154 i->phas = (smpl_t *) PyArray_GETPTR1 ((PyArrayObject *)(in->phas), 0);
5255 i->length = ((Py_cvec*)input)->length;
@@ -91,16 +94,17 @@ Py_cvec_new (PyTypeObject * type, PyObject * args, PyObject * kwds) · 38 unmodified lines
9194 static int
9295 Py_cvec_init (Py_cvec * self, PyObject * args, PyObject * kwds)
9396 {
94− self->norm = NULL;
95− self->phas = NULL;
97+ npy_intp dims[] = { self->length, 1 };
98+ self->phas = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
99+ self->norm = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
96100 return 0;
97101 }
98102
99103 static void
100104 Py_cvec_del (Py_cvec * self)
101105 {
102− Py_XDECREF(self->norm);
103− Py_XDECREF(self->phas);
106+ Py_DECREF(self->norm);
107+ Py_DECREF(self->phas);
104108 Py_TYPE(self)->tp_free ((PyObject *) self);
105109 }
106110
@@ -134,11 +138,7 @@ fail: · 27 unmodified lines
134138 PyObject *
135139 Py_cvec_get_norm (Py_cvec * self, void *closure)
136140 {
137− // if it norm hasn't been created, create it now
138− if (self->norm == NULL) {
139− npy_intp dims[] = { self->length, 1 };
140− self->norm = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
141− }
141+ // we want self->norm to still exist after our caller return it
142142 Py_INCREF(self->norm);
143143 return (PyObject*)(self->norm);
144144 }
@@ -146,11 +146,7 @@ Py_cvec_get_norm (Py_cvec * self, void *closure) · 1 unmodified line
146146 PyObject *
147147 Py_cvec_get_phas (Py_cvec * self, void *closure)
148148 {
149− // if it phas hasn't been created, create it now
150− if (self->phas == NULL) {
151− npy_intp dims[] = { self->length, 1 };
152− self->phas = PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
153− }
149+ // we want self->phas to still exist after our caller return it
154150 Py_INCREF(self->phas);
155151 return (PyObject *)(self->phas);
156152 }
python/ext/py-fft.c+20−11
@@ -11,8 +11,8 @@ typedef struct · 10 unmodified lines
1111 fvec_t vecin;
1212 cvec_t cvecin;
1313 // do / rdo output results
14− cvec_t *out;
15− fvec_t *rout;
14+ PyObject *doout;
15+ PyObject *rdoout;
1616 } Py_fft;
1717
1818 static PyObject *
@@ -57,8 +57,8 @@ Py_fft_init (Py_fft * self, PyObject * args, PyObject * kwds) · 38 unmodified lines
5757 return -1;
5858 }
5959
60− self->out = new_cvec(self->win_s);
61− self->rout = new_fvec(self->win_s);
60+ self->doout = new_py_cvec(self->win_s);
61+ self->rdoout = new_py_fvec(self->win_s);
6262
6363 return 0;
6464 }
@@ -66,9 +66,9 @@ Py_fft_init (Py_fft * self, PyObject * args, PyObject * kwds) · 1 unmodified line
6666 static void
6767 Py_fft_del (Py_fft *self, PyObject *unused)
6868 {
69+ Py_XDECREF(self->doout);
70+ Py_XDECREF(self->rdoout);
6971 del_aubio_fft(self->o);
70− del_cvec(self->out);
71− del_fvec(self->rout);
7272 Py_TYPE(self)->tp_free((PyObject *) self);
7373 }
7474
@@ -85,10 +85,14 @@ Py_fft_do(Py_fft * self, PyObject * args) · 10 unmodified lines
8585 return NULL;
8686 }
8787
88+ cvec_t c_out;
89+ Py_INCREF(self->doout);
90+ if (!PyAubio_PyCvecToCCvec(self->doout, &c_out)) {
91+ return NULL;
92+ }
8893 // compute the function
89− aubio_fft_do (((Py_fft *)self)->o, &(self->vecin), self->out);
90− // convert cvec to py_cvec
91− return PyAubio_CCvecToPyCvec(self->out);
94+ aubio_fft_do (self->o, &(self->vecin), &c_out);
95+ return self->doout;
9296 }
9397
9498 static PyMemberDef Py_fft_members[] = {
@@ -110,9 +114,14 @@ Py_fft_rdo(Py_fft * self, PyObject * args) · 15 unmodified lines
110114 return NULL;
111115 }
112116
117+ fvec_t out;
118+ Py_INCREF(self->rdoout);
119+ if (!PyAubio_ArrayToCFvec(self->rdoout, &out) ) {
120+ return NULL;
121+ }
113122 // compute the function
114− aubio_fft_rdo (self->o, &(self->cvecin), self->rout);
115− return PyAubio_CFvecToArray(self->rout);
123+ aubio_fft_rdo (self->o, &(self->cvecin), &out);
124+ return self->rdoout;
116125 }
117126
118127 static PyMethodDef Py_fft_methods[] = {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t