diff options
Diffstat (limited to 'externals/grill/flext/source/flproxy.cpp')
-rwxr-xr-x | externals/grill/flext/source/flproxy.cpp | 167 |
1 files changed, 123 insertions, 44 deletions
diff --git a/externals/grill/flext/source/flproxy.cpp b/externals/grill/flext/source/flproxy.cpp index 7b964db5..d542fe66 100755 --- a/externals/grill/flext/source/flproxy.cpp +++ b/externals/grill/flext/source/flproxy.cpp @@ -2,7 +2,7 @@ flext - C++ layer for Max/MSP and pd (pure data) externals -Copyright (c) 2001-2005 Thomas Grill (gr@grrrr.org) +Copyright (c) 2001-2006 Thomas Grill (gr@grrrr.org) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. @@ -22,100 +22,179 @@ WARRANTIES, see the file, "license.txt," in this distribution. t_class *flext_base::px_class = NULL; -void flext_base::px_object::px_method(px_object *obj,const t_symbol *s,int argc,t_atom *argv) +void flext_base::px_object::px_bang(px_object *obj) +{ + obj->base->CbMethodHandler(obj->index,sym_bang,0,NULL); +} + +void flext_base::px_object::px_float(px_object *obj,t_float f) +{ + t_atom a; SetFloat(a,f); + obj->base->CbMethodHandler(obj->index,sym_float,1,&a); +} + +void flext_base::px_object::px_symbol(px_object *obj,const t_symbol *s) +{ + t_atom a; SetSymbol(a,s); + obj->base->CbMethodHandler(obj->index,sym_symbol,1,&a); +} + +/* +void flext_base::px_object::px_pointer(px_object *obj,const t_gpointer *p) +{ + t_atom a; SetPointer(a,p); + obj->base->CbMethodHandler(obj->index,sym_pointer,1,&a); +} +*/ + +void flext_base::px_object::px_anything(px_object *obj,const t_symbol *s,int argc,t_atom *argv) { obj->base->CbMethodHandler(obj->index,s,argc,argv); } -void flext_base::cb_px_anything(flext_hdr *c,const t_symbol *s,int argc,t_atom *argv) +void flext_base::cb_bang(flext_hdr *c) +{ + thisObject(c)->CbMethodHandler(0,sym_bang,0,NULL); +} + +void flext_base::cb_float(flext_hdr *c,t_float f) +{ + t_atom a; SetFloat(a,f); + thisObject(c)->CbMethodHandler(0,sym_float,1,&a); +} + +void flext_base::cb_symbol(flext_hdr *c,const t_symbol *s) +{ + t_atom a; SetSymbol(a,s); + thisObject(c)->CbMethodHandler(0,sym_symbol,1,&a); +} + +/* +void flext_base::cb_pointer(flext_hdr *c,const t_gpointer *p) +{ + t_atom a; SetPointer(a,p); + thisObject(c)->CbMethodHandler(0,sym_pointer,1,&a); +} +*/ + +void flext_base::cb_anything(flext_hdr *c,const t_symbol *s,int argc,t_atom *argv) { thisObject(c)->CbMethodHandler(0,s,argc,argv); } -#define DEF_IN_FT(IX) \ -void flext_base::cb_px_ft ## IX(flext_hdr *c,float v) { t_atom atom; SetFloat(atom,v); thisObject(c)->CbMethodHandler(IX,sym_float,1,&atom); } +#define DEF_PROXYMSG(IX) \ +void flext_base::cb_px_ft ## IX(flext_hdr *c,t_float v) { t_atom atom; SetFloat(atom,v); thisObject(c)->CbMethodHandler(IX,sym_float,1,&atom); } + +#define ADD_PROXYMSG(c,IX) \ +add_method1(c,cb_px_ft ## IX," ft " #IX,A_FLOAT) + +//AddMethod(c,0,flext::MakeSymbol("ft" #IX),cb_px_ft ## IX) -#define ADD_IN_FT(IX) \ -add_method1(c,cb_px_ft ## IX,"ft" #IX,A_FLOAT) #elif FLEXT_SYS == FLEXT_SYS_MAX -void flext_base::cb_px_anything(flext_hdr *c,const t_symbol *s,short argc,t_atom *argv) +void flext_base::cb_anything(flext_hdr *c,const t_symbol *s,short argc,t_atom *argv) { int ci = ((flext_hdr *)c)->curinlet; thisObject(c)->CbMethodHandler(ci,s,argc,argv); } -void flext_base::cb_px_int(flext_hdr *c,long v) +void flext_base::cb_int(flext_hdr *c,long v) { t_atom atom; SetInt(atom,v); int ci = ((flext_hdr *)c)->curinlet; thisObject(c)->CbMethodHandler(ci,sym_int,1,&atom); } -void flext_base::cb_px_float(flext_hdr *c,double v) +void flext_base::cb_float(flext_hdr *c,double v) { t_atom atom; SetFloat(atom,v); int ci = ((flext_hdr *)c)->curinlet; thisObject(c)->CbMethodHandler(ci,sym_float,1,&atom); } -void flext_base::cb_px_bang(flext_hdr *c) +void flext_base::cb_bang(flext_hdr *c) { int ci = ((flext_hdr *)c)->curinlet; thisObject(c)->CbMethodHandler(ci,sym_bang,0,NULL); } -#define DEF_IN_FT(IX) \ +#define DEF_PROXYMSG(IX) \ void flext_base::cb_px_in ## IX(flext_hdr *c,long v) { t_atom atom; SetInt(atom,v); thisObject(c)->CbMethodHandler(IX,sym_int,1,&atom); } \ void flext_base::cb_px_ft ## IX(flext_hdr *c,double v) { t_atom atom; SetFloat(atom,v); thisObject(c)->CbMethodHandler(IX,sym_float,1,&atom); } -#define ADD_IN_FT(IX) \ -add_method1(c,cb_px_in ## IX,"in" #IX,A_INT); \ -add_method1(c,cb_px_ft ## IX,"ft" #IX,A_FLOAT) +//void flext_base::cb_px_in ## IX(flext_hdr *c,long v) { t_atom atom; SetInt(atom,v); thisObject(c)->CbMethodHandler(IX,sym_int,1,&atom); } \ +//void flext_base::cb_px_ft ## IX(flext_hdr *c,double v) { t_atom atom; SetFloat(atom,v); thisObject(c)->CbMethodHandler(IX,sym_float,1,&atom); } + + +#define ADD_PROXYMSG(c,IX) \ +addinx((method)(cb_px_in ## IX),IX); \ +addftx((method)(cb_px_ft ## IX),IX) + +//add_method1(c,cb_px_in ## IX,"in" #IX,A_INT); \ +//add_method1(c,cb_px_ft ## IX,"ft" #IX,A_FLOAT) + +//AddMethod(c,0,flext::MakeSymbol("in" #IX),cb_px_in ## IX); \ +//AddMethod(c,0,flext::MakeSymbol("ft" #IX),cb_px_ft ## IX) + #endif #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX -DEF_IN_FT(1) -DEF_IN_FT(2) -DEF_IN_FT(3) -DEF_IN_FT(4) -DEF_IN_FT(5) -DEF_IN_FT(6) -DEF_IN_FT(7) -DEF_IN_FT(8) -DEF_IN_FT(9) - -void flext_base::SetProxies(t_class *c) +DEF_PROXYMSG(1) +DEF_PROXYMSG(2) +DEF_PROXYMSG(3) +DEF_PROXYMSG(4) +DEF_PROXYMSG(5) +DEF_PROXYMSG(6) +DEF_PROXYMSG(7) +DEF_PROXYMSG(8) +DEF_PROXYMSG(9) + + +void flext_base::SetProxies(t_class *c,bool dsp) { - // proxy for extra inlets #if FLEXT_SYS == FLEXT_SYS_PD - add_anything(c,cb_px_anything); // for leftmost inlet - px_class = class_new(gensym("flext_base proxy"),NULL,NULL,sizeof(px_object),CLASS_PD|CLASS_NOINLET, A_NULL); - add_anything(px_class,px_object::px_method); // for other inlets + // for leftmost inlet + class_addbang(c,cb_bang); + if(!dsp) class_addfloat(c,cb_float); + class_addsymbol(c,cb_symbol); +// class_addpointer(c,cb_pointer); + class_addlist(c,cb_anything); + class_addanything(c,cb_anything); + // proxy for extra inlets + if(!px_class) { + // only once + px_class = class_new(gensym(" flext_base proxy "),NULL,NULL,sizeof(px_object),CLASS_PD|CLASS_NOINLET, A_NULL); + class_addbang(px_class,px_object::px_bang); // for other inlets + class_addfloat(px_class,px_object::px_float); // for other inlets + class_addsymbol(px_class,px_object::px_symbol); // for other inlets +// class_addpointer(px_class,px_object::px_pointer); // for other inlets + class_addlist(px_class,px_object::px_anything); // for other inlets + class_addanything(px_class,px_object::px_anything); // for other inlets + } #elif FLEXT_SYS == FLEXT_SYS_MAX - add_bang(c,cb_px_bang); - 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); + addbang((method)cb_bang); + addint((method)cb_int); + addfloat((method)cb_float); + addmess((method)cb_anything,"list",A_GIMME,A_NOTHING); // must be explicitly given, otherwise list elements are distributes over inlets + addmess((method)cb_anything,"anything",A_GIMME,A_NOTHING); #else #error Not implemented! #endif // setup non-leftmost ints and floats - ADD_IN_FT(1); - ADD_IN_FT(2); - ADD_IN_FT(3); - ADD_IN_FT(4); - ADD_IN_FT(5); - ADD_IN_FT(6); - ADD_IN_FT(7); - ADD_IN_FT(8); - ADD_IN_FT(9); + ADD_PROXYMSG(c,1); + ADD_PROXYMSG(c,2); + ADD_PROXYMSG(c,3); + ADD_PROXYMSG(c,4); + ADD_PROXYMSG(c,5); + ADD_PROXYMSG(c,6); + ADD_PROXYMSG(c,7); + ADD_PROXYMSG(c,8); + ADD_PROXYMSG(c,9); } #endif |