diff options
Diffstat (limited to 'externals/grill/py/source/pyext.cpp')
-rw-r--r-- | externals/grill/py/source/pyext.cpp | 104 |
1 files changed, 76 insertions, 28 deletions
diff --git a/externals/grill/py/source/pyext.cpp b/externals/grill/py/source/pyext.cpp index 72ae41fd..0ebeab68 100644 --- a/externals/grill/py/source/pyext.cpp +++ b/externals/grill/py/source/pyext.cpp @@ -20,6 +20,15 @@ void pyext::Setup(t_classid c) { sym_get = flext::MakeSymbol("get"); + FLEXT_CADDMETHOD_(c,0,"doc",m_doc); + FLEXT_CADDMETHOD_(c,0,"dir",m_dir); +#ifdef FLEXT_THREADS + FLEXT_CADDATTR_VAR1(c,"detach",detach); + FLEXT_CADDMETHOD_(c,0,"stop",m_stop); +#endif + + FLEXT_CADDMETHOD_(c,0,"help",m_help); + FLEXT_CADDMETHOD_(c,0,"reload",m_reload_); FLEXT_CADDMETHOD_(c,0,"reload.",m_reload); FLEXT_CADDMETHOD_(c,0,"doc+",m_doc_); @@ -95,19 +104,31 @@ void pyext::SetThis() PyObject *pyext::class_obj = NULL; PyObject *pyext::class_dict = NULL; -pyext::pyext(int argc,const t_atom *argv): +pyext::pyext(int argc,const t_atom *argv,bool sig): pyobj(NULL),pythr(NULL), inlets(-1),outlets(-1), + siginlets(0),sigoutlets(0), methname(NULL) { - int apre = 0; +#ifdef FLEXT_THREADS + FLEXT_ADDTIMER(stoptmr,tick); + // launch thread worker + FLEXT_CALLMETHOD(threadworker); +#endif + int apre = 0; if(argc >= apre+2 && CanbeInt(argv[apre]) && CanbeInt(argv[apre+1])) { inlets = GetAInt(argv[apre]); outlets = GetAInt(argv[apre+1]); apre += 2; } + if(sig && argc >= apre+2 && CanbeInt(argv[apre]) && CanbeInt(argv[apre+1])) { + siginlets = GetAInt(argv[apre]); + sigoutlets = GetAInt(argv[apre+1]); + apre += 2; + } + const t_atom *clname = NULL; PyThreadState *state = PyLock(); @@ -162,38 +183,46 @@ pyext::pyext(int argc,const t_atom *argv): if(argc > apre) args(argc-apre,argv+apre); + PyUnlock(state); +} + +bool pyext::Init() +{ + PyThreadState *state = PyLock(); + if(methname) { MakeInstance(); - - if(pyobj) - InitInOut(inlets,outlets); + if(pyobj) InitInOut(inlets,outlets); } - else + else inlets = outlets = 0; - PyUnlock(state); - if(inlets < 0 || outlets < 0) InitProblem(); else { - AddInAnything(1+inlets); + AddInSignal(siginlets); + AddInAnything((siginlets?0:1)+inlets); + AddOutSignal(sigoutlets); AddOutAnything(outlets); } - if(!pyobj) - InitProblem(); + PyUnlock(state); + + return pyobj && flext_dsp::Init(); } -pyext::~pyext() -{ - PyThreadState *state = PyLock(); +void pyext::Exit() +{ + pybase::Exit(); // exit threads + PyThreadState *state = PyLock(); DoExit(); - Unregister("_pyext"); UnimportModule(); PyUnlock(state); + + flext_dsp::Exit(); } bool pyext::DoInit() @@ -230,13 +259,15 @@ void pyext::DoExit() // try to run del to clean up the class instance PyObject *objdel = PyObject_GetAttrString(pyobj,"_del"); if(objdel) { - PyObject *args = PyTuple_New(0); - PyObject *ret = PyObject_Call(objdel,args,NULL); - if(!ret) - post("%s - Could not call _del method",thisName()); - else + Py_INCREF(emptytuple); + PyObject *ret = PyObject_Call(objdel,emptytuple,NULL); + if(ret) Py_DECREF(ret); - Py_DECREF(args); +#ifdef FLEXT_DEBUG + else + post("%s - Could not call _del method",thisName()); +#endif + Py_DECREF(emptytuple); Py_DECREF(objdel); } else @@ -269,7 +300,7 @@ void pyext::InitInOut(int &inl,int &outl) if(inl < 0) { // get number of inlets - inl = 1; + inl = inlets; PyObject *res = PyObject_GetAttrString(pyobj,"_inlets"); // get ref if(res) { if(PyCallable_Check(res)) { @@ -286,7 +317,7 @@ void pyext::InitInOut(int &inl,int &outl) } if(outl < 0) { // get number of outlets - outl = 1; + outl = outlets; PyObject *res = PyObject_GetAttrString(pyobj,"_outlets"); // get ref if(res) { if(PyCallable_Check(res)) { @@ -436,14 +467,12 @@ void pyext::m_set(int argc,const t_atom *argv) } -bool pyext::m_method_(int n,const t_symbol *s,int argc,const t_atom *argv) +bool pyext::CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv) { - bool ret = false; if(pyobj && n >= 1) - ret = work(n,s,argc,argv); + return work(n,s,argc,argv); else - post("%s - no method for type '%s' into inlet %i",thisName(),GetString(s),n); - return ret; + return flext_dsp::CbMethodResort(n,s,argc,argv); } @@ -522,6 +551,10 @@ bool pyext::work(int n,const t_symbol *s,int argc,const t_atom *argv) bool isfloat = s == sym_float && argc == 1; + // offset inlet index by signal inlets + // \note first one is shared with messages! + if(siginlets) n += siginlets-1; + // if float equals an integer, try int_* method if(isfloat && GetAFloat(argv[0]) == GetAInt(argv[0])) { sprintf(str,"int_%i",n); @@ -585,3 +618,18 @@ bool pyext::work(int n,const t_symbol *s,int argc,const t_atom *argv) Respond(ret); return ret; } + +PyObject *pyext::GetSig(int ix,bool in) { return NULL; } + +void pyext::CbClick() { pybase::OpenEditor(); } +bool pyext::CbDsp() { return false; } + +void pyext::DumpOut(const t_symbol *sym,int argc,const t_atom *argv) +{ + ToOutAnything(GetOutAttr(),sym?sym:thisTag(),argc,argv); +} + +bool pyext::thrcall(void *data) +{ + return FLEXT_CALLMETHOD_X(work_wrapper,data); +} |