From: Paul Brossier Date: Mon, 18 Apr 2016 18:32:07 +0000 (+0200) Subject: ext/py-phasevoc.c: continue fixing memory leak (#49) X-Git-Tag: 0.4.4~300^2~323 X-Git-Url: https://git.aubio.org/?a=commitdiff_plain;h=202697ace5750f91e7b71878c482b2e4788f69d2;p=aubio.git ext/py-phasevoc.c: continue fixing memory leak (#49) --- diff --git a/python/ext/py-phasevoc.c b/python/ext/py-phasevoc.c index 6767e921..2b800827 100644 --- a/python/ext/py-phasevoc.c +++ b/python/ext/py-phasevoc.c @@ -2,7 +2,16 @@ static char Py_pvoc_doc[] = "pvoc object"; -AUBIO_DECLARE(pvoc, uint_t win_s; uint_t hop_s) +typedef struct +{ + PyObject_HEAD + aubio_pvoc_t * o; + uint_t win_s; + uint_t hop_s; + cvec_t *output; + fvec_t *routput; +} Py_pvoc; + //AUBIO_NEW(pvoc) static PyObject * @@ -46,20 +55,30 @@ Py_pvoc_new (PyTypeObject * type, PyObject * args, PyObject * kwds) return NULL; } + self->output = new_cvec(self->win_s); + self->routput = new_fvec(self->hop_s); + return (PyObject *) self; } AUBIO_INIT(pvoc, self->win_s, self->hop_s) -AUBIO_DEL(pvoc) +static void +Py_pvoc_del (Py_pvoc *self, PyObject *unused) +{ + del_aubio_pvoc(self->o); + del_cvec(self->output); + del_fvec(self->routput); + self->ob_type->tp_free((PyObject *) self); +} + static PyObject * Py_pvoc_do(Py_pvoc * self, PyObject * args) { PyObject *input; fvec_t *vec; - cvec_t *output; if (!PyArg_ParseTuple (args, "O", &input)) { return NULL; @@ -71,11 +90,9 @@ Py_pvoc_do(Py_pvoc * self, PyObject * args) return NULL; } - output = new_cvec(self->win_s); - // compute the function - aubio_pvoc_do (self->o, vec, output); - return (PyObject *)PyAubio_CCvecToPyCvec(output); + aubio_pvoc_do (self->o, vec, self->output); + return (PyObject *)PyAubio_CCvecToPyCvec(self->output); } AUBIO_MEMBERS_START(pvoc) @@ -90,8 +107,6 @@ Py_pvoc_rdo(Py_pvoc * self, PyObject * args) { PyObject *input; cvec_t *vec; - fvec_t *output; - if (!PyArg_ParseTuple (args, "O", &input)) { return NULL; } @@ -102,11 +117,9 @@ Py_pvoc_rdo(Py_pvoc * self, PyObject * args) return NULL; } - output = new_fvec(self->hop_s); - // compute the function - aubio_pvoc_rdo (self->o, vec, output); - return (PyObject *)PyAubio_CFvecToArray(output); + aubio_pvoc_rdo (self->o, vec, self->routput); + return (PyObject *)PyAubio_CFvecToArray(self->routput); } static PyMethodDef Py_pvoc_methods[] = {