Update of /cvsroot/pure-data/externals/grill/flext/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13386/source
Modified Files: flbase.cpp flbase.h flclass.h fldsp.cpp fldsp.h flext.cpp flout.cpp flproxy.cpp Log Message: - better handling of click callback bugfixes and optimizations, especially for DSP under Max/MSP - more compatible handling of attributes in patcher (hiding is now an option - define FLEXT_ATTRHIDE)
Index: flout.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flout.cpp,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** flout.cpp 23 May 2005 16:52:45 -0000 1.22 --- flout.cpp 26 Sep 2005 13:59:34 -0000 1.23 *************** *** 192,213 **** ok = false; break; ! case xlet_float: ! inlets[ix] = NULL; ! if(ix >= 10) { ! post("%s: Only 9 float inlets possible",thisName()); ! ok = false; ! } ! else ! floatin(x_obj,ix); ! break; ! case xlet_int: ! inlets[ix] = NULL; ! if(ix >= 10) { ! post("%s: Only 9 int inlets possible",thisName()); ! ok = false; ! } ! else ! intin(x_obj,ix); ! break; case xlet_any: // non-leftmost case xlet_sym: --- 192,214 ---- ok = false; break; ! case xlet_float: { ! if(ix < 10) { ! inlets[ix] = NULL; ! floatin(x_obj,ix); ! break; ! } ! else ! goto makeproxy; ! } ! case xlet_int: { ! if(ix < 10) { ! inlets[ix] = NULL; ! intin(x_obj,ix); ! break; ! } ! else ! goto makeproxy; ! } ! makeproxy: case xlet_any: // non-leftmost case xlet_sym: *************** *** 222,231 **** } } ! ! // incnt = cnt; ! ! if(insigs) ! dsp_setup(thisHdr(),insigs); // signal inlets ! } #else #error --- 223,229 ---- } } ! ! while(ix >= 0) inlets[ix--] = NULL; ! } #else #error
Index: flext.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flext.cpp,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** flext.cpp 12 Sep 2005 10:27:40 -0000 1.39 --- flext.cpp 26 Sep 2005 13:59:34 -0000 1.40 *************** *** 49,53 **** }
! flext_base::~FLEXT_CLASSDEF(flext_base)() { #if FLEXT_SYS == FLEXT_SYS_PD && !defined(FLEXT_NOATTREDIT) --- 49,82 ---- }
! /*! This virtual function is called after the object has been created, that is, ! after the constructor has been processed. ! It creates the inlets and outlets and the message and attribute lists. ! \note You can override it in your own class, but be sure to call it, ! \note otherwise no inlets/outlets will be created ! \note All inlet, outlets, method and attribute declarations must be made before a call to Init! ! \remark Creation of inlets/outlets can't be done upon declaration, as Max/MSP needs creation ! \remark in reverse. ! */ ! bool flext_base::Init() ! { ! bool ok = flext_obj::Init(); ! ! if(ok) ok = InitInlets() && InitOutlets(); ! ! if(ok) { ! if(HasAttributes() && m_holdaargc && m_holdaargv) { ! // initialize creation attributes ! ok = InitAttrib(m_holdaargc,m_holdaargv); ! } ! } ! ! return ok; ! } ! ! ! /*! This virtual function is called before the destructor. ! We do this because here we can still call virtual methods. ! */ ! void flext_base::Exit() { #if FLEXT_SYS == FLEXT_SYS_PD && !defined(FLEXT_NOATTREDIT) *************** *** 56,65 **** #endif
- #if FLEXT_SYS == FLEXT_SYS_MAX - // according to David Z. one should do that first... - if(insigs) dsp_free(thisHdr()); - // if(insigs) dsp_freebox(thisHdr()); - #endif - #ifdef FLEXT_THREADS StopThreads(); --- 85,88 ---- *************** *** 102,132 **** } #endif - }
! /*! This virtual function is called after the object has been created, that is, ! after the constructor has been processed. ! It creates the inlets and outlets and the message and attribute lists. ! \note You can override it in your own class, but be sure to call it, ! \note otherwise no inlets/outlets will be created ! \note All inlet, outlets, method and attribute declarations must be made before a call to Init! ! \remark Creation of inlets/outlets can't be done upon declaration, as Max/MSP needs creation ! \remark in reverse. ! */ ! bool flext_base::Init() ! { ! bool ok = flext_obj::Init(); ! ! if(ok) ok = InitInlets() && InitOutlets(); ! ! if(ok) { ! if(HasAttributes() && m_holdaargc && m_holdaargv) { ! // initialize creation attributes ! ok = InitAttrib(m_holdaargc,m_holdaargv); ! } ! } ! ! return ok; }
/*! Set up proxy classes and basic methods at class creation time This ensures that they are processed before the registered flext messages --- 125,133 ---- } #endif
! flext_obj::Exit(); }
+ /*! Set up proxy classes and basic methods at class creation time This ensures that they are processed before the registered flext messages
Index: flproxy.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flproxy.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** flproxy.cpp 19 Jul 2005 13:17:50 -0000 1.10 --- flproxy.cpp 26 Sep 2005 13:59:34 -0000 1.11 *************** *** 43,47 **** void flext_base::cb_px_anything(t_class *c,const t_symbol *s,short argc,t_atom *argv) { - // check if inlet allows anything (or list) int ci = ((flext_hdr *)c)->curinlet; thisObject(c)->CbMethodHandler(ci,s,argc,argv); --- 43,46 ---- *************** *** 50,54 **** void flext_base::cb_px_int(t_class *c,long v) { - // check if inlet allows int type t_atom atom; SetInt(atom,v); int ci = ((flext_hdr *)c)->curinlet; --- 49,52 ---- *************** *** 58,62 **** void flext_base::cb_px_float(t_class *c,double v) { - // check if inlet allows float type t_atom atom; SetFloat(atom,v); int ci = ((flext_hdr *)c)->curinlet; --- 56,59 ---- *************** *** 66,70 **** void flext_base::cb_px_bang(t_class *c) { - // check if inlet allows bang int ci = ((flext_hdr *)c)->curinlet; thisObject(c)->CbMethodHandler(ci,sym_bang,0,NULL); --- 63,66 ---- *************** *** 106,110 **** add_method1(c,cb_px_int,"int",A_INT); add_method1(c,cb_px_float,"float",A_FLOAT); ! add_methodG(c,cb_px_anything,"list"); add_anything(c,cb_px_anything); #else --- 102,106 ---- add_method1(c,cb_px_int,"int",A_INT); add_method1(c,cb_px_float,"float",A_FLOAT); ! // add_methodG(c,cb_px_anything,"list"); add_anything(c,cb_px_anything); #else *************** *** 123,137 **** ADD_IN_FT(9); } - - #elif FLEXT_SYS == FLEXT_SYS_JMAX - void flext_base::jmax_proxy(fts_object_t *c, int winlet, fts_symbol_t s, int argc, const fts_atom_t *argv) - { - thisObject(c)->CbMethodHandler(winlet,s,argc,argv); - } - - void flext_base::SetProxies(t_class *c) - { - fts_class_set_default_handler(c, jmax_proxy); - } - #endif --- 119,121 ----
Index: flbase.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flbase.h,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** flbase.h 30 Jul 2005 12:21:41 -0000 1.33 --- flbase.h 26 Sep 2005 13:59:34 -0000 1.34 *************** *** 211,215 ****
//! Creation callback ! static void __setup__(t_classid) { flext::Setup(); }
/*! \brief This is a temporary holder --- 211,215 ----
//! Creation callback ! static void __setup__(t_classid);
/*! \brief This is a temporary holder
Index: fldsp.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldsp.h,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** fldsp.h 12 Sep 2005 10:27:40 -0000 1.16 --- fldsp.h 26 Sep 2005 13:59:34 -0000 1.17 *************** *** 53,73 ****
//! returns array of input vectors (CntInSig() vectors) ! t_sample *const *InSig() const { return invecs; }
//! returns input vector ! t_sample *InSig(int i) const { return invecs[i]; }
//! returns array of output vectors (CntOutSig() vectors) ! t_sample *const *OutSig() const { return outvecs; }
//! returns output vector ! t_sample *OutSig(int i) const { return outvecs[i]; }
//! typedef describing a signal vector - #if FLEXT_SYS == FLEXT_SYS_JMAX - typedef fts_symbol_t t_signalvec; - #else typedef t_sample *t_signalvec; - #endif
//! @} --- 53,69 ----
//! returns array of input vectors (CntInSig() vectors) ! t_sample *const *InSig() const { return vecs; }
//! returns input vector ! t_sample *InSig(int i) const { return vecs[i]; }
//! returns array of output vectors (CntOutSig() vectors) ! t_sample *const *OutSig() const { return vecs+CntInSig(); }
//! returns output vector ! t_sample *OutSig(int i) const { return vecs[CntInSig()+i]; }
//! typedef describing a signal vector typedef t_sample *t_signalvec;
//! @} *************** *** 146,150 **** FLEXT_CLASSDEF(flext_dsp)(); ! virtual ~FLEXT_CLASSDEF(flext_dsp)();
private: --- 142,151 ---- FLEXT_CLASSDEF(flext_dsp)(); ! ! #if FLEXT_SYS == FLEXT_SYS_MAX ! virtual bool Init(); ! #endif ! ! virtual void Exit();
private: *************** *** 153,157 **** float srate; int blksz; ! int chnsin,chnsout;
// setup function --- 154,158 ---- float srate; int blksz; ! t_signalvec *vecs;
// setup function *************** *** 159,191 ****
// callback functions ! ! #if FLEXT_SYS == FLEXT_SYS_JMAX ! static void cb_dsp(fts_object_t *o, int winlet, fts_symbol_t s, int ac, const fts_atom_t *at); ! // static void cb_dsp_init(fts_object_t *o, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at); ! // static void cb_dsp_delete(fts_object_t *o, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at); ! #elif FLEXT_SYS == FLEXT_SYS_MAX static void cb_dsp(t_class *c,t_signal **s,short *count); #else static void cb_dsp(t_class *c,t_signal **s); - #endif - - #if FLEXT_SYS != FLEXT_SYS_MAX - #if FLEXT_SYS == FLEXT_SYS_JMAX - static void cb_enable(fts_object_t *o, int winlet, fts_symbol_t s, int ac, const fts_atom_t *at); - #else static void cb_enable(t_class *c,t_float on); - #endif bool dspon; #endif
// dsp stuff - - #if FLEXT_SYS == FLEXT_SYS_JMAX - static void dspmeth(fts_word_t *); - static const t_symbol *dspsym; - #else static t_int *dspmeth(t_int *w); - #endif - t_signalvec *invecs,*outvecs; };
--- 160,173 ----
// callback functions ! #if FLEXT_SYS == FLEXT_SYS_MAX static void cb_dsp(t_class *c,t_signal **s,short *count); #else static void cb_dsp(t_class *c,t_signal **s); static void cb_enable(t_class *c,t_float on); bool dspon; #endif
// dsp stuff static t_int *dspmeth(t_int *w); };
Index: flbase.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flbase.cpp,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** flbase.cpp 12 Sep 2005 10:27:40 -0000 1.25 --- flbase.cpp 26 Sep 2005 13:59:34 -0000 1.26 *************** *** 53,56 **** --- 53,60 ---- void flext_obj::ProcessAttributes(bool attr) { process_attributes = attr; }
+ #if FLEXT_SYS == FLEXT_SYS_MAX + static const t_symbol *sym__shP = NULL; + #endif + ///////////////////////////////////////////////////////// // Constructor *************** *** 65,69 **** m_canvas = canvas_getcurrent(); #elif FLEXT_SYS == FLEXT_SYS_MAX ! m_canvas = (t_patcher *)gensym("#P")->s_thing; x_obj->curinlet = 0; #endif --- 69,73 ---- m_canvas = canvas_getcurrent(); #elif FLEXT_SYS == FLEXT_SYS_MAX ! m_canvas = (t_patcher *)sym__shP->s_thing; x_obj->curinlet = 0; #endif *************** *** 79,82 **** --- 83,93 ---- }
+ void flext_obj::__setup__(t_classid) + { + #if FLEXT_SYS == FLEXT_SYS_MAX + sym__shP = MakeSymbol("#P"); + #endif + flext::Setup(); + }
bool flext_obj::Init() { return true; }
Index: fldsp.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/fldsp.cpp,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** fldsp.cpp 23 May 2005 16:52:44 -0000 1.28 --- fldsp.cpp 26 Sep 2005 13:59:34 -0000 1.29 *************** *** 19,26 **** // === flext_dsp ==============================================
- #if FLEXT_SYS == FLEXT_SYS_JMAX - const t_symbol *flext_dsp::dspsym = MakeSymbol("__flext_dspfun__"); - #endif - void flext_dsp::Setup(t_classid id) { --- 19,22 ---- *************** *** 34,83 **** add_dsp(c,cb_dsp); add_method1(c,cb_enable,"enable",A_FLOAT); ! #elif FLEXT_SYS == FLEXT_SYS_JMAX ! fts_dsp_declare_function(dspsym,dspmeth); ! fts_class_message_varargs(c, fts_s_put, cb_dsp); ! fts_class_message_varargs(c, MakeSymbol("enable"), cb_enable); #endif }
! flext_dsp::FLEXT_CLASSDEF(flext_dsp)(): ! #if FLEXT_SYS == FLEXT_SYS_JMAX ! srate(fts_dsp_get_sample_rate()), // should we set it? ! blksz(fts_dsp_get_tick_size()), ! #else ! srate(sys_getsr()),blksz(sys_getblksize()), ! #endif ! chnsin(0),chnsout(0), #if FLEXT_SYS != FLEXT_SYS_MAX ! dspon(true), #endif ! invecs(NULL),outvecs(NULL) { ! #if FLEXT_SYS == FLEXT_SYS_JMAX ! fts_dsp_object_init(thisHdr()); ! #endif ! }
! flext_dsp::~FLEXT_CLASSDEF(flext_dsp)() { - #if FLEXT_SYS == FLEXT_SYS_JMAX - fts_dsp_object_delete(thisHdr()); - #endif - #if FLEXT_SYS == FLEXT_SYS_MAX ! // switch off dsp as the dsp function might get called afterwards (different thread) ! thisHdr()->z_disabled = true; #endif
! if(invecs) delete[] invecs; ! if(outvecs) delete[] outvecs; }
! #if FLEXT_SYS == FLEXT_SYS_JMAX ! void flext_dsp::dspmeth(fts_word_t *w) ! { ! } ! #else t_int *flext_dsp::dspmeth(t_int *w) { --- 30,72 ---- add_dsp(c,cb_dsp); add_method1(c,cb_enable,"enable",A_FLOAT); ! #else ! #error Platform not supported! #endif }
! flext_dsp::FLEXT_CLASSDEF(flext_dsp)() ! : srate(sys_getsr()),blksz(sys_getblksize()) ! , vecs(NULL) #if FLEXT_SYS != FLEXT_SYS_MAX ! , dspon(true) #endif ! {} ! ! #if FLEXT_SYS == FLEXT_SYS_MAX ! bool flext_dsp::Init() { ! if(!flext_base::Init()) ! return false;
+ // according to the Max/MSP SDK this should be prior to any inlet creation, BUT + // that doesn't seem to be true... multiple signal ins and additional inlets don't seem to work then + dsp_setup(thisHdr(),CntInSig()); // signal inlets + return true; + } + #endif
! void flext_dsp::Exit() { #if FLEXT_SYS == FLEXT_SYS_MAX ! // according to David Z. one should do that first... ! dsp_free(thisHdr()); #endif
! flext_base::Exit(); ! ! if(vecs) delete[] vecs; }
! t_int *flext_dsp::dspmeth(t_int *w) { *************** *** 96,104 **** return w+2; } - #endif
! #if FLEXT_SYS == FLEXT_SYS_JMAX ! void flext_dsp::cb_dsp(fts_object_t *c, int winlet, fts_symbol_t s, int ac, const fts_atom_t *at) ! #elif FLEXT_SYS == FLEXT_SYS_MAX void flext_dsp::cb_dsp(t_class *c,t_signal **sp,short *count) #else --- 85,90 ---- return w+2; }
! #if FLEXT_SYS == FLEXT_SYS_MAX void flext_dsp::cb_dsp(t_class *c,t_signal **sp,short *count) #else *************** *** 114,185 **** // min. 1 input channel! (CLASS_MAININLET in pd...) if(!in) in = 1; - #else - if(in+out == 0) return; #endif
// store current dsp parameters - #if FLEXT_SYS == FLEXT_SYS_JMAX - fts_dsp_descr_t *dsp = (fts_dsp_descr_t *)fts_get_pointer(at+0); - obj->srate = fts_dsp_get_input_srate(dsp,0); - obj->blksz = fts_dsp_get_input_size(dsp,0); // is this guaranteed to be the same as sys_getblksize() ? - #else obj->srate = sp[0]->s_sr; obj->blksz = sp[0]->s_n; // is this guaranteed to be the same as sys_getblksize() ? - #endif
// store in and out signal vectors
! if(in != obj->chnsin) { ! if(obj->invecs) delete[] obj->invecs; ! obj->invecs = in?new t_signalvec[in]:NULL; ! obj->chnsin = in; ! } ! for(i = 0; i < in; ++i) ! obj->invecs[i] = ! #if FLEXT_SYS == FLEXT_SYS_JMAX ! fts_dsp_get_input_name(dsp,i); ! #else ! sp[i]->s_vec; ! #endif
! if(out != obj->chnsout) { ! if(obj->outvecs) delete[] obj->outvecs; ! obj->outvecs = out?new t_signalvec[out]:NULL; ! obj->chnsout = out; ! } for(i = 0; i < out; ++i) ! obj->outvecs[i] = ! #if FLEXT_SYS == FLEXT_SYS_JMAX ! fts_dsp_get_output_name(dsp,i); ! #else ! sp[in+i]->s_vec; ! #endif
// with the following call derived classes can do their eventual DSP setup if(obj->CbDsp()) { // set the DSP function - #if FLEXT_SYS == FLEXT_SYS_JMAX - fts_atom_t args; - fts_set_pointer(args,obj); - fts_dsp_add_function(dspsym,1,args); - #else dsp_add((t_dspmethod)dspmeth,1,obj); - #endif } }
- /* - #if FLEXT_SYS == FLEXT_SYS_JMAX - void flext_dsp::cb_dsp_init(fts_object_t *c, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at) - { - fts_dsp_add_object(c); - } - - void flext_dsp::cb_dsp_delete(fts_object_t *c, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at) - { - fts_dsp_remove_object(c); - } - #endif - */
void flext_dsp::m_dsp(int /*n*/,t_signalvec const * /*insigs*/,t_signalvec const * /*outsigs*/) {} --- 100,126 ---- // min. 1 input channel! (CLASS_MAININLET in pd...) if(!in) in = 1; #endif
// store current dsp parameters obj->srate = sp[0]->s_sr; obj->blksz = sp[0]->s_n; // is this guaranteed to be the same as sys_getblksize() ?
// store in and out signal vectors
! if((in+out) && !obj->vecs) ! obj->vecs = new t_signalvec[in+out];
! for(i = 0; i < in; ++i) ! obj->vecs[i] = sp[i]->s_vec; for(i = 0; i < out; ++i) ! obj->vecs[in+i] = sp[in+i]->s_vec;
// with the following call derived classes can do their eventual DSP setup if(obj->CbDsp()) { // set the DSP function dsp_add((t_dspmethod)dspmeth,1,obj); } }
void flext_dsp::m_dsp(int /*n*/,t_signalvec const * /*insigs*/,t_signalvec const * /*outsigs*/) {} *************** *** 187,194 **** bool flext_dsp::CbDsp() { ! m_dsp(Blocksize(),invecs,outvecs); return true; }
void flext_dsp::m_signal(int n,t_sample *const * /*insigs*/,t_sample *const *outs) { --- 128,137 ---- bool flext_dsp::CbDsp() { ! // invoke legacy method ! m_dsp(Blocksize(),InSig(),OutSig()); return true; }
+ // this function will be overridden anyway - the probably useless default is clearing all outputs void flext_dsp::m_signal(int n,t_sample *const * /*insigs*/,t_sample *const *outs) { *************** *** 196,206 **** }
! void flext_dsp::CbSignal() { m_signal(Blocksize(),invecs,outvecs); }
#if FLEXT_SYS == FLEXT_SYS_PD void flext_dsp::cb_enable(t_class *c,t_float on) { thisObject(c)->dspon = on != 0; } - #elif FLEXT_SYS == FLEXT_SYS_JMAX - void flext_dsp::cb_enable(fts_object_t *c, int winlet, fts_symbol_t s, int ac, const fts_atom_t *at) - { thisObject(c)->dspon = fts_get_int(at+0) != 0; } #endif --- 139,150 ---- }
! void flext_dsp::CbSignal() ! { ! // invoke legacy method ! m_signal(Blocksize(),InSig(),OutSig()); ! }
#if FLEXT_SYS == FLEXT_SYS_PD void flext_dsp::cb_enable(t_class *c,t_float on) { thisObject(c)->dspon = on != 0; } #endif
Index: flclass.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flclass.h,v retrieving revision 1.63 retrieving revision 1.64 diff -C2 -d -r1.63 -r1.64 *** flclass.h 30 Jul 2005 21:59:31 -0000 1.63 --- flclass.h 26 Sep 2005 13:59:34 -0000 1.64 *************** *** 519,523 ****
FLEXT_CLASSDEF(flext_base)(); - virtual ~FLEXT_CLASSDEF(flext_base)();
/*! \brief Set up inlets and outlets, method and attribute lists --- 519,522 ---- *************** *** 525,528 **** --- 524,531 ---- virtual bool Init(); + /*! \brief Deallocate all kinds of stuff + */ + virtual void Exit(); +
/*! \defgroup FLEXT_C_ATTR Attribute handling methods (object scope)