aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/py/source/pydsp.cpp
diff options
context:
space:
mode:
authorThomas Grill <xovo@users.sourceforge.net>2005-03-14 04:58:13 +0000
committerThomas Grill <xovo@users.sourceforge.net>2005-03-14 04:58:13 +0000
commit3e0446e7fda10c3d85a628b8c1effaa5bf7f5529 (patch)
treeeac19e282f78a1d64759ca7dbeff02ee63d6a1d1 /externals/grill/py/source/pydsp.cpp
parentbf9523d0f232dc39ddf0b5d1985e93d431100c13 (diff)
fixes for OSX
docs optimizations and fixes use optimized version optimized function calls adjust pd and py files for correct argument passing more optimizations svn path=/trunk/; revision=2627
Diffstat (limited to 'externals/grill/py/source/pydsp.cpp')
-rw-r--r--externals/grill/py/source/pydsp.cpp72
1 files changed, 34 insertions, 38 deletions
diff --git a/externals/grill/py/source/pydsp.cpp b/externals/grill/py/source/pydsp.cpp
index b1f50c0d..4c9eea5c 100644
--- a/externals/grill/py/source/pydsp.cpp
+++ b/externals/grill/py/source/pydsp.cpp
@@ -26,7 +26,7 @@ protected:
virtual PyObject *GetSig(int ix,bool in);
- void NewBuffers(bool update = false);
+ void NewBuffers();
void FreeBuffers();
PyObject *dspfun,*sigfun;
@@ -46,18 +46,11 @@ bool pydsp::DoInit()
if(pyobj)
{
- NewBuffers();
-
dspfun = PyObject_GetAttrString(pyobj,"_dsp"); // get ref
if(dspfun && !PyMethod_Check(dspfun)) {
Py_DECREF(dspfun);
dspfun = NULL;
}
- sigfun = PyObject_GetAttrString(pyobj,"_signal"); // get ref
- if(sigfun && !PyMethod_Check(sigfun)) {
- Py_DECREF(sigfun);
- sigfun = NULL;
- }
}
return true;
}
@@ -72,29 +65,28 @@ void pydsp::DoExit()
PyObject *NAFromBuffer(PyObject *buf,int c,int n);
-void pydsp::NewBuffers(bool update)
+void pydsp::NewBuffers()
{
int i,n = Blocksize();
const int ins = CntInSig(),outs = CntOutSig();
t_sample *const *insigs = InSig();
t_sample *const *outsigs = OutSig();
+ // inlet/outlet count can't change so we don't have to deallocate
if(!buffers) {
int cnt = ins+outs;
- if(cnt) {
- buffers = new PyObject *[cnt];
- memset(buffers,0,cnt*sizeof(*buffers));
- }
+ buffers = new PyObject *[cnt];
+ memset(buffers,0,cnt*sizeof(*buffers));
}
for(i = 0; i < ins; ++i) {
- if(update) Py_XDECREF(buffers[i]);
+ Py_XDECREF(buffers[i]);
PyObject *b = PyBuffer_FromReadWriteMemory(insigs[i],n*sizeof(t_sample));
buffers[i] = NAFromBuffer(b,1,n);
Py_DECREF(b);
}
for(i = 0; i < outs; ++i) {
- if(update) Py_XDECREF(buffers[ins+i]);
+ Py_XDECREF(buffers[ins+i]);
if(i < ins && outsigs[i] == insigs[i]) {
// same vectors - share the objects!
buffers[ins+i] = buffers[i];
@@ -120,15 +112,14 @@ void pydsp::FreeBuffers()
bool pydsp::CbDsp()
{
- if(CntInSig() || CntOutSig())
+ if(pyobj && (CntInSig() || CntOutSig()))
{
- NewBuffers(true);
+ PyThreadState *state = PyLockSys();
+
+ NewBuffers();
if(dspfun) {
- PyThreadState *state = PyLock();
-// Py_INCREF(emptytuple);
- PyObject *ret = PyObject_Call(dspfun,emptytuple,NULL);
-// Py_DECREF(emptytuple);
+ PyObject *ret = PyObject_CallObject(dspfun,NULL);
if(ret)
Py_DECREF(ret);
else {
@@ -138,9 +129,20 @@ bool pydsp::CbDsp()
PyErr_Clear();
#endif
}
- PyUnlock(state);
}
- return true;
+
+ // do that here instead of where dspfun is initialized, so that
+ // _signal can be assigned in _dsp
+ // optimizations may be done there to assign the right _signal version
+ Py_XDECREF(sigfun);
+ sigfun = PyObject_GetAttrString(pyobj,"_signal"); // get ref
+ if(sigfun && !PyMethod_Check(sigfun)) {
+ Py_DECREF(sigfun);
+ sigfun = NULL;
+ }
+
+ PyUnlock(state);
+ return sigfun != NULL;
}
else
// switch on dsp only if there are signal inlets or outlets
@@ -149,25 +151,19 @@ bool pydsp::CbDsp()
void pydsp::CbSignal()
{
- if(sigfun) {
- PyThreadState *state = PyLock();
-// Py_INCREF(emptytuple);
- PyObject *ret = PyObject_Call(sigfun,emptytuple,NULL);
-// Py_DECREF(emptytuple);
-
- if(ret)
- Py_DECREF(ret);
- else {
+ PyThreadState *state = PyLockSys();
+ PyObject *ret = PyObject_CallObject(sigfun,NULL);
+
+ if(ret)
+ Py_DECREF(ret);
+ else {
#ifdef FLEXT_DEBUG
- PyErr_Print();
+ PyErr_Print();
#else
- PyErr_Clear();
+ PyErr_Clear();
#endif
- }
- PyUnlock(state);
}
- else
- flext_dsp::CbSignal();
+ PyUnlock(state);
}
PyObject *pydsp::GetSig(int ix,bool in)