shithub: aubio

Download patch

ref: a7f398d4247092f9247ea6c5c4df0cfb014e8ae4
parent: b5bef11ddd1694ea7702e2d182769ca4605c91c0
author: Paul Brossier <piem@piem.org>
date: Thu Apr 21 17:32:59 EDT 2016

python/lib/gen_code.py: use new proxy functions

--- a/python/lib/gen_code.py
+++ b/python/lib/gen_code.py
@@ -38,7 +38,7 @@
 pytoaubio_fn = {
         'fvec_t*': 'PyAubio_ArrayToCFvec',
         'cvec_t*': 'PyAubio_ArrayToCCvec',
-        'fmat_t*': 'PyAubio_ArrayToCFmat',
+        #'fmat_t*': 'PyAubio_ArrayToCFmat',
         }
 
 pyfromaubio_fn = {
@@ -74,6 +74,7 @@
         'char_t*': 's',
         'fmat_t*': 'O',
         'fvec_t*': 'O',
+        'cvec_t*': 'O',
         }
 
 objoutsize = {
@@ -83,8 +84,9 @@
         'sampler': 'self->hop_size',
         'mfcc': 'self->n_coeffs',
         'specdesc': '1',
-        'tempo': '1',
+        'tempo': '2',
         'filterbank': 'self->n_filters',
+        'tss': 'self->hop_size',
         }
 
 def get_name(proto):
@@ -104,20 +106,20 @@
     """ arg = 'foo *name' 
         return ['foo*', 'name'] """
     l = arg.split()
-    type_arg = {'type': l[0], 'name': l[1]}
-    # ['foo', '*name'] -> ['foo*', 'name']
-    if l[-1].startswith('*'):
-        #return [l[0]+'*', l[1][1:]]
-        type_arg['type'] = l[0] + '*'
-        type_arg['name'] = l[1][1:]
-    # ['foo', '*', 'name'] -> ['foo*', 'name']
-    if len(l) == 3:
-        #return [l[0]+l[1], l[2]]
-        type_arg['type'] = l[0]+l[1]
-        type_arg['name'] = l[2]
-    else:
-        #return l
-        pass
+    type_arg = {} #'type': l[0], 'name': l[1]}
+    type_arg['type'] = " ".join(l[:-1])
+    type_arg['name'] = l[-1]
+    # fix up type / name
+    if type_arg['name'].startswith('*'):
+        # ['foo', '*name'] -> ['foo*', 'name']
+        type_arg['type'] += '*'
+        type_arg['name'] = type_arg['name'][1:]
+    if type_arg['type'].endswith(' *'):
+        # ['foo *', 'name'] -> ['foo*', 'name']
+        type_arg['type'] = type_arg['type'].replace(' *','*')
+    if type_arg['type'].startswith('const '):
+        # ['foo *', 'name'] -> ['foo*', 'name']
+        type_arg['type'] = type_arg['type'].replace('const ','')
     return type_arg
 
 def get_params(proto):
@@ -126,17 +128,29 @@
     returns: ['int argc', 'char ** argv']
     """
     import re
-    paramregex = re.compile('[\(, ](\w+ \*?\*? ?\w+)[, \)]')
-    return paramregex.findall(proto)
+    paramregex = re.compile('.*\((.*)\);')
+    a = paramregex.findall(proto)[0].split(', ')
+    #a = [i.replace('const ', '') for i in a]
+    return a
 
+def get_input_params(proto):
+    a = get_params(proto)
+    return [i.replace('const ', '') for i in a if (i.startswith('const ') or i.startswith('uint_t ') or i.startswith('smpl_t '))]
+
+def get_output_params(proto):
+    a = get_params(proto)
+    return [i for i in a if not i.startswith('const ')][1:]
+
 def get_params_types_names(proto):
     """ get the list of parameters from a function prototype
     example: proto = "int main (int argc, char ** argv)"
     returns: [['int', 'argc'], ['char **','argv']]
     """
-    return list(map(split_type, get_params(proto)))
+    a = list(map(split_type, get_params(proto)))
+    #print proto, a
+    #import sys; sys.exit(1)
+    return a
 
-
 class MappedObject(object):
 
     def __init__(self, prototypes):
@@ -148,11 +162,16 @@
         self.del_proto = prototypes['del'][0]
         self.do_proto = prototypes['do'][0]
         self.input_params = get_params_types_names(self.new_proto)
-        self.input_params_list = "; ".join(get_params(self.new_proto))
+        self.input_params_list = "; ".join(get_input_params(self.new_proto))
         self.outputs = get_params_types_names(self.do_proto)[2:]
-        self.outputs_flat = get_params(self.do_proto)[2:]
-        self.output_results = ", ".join(self.outputs_flat)
+        self.do_inputs = [get_params_types_names(self.do_proto)[1]]
+        self.do_outputs = get_params_types_names(self.do_proto)[2:]
+        self.outputs_flat = get_output_params(self.do_proto)
+        self.output_results = "; ".join(self.outputs_flat)
 
+        print "input_params", map(split_type, get_input_params(self.do_proto))
+        print "output_params", map(split_type, get_output_params(self.do_proto))
+
     def gen_code(self):
         out = ""
         out += self.gen_struct()
@@ -177,17 +196,19 @@
     {longname} *o;
     // input parameters
     {input_params_list};
+    // do input vectors
+    {do_inputs_list};
     // output results
     {output_results};
 }} Py_{shortname};
 """
-        return out.format(**self.__dict__)
+        return out.format(do_inputs_list = "; ".join(get_input_params(self.do_proto)), **self.__dict__)
 
     def gen_doc(self):
         out = """
 // TODO: add documentation
 static char Py_{shortname}_doc[] = \"undefined\";
-    """
+"""
         return out.format(**self.__dict__)
 
     def gen_new(self):
@@ -221,7 +242,7 @@
 """.format(**self.__dict__)
         params = self.input_params
         for p in params:
-            out += self.check_valid(p) 
+            out += self.check_valid(p)
         out += """
     return (PyObject *)self;
 }
@@ -289,6 +310,9 @@
         out += """
   // TODO get internal params after actual object creation?
 """
+        for input_param in self.do_inputs:
+            out += """
+  self->{0} = ({1})malloc(sizeof({2}));""".format(input_param['name'], input_param['type'], input_param['type'][:-1])
         out += """
   // create outputs{output_create}
 """.format(output_create = output_create)
@@ -317,6 +341,9 @@
 static void
 Py_{shortname}_del  (Py_{shortname} * self, PyObject * unused)
 {{""".format(**self.__dict__)
+        for input_param in self.do_inputs:
+            out += """
+    free(self->{0[name]});""".format(input_param)
         for o in self.outputs:
             name = o['name']
             del_out = delfromtype_fn[o['type']]
@@ -331,39 +358,45 @@
         return out
 
     def gen_do(self):
-        do_fn = get_name(self.do_proto)
-        input_param = get_params_types_names(self.do_proto)[1];
-        pytoaubio = pytoaubio_fn[input_param['type']]
         output = self.outputs[0]
         out = """
 // do {shortname}
 static PyObject*
 Py_{shortname}_do  (Py_{shortname} * self, PyObject * args)
-{{
-    PyObject * in_obj;
-    {input_type} {input_name};
-
-    if (!PyArg_ParseTuple (args, "O", &in_obj)) {{
+{{""".format(**self.__dict__)
+        input_params = self.do_inputs
+        output_params = self.do_outputs
+        #print input_params
+        #print output_params
+        for input_param in input_params:
+            out += """
+    PyObject *py_{0};""".format(input_param['name'], input_param['type'])
+        refs = ", ".join(["&py_%s" % p['name'] for p in input_params])
+        pyparamtypes = "".join([pyargparse_chars[p['type']] for p in input_params])
+        out += """
+    if (!PyArg_ParseTuple (args, "{pyparamtypes}", {refs})) {{
         return NULL;
-    }}
-    {input_name} = {pytoaubio} (in_obj); 
-    if ({input_name} == NULL) {{
+    }}""".format(refs = refs, pyparamtypes = pyparamtypes, **self.__dict__)
+        for p in input_params:
+            out += """
+    if (!{pytoaubio}(py_{0[name]}, self->{0[name]})) {{
         return NULL;
-    }}
+    }}""".format(input_param, pytoaubio = pytoaubio_fn[input_param['type']])
+        do_fn = get_name(self.do_proto)
+        inputs = ", ".join(['self->'+p['name'] for p in input_params])
+        outputs = ", ".join(["self->%s" % p['name'] for p in self.do_outputs])
+        out += """
 
-    {do_fn}(self->o, {input_name}, {outputs});
+    {do_fn}(self->o, {inputs}, {outputs});
 
     return (PyObject *) {aubiotonumpy} ({outputs});
 }}
-"""
-        return out.format(do_fn = do_fn,
-                shortname = self.prototypes['shortname'],
-                input_name = input_param['name'],
-                input_type= input_param['type'],
-                pytoaubio = pytoaubio,
-                outputs = ", ".join(["self->%s" % p['name'] for p in self.outputs]),
-                aubiotonumpy = pyfromaubio_fn[output['type']], 
-                )
+""".format(
+        do_fn = do_fn,
+        aubiotonumpy = pyfromaubio_fn[output['type']], 
+        inputs = inputs, outputs = outputs,
+        )
+        return out
 
     def gen_set(self):
         out = """
--- a/python/lib/gen_external.py
+++ b/python/lib/gen_external.py
@@ -116,7 +116,7 @@
                 print ( "{:15s} {:10s} {:s}".format(o, family, lib[o][family] ) )
             elif len(lib[o][family]) == 1:
                 print ( "{:15s} {:10s} {:s}".format(o, family, lib[o][family][0] ) )
-            else:                                             
+            else:
                 print ( "{:15s} {:10s} {:d}".format(o, family, len(lib[o][family]) ) )
     """
 
@@ -158,7 +158,7 @@
         f.write(out)
         print ("wrote %s" % output_file )
         sources_list.append(output_file)
-    
+
     objlist = "".join(["extern PyTypeObject Py_%sType;\n" % p for p in lib])
     out = """
 // generated list of objects created with gen_external.py