From 3e0446e7fda10c3d85a628b8c1effaa5bf7f5529 Mon Sep 17 00:00:00 2001 From: Thomas Grill Date: Mon, 14 Mar 2005 04:58:13 +0000 Subject: 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 --- externals/grill/py/source/pydsp.cpp | 72 ++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 38 deletions(-) (limited to 'externals/grill/py/source/pydsp.cpp') 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) -- cgit v1.2.1