Showing the changes to python (2 of 2 files). Show all
Unified · Split
| @@ -6,7 +6,8 @@ typedef struct · 5 unmodified lines | ||
| 6 | 6 | aubio_filter_t * o; |
| 7 | 7 | uint_t order; |
| 8 | 8 | fvec_t vec; |
| 9 | − fvec_t *out; | |
| 9 | + PyObject *out; | |
| 10 | + fvec_t c_out; | |
| 10 | 11 | } Py_filter; |
| 11 | 12 | |
| 12 | 13 | static char Py_filter_doc[] = "filter object"; |
| @@ -49,19 +50,19 @@ Py_filter_init (Py_filter * self, PyObject * args, PyObject * kwds) · 36 unmodified lines | ||
| 49 | 50 | if (self->o == NULL) { |
| 50 | 51 | return -1; |
| 51 | 52 | } |
| 52 | − self->out = new_fvec(Py_default_vector_length); | |
| 53 | + self->out = NULL; | |
| 53 | 54 | return 0; |
| 54 | 55 | } |
| 55 | 56 | |
| 56 | 57 | static void |
| 57 | 58 | Py_filter_del (Py_filter * self) |
| 58 | 59 | { |
| 59 | − del_fvec(self->out); | |
| 60 | + Py_XDECREF(self->out); | |
| 60 | 61 | del_aubio_filter (self->o); |
| 61 | 62 | Py_TYPE(self)->tp_free ((PyObject *) self); |
| 62 | 63 | } |
| 63 | 64 | |
| 64 | −static PyObject * | |
| 65 | +static PyObject * | |
| 65 | 66 | Py_filter_do(Py_filter * self, PyObject * args) |
| 66 | 67 | { |
| 67 | 68 | PyObject *input; |
| @@ -78,17 +79,21 @@ Py_filter_do(Py_filter * self, PyObject * args) · 10 unmodified lines | ||
| 78 | 79 | return NULL; |
| 79 | 80 | } |
| 80 | 81 | |
| 81 | − // reallocate the output if needed | |
| 82 | − if (self->vec.length != self->out->length) { | |
| 83 | − del_fvec(self->out); | |
| 84 | − self->out = new_fvec(self->vec.length); | |
| 82 | + // initialize output now | |
| 83 | + if (self->out == NULL) { | |
| 84 | + self->out = new_py_fvec(self->vec.length); | |
| 85 | + } | |
| 86 | + | |
| 87 | + Py_INCREF(self->out); | |
| 88 | + if (!PyAubio_ArrayToCFvec(self->out, &(self->c_out)) ) { | |
| 89 | + return NULL; | |
| 85 | 90 | } |
| 86 | 91 | // compute the function |
| 87 | − aubio_filter_do_outplace (self->o, &(self->vec), self->out); | |
| 88 | − return PyAubio_CFvecToArray(self->out); | |
| 92 | + aubio_filter_do_outplace (self->o, &(self->vec), &(self->c_out)); | |
| 93 | + return self->out; | |
| 89 | 94 | } |
| 90 | 95 | |
| 91 | −static PyObject * | |
| 96 | +static PyObject * | |
| 92 | 97 | Py_filter_set_c_weighting (Py_filter * self, PyObject *args) |
| 93 | 98 | { |
| 94 | 99 | uint_t err = 0; |
| @@ -106,7 +111,7 @@ Py_filter_set_c_weighting (Py_filter * self, PyObject *args) · 11 unmodified lines | ||
| 106 | 111 | Py_RETURN_NONE; |
| 107 | 112 | } |
| 108 | 113 | |
| 109 | −static PyObject * | |
| 114 | +static PyObject * | |
| 110 | 115 | Py_filter_set_a_weighting (Py_filter * self, PyObject *args) |
| 111 | 116 | { |
| 112 | 117 | uint_t err = 0; |
| @@ -48,15 +48,15 @@ pyfromaubio_fn = { · 47 unmodified lines | ||
| 48 | 48 | } |
| 49 | 49 | |
| 50 | 50 | newfromtype_fn = { |
| 51 | − 'fvec_t*': 'new_fvec', | |
| 52 | − 'fmat_t*': 'new_fmat', | |
| 53 | − 'cvec_t*': 'new_cvec', | |
| 51 | + 'fvec_t*': 'new_py_fvec', | |
| 52 | + 'fmat_t*': 'new_py_fmat', | |
| 53 | + 'cvec_t*': 'new_py_cvec', | |
| 54 | 54 | } |
| 55 | 55 | |
| 56 | 56 | delfromtype_fn = { |
| 57 | − 'fvec_t*': 'del_fvec', | |
| 58 | − 'fmat_t*': 'del_fmat', | |
| 59 | − 'cvec_t*': 'del_cvec', | |
| 57 | + 'fvec_t*': 'Py_DECREF', | |
| 58 | + 'fmat_t*': 'Py_DECREF', | |
| 59 | + 'cvec_t*': 'Py_DECREF', | |
| 60 | 60 | } |
| 61 | 61 | |
| 62 | 62 | param_init = { |
| @@ -168,8 +168,8 @@ class MappedObject(object): · 105 unmodified lines | ||
| 168 | 168 | self.outputs = get_params_types_names(self.do_proto)[2:] |
| 169 | 169 | self.do_inputs = [get_params_types_names(self.do_proto)[1]] |
| 170 | 170 | self.do_outputs = get_params_types_names(self.do_proto)[2:] |
| 171 | − self.outputs_flat = get_output_params(self.do_proto) | |
| 172 | − self.output_results = "; ".join(self.outputs_flat) | |
| 171 | + struct_output_str = ["PyObject *{0[name]}; {1} c_{0[name]}".format(i, i['type'][:-1]) for i in self.do_outputs] | |
| 172 | + self.struct_outputs = ";\n ".join(struct_output_str) | |
| 173 | 173 | |
| 174 | 174 | #print ("input_params: ", map(split_type, get_input_params(self.do_proto))) |
| 175 | 175 | #print ("output_params", map(split_type, get_output_params(self.do_proto))) |
| @@ -201,7 +201,7 @@ typedef struct{{ · 25 unmodified lines | ||
| 201 | 201 | // do input vectors |
| 202 | 202 | {do_inputs_list}; |
| 203 | 203 | // output results |
| 204 | − {output_results}; | |
| 204 | + {struct_outputs}; | |
| 205 | 205 | }} Py_{shortname}; |
| 206 | 206 | """ |
| 207 | 207 | # fmat_t* / fvec_t* / cvec_t* inputs -> full fvec_t /.. struct in Py_{shortname} |
| @@ -379,24 +379,35 @@ Py_{shortname}_do (Py_{shortname} * self, PyObject * args) · 171 unmodified lines | ||
| 379 | 379 | if (!PyArg_ParseTuple (args, "{pyparamtypes}", {refs})) {{ |
| 380 | 380 | return NULL; |
| 381 | 381 | }}""".format(refs = refs, pyparamtypes = pyparamtypes, **self.__dict__) |
| 382 | − for p in input_params: | |
| 382 | + for input_param in input_params: | |
| 383 | 383 | out += """ |
| 384 | + | |
| 384 | 385 | if (!{pytoaubio}(py_{0[name]}, &(self->{0[name]}))) {{ |
| 385 | 386 | return NULL; |
| 386 | 387 | }}""".format(input_param, pytoaubio = pytoaubio_fn[input_param['type']]) |
| 388 | + out += """ | |
| 389 | + | |
| 390 | + // TODO: check input sizes""" | |
| 391 | + for output_param in output_params: | |
| 392 | + out += """ | |
| 393 | + | |
| 394 | + Py_INCREF(self->{0[name]}); | |
| 395 | + if (!{pytoaubio}(self->{0[name]}, &(self->c_{0[name]}))) {{ | |
| 396 | + return NULL; | |
| 397 | + }}""".format(output_param, pytoaubio = pytoaubio_fn[output_param['type']]) | |
| 387 | 398 | do_fn = get_name(self.do_proto) |
| 388 | 399 | inputs = ", ".join(['&(self->'+p['name']+')' for p in input_params]) |
| 400 | + c_outputs = ", ".join(["&(self->c_%s)" % p['name'] for p in self.do_outputs]) | |
| 389 | 401 | outputs = ", ".join(["self->%s" % p['name'] for p in self.do_outputs]) |
| 390 | 402 | out += """ |
| 391 | 403 | |
| 392 | − {do_fn}(self->o, {inputs}, {outputs}); | |
| 404 | + {do_fn}(self->o, {inputs}, {c_outputs}); | |
| 393 | 405 | |
| 394 | − return (PyObject *) {aubiotonumpy} ({outputs}); | |
| 406 | + return {outputs}; | |
| 395 | 407 | }} |
| 396 | 408 | """.format( |
| 397 | 409 | do_fn = do_fn, |
| 398 | − aubiotonumpy = pyfromaubio_fn[output['type']], | |
| 399 | − inputs = inputs, outputs = outputs, | |
| 410 | + inputs = inputs, outputs = outputs, c_outputs = c_outputs, | |
| 400 | 411 | ) |
| 401 | 412 | return out |
| 402 | 413 | |