aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/py/source/py.cpp
diff options
context:
space:
mode:
authorThomas Grill <xovo@users.sourceforge.net>2005-03-13 04:59:47 +0000
committerThomas Grill <xovo@users.sourceforge.net>2005-03-13 04:59:47 +0000
commit3ce0fb7e8ad57909fadcd4072817d69bc54e3a66 (patch)
treef4d4478420cc9f34bf26835f2edc5bd03f95a86b /externals/grill/py/source/py.cpp
parent0e0bfeecb60ffa25d997830553685482c666b7ba (diff)
pydsp: share dsp buffer objects at inplace operation
DSP support for py/pyext: new objects pyext~,pyx~,pyext.~,pyx.~ new base class for py and pyext classes preset sys.argv for module loading support for buffer objects (preliminary) py: bang in left inlet now really triggers without arguments fixes for detached operation and single-threaded version little restructuring adjust pd and py files for correct argument passing more optimizations update for new flext callback naming use lock count instead of message queuing to avoid py->py messaging deadlock pyext: fix for inlet count svn path=/trunk/; revision=2624
Diffstat (limited to 'externals/grill/py/source/py.cpp')
-rw-r--r--externals/grill/py/source/py.cpp83
1 files changed, 64 insertions, 19 deletions
diff --git a/externals/grill/py/source/py.cpp b/externals/grill/py/source/py.cpp
index 3856739e..bf3ff8fb 100644
--- a/externals/grill/py/source/py.cpp
+++ b/externals/grill/py/source/py.cpp
@@ -11,19 +11,23 @@ WARRANTIES, see the file, "license.txt," in this distribution.
#include "main.h"
-class pyobj:
- public py
+class pyobj
+ : public pybase
+ , public flext_base
{
- FLEXT_HEADER_S(pyobj,py,Setup)
+ FLEXT_HEADER_S(pyobj,flext_base,Setup)
public:
pyobj(int argc,const t_atom *argv);
~pyobj();
protected:
- bool m_method_(int n,const t_symbol *s,int argc,const t_atom *argv);
+ virtual void Exit();
- bool work(const t_symbol *s,int argc,const t_atom *argv);
+ virtual bool CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv);
+ virtual void CbClick();
+
+ void m_help();
void m_reload();
void m_reload_(int argc,const t_atom *argv);
@@ -31,16 +35,14 @@ protected:
void m_dir_() { m__dir(function); }
void m_doc_() { m__doc(function); }
- virtual void m_help();
-
// methods for python arguments
void callwork(const t_symbol *s,int argc,const t_atom *argv);
- void m_bang() { callwork(sym_bang,0,NULL); }
- void m_py_list(int argc,const t_atom *argv) { callwork(sym_list,argc,argv); }
- void m_py_float(int argc,const t_atom *argv) { callwork(sym_float,argc,argv); }
- void m_py_int(int argc,const t_atom *argv) { callwork(sym_int,argc,argv); }
- void m_py_any(const t_symbol *s,int argc,const t_atom *argv) { callwork(s,argc,argv); }
+ inline void m_bang() { callwork(NULL,0,NULL); }
+ inline void m_py_list(int argc,const t_atom *argv) { callwork(sym_list,argc,argv); }
+ inline void m_py_float(int argc,const t_atom *argv) { callwork(sym_float,argc,argv); }
+ inline void m_py_int(int argc,const t_atom *argv) { callwork(sym_int,argc,argv); }
+ inline void m_py_any(const t_symbol *s,int argc,const t_atom *argv) { callwork(s,argc,argv); }
const t_symbol *funname;
PyObject *function;
@@ -51,12 +53,16 @@ protected:
void SetFunction(const char *func);
void ResetFunction();
+ virtual bool thrcall(void *data);
+ virtual void DumpOut(const t_symbol *sym,int argc,const t_atom *argv);
+
private:
virtual bool callpy(PyObject *fun,PyObject *args);
static void Setup(t_classid c);
+ FLEXT_CALLBACK(m_help)
FLEXT_CALLBACK(m_bang)
FLEXT_CALLBACK(m_reload)
FLEXT_CALLBACK_V(m_reload_)
@@ -69,10 +75,20 @@ private:
FLEXT_CALLBACK_V(m_py_int)
FLEXT_CALLBACK_A(m_py_any)
+ // callbacks
+ FLEXT_ATTRVAR_I(detach)
+ FLEXT_ATTRVAR_B(respond)
+ FLEXT_CALLBACK_V(m_stop)
+ FLEXT_CALLBACK(m_dir)
+ FLEXT_CALLGET_V(mg_dir)
+ FLEXT_CALLBACK(m_doc)
+
#ifdef FLEXT_THREADS
- FLEXT_THREAD_A(work)
+ FLEXT_CALLBACK_T(tick)
+ FLEXT_THREAD(threadworker)
+ FLEXT_THREAD_X(work_wrapper)
#else
- FLEXT_CALLBACK_A(work)
+ FLEXT_CALLBACK_X(work_wrapper)
#endif
};
@@ -81,6 +97,14 @@ FLEXT_LIB_V("py",pyobj)
void pyobj::Setup(t_classid c)
{
+ 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_);
@@ -100,11 +124,17 @@ void pyobj::Setup(t_classid c)
pyobj::pyobj(int argc,const t_atom *argv):
function(NULL),funname(NULL),withfunction(false)
{
- PyThreadState *state = PyLock();
-
AddInAnything(2);
AddOutAnything();
+#ifdef FLEXT_THREADS
+ FLEXT_ADDTIMER(stoptmr,tick);
+ // launch thread worker
+ FLEXT_CALLMETHOD(threadworker);
+#endif
+
+ PyThreadState *state = PyLock();
+
if(argc > 2)
SetArgs(argc-2,argv+2);
else
@@ -163,10 +193,13 @@ pyobj::~pyobj()
PyUnlock(state);
}
+void pyobj::Exit()
+{
+ pybase::Exit();
+ flext_base::Exit();
+}
-
-
-bool pyobj::m_method_(int n,const t_symbol *s,int argc,const t_atom *argv)
+bool pyobj::CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv)
{
if(n == 1)
post("%s - no method for type %s",thisName(),GetString(s));
@@ -346,3 +379,15 @@ void pyobj::callwork(const t_symbol *s,int argc,const t_atom *argv)
Respond(ret);
}
+
+void pyobj::CbClick() { pybase::OpenEditor(); }
+
+void pyobj::DumpOut(const t_symbol *sym,int argc,const t_atom *argv)
+{
+ ToOutAnything(GetOutAttr(),sym?sym:thisTag(),argc,argv);
+}
+
+bool pyobj::thrcall(void *data)
+{
+ return FLEXT_CALLMETHOD_X(work_wrapper,data);
+}