History

python/lib/gen_code.py: switch to using PyObjects instead of fvec, cvec, fmat

Paul Brossier committed 10 years ago

Commit 21e84081 parent b055b4e2 files · +42 −26Browse files

Showing the changes to python (2 of 2 files). Show all

Unified · Split

2 files
  1. python/ext/py-filter.c +17 −12
  2. python/lib/gen_code.py +25 −14
python/ext/py-filter.c+17−12
@@ -6,7 +6,8 @@ typedef struct · 5 unmodified lines
66 aubio_filter_t * o;
77 uint_t order;
88 fvec_t vec;
9− fvec_t *out;
9+ PyObject *out;
10+ fvec_t c_out;
1011 } Py_filter;
1112
1213 static char Py_filter_doc[] = "filter object";
@@ -49,19 +50,19 @@ Py_filter_init (Py_filter * self, PyObject * args, PyObject * kwds) · 36 unmodified lines
4950 if (self->o == NULL) {
5051 return -1;
5152 }
52− self->out = new_fvec(Py_default_vector_length);
53+ self->out = NULL;
5354 return 0;
5455 }
5556
5657 static void
5758 Py_filter_del (Py_filter * self)
5859 {
59− del_fvec(self->out);
60+ Py_XDECREF(self->out);
6061 del_aubio_filter (self->o);
6162 Py_TYPE(self)->tp_free ((PyObject *) self);
6263 }
6364
64−static PyObject *
65+static PyObject *
6566 Py_filter_do(Py_filter * self, PyObject * args)
6667 {
6768 PyObject *input;
@@ -78,17 +79,21 @@ Py_filter_do(Py_filter * self, PyObject * args) · 10 unmodified lines
7879 return NULL;
7980 }
8081
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;
8590 }
8691 // 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;
8994 }
9095
91−static PyObject *
96+static PyObject *
9297 Py_filter_set_c_weighting (Py_filter * self, PyObject *args)
9398 {
9499 uint_t err = 0;
@@ -106,7 +111,7 @@ Py_filter_set_c_weighting (Py_filter * self, PyObject *args) · 11 unmodified lines
106111 Py_RETURN_NONE;
107112 }
108113
109−static PyObject *
114+static PyObject *
110115 Py_filter_set_a_weighting (Py_filter * self, PyObject *args)
111116 {
112117 uint_t err = 0;
python/lib/gen_code.py+25−14
@@ -48,15 +48,15 @@ pyfromaubio_fn = { · 47 unmodified lines
4848 }
4949
5050 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',
5454 }
5555
5656 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',
6060 }
6161
6262 param_init = {
@@ -168,8 +168,8 @@ class MappedObject(object): · 105 unmodified lines
168168 self.outputs = get_params_types_names(self.do_proto)[2:]
169169 self.do_inputs = [get_params_types_names(self.do_proto)[1]]
170170 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)
173173
174174 #print ("input_params: ", map(split_type, get_input_params(self.do_proto)))
175175 #print ("output_params", map(split_type, get_output_params(self.do_proto)))
@@ -201,7 +201,7 @@ typedef struct{{ · 25 unmodified lines
201201 // do input vectors
202202 {do_inputs_list};
203203 // output results
204− {output_results};
204+ {struct_outputs};
205205 }} Py_{shortname};
206206 """
207207 # 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
379379 if (!PyArg_ParseTuple (args, "{pyparamtypes}", {refs})) {{
380380 return NULL;
381381 }}""".format(refs = refs, pyparamtypes = pyparamtypes, **self.__dict__)
382− for p in input_params:
382+ for input_param in input_params:
383383 out += """
384+
384385 if (!{pytoaubio}(py_{0[name]}, &(self->{0[name]}))) {{
385386 return NULL;
386387 }}""".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']])
387398 do_fn = get_name(self.do_proto)
388399 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])
389401 outputs = ", ".join(["self->%s" % p['name'] for p in self.do_outputs])
390402 out += """
391403
392− {do_fn}(self->o, {inputs}, {outputs});
404+ {do_fn}(self->o, {inputs}, {c_outputs});
393405
394− return (PyObject *) {aubiotonumpy} ({outputs});
406+ return {outputs};
395407 }}
396408 """.format(
397409 do_fn = do_fn,
398− aubiotonumpy = pyfromaubio_fn[output['type']],
399− inputs = inputs, outputs = outputs,
410+ inputs = inputs, outputs = outputs, c_outputs = c_outputs,
400411 )
401412 return out
402413

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