diff options
author | Thomas Grill <xovo@users.sourceforge.net> | 2005-05-23 16:52:46 +0000 |
---|---|---|
committer | Thomas Grill <xovo@users.sourceforge.net> | 2005-05-23 16:52:46 +0000 |
commit | a1c2bb17663ce4dea2f5e7e3c1e1bfae35541a2c (patch) | |
tree | 9000122288ab01e7d815323c79342f668d6b2a5b /externals/grill/flext/source/flout.cpp | |
parent | a98acaeb0ce114ede2cfd31267c6dcc3fc0fbb01 (diff) |
oops, fix
Max/MSP has its own check....
changed initialization functions accordingly
better timers for Windows
fixed timer bug
changed template parameter of TableMap
compiler flag for MinGW binary compatibility (thanks to GG)
enable WIN2000/XP API features with definition in build system
fix for symbol messages into non-left inlets
restructured TableMap type (doesn't own pointers any more)
no sanity check for iterator
fixes for MSVC6
slimmed object data structures
better c++ compliance
fixed problems with symbol binding
svn path=/trunk/; revision=3074
Diffstat (limited to 'externals/grill/flext/source/flout.cpp')
-rw-r--r-- | externals/grill/flext/source/flout.cpp | 275 |
1 files changed, 89 insertions, 186 deletions
diff --git a/externals/grill/flext/source/flout.cpp b/externals/grill/flext/source/flout.cpp index 7a2d2e8e..7f3130e8 100644 --- a/externals/grill/flext/source/flout.cpp +++ b/externals/grill/flext/source/flout.cpp @@ -66,71 +66,52 @@ bool flext_base::InitInlets() { bool ok = true; + // incnt has number of inlets (any type) + // insigs should be 0 + + FLEXT_ASSERT(!insigs && !inlets); + // ---------------------------------- // create inlets // ---------------------------------- - incnt = insigs = 0; - - // digest inlist - - xlet *xi; - incnt = 0; - for(xi = inlist; xi; xi = xi->nxt) ++incnt; - xlet::type *list = new xlet::type[incnt]; - int i; - for(xi = inlist,i = 0; xi; xi = xi->nxt,++i) list[i] = xi->tp; - #if FLEXT_SYS == FLEXT_SYS_MAX // copy inlet descriptions indesc = new char *[incnt]; - for(xi = inlist,i = 0; xi; xi = xi->nxt,++i) { - int l = xi->desc?strlen(xi->desc):0; - if(l) { - indesc[i] = new char[l+1]; - memcpy(indesc[i],xi->desc,l); - indesc[i][l] = 0; - } - else - indesc[i] = NULL; + for(int i = 0; i < incnt; ++i) { + xlet &x = inlist[i]; + indesc[i] = x.desc; + x.desc = NULL; } #endif #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX inlets = new px_object *[incnt]; - for(i = 0; i < incnt; ++i) inlets[i] = NULL; #endif // type info is now in list array #if FLEXT_SYS == FLEXT_SYS_PD { int cnt = 0; - xi = inlist; // points to first inlet - if(incnt >= 1) { - switch(list[0]) { - case xlet::tp_sig: - ++insigs; - break; - default: - // leftmost inlet is already there... - break; - } + xlet &xi = inlist[0]; // points to first inlet + if(xi.tp == xlet_sig) ++insigs; + // else leftmost inlet is already there... ++cnt; #if PD_MINOR_VERSION >= 37 && defined(PD_DEVEL_VERSION) // set tooltip - if(xi->desc && *xi->desc) class_settip(thisClass(),gensym(xi->desc)); + if(xi.desc && *xi.desc) class_settip(thisClass(),gensym(xi.desc)); #endif } for(int ix = 1; ix < incnt; ++ix,++cnt) { - xi = xi->nxt; // points to next inlet - + xlet &xi = inlist[ix]; // points to first inlet t_inlet *in = NULL; - switch(list[ix]) { - case xlet::tp_float: - case xlet::tp_int: { + switch(xi.tp) { + case xlet_float: + case xlet_int: { + inlets[ix] = NULL; char sym[] = "ft??"; if(ix >= 10) { if(compatibility) { @@ -149,20 +130,21 @@ bool flext_base::InitInlets() if(ok) in = inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, (t_symbol *)sym_float, gensym(sym)); break; } - case xlet::tp_sym: + case xlet_sym: (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages in = inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_symbol, (t_symbol *)sym_symbol); break; - case xlet::tp_list: + case xlet_list: (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages in = inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_list, (t_symbol *)sym_list); break; - case xlet::tp_any: + case xlet_any: (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages in = inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, 0, 0); break; - case xlet::tp_sig: - if(compatibility && list[ix-1] != xlet::tp_sig) { + case xlet_sig: + inlets[ix] = NULL; + if(compatibility && inlist[ix-1].tp != xlet_sig) { post("%s: All signal inlets must be left-aligned in compatibility mode",thisName()); ok = false; } @@ -174,13 +156,14 @@ bool flext_base::InitInlets() } break; default: - error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); + inlets[ix] = NULL; + error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)inlist[ix].tp); ok = false; } #if PD_MINOR_VERSION >= 37 && defined(PD_DEVEL_VERSION) // set tooltip - if(in && xi->desc && *xi->desc) inlet_settip(in,gensym(xi->desc)); + if(in && xi.desc && *xi.desc) inlet_settip(in,gensym(xi.desc)); #endif } @@ -190,22 +173,26 @@ bool flext_base::InitInlets() { int ix,cnt; // count leftmost signal inlets - while(insigs < incnt && list[insigs] == xlet::tp_sig) ++insigs; + while(insigs < incnt && inlist[insigs].tp == xlet_sig) ++insigs; for(cnt = 0,ix = incnt-1; ix >= insigs; --ix,++cnt) { + xlet &xi = inlist[ix]; if(ix == 0) { - if(list[ix] != xlet::tp_any) { + inlets[ix] = NULL; + if(xi.tp != xlet_any) { error("%s: Leftmost inlet must be of type signal or anything",thisName()); ok = false; } } else { - switch(list[ix]) { - case xlet::tp_sig: + switch(xi.tp) { + case xlet_sig: + inlets[ix] = NULL; error("%s: All signal inlets must be left-aligned",thisName()); ok = false; break; - case xlet::tp_float: + case xlet_float: + inlets[ix] = NULL; if(ix >= 10) { post("%s: Only 9 float inlets possible",thisName()); ok = false; @@ -213,7 +200,8 @@ bool flext_base::InitInlets() else floatin(x_obj,ix); break; - case xlet::tp_int: + case xlet_int: + inlets[ix] = NULL; if(ix >= 10) { post("%s: Only 9 int inlets possible",thisName()); ok = false; @@ -221,13 +209,14 @@ bool flext_base::InitInlets() else intin(x_obj,ix); break; - case xlet::tp_any: // non-leftmost - case xlet::tp_sym: - case xlet::tp_list: + case xlet_any: // non-leftmost + case xlet_sym: + case xlet_list: inlets[ix] = (px_object *)proxy_new(x_obj,ix,&((flext_hdr *)x_obj)->curinlet); break; default: - error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); + inlets[ix] = NULL; + error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)xi.tp); ok = false; } } @@ -236,67 +225,29 @@ bool flext_base::InitInlets() // incnt = cnt; if(insigs) - dsp_setup(thisHdr(),insigs); // signal inlets -// dsp_setupbox(thisHdr(),insigs); // signal inlets - } -#elif FLEXT_SYS == FLEXT_SYS_JMAX - { - t_class *cl = thisClass(); - int cnt = 0; - for(int ix = 0; ix < incnt; ++ix,++cnt) { - switch(list[ix]) { - case xlet::tp_float: - case xlet::tp_int: -// fts_class_inlet_number(cl, ix, jmax_proxy); - break; - case xlet::tp_sym: -// fts_class_inlet_symbol(cl, ix, jmax_proxy); - break; - case xlet::tp_sig: - if(compatibility && list[ix-1] != xlet::tp_sig) { - post("%s: All signal inlets must be left-aligned in compatibility mode",thisName()); - ok = false; - } - else { - if(!insigs) fts_dsp_declare_inlet(cl,0); - ++insigs; - } - // no break -> let a signal inlet also accept any messages - case xlet::tp_list: - case xlet::tp_any: -// fts_class_inlet_varargs(cl,ix, jmax_proxy); - break; - default: - error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); - ok = false; - } - } - - incnt = cnt; - - fts_object_set_inlets_number((fts_object_t *)thisHdr(), incnt); + dsp_setup(thisHdr(),insigs); // signal inlets } #else #error #endif - delete inlist; inlist = NULL; - - delete[] list; - return ok; } bool flext_base::InitOutlets() { bool ok = true; + int procattr = HasAttributes()?1:0; + + // outcnt has number of inlets (any type) + // outsigs should be 0 + + FLEXT_ASSERT(outsigs == 0); // ---------------------------------- // create outlets // ---------------------------------- - outcnt = outsigs = 0; - #if FLEXT_SYS == FLEXT_SYS_MAX // for Max/MSP the rightmost outlet has to be created first outlet *attrtmp = NULL; @@ -304,104 +255,58 @@ bool flext_base::InitOutlets() attrtmp = (outlet *)newout_anything(thisHdr()); #endif - // digest outlist - { - xlet *xi; - - // count outlets - outcnt = 0; - for(xi = outlist; xi; xi = xi->nxt) ++outcnt; - - xlet::type *list = new xlet::type[outcnt]; - int i; - for(xi = outlist,i = 0; xi; xi = xi->nxt,++i) list[i] = xi->tp; - #if FLEXT_SYS == FLEXT_SYS_MAX - // copy outlet descriptions - outdesc = new char *[outcnt]; - for(xi = outlist,i = 0; xi; xi = xi->nxt,++i) { - int l = xi->desc?strlen(xi->desc):0; - if(l) { - outdesc[i] = new char[l+1]; - memcpy(outdesc[i],xi->desc,l); - outdesc[i][l] = 0; - } - else - outdesc[i] = NULL; - } + // copy outlet descriptions + outdesc = new char *[outcnt]; + for(int i = 0; i < outcnt; ++i) { + xlet &xi = outlist[i]; + outdesc[i] = xi.desc; + xi.desc = NULL; + } #endif #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX - outlets = new outlet *[outcnt+(procattr?1:0)]; + outlets = new outlet *[outcnt+procattr]; - // type info is now in list array + // type info is now in list array #if FLEXT_SYS == FLEXT_SYS_PD - for(int ix = 0; ix < outcnt; ++ix) + for(int ix = 0; ix < outcnt; ++ix) #elif FLEXT_SYS == FLEXT_SYS_MAX - for(int ix = outcnt-1; ix >= 0; --ix) + for(int ix = outcnt-1; ix >= 0; --ix) #else #error #endif - { - switch(list[ix]) { - case xlet::tp_float: - outlets[ix] = (outlet *)newout_float(&x_obj->obj); - break; - case xlet::tp_int: - outlets[ix] = (outlet *)newout_flint(&x_obj->obj); - break; - case xlet::tp_sig: - outlets[ix] = (outlet *)newout_signal(&x_obj->obj); - ++outsigs; - break; - case xlet::tp_sym: - outlets[ix] = (outlet *)newout_symbol(&x_obj->obj); - break; - case xlet::tp_list: - outlets[ix] = (outlet *)newout_list(&x_obj->obj); - break; - case xlet::tp_any: - outlets[ix] = (outlet *)newout_anything(&x_obj->obj); - break; -#ifdef FLEXT_DEBUG - default: - ERRINTERNAL(); - ok = false; -#endif - } - } -#elif FLEXT_SYS == FLEXT_SYS_JMAX - t_class *cl = thisClass(); - for(int ix = 0; ix < outcnt; ++ix) { - switch(list[ix]) { - case xlet::tp_float: - case xlet::tp_int: -// fts_class_outlet_number(cl, ix); - break; - case xlet::tp_sym: -// fts_class_outlet_symbol(cl, ix); - break; - case xlet::tp_list: - case xlet::tp_any: -// fts_class_outlet_anything(cl, ix); - break; - case xlet::tp_sig: - if(!outsigs) fts_dsp_declare_outlet(cl,0); - ++outsigs; - break; + { + switch(outlist[ix].tp) { + case xlet_float: + outlets[ix] = (outlet *)newout_float(&x_obj->obj); + break; + case xlet_int: + outlets[ix] = (outlet *)newout_flint(&x_obj->obj); + break; + case xlet_sig: + outlets[ix] = (outlet *)newout_signal(&x_obj->obj); + ++outsigs; + break; + case xlet_sym: + outlets[ix] = (outlet *)newout_symbol(&x_obj->obj); + break; + case xlet_list: + outlets[ix] = (outlet *)newout_list(&x_obj->obj); + break; + case xlet_any: + outlets[ix] = (outlet *)newout_anything(&x_obj->obj); + break; #ifdef FLEXT_DEBUG - default: - ERRINTERNAL(); - ok = false; + default: + ERRINTERNAL(); + ok = false; #endif - } - } - - fts_object_set_outlets_number((fts_object_t *)thisHdr(), outcnt+(procattr?1:0)); -#endif - - delete[] list; + } } +#else +#error +#endif #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX if(procattr) { @@ -417,8 +322,6 @@ bool flext_base::InitOutlets() } #endif - delete outlist; outlist = NULL; - return ok; } |