diff options
62 files changed, 2525 insertions, 1591 deletions
diff --git a/externals/grill/deljoin/main.cpp b/externals/grill/deljoin/main.cpp index b52303cb..5dfdff5f 100755 --- a/externals/grill/deljoin/main.cpp +++ b/externals/grill/deljoin/main.cpp @@ -10,8 +10,8 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include <flext.h> -#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 400) -#error You need at least flext version 0.4.0 +#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 401) +#error You need at least flext version 0.4.1 #endif #include <string.h> @@ -26,7 +26,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define C char #define BL bool -#define VERSION "0.1.1" +#define VERSION "0.1.2" #ifdef __MWERKS__ #define STD std @@ -38,7 +38,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class deljoin: public flext_base { - FLEXT_HEADER(deljoin,flext_base) + FLEXT_HEADER_S(deljoin,flext_base,Setup) public: deljoin(I argc,const t_atom *argv); @@ -53,6 +53,8 @@ protected: virtual void m_assist(long /*msg*/,long /*arg*/,char * /*s*/); private: + static V Setup(t_class *c); + FLEXT_CALLBACK_A(m_list) FLEXT_CALLBACK_S(m_del) }; @@ -60,6 +62,12 @@ private: FLEXT_NEW_V("deljoin",deljoin) +V deljoin::Setup(t_class *c) +{ + FLEXT_CADDMETHOD_A(c,0,m_list); + FLEXT_CADDMETHOD(c,1,m_del); +} + deljoin::deljoin(I argc,const t_atom *argv): delim(NULL) { @@ -67,9 +75,6 @@ deljoin::deljoin(I argc,const t_atom *argv): AddInSymbol(); AddOutSymbol(); - FLEXT_ADDMETHOD_A(0,m_list); - FLEXT_ADDMETHOD(1,m_del); - if(argc && IsSymbol(argv[0])) delim = GetSymbol(argv[0]); } @@ -104,36 +109,40 @@ V deljoin::m_assist(long msg,long arg,char *s) */ V deljoin::m_list(const t_symbol *s,int argc,const t_atom *argv) { - C tmp[1024],*t = tmp; - const C *sdel = GetString(delim); - I ldel = strlen(sdel); - - if(s && s != sym_list && s != sym_float && s != sym_int) { - strcpy(t,GetString(s)); - t += strlen(t); - } - - for(int i = 0; i < argc; ++i) { - if(t != tmp) { - strcpy(t,sdel); - t += ldel; - } - - const t_atom &a = argv[i]; - if(IsSymbol(a)) - strcpy(t,GetString(a)); - else if(IsInt(a)) { - STD::sprintf(t,"%i",GetInt(a),10); + if(delim) { + C tmp[1024],*t = tmp; + const C *sdel = GetString(delim); + I ldel = strlen(sdel); + + if(s && s != sym_list && s != sym_float && s != sym_int) { + strcpy(t,GetString(s)); + t += strlen(t); } - else if(IsFloat(a)) { - STD::sprintf(t,"%f",GetFloat(a),10); + + for(int i = 0; i < argc; ++i) { + if(t != tmp) { + strcpy(t,sdel); + t += ldel; + } + + const t_atom &a = argv[i]; + if(IsSymbol(a)) + strcpy(t,GetString(a)); + else if(IsInt(a)) { + STD::sprintf(t,"%i",GetInt(a),10); + } + else if(IsFloat(a)) { + STD::sprintf(t,"%f",GetFloat(a),10); + } + // else do nothing + + t += strlen(t); } -// else do nothing - - t += strlen(t); + + ToOutString(0,tmp); } - - ToOutString(0,tmp); + else + post("%s - No delimiter defined",thisName()); } V deljoin::m_del(const t_symbol *s) diff --git a/externals/grill/delsplit/main.cpp b/externals/grill/delsplit/main.cpp index 17e30bc3..a7369dc7 100755 --- a/externals/grill/delsplit/main.cpp +++ b/externals/grill/delsplit/main.cpp @@ -10,8 +10,8 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include <flext.h> -#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 400) -#error You need at least flext version 0.4.0 +#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 401) +#error You need at least flext version 0.4.1 #endif #include <string.h> @@ -27,7 +27,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define C char #define BL bool -#define VERSION "0.1.1" +#define VERSION "0.1.2" #ifdef __MWERKS__ #define STD std @@ -39,7 +39,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class delsplit: public flext_base { - FLEXT_HEADER(delsplit,flext_base) + FLEXT_HEADER_S(delsplit,flext_base,Setup) public: delsplit(I argc,const t_atom *argv); @@ -55,6 +55,8 @@ protected: static V SetAtom(t_atom &l,const C *s); private: + static V Setup(t_class *c); + FLEXT_CALLBACK_S(m_list) FLEXT_CALLBACK_S(m_del) }; @@ -62,6 +64,12 @@ private: FLEXT_NEW_V("delsplit",delsplit) +V delsplit::Setup(t_class *c) +{ + FLEXT_CADDMETHOD(c,0,m_list); + FLEXT_CADDMETHOD(c,1,m_del); +} + delsplit::delsplit(I argc,const t_atom *argv): delim(NULL) { @@ -69,9 +77,6 @@ delsplit::delsplit(I argc,const t_atom *argv): AddInSymbol(); AddOutList(); - FLEXT_ADDMETHOD(0,m_list); - FLEXT_ADDMETHOD(1,m_del); - if(argc && IsSymbol(argv[0])) delim = GetSymbol(argv[0]); } @@ -128,27 +133,31 @@ V delsplit::SetAtom(t_atom &l,const C *s) V delsplit::m_list(const t_symbol *sym) { - t_atom lst[256]; - int cnt = 0; - const C *sdel = GetString(delim); - I ldel = strlen(sdel); - C str[1024]; - strcpy(str,GetString(sym)); - - for(const char *s = str; *s; ) { - C *e = strstr(s,sdel); - if(!e) { - SetAtom(lst[cnt++],s); - break; - } - else { - *e = 0; - SetAtom(lst[cnt++],s); - s = e+ldel; + if(delim) { + t_atom lst[256]; + int cnt = 0; + const C *sdel = GetString(delim); + I ldel = strlen(sdel); + C str[1024]; + strcpy(str,GetString(sym)); + + for(const char *s = str; *s; ) { + C *e = strstr(s,sdel); + if(!e) { + SetAtom(lst[cnt++],s); + break; + } + else { + *e = 0; + SetAtom(lst[cnt++],s); + s = e+ldel; + } } + + ToOutList(0,cnt,lst); } - - ToOutList(0,cnt,lst); + else + post("%s - No delimiter defined",thisName()); } V delsplit::m_del(const t_symbol *s) diff --git a/externals/grill/flext/flext.cw b/externals/grill/flext/flext.cw Binary files differindex 21096612..488b8fc2 100644 --- a/externals/grill/flext/flext.cw +++ b/externals/grill/flext/flext.cw diff --git a/externals/grill/flext/flext.dsp b/externals/grill/flext/flext.dsp index d13680e9..8ebb264f 100644 --- a/externals/grill/flext/flext.dsp +++ b/externals/grill/flext/flext.dsp @@ -146,29 +146,36 @@ SOURCE=".\make-files.txt" SOURCE=.\readme.txt # End Source File # End Group +# Begin Group "Atom" + +# PROP Default_Filter "" # Begin Source File SOURCE=.\source\flatom.cpp # End Source File # Begin Source File -SOURCE=.\source\flatom_pr.cpp +SOURCE=.\source\flatom_app.cpp # End Source File # Begin Source File -SOURCE=.\source\flattr.cpp +SOURCE=.\source\flatom_part.cpp # End Source File # Begin Source File -SOURCE=.\source\flbase.cpp +SOURCE=.\source\flatom_pr.cpp # End Source File +# End Group +# Begin Group "Base" + +# PROP Default_Filter "" # Begin Source File -SOURCE=.\source\flbase.h +SOURCE=.\source\flbase.cpp # End Source File # Begin Source File -SOURCE=.\source\flbuf.cpp +SOURCE=.\source\flbase.h # End Source File # Begin Source File @@ -180,31 +187,51 @@ SOURCE=.\source\fldefs.h # End Source File # Begin Source File -SOURCE=.\source\fldsp.cpp +SOURCE=.\source\flext.cpp # End Source File # Begin Source File -SOURCE=.\source\fldsp.h +SOURCE=.\source\flext.h # End Source File # Begin Source File -SOURCE=.\source\flext.cpp +SOURCE=.\source\flinternal.h # End Source File # Begin Source File -SOURCE=.\source\flext.h +SOURCE=.\source\fllib.cpp # End Source File # Begin Source File -SOURCE=.\source\flinternal.h +SOURCE=.\source\flprefix.h # End Source File # Begin Source File -SOURCE=.\source\fllib.cpp +SOURCE=.\source\flstdc.h # End Source File # Begin Source File -SOURCE=.\source\flmspbuffer.h +SOURCE=.\source\flthr.cpp +# End Source File +# End Group +# Begin Group "IO" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\source\flattr.cpp +# End Source File +# Begin Source File + +SOURCE=.\source\flitem.cpp +# End Source File +# Begin Source File + +SOURCE=.\source\flmeth.cpp +# End Source File +# Begin Source File + +SOURCE=.\source\flmsg.cpp # End Source File # Begin Source File @@ -212,19 +239,27 @@ SOURCE=.\source\flout.cpp # End Source File # Begin Source File -SOURCE=.\source\flprefix.h +SOURCE=.\source\flproxy.cpp # End Source File # Begin Source File -SOURCE=.\source\flsndobj.cpp +SOURCE=.\source\flqueue.cpp # End Source File # Begin Source File -SOURCE=.\source\flsndobj.h +SOURCE=.\source\flxlet.cpp # End Source File +# End Group +# Begin Group "Util" + +# PROP Default_Filter "" # Begin Source File -SOURCE=.\source\flstdc.h +SOURCE=.\source\flbuf.cpp +# End Source File +# Begin Source File + +SOURCE=.\source\flmspbuffer.h # End Source File # Begin Source File @@ -236,15 +271,32 @@ SOURCE=.\source\flsupport.h # End Source File # Begin Source File -SOURCE=.\source\flthr.cpp +SOURCE=.\source\flutil.cpp # End Source File +# End Group +# Begin Group "Dsp" + +# PROP Default_Filter "" # Begin Source File -SOURCE=.\source\flutil.cpp +SOURCE=.\source\fldsp.cpp # End Source File # Begin Source File -SOURCE=.\source\flxlet.cpp +SOURCE=.\source\fldsp.h # End Source File +# End Group +# Begin Group "SndObj" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\source\flsndobj.cpp +# End Source File +# Begin Source File + +SOURCE=.\source\flsndobj.h +# End Source File +# End Group # End Target # End Project diff --git a/externals/grill/flext/make-files.txt b/externals/grill/flext/make-files.txt index cb60d388..c6228eeb 100644 --- a/externals/grill/flext/make-files.txt +++ b/externals/grill/flext/make-files.txt @@ -1,5 +1,7 @@ SRCS=flbase.cpp flext.cpp flbuf.cpp fldsp.cpp fllib.cpp flxlet.cpp flattr.cpp flsupport.cpp \ -flutil.cpp flatom.cpp flatom_pr.cpp flthr.cpp flout.cpp +flutil.cpp flatom.cpp flatom_pr.cpp flthr.cpp flout.cpp \ +flatom_app.cpp flatom_part.cpp flitem.cpp flmeth.cpp flmsg.cpp \ +flproxy.cpp flqueue.cpp HDRS=flprefix.h flstdc.h flbase.h flclass.h fldefs.h flext.h flsupport.h fldsp.h flinternal.h SRCS_SNDOBJ=flsndobj.cpp HDRS_SNDOBJ=flsndobj.h diff --git a/externals/grill/flext/readme.txt b/externals/grill/flext/readme.txt index eefd0260..1f6f8fee 100644 --- a/externals/grill/flext/readme.txt +++ b/externals/grill/flext/readme.txt @@ -101,6 +101,8 @@ Version history: 0.4.1: - full port for Max@OSX +- completely redesigned message and attribute handling: now hashed and a much more efficient +- introduced "Finalize" virtual method, called after all "Init" methods - fixed crash issue in flext_dsp when there are NO signal inlets or outlets defined (this is possibly only a problem for the signal2 tutorial example) - added flext::GetType(t_atom &), flext::ZeroMem @@ -299,7 +301,6 @@ tests: - some more mutexes needed for thread safety? - buffer resize: flext_base::buffer::Frames(): should we use buffer or system sample rate? - what about FLEXT_ADDMETHOD_V (for var arg lists) and FLEXT_ADDMETHOD_A (anythings)... nonsense? -- queued messages... triggering timer should not be necessary for MaxMSP qmsg features: - abstraction for clock functions diff --git a/externals/grill/flext/source/flatom.cpp b/externals/grill/flext/source/flatom.cpp index 0efb79f4..3d5db8f2 100644 --- a/externals/grill/flext/source/flatom.cpp +++ b/externals/grill/flext/source/flatom.cpp @@ -36,6 +36,7 @@ flext::AtomList::AtomList(const AtomList &a): flext::AtomList::~AtomList() { Clear(); } + flext::AtomList &flext::AtomList::Set(int argc,const t_atom *argv,int offs,bool resize) { int ncnt = argc+offs; @@ -51,85 +52,6 @@ flext::AtomList &flext::AtomList::Set(int argc,const t_atom *argv,int offs,bool return *this; } -int flext::AtomList::Get(t_atom *argv,int mxsz) const -{ - int argc = Count(); - if(mxsz >= 0 && argc > mxsz) argc = mxsz; - - for(int i = 0; i < argc; ++i) SetAtom(argv[i],lst[i]); - - return argc; -} - - -flext::AtomList &flext::AtomList::Append(const t_atom &a) -{ - t_atom *nlst = new t_atom[cnt+1]; - for(int i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]); - SetAtom(nlst[cnt],a); - - if(lst) delete[] lst; - lst = nlst; - ++cnt; - - return *this; -} - -flext::AtomList &flext::AtomList::Append(int argc,const t_atom *argv) -{ - if(argc) { - t_atom *nlst = new t_atom[cnt+argc]; - int i; - for(i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]); - if(argv) - for(i = 0; i < argc; ++i) SetAtom(nlst[cnt+i],argv[i]); - - if(lst) delete[] lst; - lst = nlst; - cnt += argc; - } - return *this; -} - -flext::AtomList &flext::AtomList::Prepend(const t_atom &a) -{ - t_atom *nlst = new t_atom[cnt+1]; - for(int i = 0; i < cnt; ++i) SetAtom(nlst[i+1],lst[i]); - SetAtom(nlst[0],a); - - if(lst) delete[] lst; - lst = nlst; - ++cnt; - - return *this; -} - -flext::AtomList &flext::AtomList::Prepend(int argc,const t_atom *argv) -{ - if(argc) { - t_atom *nlst = new t_atom[cnt+argc]; - int i; - - if(argv) - for(i = 0; i < argc; ++i) SetAtom(nlst[i],argv[i]); - for(i = 0; i < cnt; ++i) SetAtom(nlst[argc+i],lst[i]); - - if(lst) delete[] lst; - lst = nlst; - cnt += argc; - } - return *this; -} - -flext::AtomList flext::AtomList::GetPart(int offs,int len) const -{ - if(offs+len > Count()) { - len = Count()-offs; - if(len < 0) len = 0; - } - - return AtomList(len,Atoms()+offs); -} flext::AtomAnything::AtomAnything(const t_symbol *h,int argc,const t_atom *argv): diff --git a/externals/grill/flext/source/flatom_app.cpp b/externals/grill/flext/source/flatom_app.cpp new file mode 100755 index 00000000..aedaadcd --- /dev/null +++ b/externals/grill/flext/source/flatom_app.cpp @@ -0,0 +1,76 @@ +/* + +flext - C++ layer for Max/MSP and pd (pure data) externals + +Copyright (c) 2001,2002 Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +/*! \file flatom_app.cpp + \brief Definitions for handling the t_atom type and lists thereof. +*/ + +#include "flext.h" + + +flext::AtomList &flext::AtomList::Append(const t_atom &a) +{ + t_atom *nlst = new t_atom[cnt+1]; + for(int i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]); + SetAtom(nlst[cnt],a); + + if(lst) delete[] lst; + lst = nlst; + ++cnt; + + return *this; +} + +flext::AtomList &flext::AtomList::Append(int argc,const t_atom *argv) +{ + if(argc) { + t_atom *nlst = new t_atom[cnt+argc]; + int i; + for(i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]); + if(argv) + for(i = 0; i < argc; ++i) SetAtom(nlst[cnt+i],argv[i]); + + if(lst) delete[] lst; + lst = nlst; + cnt += argc; + } + return *this; +} + +flext::AtomList &flext::AtomList::Prepend(const t_atom &a) +{ + t_atom *nlst = new t_atom[cnt+1]; + for(int i = 0; i < cnt; ++i) SetAtom(nlst[i+1],lst[i]); + SetAtom(nlst[0],a); + + if(lst) delete[] lst; + lst = nlst; + ++cnt; + + return *this; +} + +flext::AtomList &flext::AtomList::Prepend(int argc,const t_atom *argv) +{ + if(argc) { + t_atom *nlst = new t_atom[cnt+argc]; + int i; + + if(argv) + for(i = 0; i < argc; ++i) SetAtom(nlst[i],argv[i]); + for(i = 0; i < cnt; ++i) SetAtom(nlst[argc+i],lst[i]); + + if(lst) delete[] lst; + lst = nlst; + cnt += argc; + } + return *this; +} + diff --git a/externals/grill/flext/source/flatom_part.cpp b/externals/grill/flext/source/flatom_part.cpp new file mode 100755 index 00000000..b736666a --- /dev/null +++ b/externals/grill/flext/source/flatom_part.cpp @@ -0,0 +1,37 @@ +/* + +flext - C++ layer for Max/MSP and pd (pure data) externals + +Copyright (c) 2001,2002 Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +/*! \file flatom_part.cpp + \brief Definitions for handling the t_atom type and lists thereof. +*/ + +#include "flext.h" + +int flext::AtomList::Get(t_atom *argv,int mxsz) const +{ + int argc = Count(); + if(mxsz >= 0 && argc > mxsz) argc = mxsz; + + for(int i = 0; i < argc; ++i) SetAtom(argv[i],lst[i]); + + return argc; +} + + +flext::AtomList flext::AtomList::GetPart(int offs,int len) const +{ + if(offs+len > Count()) { + len = Count()-offs; + if(len < 0) len = 0; + } + + return AtomList(len,Atoms()+offs); +} + diff --git a/externals/grill/flext/source/flattr.cpp b/externals/grill/flext/source/flattr.cpp index 44dc0d28..5612ab33 100644 --- a/externals/grill/flext/source/flattr.cpp +++ b/externals/grill/flext/source/flattr.cpp @@ -21,41 +21,80 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define STD #endif -flext_base::attritem::attritem(const t_symbol *t,const t_symbol *gt,metharg tp,methfun gf,methfun sf): - tag(t),gtag(gt),argtp(tp),gfun(gf),sfun(sf),nxt(NULL) -{} +flext_base::attritem::attritem(const t_symbol *t,metharg tp,methfun f,bool g): + item(t,0,NULL),argtp(tp), + fun(f),isget(g) +{ +} flext_base::attritem::~attritem() { - if(nxt) delete nxt; +// if(nxt) delete nxt; } +/* void flext_base::AddAttrItem(attritem *m) { - if(attrhead) { + int ix = m->Hash(); + post("attr index %x",ix); + attritem *&aix = attrhead[ix]; + + if(aix) { attritem *mi; - for(mi = attrhead; mi->nxt; mi = mi->nxt) {} + for(mi = aix; mi->nxt; mi = mi->nxt) {} mi->nxt = m; } else - attrhead = m; - attrcnt++; + aix = m; +// m->th->attrcnt++; } +*/ -void flext_base::AddAttrib(const char *attr,metharg tp,methfun gfun,methfun sfun) +//! Add get and set attributes +void flext_base::AddAttrib(itemarr *aa,itemarr *ma,const char *attr,metharg tp,methfun gfun,methfun sfun) { - if(procattr) { - char tmp[256] = "get"; + const t_symbol *asym = MakeSymbol(attr); + +// if(sfun) // if commented out, there will be a warning at run-time (more user-friendly) + { + attritem *a = new attritem(asym,tp,sfun,false); + aa->Add(a); + + // bind attribute to a method + methitem *mi = new methitem(0,asym,a); + mi->SetArgs(sfun,1,&tp); + ma->Add(mi); + } + +// if(gfun) // if commented out, there will be a warning at run-time (more user-friendly) + { + attritem *a = new attritem(asym,tp,gfun,true); + aa->Add(a); + + static char tmp[256] = "get"; strcpy(tmp+3,attr); - AddAttrItem(new attritem(MakeSymbol(attr),MakeSymbol(tmp),tp,gfun,sfun)); - AddMethod(0,attr,(methfun)cb_SetAttrib,a_any,a_null); - AddMethod(0,tmp,(methfun)cb_GetAttrib,a_any,a_null); + // bind attribute to a method + methitem *mi = new methitem(0,MakeSymbol(tmp),a); + mi->SetArgs(gfun,0,NULL); + ma->Add(mi); } +} + +void flext_base::AddAttrib(const char *attr,metharg tp,methfun gfun,methfun sfun) +{ + if(procattr) + AddAttrib(ThAttrs(),ThMeths(),attr,tp,gfun,sfun); else error("%s - attribute procession is not enabled!",thisName()); } +void flext_base::AddAttrib(t_class *c,const char *attr,metharg tp,methfun gfun,methfun sfun) +{ + AddAttrib(ClAttrs(c),ClMeths(c),attr,tp,gfun,sfun); +} + + int flext_base::CheckAttrib(int argc,const t_atom *argv) { int offs = 0; @@ -81,9 +120,19 @@ bool flext_base::InitAttrib(int argc,const t_atom *argv) bool flext_base::ListAttrib() { if(outattr) { - AtomList la(attrcnt); - attritem *a = attrhead; - for(int i = 0; i < attrcnt; ++i,a = a->nxt) SetSymbol(la[i],a->tag); + int cnt = attrhead?attrhead->Count():0; + int ccnt = clattrhead?clattrhead->Count():0; + AtomList la(ccnt+cnt); + + for(int i = 0,ix = 0; i <= 1; ++i) { + itemarr *a = i?attrhead:clattrhead; + if(a) { + for(int ai = 0; ai < a->Size(); ++ai) { + for(item *l = a->Item(ai); l; l = l->nxt) + SetSymbol(la[ix++],l->tag); + } + } + } ToOutAnything(outattr,MakeSymbol("attributes"),la.Count(),la.Atoms()); return true; @@ -94,90 +143,117 @@ bool flext_base::ListAttrib() bool flext_base::SetAttrib(const t_symbol *tag,int argc,const t_atom *argv) { - attritem *a = attrhead; - for(; a && a->tag != tag; a = a->nxt) {} + // search for matching attribute + attritem *a = (attritem *)attrhead->Find(tag); + while(a && (a->tag != tag || a->inlet != 0 || a->isget)) a = (attritem *)a->nxt; + if(!a) { + a = (attritem *)clattrhead->Find(tag); + while(a && (a->tag != tag || a->inlet != 0 || a->isget)) a = (attritem *)a->nxt; + } - if(a) { - if(a->sfun) { - bool ok = true; + if(a) + return SetAttrib(a,argc,argv); + else { + error("%s - %s: attribute not found",thisName(),GetString(tag)); + return true; + } +} - AtomList la; - t_any any; - switch(a->argtp) { - case a_float: - if(argc == 1 && CanbeFloat(argv[0])) { - any.ft = GetAFloat(argv[0]); - ((methfun_1)a->sfun)(this,any); - } - else ok = false; - break; - case a_int: - if(argc == 1 && CanbeInt(argv[0])) { - any.it = GetAInt(argv[0]); - ((methfun_1)a->sfun)(this,any); - } - else ok = false; - break; - case a_symbol: - if(argc == 1 && IsSymbol(argv[0])) { - any.st = GetSymbol(argv[0]); - ((methfun_1)a->sfun)(this,any); - } - else ok = false; - break; - case a_LIST: - any.vt = &(la(argc,argv)); - ((methfun_1)a->sfun)(this,any); - break; - default: - ERRINTERNAL(); - } +bool flext_base::SetAttrib(attritem *a,int argc,const t_atom *argv) +{ + if(a->fun) { + bool ok = true; - if(!ok) - post("%s - wrong arguments for attribute %s",thisName(),GetString(tag)); + AtomList la; + t_any any; + switch(a->argtp) { + case a_float: + if(argc == 1 && CanbeFloat(argv[0])) { + any.ft = GetAFloat(argv[0]); + ((methfun_1)a->fun)(this,any); + } + else ok = false; + break; + case a_int: + if(argc == 1 && CanbeInt(argv[0])) { + any.it = GetAInt(argv[0]); + ((methfun_1)a->fun)(this,any); + } + else ok = false; + break; + case a_symbol: + if(argc == 1 && IsSymbol(argv[0])) { + any.st = GetSymbol(argv[0]); + ((methfun_1)a->fun)(this,any); + } + else ok = false; + break; + case a_LIST: + any.vt = &(la(argc,argv)); + ((methfun_1)a->fun)(this,any); + break; + default: + ERRINTERNAL(); } - else - post("%s - attribute %s has no get method",thisName(),GetString(tag)); + + if(!ok) + post("%s - wrong arguments for attribute %s",thisName(),GetString(a->tag)); } else - error("%s - %s: attribute not found",thisName(),GetString(tag)); + post("%s - attribute %s has no get method",thisName(),GetString(a->tag)); return true; } -bool flext_base::GetAttrib(const t_symbol *tag,int argc,const t_atom *argv) +/* +bool flext_base::GetAttrib(const t_symbol *tag) { if(argc) post("%s - %s: arguments ignored",thisName(),GetString(tag)); - attritem *a = attrhead; - for(; a && a->gtag != tag; a = a->nxt) {} +#ifdef FLEXT_DEBUG + if(strncmp(GetString(tag),"get",3)) { + post("%s - %s: tag has no 'get' prefix",thisName(),GetString(tag)); + return false; + } +#endif + + const t_symbol *mtag = MakeSymbol(GetString(a->tag)+3); + // search for attribute + attritem *a = (attritem *)attrhead->Find(mtag); + if(!a) a = (attritem *)clattrhead->Find(mtag); +} +*/ + +bool flext_base::GetAttrib(attritem *a) +{ + // main attribute tag if(a) { - if(a->gfun) { + if(a->fun) { AtomList la; t_any any; switch(a->argtp) { case a_float: { - ((methfun_1)a->gfun)(this,any); + ((methfun_1)a->fun)(this,any); la(1); SetFloat(la[0],any.ft); break; } case a_int: { - ((methfun_1)a->gfun)(this,any); + ((methfun_1)a->fun)(this,any); la(1); SetInt(la[0],any.it); break; } case a_symbol: { - ((methfun_1)a->gfun)(this,any); + ((methfun_1)a->fun)(this,any); la(1); SetSymbol(la[0],any.st); break; } case a_LIST: { any.vt = &la; - ((methfun_1)a->gfun)(this,any); + ((methfun_1)a->fun)(this,any); break; } default: @@ -186,10 +262,10 @@ bool flext_base::GetAttrib(const t_symbol *tag,int argc,const t_atom *argv) ToOutAnything(outattr,a->tag,la.Count(),la.Atoms()); } else - post("%s - attribute %s has no set method",thisName(),GetString(tag)); + post("%s - attribute %s has no set method",thisName(),GetString(a->tag)); } else - error("%s - %s: attribute not found",thisName(),GetString(tag)); + error("%s - %s: attribute not found",thisName(),GetString(a->tag)); return true; } diff --git a/externals/grill/flext/source/flbase.cpp b/externals/grill/flext/source/flbase.cpp index f1791884..3b43c1fe 100644 --- a/externals/grill/flext/source/flbase.cpp +++ b/externals/grill/flext/source/flbase.cpp @@ -56,6 +56,10 @@ flext_obj :: flext_obj() flext_obj :: ~flext_obj() {} +bool flext_obj::Init() { return true; } +bool flext_obj::Finalize() { return true; } +void flext_obj::Exit() {} + void flext_obj::DefineHelp(t_class *c,const char *ref,const char *dir,bool addtilde) { #if FLEXT_SYS == FLEXT_SYS_PD diff --git a/externals/grill/flext/source/flbase.h b/externals/grill/flext/source/flbase.h index 79128e53..96a89d30 100644 --- a/externals/grill/flext/source/flbase.h +++ b/externals/grill/flext/source/flbase.h @@ -117,10 +117,13 @@ class FLEXT_EXT flext_obj: //! Virtual function called at creation time (but after the constructor) // this also guarantees that there are no instances of flext_obj - virtual bool Init() = 0; + virtual bool Init(); + + //! Virtual function called after Init() has succeeded + virtual bool Finalize(); //! Virtual function called at destruction (before the destructor) - virtual void Exit() {} + virtual void Exit(); //! @} FLEXT_O_CREATION diff --git a/externals/grill/flext/source/flclass.h b/externals/grill/flext/source/flclass.h index ab90667a..b0376ed3 100644 --- a/externals/grill/flext/source/flclass.h +++ b/externals/grill/flext/source/flclass.h @@ -77,10 +77,10 @@ public: virtual void m_help(); //! called on patcher load (not on mere object creation!) - virtual void m_loadbang() {} + virtual void m_loadbang(); //! quickhelp for inlets/outlets (gets called in Max/MSP only) - virtual void m_assist(long /*msg*/,long /*arg*/,char * /*s*/) {} + virtual void m_assist(long /*msg*/,long /*arg*/,char * /*s*/); /*! \brief Called for every incoming message. All method handling is done in there @@ -313,35 +313,63 @@ public: */ void AddMethodDef(int inlet,const char *tag = NULL); // call virtual function for tag && inlet - void AddMethod(int inlet,const char *tag,methfun fun,metharg tp,...); - - void AddMethod(int inlet,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(inlet,"list",(methfun)m,a_list,a_null); } - void AddMethod(int inlet,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(inlet,"list",(methfun)m,a_list,a_null); } - void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *)) { AddMethod(inlet,tag,(methfun)m,a_null); } // pure method - void AddMethod(int inlet,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(inlet,"anything",(methfun)m,a_any,a_null); } // anything - void AddMethod(int inlet,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(inlet,"anything",(methfun)m,a_any,a_null); } // anything - void AddMethod(int inlet,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(inlet,"symbol",(methfun)m,a_symbol,a_null); } // single symbol - void AddMethod(int inlet,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(inlet,"symbol",(methfun)m,a_symbol,a_null); } // single symbol - void AddMethod(int inlet,bool (*m)(flext_base *,float &)) { AddMethod(inlet,"float",(methfun)m,a_float,a_null); } // single float - void AddMethod(int inlet,bool (*m)(flext_base *,float &,float &)) { AddMethod(inlet,"list",(methfun)m,a_float,a_float,a_null); } // list of 2 floats - void AddMethod(int inlet,bool (*m)(flext_base *,float &,float &,float &)) { AddMethod(inlet,"list",(methfun)m,a_float,a_float,a_float,a_null); } // list of 3 floats + + void AddMethod(int inlet,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(ThMeths(),inlet,"list",(methfun)m,a_list,a_null); } + void AddMethod(int inlet,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(ThMeths(),inlet,"list",(methfun)m,a_list,a_null); } + void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_null); } // pure method + void AddMethod(int inlet,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(ThMeths(),inlet,"anything",(methfun)m,a_any,a_null); } // anything + void AddMethod(int inlet,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(ThMeths(),inlet,"anything",(methfun)m,a_any,a_null); } // anything + void AddMethod(int inlet,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(ThMeths(),inlet,"symbol",(methfun)m,a_symbol,a_null); } // single symbol + void AddMethod(int inlet,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(ThMeths(),inlet,"symbol",(methfun)m,a_symbol,a_null); } // single symbol + void AddMethod(int inlet,bool (*m)(flext_base *,float &)) { AddMethod(ThMeths(),inlet,"float",(methfun)m,a_float,a_null); } // single float + void AddMethod(int inlet,bool (*m)(flext_base *,float &,float &)) { AddMethod(ThMeths(),inlet,"list",(methfun)m,a_float,a_float,a_null); } // list of 2 floats + void AddMethod(int inlet,bool (*m)(flext_base *,float &,float &,float &)) { AddMethod(ThMeths(),inlet,"list",(methfun)m,a_float,a_float,a_float,a_null); } // list of 3 floats #if FLEXT_SYS == FLEXT_SYS_PD - void AddMethod(int inlet,bool (*m)(flext_base *,int &)) { AddMethod(inlet,"float",(methfun)m,a_int,a_null); } // single float + void AddMethod(int inlet,bool (*m)(flext_base *,int &)) { AddMethod(ThMeths(),inlet,"float",(methfun)m,a_int,a_null); } // single float #elif FLEXT_SYS == FLEXT_SYS_MAX - void AddMethod(int inlet,bool (*m)(flext_base *,int &)) { AddMethod(inlet,"int",(methfun)m,a_int,a_null); } // single float + void AddMethod(int inlet,bool (*m)(flext_base *,int &)) { AddMethod(ThMeths(),inlet,"int",(methfun)m,a_int,a_null); } // single float #else #error #endif - void AddMethod(int inlet,bool (*m)(flext_base *,int &,int &)) { AddMethod(inlet,"list",(methfun)m,a_int,a_int,a_null); } // list of 2 floats - void AddMethod(int inlet,bool (*m)(flext_base *,int &,int &,int &)) { AddMethod(inlet,"list",(methfun)m,a_int,a_int,a_int,a_null); } // list of 3 floats - void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(inlet,tag,(methfun)m,a_list,a_null); } // method+gimme - void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(inlet,tag,(methfun)m,a_list,a_null); } // method+gimme - void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(inlet,tag,(methfun)m,a_any,a_null); } // method+gimme - void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(inlet,tag,(methfun)m,a_any,a_null); } // method+gimme - void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(inlet,tag,(methfun)m,a_symbol,a_null); } // method+symbol - void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(inlet,tag,(methfun)m,a_symbol,a_null); } // method+symbol - void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,float &)) { AddMethod(inlet,tag,(methfun)m,a_float,a_null); } // method+float - void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,int &)) { AddMethod(inlet,tag,(methfun)m,a_int,a_null); } // method+int + void AddMethod(int inlet,bool (*m)(flext_base *,int &,int &)) { AddMethod(ThMeths(),inlet,"list",(methfun)m,a_int,a_int,a_null); } // list of 2 floats + void AddMethod(int inlet,bool (*m)(flext_base *,int &,int &,int &)) { AddMethod(ThMeths(),inlet,"list",(methfun)m,a_int,a_int,a_int,a_null); } // list of 3 floats + void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_list,a_null); } // method+gimme + void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_list,a_null); } // method+gimme + void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_any,a_null); } // method+gimme + void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_any,a_null); } // method+gimme + void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_symbol,a_null); } // method+symbol + void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_symbol,a_null); } // method+symbol + void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,float &)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_float,a_null); } // method+float + void AddMethod(int inlet,const char *tag,bool (*m)(flext_base *,int &)) { AddMethod(ThMeths(),inlet,tag,(methfun)m,a_int,a_null); } // method+int + + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(ClMeths(c),inlet,"list",(methfun)m,a_list,a_null); } + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(ClMeths(c),inlet,"list",(methfun)m,a_list,a_null); } + static void AddMethod(t_class *c,int inlet,const char *tag,bool (*m)(flext_base *)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_null); } // pure method + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(ClMeths(c),inlet,"anything",(methfun)m,a_any,a_null); } // anything + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(ClMeths(c),inlet,"anything",(methfun)m,a_any,a_null); } // anything + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(ClMeths(c),inlet,"symbol",(methfun)m,a_symbol,a_null); } // single symbol + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(ClMeths(c),inlet,"symbol",(methfun)m,a_symbol,a_null); } // single symbol + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,float &)) { AddMethod(ClMeths(c),inlet,"float",(methfun)m,a_float,a_null); } // single float + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,float &,float &)) { AddMethod(ClMeths(c),inlet,"list",(methfun)m,a_float,a_float,a_null); } // list of 2 floats + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,float &,float &,float &)) { AddMethod(ClMeths(c),inlet,"list",(methfun)m,a_float,a_float,a_float,a_null); } // list of 3 floats +#if FLEXT_SYS == FLEXT_SYS_PD + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,int &)) { AddMethod(ClMeths(c),inlet,"float",(methfun)m,a_int,a_null); } // single float +#elif FLEXT_SYS == FLEXT_SYS_MAX + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,int &)) { AddMethod(ClMeths(c),inlet,"int",(methfun)m,a_int,a_null); } // single float +#else +#error +#endif + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,int &,int &)) { AddMethod(ClMeths(c),inlet,"list",(methfun)m,a_int,a_int,a_null); } // list of 2 floats + static void AddMethod(t_class *c,int inlet,bool (*m)(flext_base *,int &,int &,int &)) { AddMethod(ClMeths(c),inlet,"list",(methfun)m,a_int,a_int,a_int,a_null); } // list of 3 floats + static void AddMethod(t_class *c,int inlet,const char *tag,bool (*m)(flext_base *,int,t_atom *)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_list,a_null); } // method+gimme + static void AddMethod(t_class *c,int inlet,const char *tag,bool (*m)(flext_base *,int,const t_atom *)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_list,a_null); } // method+gimme + static void AddMethod(t_class *c,int inlet,const char *tag,bool (*m)(flext_base *,t_symbol *,int,t_atom *)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_any,a_null); } // method+gimme + static void AddMethod(t_class *c,int inlet,const char *tag,bool (*m)(flext_base *,const t_symbol *,int,const t_atom *)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_any,a_null); } // method+gimme + static void AddMethod(t_class *c,int inlet,const char *tag,bool (*m)(flext_base *,t_symbol *&)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_symbol,a_null); } // method+symbol + static void AddMethod(t_class *c,int inlet,const char *tag,bool (*m)(flext_base *,const t_symbol *&)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_symbol,a_null); } // method+symbol + static void AddMethod(t_class *c,int inlet,const char *tag,bool (*m)(flext_base *,float &)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_float,a_null); } // method+float + static void AddMethod(t_class *c,int inlet,const char *tag,bool (*m)(flext_base *,int &)) { AddMethod(ClMeths(c),inlet,tag,(methfun)m,a_int,a_null); } // method+int + //! Set Max/MSP style of distributing list elements over (message) inlets void SetDist(bool d = true) { distmsgs = d; } @@ -412,14 +440,10 @@ protected: flext_base(); virtual ~flext_base(); -// inlets and outlets - - /*! \brief Set up inlets and outlets - \ingroup FLEXT_C_INOUT - \return True on successful creation of all inlets and outlets + /*! \brief Set up inlets and outlets, method and attribute lists */ virtual bool Init(); - + //! \brief This represents either an inlet or outlet struct xlet { enum type { @@ -448,6 +472,13 @@ protected: void AddAttrib(const char *attr,bool (*get)(flext_base *,AtomList *&),bool (*set)(flext_base *,AtomList *&)) { AddAttrib(attr,a_LIST,(methfun)get,(methfun)set); } void AddAttrib(const char *attr,bool (*get)(flext_base *,AtomAnything *&),bool (*set)(flext_base *,AtomAnything *&)) { AddAttrib(attr,a_ANY,(methfun)get,(methfun)set); } + static void AddAttrib(t_class *c,const char *attr,bool (*get)(flext_base *,float &),bool (*set)(flext_base *,float &)) { AddAttrib(c,attr,a_float,(methfun)get,(methfun)set); } + static void AddAttrib(t_class *c,const char *attr,bool (*get)(flext_base *,int &),bool (*set)(flext_base *,int &)) { AddAttrib(c,attr,a_int,(methfun)get,(methfun)set); } + static void AddAttrib(t_class *c,const char *attr,bool (*get)(flext_base *,const t_symbol *&),bool (*set)(flext_base *,const t_symbol *&)) { AddAttrib(c,attr,a_symbol,(methfun)get,(methfun)set); } + static void AddAttrib(t_class *c,const char *attr,bool (*get)(flext_base *,t_symbol *&),bool (*set)(flext_base *,t_symbol *&)) { AddAttrib(c,attr,a_symbol,(methfun)get,(methfun)set); } + static void AddAttrib(t_class *c,const char *attr,bool (*get)(flext_base *,AtomList *&),bool (*set)(flext_base *,AtomList *&)) { AddAttrib(c,attr,a_LIST,(methfun)get,(methfun)set); } + static void AddAttrib(t_class *c,const char *attr,bool (*get)(flext_base *,AtomAnything *&),bool (*set)(flext_base *,AtomAnything *&)) { AddAttrib(c,attr,a_ANY,(methfun)get,(methfun)set); } + //! @} FLEXT_C_ATTR /*! \addtogroup FLEXT_C_INOUT @@ -483,38 +514,84 @@ protected: // method handling - //! \brief This represents an item of the method list - class methitem { public: - methitem(int inlet,const t_symbol *t); - ~methitem(); - void SetArgs(methfun fun,int argc,metharg *args); + class attritem; + + class item { + public: + item(const t_symbol *t,int inl,attritem *a); + ~item(); + + bool IsAttr() const { return attr != NULL; } const t_symbol *tag; int inlet; + attritem *attr; + item *nxt; + }; + + class itemarr { + public: + itemarr(); + ~itemarr(); + + void Add(item *it); + item *Find(const t_symbol *tag,int inlet = 0) const; + void Finalize(); + + bool Ready() const { return bits >= 0; } + int Count() const { return cnt; } + int Size() const { return bits?1<<bits:0; } + item *Item(int ix) { return arr[ix]; } + + protected: + static int Hash(const t_symbol *,int inlet,int bits); + + item **arr; + int cnt,bits; + }; + + //! \brief This represents an item of the method list + class methitem: + public item { + public: + methitem(int inlet,const t_symbol *tg,attritem *conn = NULL); + ~methitem(); + + void SetArgs(methfun fun,int argc,metharg *args); + int argc; metharg *args; methfun fun; - - methitem *nxt; }; //! \brief This represents an item of the attribute list - class attritem { + class attritem: + public item { public: - attritem(const t_symbol *tag,const t_symbol *gtag,metharg tp,methfun gfun,methfun sfun); + attritem(const t_symbol *tag,metharg tp,methfun fun,bool get); ~attritem(); - const t_symbol *tag,*gtag; + bool isget; metharg argtp; - methfun gfun,sfun; - - attritem *nxt; + methfun fun; }; //! @} FLEXT_CLASS + itemarr *ThMeths() { return methhead; } + static itemarr *ClMeths(t_class *c) { return GetClassArr(c,0); } + + static void AddMethod(itemarr *ma,int inlet,const char *tag,methfun fun,metharg tp,...); + + itemarr *ThAttrs() { return attrhead; } + static itemarr *ClAttrs(t_class *c) { return GetClassArr(c,1); } + + static void AddAttrib(itemarr *aa,itemarr *ma,const char *attr,metharg tp,methfun gfun,methfun sfun); + void AddAttrib(const char *attr,metharg tp,methfun gfun,methfun sfun); + static void AddAttrib(t_class *c,const char *attr,metharg tp,methfun gfun,methfun sfun); + private: static void Setup(t_class *c); @@ -546,27 +623,31 @@ private: typedef bool (*methfun_3)(flext_base *c,t_any &,t_any &,t_any &); typedef bool (*methfun_4)(flext_base *c,t_any &,t_any &,t_any &,t_any &); typedef bool (*methfun_5)(flext_base *c,t_any &,t_any &,t_any &,t_any &,t_any &); - - methitem *methhead; - void AddMethItem(methitem *m); - attritem *attrhead; - int attrcnt; - void AddAttrItem(attritem *m); + static itemarr *GetClassArr(t_class *c,int ix); - void AddAttrib(const char *attr,metharg tp,methfun gfun,methfun sfun); + itemarr *methhead,*clmethhead; + + bool CallMeth(const methitem &m,int argc,const t_atom *argv); + bool FindMeth(int inlet,const t_symbol *s,int argc,const t_atom *argv); + bool TryMethTag(const methitem *m,int inlet,const t_symbol *t,int argc,const t_atom *argv); + bool TryMethSym(const methitem *m,int inlet,const t_symbol *t,const t_symbol *s); + bool TryMethAny(const methitem *m,int inlet,const t_symbol *t,const t_symbol *s,int argc,const t_atom *argv); + + itemarr *attrhead,*clattrhead; static int CheckAttrib(int argc,const t_atom *argv); bool InitAttrib(int argc,const t_atom *argv); bool ListAttrib(); - bool GetAttrib(const t_symbol *s,int argc,const t_atom *argv); +// bool GetAttrib(const t_symbol *s); + bool GetAttrib(attritem *a); bool SetAttrib(const t_symbol *s,int argc,const t_atom *argv); + bool SetAttrib(attritem *a,int argc,const t_atom *argv); static bool cb_ListAttrib(flext_base *c) { return c->ListAttrib(); } - static bool cb_GetAttrib(flext_base *c,const t_symbol *s,int argc,const t_atom *argv) { return c->GetAttrib(s,argc,argv); } - static bool cb_SetAttrib(flext_base *c,const t_symbol *s,int argc,const t_atom *argv) { return c->SetAttrib(s,argc,argv); } - +// static bool cb_GetAttrib(flext_base *c,const t_symbol *s,int argc,const t_atom *argv) { return c->GetAttrib(s,argc,argv); } +// static bool cb_SetAttrib(flext_base *c,const t_symbol *s,int argc,const t_atom *argv) { return c->SetAttrib(s,argc,argv); } // queue stuff @@ -582,7 +663,18 @@ private: #if FLEXT_SYS == FLEXT_SYS_PD // proxy object (for additional inlets) stuff - struct px_object; + static t_class *px_class; + + struct px_object // no virtual table! + { + t_object obj; // MUST reside at memory offset 0 + flext_base *base; + int index; + + void init(flext_base *b,int ix) { base = b; index = ix; } + static void px_method(px_object *c,const t_symbol *s,int argc,t_atom *argv); + }; + friend struct px_object; #elif FLEXT_SYS == FLEXT_SYS_MAX typedef object px_object; @@ -616,6 +708,11 @@ private: px_object **inlets; + static void SetProxies(t_class *c); + + bool InitInlets(); + bool InitOutlets(); + // callback functions static void cb_help(t_class *c); diff --git a/externals/grill/flext/source/fldefs.h b/externals/grill/flext/source/fldefs.h index 353752f7..49f44366 100644 --- a/externals/grill/flext/source/fldefs.h +++ b/externals/grill/flext/source/fldefs.h @@ -251,6 +251,9 @@ REAL_NEW_3(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2, TYPE3) // deprecated stuff +/*! \defgroup FLEXT_D_DEPRECATED Deprecated definitions + @{ + #define FLEXT_NEW_G FLEXT_NEW_V #define FLEXT_NEW_TILDE FLEXT_NEW_DSP @@ -268,6 +271,10 @@ REAL_NEW_3(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2, TYPE3) #define FLEXT_LIB_TILDE_3 FLEXT_LIB_DSP_3 +#define FLEXT_TILDE_SETUP FLEXT_DSP_SETUP + +//! @} FLEXT_D_DEPRECATED + /*! \defgroup FLEXT_D_LIBRARY Definitions for library objects @{ @@ -288,9 +295,6 @@ REAL_NEW_3(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2, TYPE3) */ #define FLEXT_DSP_SETUP(cl) REAL_SETUP(cl,1) -//! \deprecated -#define FLEXT_TILDE_SETUP FLEXT_DSP_SETUP - //! @} FLEXT_D_LIBRARY @@ -657,10 +661,109 @@ FLEXT_THREAD_1(M_FUN,t_symptr) // ==================================================================================== +/*! \defgroup FLEXT_D_CADDMETHOD Add flext methods within class scope + \note These can only be used at class construction time + @{ +*/ + +//! Add a method handler for bang +#define FLEXT_CADDBANG(CL,IX,M_FUN) \ +\ +AddMethod(CL,IX,"bang",FLEXT_CALL_PRE(M_FUN)) + +//! Add a handler for a method with no arguments +#define FLEXT_CADDMETHOD(CL,IX,M_FUN) \ +AddMethod(CL,IX,FLEXT_CALL_PRE(M_FUN)) + +//! Add a handler for a method with a (variable argument) list +#define FLEXT_CADDMETHOD_V(CL,IX,M_FUN) \ +\ +AddMethod(CL,IX,FLEXT_CALL_PRE(M_FUN)) + +//! Add a handler for a method with an anything argument +#define FLEXT_CADDMETHOD_A(CL,IX,M_FUN) \ +\ +AddMethod(CL,IX,FLEXT_CALL_PRE(M_FUN)) + +//! Add a a handler for a method with implicit arguments +#define FLEXT_CADDMETHOD_(CL,IX,M_TAG,M_FUN) \ +\ +AddMethod(CL,IX,M_TAG,FLEXT_CALL_PRE(M_FUN)) + +//! Add a handler for a method with 1 enum type argument +#define FLEXT_CADDMETHOD_E(CL,IX,M_TAG,M_FUN) \ +\ +AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),a_int,a_null) + +//! Add a handler for a method with 1 argument +#define FLEXT_CADDMETHOD_1(CL,IX,M_TAG,M_FUN,TP1) \ +\ +AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null) + +//! Add a handler for a method with 2 arguments +#define FLEXT_CADDMETHOD_2(CL,IX,M_TAG,M_FUN,TP1,TP2) \ +\ +AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),a_null) + +//! Add a handler for a method with 3 arguments +#define FLEXT_CADDMETHOD_3(CL,IX,M_TAG,M_FUN,TP1,TP2,TP3) \ +\ +AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),a_null) + +//! Add a handler for a method with 4 arguments +#define FLEXT_CADDMETHOD_4(CL,IX,M_TAG,M_FUN,TP1,TP2,TP3,TP4) \ +\ +AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),FLEXTARG(TP4),a_null) + +//! Add a handler for a method with 5 arguments +#define FLEXT_CADDMETHOD_5(CL,IX,M_TAG,M_FUN,TP1,TP2,TP3,TP4,TP5) \ +\ +AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),FLEXTARG(TP4),FLEXTARG(TP5),a_null) + + +// Shortcuts + +//! Add a handler for a method with a boolean argument +#define FLEXT_CADDMETHOD_B(CL,IX,M_TAG,M_FUN) \ +\ +FLEXT_CADDMETHOD_1(CL,IX,M_TAG,M_FUN,bool) + +//! Add a handler for a method with 1 float argument +#define FLEXT_CADDMETHOD_F(CL,IX,M_TAG,M_FUN) \ +\ +FLEXT_CADDMETHOD_1(CL,IX,M_TAG,M_FUN,float) + +//! Add a handler for a method with 2 float arguments +#define FLEXT_CADDMETHOD_FF(CL,IX,M_TAG,M_FUN) \ +\ +FLEXT_CADDMETHOD_2(CL,IX,M_TAG,M_FUN,float,float) + +//! Add a handler for a method with 3 float arguments +#define FLEXT_CADDMETHOD_FFF(CL,IX,M_TAG,M_FUN) \ +\ +FLEXT_CADDMETHOD_3(CL,IX,M_TAG,M_FUN,float,float,float) + +//! Add a handler for a method with 1 integer argument +#define FLEXT_CADDMETHOD_I(CL,IX,M_TAG,M_FUN) \ +\ +FLEXT_CADDMETHOD_1(CL,IX,M_TAG,M_FUN,int) + +//! Add a handler for a method with 2 integer arguments +#define FLEXT_CADDMETHOD_II(CL,IX,M_TAG,M_FUN) \ +\ +FLEXT_CADDMETHOD_2(CL,IX,M_TAG,M_FUN,int,int) + +//! Add a handler for a method with 3 integer arguments +#define FLEXT_CADDMETHOD_III(CL,IX,M_TAG,M_FUN) \ +\ +FLEXT_CADDMETHOD_3(CL,IX,M_TAG,M_FUN,int,int,int) + +//! @} FLEXT_D_CADDMETHOD /*! \defgroup FLEXT_D_ADDMETHOD Add flext methods - \note These can only be used at class construction time + \note These can only be used at object construction time + \note (in constructor or in Init() function before call to parent's Init()) @{ */ @@ -696,32 +799,32 @@ AddMethod(IX,M_TAG,FLEXT_CALL_PRE(M_FUN)) //! Add a handler for a method with 1 enum type argument #define FLEXT_ADDMETHOD_E(IX,M_TAG,M_FUN) \ \ -AddMethod(IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),a_int,a_null) +AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),a_int,a_null) //! Add a handler for a method with 1 argument #define FLEXT_ADDMETHOD_1(IX,M_TAG,M_FUN,TP1) \ \ -AddMethod(IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null) +AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null) //! Add a handler for a method with 2 arguments #define FLEXT_ADDMETHOD_2(IX,M_TAG,M_FUN,TP1,TP2) \ \ -AddMethod(IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),a_null) +AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),a_null) //! Add a handler for a method with 3 arguments #define FLEXT_ADDMETHOD_3(IX,M_TAG,M_FUN,TP1,TP2,TP3) \ \ -AddMethod(IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),a_null) +AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),a_null) //! Add a handler for a method with 4 arguments #define FLEXT_ADDMETHOD_4(IX,M_TAG,M_FUN,TP1,TP2,TP3,TP4) \ \ -AddMethod(IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),FLEXTARG(TP4),a_null) +AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),FLEXTARG(TP4),a_null) //! Add a handler for a method with 5 arguments #define FLEXT_ADDMETHOD_5(IX,M_TAG,M_FUN,TP1,TP2,TP3,TP4,TP5) \ \ -AddMethod(IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),FLEXTARG(TP4),FLEXTARG(TP5),a_null) +AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),FLEXTARG(TP4),FLEXTARG(TP5),a_null) // Shortcuts @@ -761,8 +864,8 @@ FLEXT_ADDMETHOD_2(IX,M_TAG,M_FUN,int,int) \ FLEXT_ADDMETHOD_3(IX,M_TAG,M_FUN,int,int,int) -//! @} FLEXT_D_ADDMETHOD +//! @} FLEXT_D_ADDMETHOD /*! \defgroup FLEXT_D_CALLMETHOD Call flext methods manually @@ -1082,12 +1185,62 @@ FLEXT_ATTRGET_V(VAR) FLEXT_ATTRSET_V(VAR) //! @} FLEXT_DA_ATTRVAR -/*! \defgroup FLEXT_D_ADDATTR Announce object attributes +/*! \defgroup FLEXT_D_CADDATTR Announce object attributes at class scope \note These can only be used at class construction time @{ */ //! Add handler for a gettable attribute +#define FLEXT_CADDATTR_GET(CL,NAME,GFUN) \ +\ +AddAttrib(CL,NAME,(FLEXT_GET_PRE(GFUN)),NULL) + +//! Add handler for a settable attribute +#define FLEXT_CADDATTR_SET(CL,NAME,SFUN) \ +\ +AddAttrib(CL,NAME,NULL,(FLEXT_SET_PRE(SFUN))) + +//! Add handlers for a both get- and settable attribute +#define FLEXT_CADDATTR_VAR(CL,NAME,GFUN,SFUN) \ +\ +AddAttrib(CL,NAME,(FLEXT_GET_PRE(GFUN)),(FLEXT_SET_PRE(SFUN))) + +//! Add handlers for a both get- and settable attribute +#define FLEXT_CADDATTR_VAR1(CL,NAME,FUN) \ +\ +AddAttrib(CL,NAME,(FLEXT_GET_PRE(FUN)),(FLEXT_SET_PRE(FUN))) + + +//! Add handler for a gettable enum attribute +#define FLEXT_CADDATTR_GET_E(CL,NAME,GFUN) \ +\ +AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),NULL) + +//! Add handler for a settable enum attribute +#define FLEXT_CADDATTR_SET_E(CL,NAME,SFUN) \ +\ +AddAttrib(CL,NAME,NULL,(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN))) + +//! Add handlers for a both get- and settable enum attribute +#define FLEXT_CADDATTR_VAR_E(CL,NAME,GFUN,SFUN) \ +\ +AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN))) + +//! Add handlers for a both get- and settable enum attribute +#define FLEXT_CADDATTR_VAR1_E(CL,NAME,FUN) \ +\ +AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(FUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(FUN))) + +//! @} FLEXT_D_CADDATTR + + +/*! \defgroup FLEXT_D_ADDATTR Announce object attributes + \note These can only be used at object construction time + \note (in constructor or in Init() function before call to parent's Init()) + @{ +*/ + +//! Add handler for a gettable attribute #define FLEXT_ADDATTR_GET(NAME,GFUN) \ \ AddAttrib(NAME,(FLEXT_GET_PRE(GFUN)),NULL) diff --git a/externals/grill/flext/source/flext.cpp b/externals/grill/flext/source/flext.cpp index f74d11c6..5ffaaae4 100644 --- a/externals/grill/flext/source/flext.cpp +++ b/externals/grill/flext/source/flext.cpp @@ -14,104 +14,6 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include "flext.h" #include "flinternal.h" -#include <string.h> -#include <stdarg.h> - - -// === proxy class for flext_base ============================ - -#if FLEXT_SYS == FLEXT_SYS_PD - -static t_class *px_class; - -struct flext_base::px_object // no virtual table! -{ - t_object obj; // MUST reside at memory offset 0 - flext_base *base; - int index; - - void init(flext_base *b,int ix) { base = b; index = ix; } - static void px_method(px_object *c,const t_symbol *s,int argc,t_atom *argv); -}; - - -void flext_base::px_object::px_method(px_object *obj,const t_symbol *s,int argc,t_atom *argv) -{ - obj->base->m_methodmain(obj->index,s,argc,argv); -} - -void flext_base::cb_px_anything(t_class *c,const t_symbol *s,int argc,t_atom *argv) -{ - thisObject(c)->m_methodmain(0,s,argc,argv); -} - -#define DEF_IN_FT(IX) \ -void flext_base::cb_px_ft ## IX(t_class *c,float v) { \ - t_atom atom; SETFLOAT(&atom,v); \ - thisObject(c)->m_methodmain(IX,&s_float,1,&atom); \ -} - -#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(t_class *c,const t_symbol *s,int argc,t_atom *argv) -{ - // check if inlet allows anything (or list) - - flext_base *o = thisObject(c); - int ci = ((flext_hdr *)o->x_obj)->curinlet; - - o->m_methodmain(ci,s,argc,argv); -} - -void flext_base::cb_px_int(t_class *c,int v) -{ - // check if inlet allows int type - t_atom atom; - SetInt(atom,v); - cb_px_anything(c,sym_int,1,&atom); -} - -void flext_base::cb_px_float(t_class *c,float v) -{ - // check if inlet allows float type - t_atom atom; - SetFloat(atom,v); - cb_px_anything(c,sym_float,1,&atom); -} - -void flext_base::cb_px_bang(t_class *c) -{ - // check if inlet allows bang - cb_px_anything(c,sym_bang,0,NULL); -} - - -#define DEF_IN_FT(IX) \ -void flext_base::cb_px_in ## IX(t_class *c,int v) { long &ci = ((flext_hdr *)thisObject(c)->x_obj)->curinlet; ci = IX; cb_px_int(c,v); ci = 0; } \ -void flext_base::cb_px_ft ## IX(t_class *c,float v) { long &ci = ((flext_hdr *)thisObject(c)->x_obj)->curinlet; ci = IX; cb_px_float(c,v); ci = 0; } - -#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) - -#else -#error // Other system -#endif - - -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) - // === flext_base ============================================ @@ -125,15 +27,15 @@ flext_base::flext_base(): insigs(0),outsigs(0), outlets(NULL),outattr(NULL), distmsgs(false), - methhead(NULL),attrhead(NULL),attrcnt(0), + methhead(new itemarr),attrhead(new itemarr), //attrcnt(0), + clmethhead(ClMeths(thisClass())),clattrhead(ClAttrs(thisClass())), inlets(NULL) { LOG1("%s - flext logging is on",thisName()); + // message queue ticker qhead = qtail = NULL; qclk = (t_qelem *)(qelem_new(this,(t_method)QTick)); - - AddMethod(0,"getattributes",(methfun)cb_ListAttrib); } flext_base::~flext_base() @@ -142,10 +44,15 @@ flext_base::~flext_base() StopThreads(); #endif - // send remaining pending messages + // send remaining pending messages and destroy queue ticker while(qhead) QTick(this); qelem_free((t_qelem *)qclk); + // delete message lists + if(methhead) delete methhead; + if(attrhead) delete attrhead; + + // destroy inlets and outlets and their proxy objects if(inlist) delete inlist; if(outlist) delete outlist; if(outlets) delete[] outlets; @@ -153,6 +60,7 @@ flext_base::~flext_base() if(inlets) { for(int ix = 0; ix < incnt; ++ix) if(inlets[ix]) { + // release proxy object #if FLEXT_SYS == FLEXT_SYS_PD pd_free(&inlets[ix]->obj.ob_pd); #elif FLEXT_SYS == FLEXT_SYS_MAX @@ -161,258 +69,44 @@ flext_base::~flext_base() } delete[] inlets; } - + #if FLEXT_SYS == FLEXT_SYS_MAX // if(insigs) dsp_free(thisHdr()); if(insigs) dsp_freebox(thisHdr()); #endif - - if(methhead) delete methhead; - if(attrhead) delete attrhead; } -/*! This virtual function is created after the object has been created, that is, - after the constructor has been processed. It creates the inlets and outlets. +/*! 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 + \mote 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 = true; - - // ---------------------------------- - // create inlets - // ---------------------------------- - - incnt = insigs = 0; - - if(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; - delete inlist; inlist = NULL; - - inlets = new px_object *[incnt]; - for(i = 0; i < incnt; ++i) inlets[i] = NULL; - - // type info is now in list array -#if FLEXT_SYS == FLEXT_SYS_PD - { - int cnt = 0; - - if(incnt >= 1) { - switch(list[0]) { - case xlet::tp_sig: - CLASS_MAINSIGNALIN(thisClass(),flext_hdr,defsig); - ++insigs; - break; - default: - // leftmost inlet is already there... - break; - } - ++cnt; - } - - for(int ix = 1; ix < incnt; ++ix,++cnt) { - switch(list[ix]) { - case xlet::tp_float: - case xlet::tp_int: { - char sym[] = "ft??"; - if(ix >= 10) { - if(compatibility) { - // Max allows max. 9 inlets - post("%s: Only 9 float/int inlets allowed in compatibility mode",thisName()); - ok = false; - } - else { - if(ix > 99) - post("%s: Inlet index > 99 not allowed for float/int inlets",thisName()); - sym[2] = '0'+ix/10,sym[3] = '0'+ix%10; - } - } - else - sym[2] = '0'+ix,sym[3] = 0; - if(ok) inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, &s_float, gensym(sym)); - break; - } - case xlet::tp_sym: - (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages - inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, &s_symbol, &s_symbol); - break; - case xlet::tp_list: - (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages - inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, &s_list, &s_list); - break; - case xlet::tp_any: - (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages - 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) { - post("%s: All signal inlets must be left-aligned in compatibility mode",thisName()); - ok = false; - } - else { - // pd doesn't seem to be able to handle signals and messages into the same inlet... - - inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, &s_signal, &s_signal); - ++insigs; - } - break; - default: - error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); - ok = false; - } - } - - incnt = cnt; - } -#elif FLEXT_SYS == FLEXT_SYS_MAX - { - int ix,cnt; - // count leftmost signal inlets - while(insigs < incnt && list[insigs] == xlet::tp_sig) ++insigs; - - for(cnt = 0,ix = incnt-1; ix >= insigs; --ix,++cnt) { - if(ix == 0) { - if(list[ix] != xlet::tp_any) { - error("%s: Leftmost inlet must be of type signal or default",thisName()); - ok = false; - } - } - else { - switch(list[ix]) { - case xlet::tp_sig: - error("%s: All signal inlets must be at the left side",thisName()); - ok = false; - break; - case xlet::tp_float: - if(ix >= 10) { - post("%s: Only 9 float inlets possible",thisName()); - ok = false; - } - else - floatin(x_obj,ix); - break; - case xlet::tp_int: - if(ix >= 10) { - post("%s: Only 9 int inlets possible",thisName()); - ok = false; - } - else - intin(x_obj,ix); - break; - case xlet::tp_any: // non-leftmost - case xlet::tp_sym: - case xlet::tp_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]); - ok = false; - } - } - } - - incnt = cnt; - - if(insigs) -// dsp_setup(thisHdr(),insigs); // signal inlets - dsp_setupbox(thisHdr(),insigs); // signal inlets - } -#else -#error -#endif + bool ok = flext_obj::Init(); - delete[] list; - } - -/* - if(outlets) { delete[] outlets; outlets = NULL; } -*/ - // ---------------------------------- - // create outlets - // ---------------------------------- + if(ok) ok = InitInlets() && InitOutlets(); - outcnt = outsigs = 0; - -#if FLEXT_SYS == FLEXT_SYS_MAX - // for Max/MSP the rightmost outlet has to be created first - if(procattr) - outattr = (outlet *)newout_anything(&x_obj->obj); -#endif - - if(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; - delete outlist; outlist = NULL; + if(ok) { + // initialize method lists + if(methhead) methhead->Finalize(); + if(clmethhead) clmethhead->Finalize(); - outlets = new outlet *[outcnt]; - - // type info is now in list array -#if FLEXT_SYS == FLEXT_SYS_PD - for(int ix = 0; ix < outcnt; ++ix) -#elif FLEXT_SYS == FLEXT_SYS_MAX - 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 - } + if(procattr) { + // initialize attribute lists + if(attrhead) attrhead->Finalize(); + if(clattrhead) clattrhead->Finalize(); + + // initialize creation attributes + if(m_holdaargc && m_holdaargv) + ok = InitAttrib(m_holdaargc,m_holdaargv); } - - delete[] list; } - if(procattr) { -#if FLEXT_SYS == FLEXT_SYS_PD - // attribute dump outlet is the last one - outattr = (outlet *)newout_anything(&x_obj->obj); -#endif - - // initialize creation attributes - if(m_holdaargc && m_holdaargv) - ok = InitAttrib(m_holdaargc,m_holdaargv); - } - - return ok; } @@ -427,35 +121,13 @@ void flext_base::Setup(t_class *c) add_assist(c,cb_assist); #endif - // 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 -#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); -#else -#error -#endif + if(process_attributes) + AddMethod(c,0,"getattributes",(methfun)cb_ListAttrib); - // 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); + SetProxies(c); #ifdef FLEXT_THREADS thrid = GetThreadId(); - StartHelper(); #endif } @@ -473,282 +145,8 @@ void flext_base::m_help() post("%s (using flext " FLEXT_VERSTR ") - compiled on %s %s",thisName(),__DATE__,__TIME__); } -/*! \brief All the message processing - The messages of all the inlets go here and are promoted to the registered callback functions -*/ -bool flext_base::m_methodmain(int inlet,const t_symbol *s,int argc,const t_atom *argv) -{ - static bool trap = false; - bool ret = false; - - curtag = s; - - LOG3("methodmain inlet:%i args:%i symbol:%s",inlet,argc,s?s->s_name:""); - - for(const methitem *m = methhead; m && !ret; m = m->nxt) { - if(m->tag == s && (inlet == m->inlet || m->inlet < 0 )) { - // tag fits - LOG4("found method tag %s: inlet=%i, symbol=%s, argc=%i",m->tag->s_name,inlet,s->s_name,argc); - - if(m->argc == 1 && m->args[0] == a_list) { - ret = ((methfun_V)m->fun)(this,argc,const_cast<t_atom *>(argv)); - } - else if(m->argc == 1 && m->args[0] == a_any) { - ret = ((methfun_A)m->fun)(this,s,argc,const_cast<t_atom *>(argv)); - } - else if(argc == m->argc) { - int ix; - t_any aargs[FLEXT_MAXMETHARGS]; - bool ok = true; - for(ix = 0; ix < argc && ok; ++ix) { - switch(m->args[ix]) { - case a_float: { - if(IsFloat(argv[ix])) aargs[ix].ft = GetFloat(argv[ix]); - else if(IsInt(argv[ix])) aargs[ix].ft = (float)GetInt(argv[ix]); - else ok = false; - - if(ok) LOG2("int arg %i = %f",ix,aargs[ix].ft); - break; - } - case a_int: { - if(IsFloat(argv[ix])) aargs[ix].it = (int)GetFloat(argv[ix]); - else if(IsInt(argv[ix])) aargs[ix].it = GetInt(argv[ix]); - else ok = false; - - if(ok) LOG2("float arg %i = %i",ix,aargs[ix].it); - break; - } - case a_symbol: { - if(IsSymbol(argv[ix])) aargs[ix].st = GetSymbol(argv[ix]); - else ok = false; - - if(ok) LOG2("symbol arg %i = %s",ix,GetString(aargs[ix].st)); - break; - } -#if FLEXT_SYS == FLEXT_SYS_PD - case a_pointer: { - if(IsPointer(argv[ix])) aargs[ix].pt = GetPointer(argv[ix]); - else ok = false; - break; - } -#endif - default: - error("Argument type illegal"); - ok = false; - } - } - - if(ok && ix == argc) { - switch(argc) { - case 0: ret = ((methfun_0)m->fun)(this); break; - case 1: ret = ((methfun_1)m->fun)(this,aargs[0]); break; - case 2: ret = ((methfun_2)m->fun)(this,aargs[0],aargs[1]); break; - case 3: ret = ((methfun_3)m->fun)(this,aargs[0],aargs[1],aargs[2]); break; - case 4: ret = ((methfun_4)m->fun)(this,aargs[0],aargs[1],aargs[2],aargs[3]); break; - case 5: ret = ((methfun_5)m->fun)(this,aargs[0],aargs[1],aargs[2],aargs[3],aargs[4]); break; - } - } - } - } - else if(m->tag == sym_symbol && !argc && (inlet == m->inlet || m->inlet < 0 )) { - // symbol - LOG3("found symbol method for %s: inlet=%i, symbol=%s",m->tag->s_name,inlet,s->s_name); - - t_any sym; sym.st = const_cast<t_symbol *>(s); - ret = ((methfun_1)m->fun)(this,sym); - } - else if(m->tag == sym_anything && (inlet == m->inlet || m->inlet < 0) && m->argc == 1 && m->args[0] == a_any) { - // any - LOG4("found any method for %s: inlet=%i, symbol=%s, argc=%i",m->tag->s_name,inlet,s->s_name,argc); - - ret = ((methfun_A)m->fun)(this,s,argc,const_cast<t_atom *>(argv)); - } - } - -#if FLEXT_SYS == FLEXT_SYS_MAX - // If float message is not explicitly handled: try int handler instead - if(!ret && argc == 1 && s == sym_float && !trap) { - t_atom fl; - SetInt(fl,GetAInt(argv[0])); - trap = true; - ret = m_methodmain(inlet,sym_int,1,&fl); - trap = false; - } - - // If int message is not explicitly handled: try float handler instead - if(!ret && argc == 1 && s == sym_int && !trap) { - t_atom fl; - SetFloat(fl,GetAFloat(argv[0])); - trap = true; - ret = m_methodmain(inlet,sym_float,1,&fl); - trap = false; - } -#endif - - // If float or int message is not explicitly handled: try list handler instead - if(!ret && !trap && argc == 1 && (s == sym_float -#if FLEXT_SYS == FLEXT_SYS_MAX - || s == sym_int -#endif - )) { - t_atom list; - if(s == sym_float) - SetFloat(list,GetFloat(argv[0])); -#if FLEXT_SYS == FLEXT_SYS_MAX - else if(s == sym_int) - SetInt(list,GetInt(argv[0])); -#endif - - trap = true; - ret = m_methodmain(inlet,sym_list,1,&list); - trap = false; - } - - // If symbol message (pure anything without args) is not explicitly handled: try list handler instead - if(!ret && !trap && argc == 0) { - t_atom list; - SetSymbol(list,s); - trap = true; - ret = m_methodmain(inlet,sym_list,1,&list); - trap = false; - } +void flext_base::m_loadbang() {} - // if distmsgs is switched on then distribute list elements over inlets (Max/MSP behavior) - if(!ret && distmsgs && !trap && inlet == 0 && s == sym_list && insigs <= 1) { - int i = incnt; - if(i > argc) i = argc; - for(--i; i >= 0; --i) { // right to left distribution - const t_symbol *sym = NULL; - if(IsFloat(argv[i])) sym = sym_float; - else if(IsInt(argv[i])) sym = sym_int; - else if(IsSymbol(argv[i])) sym = sym_symbol; -#if FLEXT_SYS == FLEXT_SYS_PD - else if(IsPointer(argv[i])) sym = sym_pointer; // can pointer atoms occur here? -#endif - if(sym) { - trap = true; - m_methodmain(i,sym,1,argv+i); - trap = false; - } - } - - ret = true; - } - - if(!ret && !trap) ret = m_method_(inlet,s,argc,argv); - - curtag = NULL; - - return ret; // true if appropriate handler was found and called -} - -bool flext_base::m_method_(int inlet,const t_symbol *s,int argc,const t_atom *argv) -{ -//#ifdef FLEXT_DEBUG - post("%s: message unhandled - inlet:%i args:%i symbol:%s",thisName(),inlet,argc,s?s->s_name:""); -//#endif - return false; -} - - -flext_base::methitem::methitem(int in,const t_symbol *t): - tag(t),inlet(in), - argc(0),args(NULL), - fun(NULL), - nxt(NULL) -{} - -flext_base::methitem::~methitem() -{ - if(nxt) delete nxt; - if(args) delete[] args; -} - -void flext_base::methitem::SetArgs(methfun _fun,int _argc,metharg *_args) -{ - fun = _fun; - if(args) delete[] args; - argc = _argc,args = _args; -} - - - -void flext_base::AddMethItem(methitem *m) -{ - if(methhead) { - methitem *mi; - for(mi = methhead; mi->nxt; mi = mi->nxt) {} - mi->nxt = m; - } - else - methhead = m; -} -/* -const flext_base::methitem *flext_base::FindMethItem(int inlet,const t_symbol *tag,const methitem *st) -{ - const methitem *mi = st?st:mlst; - if(inlet < 0) { - for(; mi; mi = mi->nxt) - if(mi->tag == tag) break; - } - else { - for(; mi; mi = mi->nxt) - if(mi->inlet == inlet && mi->tag == tag) break; - } - return mi; -} -*/ - -void flext_base::AddMethodDef(int inlet,const char *tag) -{ - AddMethItem(new methitem(inlet,tag?MakeSymbol(tag):NULL)); -} - -/*! \brief Add a method to the queue -*/ -void flext_base::AddMethod(int inlet,const char *tag,methfun fun,metharg tp,...) -{ - methitem *mi = new methitem(inlet,MakeSymbol(tag)); - - va_list marker; - - // at first just count the arg type list (in argc) - int argc = 0; - va_start(marker,tp); - metharg *args = NULL,arg = tp; - for(; arg != a_null; ++argc) arg = (metharg)va_arg(marker,int); //metharg); - va_end(marker); - - if(argc > 0) { - if(argc > FLEXT_MAXMETHARGS) { - error("%s - method %s: only %i arguments are type-checkable: use variable argument list for more",thisName(),tag?tag:"?",FLEXT_MAXMETHARGS); - argc = FLEXT_MAXMETHARGS; - } - - args = new metharg[argc]; - - va_start(marker,tp); - metharg a = tp; - for(int ix = 0; ix < argc; ++ix) { -#ifdef FLEXT_DEBUG - if(a == a_list && ix > 0) { - ERRINTERNAL(); - } -#endif -#if FLEXT_SYS == FLEXT_SYS_PD - if(a == a_pointer && flext_base::compatibility) { - post("Pointer arguments are not allowed in compatibility mode"); - } -#endif - args[ix] = a; - a = (metharg)va_arg(marker,int); //metharg); - } - va_end(marker); - } - - mi->SetArgs(fun,argc,args); - - AddMethItem(mi); -} +void flext_base::m_assist(long /*msg*/,long /*arg*/,char * /*s*/) {} diff --git a/externals/grill/flext/source/flinternal.h b/externals/grill/flext/source/flinternal.h index 09b8cbd1..87f04882 100644 --- a/externals/grill/flext/source/flinternal.h +++ b/externals/grill/flext/source/flinternal.h @@ -62,6 +62,9 @@ typedef t_perfroutine t_dspmethod; #define qelem_set clock_set #define qelem_unset clock_unset +#define CRITON() +#define CRITOFF() + #elif FLEXT_SYS == FLEXT_SYS_MAX @@ -106,6 +109,9 @@ typedef void t_outlet; typedef t_perfroutine t_dspmethod; +#define CRITON() short state = lockout_set(1) +#define CRITOFF() lockout_set(state) + #endif diff --git a/externals/grill/flext/source/flitem.cpp b/externals/grill/flext/source/flitem.cpp new file mode 100755 index 00000000..cd5aed9e --- /dev/null +++ b/externals/grill/flext/source/flitem.cpp @@ -0,0 +1,209 @@ +/* + +flext - C++ layer for Max/MSP and pd (pure data) externals + +Copyright (c) 2001,2002 Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +/*! \file flitem.cpp + \brief Processing of method and attribute lists. +*/ + +#include "flext.h" +#include <string.h> + + +flext_base::item::item(const t_symbol *t,int inl,attritem *a): + inlet(inl),tag(t),attr(a),nxt(NULL) +{} + +flext_base::item::~item() +{ + if(nxt) delete nxt; +} + + +flext_base::itemarr::itemarr(): + arr(new item *[2]),cnt(0),bits(-1) +{ + arr[0] = arr[1] = NULL; +} + +flext_base::itemarr::~itemarr() +{ + int c = Ready()?Size():2; + + for(int i = 0; i < c; ++i) + if(arr[i]) delete arr[i]; + delete[] arr; +} + +void flext_base::itemarr::Add(item *it) +{ + if(Ready()) { + // retrieve array index + int ix = Hash(it->tag,it->inlet,bits); + + // add to array slot + if(arr[ix]) { + item *a = arr[ix]; + while(a->nxt) a = a->nxt; + a->nxt = it; + } + else arr[ix] = it; + } + else { +// post("ADD %i,%s",it->inlet,GetString(it->tag)); + + if(arr[0]) arr[1] = arr[1]->nxt = it; + else arr[0] = arr[1] = it; + ++cnt; + } +} + +void flext_base::itemarr::Finalize() +{ + if(!Ready()) + { + bits = Int2Bits(cnt); // at least enough bits to hold all items + + int sz = Size(); + + // save stored item list + item *lst = arr[0]; + + delete[] arr; + arr = new item *[sz]; + memset(arr,0,sz*sizeof(*arr)); + + while(lst) { + item *l = lst; + lst = lst->nxt; + l->nxt = NULL; + + Add(l); +/* + // retrieve array index + int ix = Hash(l->tag,l->inlet,bits); + +// post("ADD %i,%s -> index %i",l->inlet,GetString(l->tag),ix); + + // add to array slot + if(arr[ix]) { + item *a = arr[ix]; + while(a->nxt) a = a->nxt; + a->nxt = l; + } + else arr[ix] = l; +*/ + } + +#if 0 + post("count=%i, bit=%i size=%i",Count(),bits,sz); + + if(Count()) { + static char usage[1024]; + int c = 0,i; + for(i = 0; i < sz; ++i) { + usage[i] = arr[i]?'x':'.'; + if(arr[i]) ++c; + } + usage[i] = 0; + post("USAGE %i/%i - sparse=%i%% %s",c,Count(),(int)((float)c/Count()*100.),usage); + } +#endif + } +} + +flext_base::item *flext_base::itemarr::Find(const t_symbol *tag,int inlet) const +{ + item *a; + if(!Ready()) + a = arr[0]; + else if(Count()) { + int ix = Hash(tag,inlet,bits); + a = arr[ix]; + } + else + a = NULL; + + // Search first matching entry + while(a && (a->tag != tag || a->inlet != inlet)) a = a->nxt; + return a; +} + +int flext_base::itemarr::Hash(const t_symbol *tag,int inlet,int bits) +{ + unsigned long h = ((reinterpret_cast<unsigned long>(tag)&~7L)<<1)+inlet; + return FoldBits(h,bits); +} + +// --- class item lists (methods and attributes) ---------------- + +class _itemarr +{ +public: + enum { HASHBITS=7, HASHSIZE=1<<HASHBITS }; + + _itemarr(t_class *c,int i); + ~_itemarr(); // will never be called + + static int Hash(t_class *c,int ix); + + int Hash() const { return Hash(cl,ix); } + void Add(_itemarr *a); + + t_class *cl; + int ix; + flext_base::itemarr *arr; + + _itemarr *nxt; +}; + +_itemarr::_itemarr(t_class *c,int i): + cl(c),ix(i), + arr(new flext_base::itemarr), + nxt(NULL) +{} + +void _itemarr::Add(_itemarr *a) +{ + if(nxt) nxt->Add(a); + else nxt = a; +} + +int _itemarr::Hash(t_class *c,int ix) +{ + unsigned long h = (reinterpret_cast<unsigned long>(c)&~3L)+ix; + return flext::FoldBits(h,HASHBITS); +} + +static _itemarr **_arrs = NULL; + +flext_base::itemarr *flext_base::GetClassArr(t_class *c,int ix) +{ + if(!_arrs) { + _arrs = new _itemarr *[_itemarr::HASHSIZE]; + memset(_arrs,0,_itemarr::HASHSIZE*sizeof(*_arrs)); + } + + int hash = _itemarr::Hash(c,ix); + _itemarr *a = _arrs[hash]; + _itemarr *pa = NULL; + while(a && (a->cl != c || a->ix != ix)) pa = a,a = a->nxt; + + if(!a) { + a = new _itemarr(c,ix); + if(pa) + // previous entry... extend + a->nxt = pa->nxt,pa->nxt = a; + else + // new singular entry + _arrs[hash] = a; + } + + return a->arr; +} diff --git a/externals/grill/flext/source/fllib.cpp b/externals/grill/flext/source/fllib.cpp index 77f85dbc..4c66d0b5 100755 --- a/externals/grill/flext/source/fllib.cpp +++ b/externals/grill/flext/source/fllib.cpp @@ -354,8 +354,12 @@ flext_hdr *flext_obj::obj_new(const t_symbol *s,int _argc_,t_atom *argv) flext_obj::m_holdaargv = argv+argc; // call virtual init function + // here, inlets, outlets, methods and attributes can be set up ok = obj->data->Init(); + // call another virtual init function + if(ok) ok = obj->data->Finalize(); + flext_obj::m_holdaargc = 0; flext_obj::m_holdaargv = NULL; } diff --git a/externals/grill/flext/source/flmeth.cpp b/externals/grill/flext/source/flmeth.cpp new file mode 100755 index 00000000..c5b4499b --- /dev/null +++ b/externals/grill/flext/source/flmeth.cpp @@ -0,0 +1,120 @@ +/* + +flext - C++ layer for Max/MSP and pd (pure data) externals + +Copyright (c) 2001,2002 Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +/*! \file flmeth.cpp + \brief Method processing of flext base class. +*/ + +#include "flext.h" +#include <string.h> +#include <stdarg.h> + +flext_base::methitem::methitem(int in,const t_symbol *tg,attritem *conn): + item(tg,in,conn), + argc(0),args(NULL) + ,fun(NULL) +{} + +flext_base::methitem::~methitem() +{ + if(args) delete[] args; +} + +void flext_base::methitem::SetArgs(methfun _fun,int _argc,metharg *_args) +{ + fun = _fun; + if(args) delete[] args; + argc = _argc,args = _args; +} + +/* +void flext_base::AddMethItem(methitem *m) +{ + int ix = m->Hash(); + post("method index %x",ix); + methitem *&mix = methhead[ix]; + + if(mix) { + methitem *mi; + for(mi = mix; mi->nxt; mi = mi->nxt) {} + mi->nxt = m; + } + else + mix = m; +} +*/ +/* +const flext_base::methitem *flext_base::FindMethItem(int inlet,const t_symbol *tag,const methitem *st) +{ + const methitem *mi = st?st:mlst; + if(inlet < 0) { + for(; mi; mi = mi->nxt) + if(mi->tag == tag) break; + } + else { + for(; mi; mi = mi->nxt) + if(mi->inlet == inlet && mi->tag == tag) break; + } + return mi; +} +*/ + +void flext_base::AddMethodDef(int inlet,const char *tag) +{ + methhead->Add(new methitem(inlet,tag?MakeSymbol(tag):NULL)); +} + +/*! \brief Add a method to the queue +*/ +void flext_base::AddMethod(itemarr *ma,int inlet,const char *tag,methfun fun,metharg tp,...) +{ + va_list marker; + + // at first just count the arg type list (in argc) + int argc = 0; + va_start(marker,tp); + metharg *args = NULL,arg = tp; + for(; arg != a_null; ++argc) arg = (metharg)va_arg(marker,int); //metharg); + va_end(marker); + + if(argc > 0) { + if(argc > FLEXT_MAXMETHARGS) { + error("flext - method %s: only %i arguments are type-checkable: use variable argument list for more",tag?tag:"?",FLEXT_MAXMETHARGS); + argc = FLEXT_MAXMETHARGS; + } + + args = new metharg[argc]; + + va_start(marker,tp); + metharg a = tp; + for(int ix = 0; ix < argc; ++ix) { +#ifdef FLEXT_DEBUG + if(a == a_list && ix > 0) { + ERRINTERNAL(); + } +#endif +#if FLEXT_SYS == FLEXT_SYS_PD + if(a == a_pointer && flext_base::compatibility) { + post("Pointer arguments are not allowed in compatibility mode"); + } +#endif + args[ix] = a; + a = (metharg)va_arg(marker,int); //metharg); + } + va_end(marker); + } + + methitem *mi = new methitem(inlet,MakeSymbol(tag)); + + mi->SetArgs(fun,argc,args); + + ma->Add(mi); +} + diff --git a/externals/grill/flext/source/flmsg.cpp b/externals/grill/flext/source/flmsg.cpp new file mode 100755 index 00000000..a1c049d2 --- /dev/null +++ b/externals/grill/flext/source/flmsg.cpp @@ -0,0 +1,256 @@ +/* + +flext - C++ layer for Max/MSP and pd (pure data) externals + +Copyright (c) 2001,2002 Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +/*! \file flmsg.cpp + \brief Message processing of flext base class. +*/ + +#include "flext.h" + +bool flext_base::CallMeth(const methitem &m,int argc,const t_atom *argv) +{ + bool ret = false; + int ix; + t_any aargs[FLEXT_MAXMETHARGS]; + bool ok = true; + for(ix = 0; ix < argc && ok; ++ix) { + switch(m.args[ix]) { + case a_float: { + if(IsFloat(argv[ix])) aargs[ix].ft = GetFloat(argv[ix]); + else if(IsInt(argv[ix])) aargs[ix].ft = (float)GetInt(argv[ix]); + else ok = false; + + if(ok) LOG2("int arg %i = %f",ix,aargs[ix].ft); + break; + } + case a_int: { + if(IsFloat(argv[ix])) aargs[ix].it = (int)GetFloat(argv[ix]); + else if(IsInt(argv[ix])) aargs[ix].it = GetInt(argv[ix]); + else ok = false; + + if(ok) LOG2("float arg %i = %i",ix,aargs[ix].it); + break; + } + case a_symbol: { + if(IsSymbol(argv[ix])) aargs[ix].st = GetSymbol(argv[ix]); + else ok = false; + + if(ok) LOG2("symbol arg %i = %s",ix,GetString(aargs[ix].st)); + break; + } +#if FLEXT_SYS == FLEXT_SYS_PD + case a_pointer: { + if(IsPointer(argv[ix])) aargs[ix].pt = GetPointer(argv[ix]); + else ok = false; + break; + } +#endif + default: + error("Argument type illegal"); + ok = false; + } + } + + if(ok && ix == argc) { + switch(argc) { + case 0: ret = ((methfun_0)m.fun)(this); break; + case 1: ret = ((methfun_1)m.fun)(this,aargs[0]); break; + case 2: ret = ((methfun_2)m.fun)(this,aargs[0],aargs[1]); break; + case 3: ret = ((methfun_3)m.fun)(this,aargs[0],aargs[1],aargs[2]); break; + case 4: ret = ((methfun_4)m.fun)(this,aargs[0],aargs[1],aargs[2],aargs[3]); break; + case 5: ret = ((methfun_5)m.fun)(this,aargs[0],aargs[1],aargs[2],aargs[3],aargs[4]); break; + } + } + + return ret; +} + +bool flext_base::TryMethTag(const methitem *m,int inlet,const t_symbol *t,int argc,const t_atom *argv) +{ + do { + if(m->inlet == inlet && m->tag == t) { + LOG3("found method tag %s: inlet=%i, argc=%i",GetString(m->tag),m->inlet,argc); + + if(m->attr) { + // attributes are treated differently + + if(m->attr->isget) + return GetAttrib(m->attr); + else + return SetAttrib(m->attr,argc,argv); + } + else { + if(m->argc == 1) { + // try list + if(m->args[0] == a_list && ((methfun_V)m->fun)(this,argc,const_cast<t_atom *>(argv))) return true; + + // try anything + if(m->args[0] == a_any && ((methfun_A)m->fun)(this,m->tag,argc,const_cast<t_atom *>(argv))) return true; + } + + // try matching number of args + if(argc == m->argc && CallMeth(*m,argc,argv)) return true; + } + } + } while((m = (const methitem *)m->nxt) != NULL); + return false; +} + +bool flext_base::TryMethSym(const methitem *m,int inlet,const t_symbol *t,const t_symbol *s) +{ + do { + if(!m->IsAttr() && m->inlet == inlet && m->tag == t) { + LOG3("found symbol method for %s: inlet=%i, symbol=%s",GetString(m->tag),m->inlet,GetString(s)); + + t_any sym; sym.st = const_cast<t_symbol *>(s); + if(((methfun_1)m->fun)(this,sym)) return true; + } + } while((m = (const methitem *)m->nxt) != NULL); + return false; +} + +bool flext_base::TryMethAny(const methitem *m,int inlet,const t_symbol *t,const t_symbol *s,int argc,const t_atom *argv) +{ + do { + if(!m->IsAttr() && m->inlet == inlet && m->tag == t) { + LOG4("found any method for %s: inlet=%i, symbol=%s, argc=%i",GetString(m->tag),m->inlet,GetString(s),argc); + + if(((methfun_A)m->fun)(this,s,argc,const_cast<t_atom *>(argv))) return true; + } + } while((m = (const methitem *)m->nxt) != NULL); + return false; +} + +bool flext_base::FindMeth(int inlet,const t_symbol *s,int argc,const t_atom *argv) +{ + methitem *m; + + // search for exactly matching tag + if((m = (methitem *)methhead->Find(s,inlet)) != NULL && TryMethTag(m,inlet,s,argc,argv)) return true; + if((m = (methitem *)clmethhead->Find(s,inlet)) != NULL && TryMethTag(m,inlet,s,argc,argv)) return true; + + // if no list args, then search for pure symbol + if(!argc) { + if((m = (methitem *)methhead->Find(sym_symbol,inlet)) != NULL && TryMethSym(m,inlet,sym_symbol,s)) return true; + if((m = (methitem *)clmethhead->Find(sym_symbol,inlet)) != NULL && TryMethSym(m,inlet,sym_symbol,s)) return true; + } + + // otherwise search for anything + if((m = (methitem *)methhead->Find(sym_anything,inlet)) != NULL && m->argc == 1 && m->args[0] == a_any && TryMethAny(m,inlet,sym_anything,s,argc,argv)) return true; + if((m = (methitem *)clmethhead->Find(sym_anything,inlet)) != NULL && m->argc == 1 && m->args[0] == a_any && TryMethAny(m,inlet,sym_anything,s,argc,argv)) return true; + + // if nothing found try any inlet + return inlet >= 0 && FindMeth(-1,s,argc,argv); +} + +/*! \brief All the message processing + The messages of all the inlets go here and are promoted to the registered callback functions +*/ +bool flext_base::m_methodmain(int inlet,const t_symbol *s,int argc,const t_atom *argv) +{ + static bool trap = false; + + curtag = s; + + LOG3("methodmain inlet:%i args:%i symbol:%s",inlet,argc,s?GetString(s):""); + + bool ret = FindMeth(inlet,s,argc,argv); + if(ret) goto end; + +#if FLEXT_SYS == FLEXT_SYS_MAX + // If float message is not explicitly handled: try int handler instead + if(argc == 1 && s == sym_float && !trap) { + t_atom fl; + SetInt(fl,GetAInt(argv[0])); + trap = true; + ret = m_methodmain(inlet,sym_int,1,&fl); + trap = false; + } + if(ret) goto end; + + // If int message is not explicitly handled: try float handler instead + if(argc == 1 && s == sym_int && !trap) { + t_atom fl; + SetFloat(fl,GetAFloat(argv[0])); + trap = true; + ret = m_methodmain(inlet,sym_float,1,&fl); + trap = false; + } + if(ret) goto end; +#endif + + // If float or int message is not explicitly handled: try list handler instead + if(!trap && argc == 1 && (s == sym_float +#if FLEXT_SYS == FLEXT_SYS_MAX + || s == sym_int +#endif + )) { + t_atom list; + if(s == sym_float) + SetFloat(list,GetFloat(argv[0])); +#if FLEXT_SYS == FLEXT_SYS_MAX + else if(s == sym_int) + SetInt(list,GetInt(argv[0])); +#endif + + trap = true; + ret = m_methodmain(inlet,sym_list,1,&list); + trap = false; + } + if(ret) goto end; + + // If symbol message (pure anything without args) is not explicitly handled: try list handler instead + if(!trap && argc == 0) { + t_atom list; + SetSymbol(list,s); + trap = true; + ret = m_methodmain(inlet,sym_list,1,&list); + trap = false; + } + if(ret) goto end; + + // if distmsgs is switched on then distribute list elements over inlets (Max/MSP behavior) + if(distmsgs && !trap && inlet == 0 && s == sym_list && insigs <= 1) { + int i = incnt; + if(i > argc) i = argc; + for(--i; i >= 0; --i) { // right to left distribution + const t_symbol *sym = NULL; + if(IsFloat(argv[i])) sym = sym_float; + else if(IsInt(argv[i])) sym = sym_int; + else if(IsSymbol(argv[i])) sym = sym_symbol; +#if FLEXT_SYS == FLEXT_SYS_PD + else if(IsPointer(argv[i])) sym = sym_pointer; // can pointer atoms occur here? +#endif + if(sym) { + trap = true; + m_methodmain(i,sym,1,argv+i); + trap = false; + } + } + + ret = true; + } + + if(!ret && !trap) ret = m_method_(inlet,s,argc,argv); + +end: + curtag = NULL; + + return ret; // true if appropriate handler was found and called +} + +bool flext_base::m_method_(int inlet,const t_symbol *s,int argc,const t_atom *argv) +{ +//#ifdef FLEXT_DEBUG + post("%s: message unhandled - inlet:%i args:%i symbol:%s",thisName(),inlet,argc,s?GetString(s):""); +//#endif + return false; +} + diff --git a/externals/grill/flext/source/flout.cpp b/externals/grill/flext/source/flout.cpp index 9dbda7f1..e8341e9e 100644 --- a/externals/grill/flext/source/flout.cpp +++ b/externals/grill/flext/source/flout.cpp @@ -16,14 +16,6 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include "flinternal.h" -#if FLEXT_SYS == FLEXT_SYS_MAX -#define CRITON() short state = lockout_set(1) -#define CRITOFF() lockout_set(state) -#else -#define CRITON() -#define CRITOFF() -#endif - #ifndef FLEXT_THREADS void flext_base::ToOutBang(outlet *o) const { CRITON(); outlet_bang((t_outlet *)o); CRITOFF(); } void flext_base::ToOutFloat(outlet *o,float f) const { CRITON(); outlet_float((t_outlet *)o,f); CRITOFF(); } @@ -41,153 +33,242 @@ void flext_base::ToOutAnything(outlet *o,const t_symbol *s,int argc,const t_atom #endif -class flext_base::qmsg +bool flext_base::InitInlets() { -public: - qmsg(): nxt(NULL),tp(tp_none) {} - ~qmsg(); - - qmsg *nxt; - - void Clear(); - - void SetBang(outlet *o) { Clear(); out = o; tp = tp_bang; } - void SetFloat(outlet *o,float f) { Clear(); out = o; tp = tp_float; _float = f; } - void SetInt(outlet *o,int i) { Clear(); out = o; tp = tp_int; _int = i; } - void SetSymbol(outlet *o,const t_symbol *s) { Clear(); out = o; tp = tp_sym; _sym = s; } - void SetList(outlet *o,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_list; _list.argc = argc,_list.argv = CopyList(argc,argv); } - void SetAny(outlet *o,const t_symbol *s,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_any; _any.s = s,_any.argc = argc,_any.argv = CopyList(argc,argv); } - - outlet *out; - enum { tp_none,tp_bang,tp_float,tp_int,tp_sym,tp_list,tp_any } tp; - union { - float _float; - int _int; - const t_symbol *_sym; - struct { int argc; t_atom *argv; } _list; - struct { const t_symbol *s; int argc; t_atom *argv; } _any; - }; -}; - -flext_base::qmsg::~qmsg() -{ - Clear(); - if(nxt) delete nxt; -} + bool ok = true; + + // ---------------------------------- + // create inlets + // ---------------------------------- + + incnt = insigs = 0; + + if(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; + delete inlist; inlist = NULL; + + inlets = new px_object *[incnt]; + for(i = 0; i < incnt; ++i) inlets[i] = NULL; + + // type info is now in list array +#if FLEXT_SYS == FLEXT_SYS_PD + { + int cnt = 0; + + if(incnt >= 1) { + switch(list[0]) { + case xlet::tp_sig: + CLASS_MAINSIGNALIN(thisClass(),flext_hdr,defsig); + ++insigs; + break; + default: + // leftmost inlet is already there... + break; + } + ++cnt; + } + + for(int ix = 1; ix < incnt; ++ix,++cnt) { + switch(list[ix]) { + case xlet::tp_float: + case xlet::tp_int: { + char sym[] = "ft??"; + if(ix >= 10) { + if(compatibility) { + // Max allows max. 9 inlets + post("%s: Only 9 float/int inlets allowed in compatibility mode",thisName()); + ok = false; + } + else { + if(ix > 99) + post("%s: Inlet index > 99 not allowed for float/int inlets",thisName()); + sym[2] = '0'+ix/10,sym[3] = '0'+ix%10; + } + } + else + sym[2] = '0'+ix,sym[3] = 0; + if(ok) inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, &s_float, gensym(sym)); + break; + } + case xlet::tp_sym: + (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages + inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, &s_symbol, &s_symbol); + break; + case xlet::tp_list: + (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages + inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, &s_list, &s_list); + break; + case xlet::tp_any: + (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages + 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) { + post("%s: All signal inlets must be left-aligned in compatibility mode",thisName()); + ok = false; + } + else { + // pd doesn't seem to be able to handle signals and messages into the same inlet... + + inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, &s_signal, &s_signal); + ++insigs; + } + break; + default: + error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); + ok = false; + } + } + + incnt = cnt; + } +#elif FLEXT_SYS == FLEXT_SYS_MAX + { + int ix,cnt; + // count leftmost signal inlets + while(insigs < incnt && list[insigs] == xlet::tp_sig) ++insigs; + + for(cnt = 0,ix = incnt-1; ix >= insigs; --ix,++cnt) { + if(ix == 0) { + if(list[ix] != xlet::tp_any) { + error("%s: Leftmost inlet must be of type signal or default",thisName()); + ok = false; + } + } + else { + switch(list[ix]) { + case xlet::tp_sig: + error("%s: All signal inlets must be at the left side",thisName()); + ok = false; + break; + case xlet::tp_float: + if(ix >= 10) { + post("%s: Only 9 float inlets possible",thisName()); + ok = false; + } + else + floatin(x_obj,ix); + break; + case xlet::tp_int: + if(ix >= 10) { + post("%s: Only 9 int inlets possible",thisName()); + ok = false; + } + else + intin(x_obj,ix); + break; + case xlet::tp_any: // non-leftmost + case xlet::tp_sym: + case xlet::tp_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]); + ok = false; + } + } + } + + incnt = cnt; + + if(insigs) +// dsp_setup(thisHdr(),insigs); // signal inlets + dsp_setupbox(thisHdr(),insigs); // signal inlets + } +#else +#error +#endif + + delete[] list; + } -void flext_base::qmsg::Clear() -{ - if(tp == tp_list) { if(_list.argv) delete[] _list.argv; } - else if(tp == tp_any) { if(_any.argv) delete[] _any.argv; } - tp = tp_none; + return ok; } -void flext_base::QTick(flext_base *th) +bool flext_base::InitOutlets() { -// post("qtick"); -#if defined(FLEXT_THREADS) && defined(FLEXT_DEBUG) - if(!th->IsSystemThread()) { - error("flext - Queue tick called by wrong thread!"); - return; - } -#endif - -#ifdef FLEXT_THREADS - th->qmutex.Lock(); -#endif - for(;;) { - qmsg *m = th->qhead; - if(!m) break; - - CRITON(); - - switch(m->tp) { - case qmsg::tp_bang: th->ToOutBang(m->out); break; - case qmsg::tp_float: th->ToOutFloat(m->out,m->_float); break; - case qmsg::tp_int: th->ToOutInt(m->out,m->_int); break; - case qmsg::tp_sym: th->ToOutSymbol(m->out,m->_sym); break; - case qmsg::tp_list: th->ToOutList(m->out,m->_list.argc,m->_list.argv); break; - case qmsg::tp_any: th->ToOutAnything(m->out,m->_any.s,m->_any.argc,m->_any.argv); break; -#ifdef FLEXT_DEBUG - default: ERRINTERNAL(); -#endif - } + bool ok = true; - CRITOFF(); + // ---------------------------------- + // create outlets + // ---------------------------------- - th->qhead = m->nxt; - if(!th->qhead) th->qtail = NULL; - m->nxt = NULL; - delete m; - } -#ifdef FLEXT_THREADS - th->qmutex.Unlock(); + outcnt = outsigs = 0; + +#if FLEXT_SYS == FLEXT_SYS_MAX + // for Max/MSP the rightmost outlet has to be created first + if(procattr) + outattr = (outlet *)newout_anything(&x_obj->obj); #endif -} -void flext_base::Queue(qmsg *m) -{ -// post("Queue"); + if(outlist) { + xlet *xi; -#ifdef FLEXT_THREADS - qmutex.Lock(); -#endif - if(qtail) qtail->nxt = m; - else qhead = m; - qtail = m; -#ifdef FLEXT_THREADS - qmutex.Unlock(); -#endif + // 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; + delete outlist; outlist = NULL; + + outlets = new outlet *[outcnt]; + // type info is now in list array #if FLEXT_SYS == FLEXT_SYS_PD - clock_delay(qclk,0); + for(int ix = 0; ix < outcnt; ++ix) #elif FLEXT_SYS == FLEXT_SYS_MAX - qelem_set(qclk); + for(int ix = outcnt-1; ix >= 0; --ix) #else -#error +#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 + } + } + + delete[] list; + } -} - -void flext_base::ToQueueBang(outlet *o) const -{ - qmsg *m = new qmsg(); - m->SetBang(o); - const_cast<flext_base &>(*this).Queue(m); -} - -void flext_base::ToQueueFloat(outlet *o,float f) const -{ - qmsg *m = new qmsg; - m->SetFloat(o,f); - const_cast<flext_base &>(*this).Queue(m); -} - -void flext_base::ToQueueInt(outlet *o,int f) const -{ - qmsg *m = new qmsg; - m->SetInt(o,f); - const_cast<flext_base &>(*this).Queue(m); -} - -void flext_base::ToQueueSymbol(outlet *o,const t_symbol *s) const -{ - qmsg *m = new qmsg; - m->SetSymbol(o,s); - const_cast<flext_base &>(*this).Queue(m); -} + if(procattr) { +#if FLEXT_SYS == FLEXT_SYS_PD + // attribute dump outlet is the last one + outattr = (outlet *)newout_anything(&x_obj->obj); +#endif -void flext_base::ToQueueList(outlet *o,int argc,const t_atom *argv) const -{ - qmsg *m = new qmsg; - m->SetList(o,argc,argv); - const_cast<flext_base &>(*this).Queue(m); + } + + return ok; } -void flext_base::ToQueueAnything(outlet *o,const t_symbol *s,int argc,const t_atom *argv) const -{ - qmsg *m = new qmsg; - m->SetAny(o,s,argc,argv); - const_cast<flext_base &>(*this).Queue(m); -} diff --git a/externals/grill/flext/source/flproxy.cpp b/externals/grill/flext/source/flproxy.cpp new file mode 100755 index 00000000..c1a6930c --- /dev/null +++ b/externals/grill/flext/source/flproxy.cpp @@ -0,0 +1,132 @@ +/* + +flext - C++ layer for Max/MSP and pd (pure data) externals + +Copyright (c) 2001,2002 Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +/*! \file flproxy.cpp + \brief Proxy classes for the flext base class. +*/ + +#include "flext.h" +#include "flinternal.h" + + +// === proxy class for flext_base ============================ + +#if FLEXT_SYS == FLEXT_SYS_PD + +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) +{ + obj->base->m_methodmain(obj->index,s,argc,argv); +} + +void flext_base::cb_px_anything(t_class *c,const t_symbol *s,int argc,t_atom *argv) +{ + thisObject(c)->m_methodmain(0,s,argc,argv); +} + +#define DEF_IN_FT(IX) \ +void flext_base::cb_px_ft ## IX(t_class *c,float v) { \ + t_atom atom; SETFLOAT(&atom,v); \ + thisObject(c)->m_methodmain(IX,&s_float,1,&atom); \ +} + +#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(t_class *c,const t_symbol *s,int argc,t_atom *argv) +{ + // check if inlet allows anything (or list) + + flext_base *o = thisObject(c); + int ci = ((flext_hdr *)o->x_obj)->curinlet; + + o->m_methodmain(ci,s,argc,argv); +} + +void flext_base::cb_px_int(t_class *c,int v) +{ + // check if inlet allows int type + t_atom atom; + SetInt(atom,v); + cb_px_anything(c,sym_int,1,&atom); +} + +void flext_base::cb_px_float(t_class *c,float v) +{ + // check if inlet allows float type + t_atom atom; + SetFloat(atom,v); + cb_px_anything(c,sym_float,1,&atom); +} + +void flext_base::cb_px_bang(t_class *c) +{ + // check if inlet allows bang + cb_px_anything(c,sym_bang,0,NULL); +} + + +#define DEF_IN_FT(IX) \ +void flext_base::cb_px_in ## IX(t_class *c,int v) { long &ci = ((flext_hdr *)thisObject(c)->x_obj)->curinlet; ci = IX; cb_px_int(c,v); ci = 0; } \ +void flext_base::cb_px_ft ## IX(t_class *c,float v) { long &ci = ((flext_hdr *)thisObject(c)->x_obj)->curinlet; ci = IX; cb_px_float(c,v); ci = 0; } + +#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) + +#else +#error // Other system +#endif + + +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) +{ + // 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 +#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); +#else +#error +#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); +} + + diff --git a/externals/grill/flext/source/flqueue.cpp b/externals/grill/flext/source/flqueue.cpp new file mode 100755 index 00000000..537101bc --- /dev/null +++ b/externals/grill/flext/source/flqueue.cpp @@ -0,0 +1,167 @@ +/* + +flext - C++ layer for Max/MSP and pd (pure data) externals + +Copyright (c) 2001,2002 Thomas Grill (xovo@gmx.net) +For information on usage and redistribution, and for a DISCLAIMER OF ALL +WARRANTIES, see the file, "license.txt," in this distribution. + +*/ + +/*! \file flqueue.cpp + \brief Implementation of the flext message queuing functionality. +*/ + +#include "flext.h" +#include "flinternal.h" + +class flext_base::qmsg +{ +public: + qmsg(): nxt(NULL),tp(tp_none) {} + ~qmsg(); + + qmsg *nxt; + + void Clear(); + + void SetBang(outlet *o) { Clear(); out = o; tp = tp_bang; } + void SetFloat(outlet *o,float f) { Clear(); out = o; tp = tp_float; _float = f; } + void SetInt(outlet *o,int i) { Clear(); out = o; tp = tp_int; _int = i; } + void SetSymbol(outlet *o,const t_symbol *s) { Clear(); out = o; tp = tp_sym; _sym = s; } + void SetList(outlet *o,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_list; _list.argc = argc,_list.argv = CopyList(argc,argv); } + void SetAny(outlet *o,const t_symbol *s,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_any; _any.s = s,_any.argc = argc,_any.argv = CopyList(argc,argv); } + + outlet *out; + enum { tp_none,tp_bang,tp_float,tp_int,tp_sym,tp_list,tp_any } tp; + union { + float _float; + int _int; + const t_symbol *_sym; + struct { int argc; t_atom *argv; } _list; + struct { const t_symbol *s; int argc; t_atom *argv; } _any; + }; +}; + +flext_base::qmsg::~qmsg() +{ + Clear(); + if(nxt) delete nxt; +} + +void flext_base::qmsg::Clear() +{ + if(tp == tp_list) { if(_list.argv) delete[] _list.argv; } + else if(tp == tp_any) { if(_any.argv) delete[] _any.argv; } + tp = tp_none; +} + +void flext_base::QTick(flext_base *th) +{ +// post("qtick"); +#if defined(FLEXT_THREADS) && defined(FLEXT_DEBUG) + if(!th->IsSystemThread()) { + error("flext - Queue tick called by wrong thread!"); + return; + } +#endif + +#ifdef FLEXT_THREADS + th->qmutex.Lock(); +#endif + for(;;) { + qmsg *m = th->qhead; + if(!m) break; + + CRITON(); + + switch(m->tp) { + case qmsg::tp_bang: th->ToOutBang(m->out); break; + case qmsg::tp_float: th->ToOutFloat(m->out,m->_float); break; + case qmsg::tp_int: th->ToOutInt(m->out,m->_int); break; + case qmsg::tp_sym: th->ToOutSymbol(m->out,m->_sym); break; + case qmsg::tp_list: th->ToOutList(m->out,m->_list.argc,m->_list.argv); break; + case qmsg::tp_any: th->ToOutAnything(m->out,m->_any.s,m->_any.argc,m->_any.argv); break; +#ifdef FLEXT_DEBUG + default: ERRINTERNAL(); +#endif + } + + CRITOFF(); + + th->qhead = m->nxt; + if(!th->qhead) th->qtail = NULL; + m->nxt = NULL; + delete m; + } +#ifdef FLEXT_THREADS + th->qmutex.Unlock(); +#endif +} + +void flext_base::Queue(qmsg *m) +{ +// post("Queue"); + +#ifdef FLEXT_THREADS + qmutex.Lock(); +#endif + if(qtail) qtail->nxt = m; + else qhead = m; + qtail = m; +#ifdef FLEXT_THREADS + qmutex.Unlock(); +#endif + +#if FLEXT_SYS == FLEXT_SYS_PD + clock_delay(qclk,0); +#elif FLEXT_SYS == FLEXT_SYS_MAX + qelem_set(qclk); +#else +#error +#endif + +} + +void flext_base::ToQueueBang(outlet *o) const +{ + qmsg *m = new qmsg(); + m->SetBang(o); + const_cast<flext_base &>(*this).Queue(m); +} + +void flext_base::ToQueueFloat(outlet *o,float f) const +{ + qmsg *m = new qmsg; + m->SetFloat(o,f); + const_cast<flext_base &>(*this).Queue(m); +} + +void flext_base::ToQueueInt(outlet *o,int f) const +{ + qmsg *m = new qmsg; + m->SetInt(o,f); + const_cast<flext_base &>(*this).Queue(m); +} + +void flext_base::ToQueueSymbol(outlet *o,const t_symbol *s) const +{ + qmsg *m = new qmsg; + m->SetSymbol(o,s); + const_cast<flext_base &>(*this).Queue(m); +} + +void flext_base::ToQueueList(outlet *o,int argc,const t_atom *argv) const +{ + qmsg *m = new qmsg; + m->SetList(o,argc,argv); + const_cast<flext_base &>(*this).Queue(m); +} + +void flext_base::ToQueueAnything(outlet *o,const t_symbol *s,int argc,const t_atom *argv) const +{ + qmsg *m = new qmsg; + m->SetAny(o,s,argc,argv); + const_cast<flext_base &>(*this).Queue(m); +} + diff --git a/externals/grill/flext/source/flsupport.cpp b/externals/grill/flext/source/flsupport.cpp index 85ebae79..cd57dfd8 100644 --- a/externals/grill/flext/source/flsupport.cpp +++ b/externals/grill/flext/source/flsupport.cpp @@ -58,3 +58,21 @@ void flext::GetAString(const t_atom &a,char *buf,int szbuf) else if(IsInt(a)) sprintf(buf,"%i",GetInt(a)); #endif } + +int flext::FoldBits(unsigned long h,int bits) +{ + if(!bits) return 0; + const int hmax = (1<<bits)-1; + int ret = 0; + for(int i = 0; i < sizeof(h)*8; i += bits) + ret = ret^((h>>i)&hmax); + return ret; +} + +int flext::Int2Bits(unsigned long n) +{ + int b; + for(b = 0; n; ++b) n >>= 1; + return b; +} + diff --git a/externals/grill/flext/source/flsupport.h b/externals/grill/flext/source/flsupport.h index ad7158f9..6eef5bd5 100644 --- a/externals/grill/flext/source/flsupport.h +++ b/externals/grill/flext/source/flsupport.h @@ -373,6 +373,24 @@ public: //! @} FLEXT_S_ATOM + +// --- utilities ------------------------------------------------ + + /*! \defgroup FLEXT_S_UTIL Flext utility functions + @{ + */ + + /*! \brief Fold value to a number of bits + \remark Good for hash generation + */ + static int FoldBits(unsigned long h,int bits); + + //! \brief How many bits are necessary to represent n + static int Int2Bits(unsigned long n); + +//! @} FLEXT_S_UTIL + + // --- clock stuff ------------------------------------------------ diff --git a/externals/grill/flext/source/flthr.cpp b/externals/grill/flext/source/flthr.cpp index e8834b76..a9a68471 100644 --- a/externals/grill/flext/source/flthr.cpp +++ b/externals/grill/flext/source/flthr.cpp @@ -20,10 +20,10 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include <errno.h> //! Thread id of system thread -flext::thrid_t flext::thrid; +flext::thrid_t flext::thrid = 0; //! Thread id of helper thread -flext::thrid_t flext::thrhelpid; +flext::thrid_t flext::thrhelpid = 0; /* flext::thr_entry *flext::thrhead = NULL,*flext::thrtail = NULL; @@ -42,6 +42,8 @@ static flext::ThrCond *thrhelpcond = NULL; //! Start helper thread bool flext::StartHelper() { + if(thrhelpid) return true; + bool ok = false; #if FLEXT_THREADS == FLEXT_THR_POSIX pthread_attr_t attr; diff --git a/externals/grill/idelay/delay.cpp b/externals/grill/idelay/delay.cpp index b126ebce..a922a8f8 100644 --- a/externals/grill/idelay/delay.cpp +++ b/externals/grill/idelay/delay.cpp @@ -16,8 +16,8 @@ Watch out for Doppler effects! #include <flext.h> -#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 400) -#error You need at least flext version 0.4.0 +#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 401) +#error You need at least flext version 0.4.1 #endif // template class for delay line @@ -51,7 +51,6 @@ idelay::idelay(F maxmsec) AddInSignal(2); // audio in & delay signals AddOutSignal(); // audio out - SetupInOut(); // set up inlets and outlets } idelay::~idelay() diff --git a/externals/grill/pool/main.cpp b/externals/grill/pool/main.cpp index 57773742..07d96e20 100644 --- a/externals/grill/pool/main.cpp +++ b/externals/grill/pool/main.cpp @@ -172,13 +172,61 @@ FLEXT_NEW_V("pool",pool); pooldata *pool::head,*pool::tail; -V pool::setup(t_class *) +V pool::setup(t_class *c) { post(""); post("pool %s - hierarchical storage object, (C)2002 Thomas Grill",POOL_VERSION); post(""); head = tail = NULL; + + FLEXT_CADDATTR_VAR(c,"pool",mg_pool,ms_pool); + FLEXT_CADDATTR_VAR1(c,"absdir",absdir); + FLEXT_CADDATTR_VAR1(c,"echodir",echo); + FLEXT_CADDATTR_GET(c,"private",priv); + + FLEXT_CADDMETHOD_(c,0,"reset",m_reset); + FLEXT_CADDMETHOD_(c,0,"set",m_set); + FLEXT_CADDMETHOD_(c,0,"add",m_add); + FLEXT_CADDMETHOD_(c,0,"getdir",m_getdir); + FLEXT_CADDMETHOD_(c,0,"mkdir",m_mkdir); + FLEXT_CADDMETHOD_(c,0,"chdir",m_chdir); + FLEXT_CADDMETHOD_(c,0,"rmdir",m_rmdir); + FLEXT_CADDMETHOD_(c,0,"updir",m_updir); + FLEXT_CADDMETHOD_(c,0,"mksub",m_mksub); + FLEXT_CADDMETHOD_(c,0,"chsub",m_chsub); + FLEXT_CADDMETHOD_(c,0,"rmsub",m_rmsub); + + FLEXT_CADDMETHOD_(c,0,"set",m_set); + FLEXT_CADDMETHOD_(c,0,"clr",m_clr); + FLEXT_CADDMETHOD_(c,0,"clrall",m_clrall); + FLEXT_CADDMETHOD_(c,0,"clrrec",m_clrrec); + FLEXT_CADDMETHOD_(c,0,"clrsub",m_clrsub); + FLEXT_CADDMETHOD_(c,0,"get",m_get); + FLEXT_CADDMETHOD_(c,0,"geti",m_geti); + FLEXT_CADDMETHOD_(c,0,"getall",m_getall); + FLEXT_CADDMETHOD_(c,0,"getrec",m_getrec); + FLEXT_CADDMETHOD_(c,0,"getsub",m_getsub); + FLEXT_CADDMETHOD_(c,0,"cntall",m_cntall); + FLEXT_CADDMETHOD_(c,0,"cntrec",m_cntrec); + FLEXT_CADDMETHOD_(c,0,"cntsub",m_cntsub); + + FLEXT_CADDMETHOD_(c,0,"paste",m_paste); + FLEXT_CADDMETHOD_(c,0,"pasteadd",m_pasteadd); + FLEXT_CADDMETHOD_(c,0,"clrclip",m_clrclip); + FLEXT_CADDMETHOD_(c,0,"cut",m_cut); + FLEXT_CADDMETHOD_(c,0,"copy",m_copy); + FLEXT_CADDMETHOD_(c,0,"cutall",m_cutall); + FLEXT_CADDMETHOD_(c,0,"copyall",m_copyall); + FLEXT_CADDMETHOD_(c,0,"cutrec",m_cutrec); + FLEXT_CADDMETHOD_(c,0,"copyrec",m_copyrec); + + FLEXT_CADDMETHOD_(c,0,"load",m_load); + FLEXT_CADDMETHOD_(c,0,"save",m_save); + FLEXT_CADDMETHOD_(c,0,"lddir",m_lddir); + FLEXT_CADDMETHOD_(c,0,"ldrec",m_ldrec); + FLEXT_CADDMETHOD_(c,0,"svdir",m_svdir); + FLEXT_CADDMETHOD_(c,0,"svrec",m_svrec); } pool::pool(I argc,const A *argv): @@ -192,54 +240,6 @@ pool::pool(I argc,const A *argv): AddOutAnything(); AddOutList(); AddOutAnything(); - - FLEXT_ADDATTR_VAR("pool",mg_pool,ms_pool); - FLEXT_ADDATTR_VAR1("absdir",absdir); - FLEXT_ADDATTR_VAR1("echodir",echo); - FLEXT_ADDATTR_GET("private",priv); - - FLEXT_ADDMETHOD_(0,"reset",m_reset); - FLEXT_ADDMETHOD_(0,"set",m_set); - FLEXT_ADDMETHOD_(0,"add",m_add); - FLEXT_ADDMETHOD_(0,"getdir",m_getdir); - FLEXT_ADDMETHOD_(0,"mkdir",m_mkdir); - FLEXT_ADDMETHOD_(0,"chdir",m_chdir); - FLEXT_ADDMETHOD_(0,"rmdir",m_rmdir); - FLEXT_ADDMETHOD_(0,"updir",m_updir); - FLEXT_ADDMETHOD_(0,"mksub",m_mksub); - FLEXT_ADDMETHOD_(0,"chsub",m_chsub); - FLEXT_ADDMETHOD_(0,"rmsub",m_rmsub); - - FLEXT_ADDMETHOD_(0,"set",m_set); - FLEXT_ADDMETHOD_(0,"clr",m_clr); - FLEXT_ADDMETHOD_(0,"clrall",m_clrall); - FLEXT_ADDMETHOD_(0,"clrrec",m_clrrec); - FLEXT_ADDMETHOD_(0,"clrsub",m_clrsub); - FLEXT_ADDMETHOD_(0,"get",m_get); - FLEXT_ADDMETHOD_(0,"geti",m_geti); - FLEXT_ADDMETHOD_(0,"getall",m_getall); - FLEXT_ADDMETHOD_(0,"getrec",m_getrec); - FLEXT_ADDMETHOD_(0,"getsub",m_getsub); - FLEXT_ADDMETHOD_(0,"cntall",m_cntall); - FLEXT_ADDMETHOD_(0,"cntrec",m_cntrec); - FLEXT_ADDMETHOD_(0,"cntsub",m_cntsub); - - FLEXT_ADDMETHOD_(0,"paste",m_paste); - FLEXT_ADDMETHOD_(0,"pasteadd",m_pasteadd); - FLEXT_ADDMETHOD_(0,"clrclip",m_clrclip); - FLEXT_ADDMETHOD_(0,"cut",m_cut); - FLEXT_ADDMETHOD_(0,"copy",m_copy); - FLEXT_ADDMETHOD_(0,"cutall",m_cutall); - FLEXT_ADDMETHOD_(0,"copyall",m_copyall); - FLEXT_ADDMETHOD_(0,"cutrec",m_cutrec); - FLEXT_ADDMETHOD_(0,"copyrec",m_copyrec); - - FLEXT_ADDMETHOD_(0,"load",m_load); - FLEXT_ADDMETHOD_(0,"save",m_save); - FLEXT_ADDMETHOD_(0,"lddir",m_lddir); - FLEXT_ADDMETHOD_(0,"ldrec",m_ldrec); - FLEXT_ADDMETHOD_(0,"svdir",m_svdir); - FLEXT_ADDMETHOD_(0,"svrec",m_svrec); } pool::~pool() @@ -453,11 +453,14 @@ V pool::m_get(I argc,const A *argv) ToOutList(2,curdir); else ToOutList(2,0,NULL); - ToOutAtom(1,r->key); - if(r) + if(r) { + ToOutAtom(1,r->key); ToOutList(0,*r->data); - else + } + else { + ToOutBang(1); ToOutBang(0); + } } echodir(); diff --git a/externals/grill/pool/pool.cw b/externals/grill/pool/pool.cw Binary files differindex 52435a6a..068876a4 100755 --- a/externals/grill/pool/pool.cw +++ b/externals/grill/pool/pool.cw diff --git a/externals/grill/pool/pool.pd b/externals/grill/pool/pool.pd index 0726e6f6..cdf0f6e6 100644 --- a/externals/grill/pool/pool.pd +++ b/externals/grill/pool/pool.pd @@ -1,201 +1,212 @@ -#N canvas 25 23 974 677 12; -#X obj 260 478 pool; -#X msg 295 108 set 1 2 3; -#X obj 272 600 print K; -#X msg 607 211 getall; -#X msg 295 137 set A k g; -#X obj 251 631 print V; -#X obj 290 569 print D; -#X msg 295 167 set A l m; -#X msg 298 196 set 2 34; -#X msg 297 227 set 3 17; -#X msg 428 105 clr A; -#X msg 432 181 get A; -#X msg 432 213 get 2; -#X msg 40 132 echodir \$1; -#X obj 40 111 tgl 15 0 empty empty empty 0 -6 32 8 -262144 -1 -1 0 -1; -#X obj 40 213 tgl 15 0 empty empty empty 0 -6 32 8 -262144 -1 -1 0 -1; -#X msg 40 234 absdir \$1; -#X text 427 85 clear value; -#X text 428 159 get value; -#X obj 309 542 print C; -#X text 381 542 command; -#X text 363 569 directory (abs or rel to current); -#X text 326 632 data value; -#X text 344 600 data key; -#X msg 41 314 pool pool1; -#X msg 42 343 pool; -#X text 86 343 set to private; -#X msg 42 405 reset; -#X text 41 384 clear all pool data; -#X msg 613 111 clrall; -#X text 604 89 clear all values in dir; -#X text 607 190 get all values in dir; -#X text 314 479 pool name can be given as argument; -#X text 603 136 clear all values and dirs; -#X msg 611 158 clrrec; -#X msg 605 258 getrec; -#X text 605 236 get all values in dir and subdirs; -#X text 670 289 bang at EOL; -#X text 673 208 bang at EOL; -#X text 670 257 depth may be given; -#X text 43 291 set pool name; -#X text 40 89 at each command; -#X text 40 73 echo current dir; -#X text 292 83 set values; -#X text 35 194 (default on); -#X text 27 178 report absolute dirs; -#X msg 43 452 help; -#X text 86 453 get some info; -#X text 670 274 default=-1 (= infinite); -#X msg 609 338 cntall; -#X text 675 336 count all values in dir; -#X msg 609 364 cntrec; -#X text 677 362 ... and subdirs; -#X text 673 376 (depth may be given); -#X msg 296 282 add 3 14; -#X text 294 261 set but don't replace; -#N canvas 0 0 510 536 dirs 0; -#X msg 109 27 mkdir fld1; -#X msg 111 122 chdir; -#X msg 110 217 updir; -#X msg 111 354 getsub -1; -#X text 110 7 make absolute dir; -#X text 109 51 make relative dir; -#X msg 110 72 mksub fld2; -#X text 109 104 change to absolute dir; -#X msg 110 165 chsub fld2; -#X text 108 146 change to relative dir; -#X text 106 198 change to upper dir; -#X text 107 250 remove absolute dir; -#X msg 108 269 rmdir fld1; -#X msg 110 308 rmsub fld2; -#X text 109 289 remove relative dir; -#X text 109 336 get subdirs; -#X text 251 380 -1 ... infinite; -#X text 167 213 depth may be given; -#X text 168 229 default=1; -#X text 209 349 depth may be given; -#X text 207 365 default=1; -#X text 108 377 count subdirs; -#X msg 111 398 cntsub -1; -#X msg 111 458 getdir; -#X text 110 438 get current dir; -#X text 176 458 always absolute; -#X obj 11 239 s \$0-pool; -#X connect 0 0 26 0; -#X connect 1 0 26 0; -#X connect 2 0 26 0; -#X connect 3 0 26 0; -#X connect 6 0 26 0; -#X connect 8 0 26 0; -#X connect 12 0 26 0; -#X connect 13 0 26 0; -#X connect 22 0 26 0; -#X connect 23 0 26 0; -#X restore 718 511 pd dirs; -#X text 715 485 directory operations; -#N canvas 0 0 469 436 file 0; -#X text 117 207 save dir and subdirs; -#X text 117 165 save data in current dir; -#X msg 117 184 svdir c:/temp/pool.dat; -#X msg 117 226 svrec c:/temp/pool.dat; -#X msg 116 272 lddir c:/temp/pool.dat; -#X msg 116 319 ldrec c:/temp/pool.dat; -#X text 117 253 load data into current dir; -#X text 115 300 load data into current dir and below; -#X text 132 340 depth (default -1) and; -#X text 134 356 mkdir flag (default 1) can be given; -#X text 117 37 save all; -#X text 117 81 load all (add to existing data); -#X msg 118 100 load c:/temp/pool.dat; -#X msg 120 54 save c:/temp/pool.dat; -#X text 22 12 file operations; -#X obj 22 188 s \$0-pool; -#X connect 2 0 15 0; -#X connect 3 0 15 0; -#X connect 4 0 15 0; -#X connect 5 0 15 0; -#X connect 12 0 15 0; -#X connect 13 0 15 0; -#X restore 719 566 pd file; -#X text 717 543 file operations; -#X text 717 600 clipboard operations; -#N canvas 0 0 535 583 clip 0; -#X text 97 56 copy value associated to key into clipboard; -#X msg 100 77 copy A; -#X msg 98 119 cut B; -#X text 96 101 cut value associated to key into clipboard; -#X msg 96 401 paste; -#X msg 98 179 copyall; -#X text 95 158 copy all values in current dir into clipboard; -#X msg 97 221 cutall; -#X text 95 201 cut all values in current dir into clipboard; -#X text 94 263 copy all values in current dir into clipboard; -#X text 94 306 cut all values in current dir into clipboard; -#X msg 97 284 copyrec; -#X text 194 285 depth may be given (default=-1); -#X text 193 326 depth may be given (default=-1); -#X msg 96 326 cutrec 1; -#X text 194 345 1..only with first level subdirs; -#X text 96 379 paste clipboard contents into current directory; -#X text 167 397 depth (default -1) and; -#X text 169 413 mkdir flag (default 1) can be given; -#X text 183 448 depth (default -1) and; -#X text 185 466 mkdir flag (default 1) can be given; -#X msg 95 453 pasteadd; -#X text 95 431 paste but don't replace; -#X msg 94 521 clrclip; -#X text 171 520 clear clipboard (free memory); -#X text 22 12 clipboard operations (this is an internal clipboard...) -; -#X obj 4 193 s \$0-pool; -#X connect 1 0 26 0; -#X connect 2 0 26 0; -#X connect 4 0 26 0; -#X connect 5 0 26 0; -#X connect 7 0 26 0; -#X connect 11 0 26 0; -#X connect 14 0 26 0; -#X connect 21 0 26 0; -#X connect 23 0 26 0; -#X restore 719 623 pd clip; -#X text 717 454 more commands:; -#X obj 349 429 r \$0-pool; -#X text 174 500 data is shared among pool objects with the same name -; -#X obj 26 10 cnv 15 850 40 empty empty pool 10 22 32 24 -260818 -1 -0; -#X text 337 32 http://www.parasitaere-kapazitaeten.net; -#X text 337 12 a hierarchical storage object \, (C)2002 Thomas Grill -; -#X connect 0 0 5 0; -#X connect 0 1 2 0; -#X connect 0 2 6 0; -#X connect 0 3 19 0; -#X connect 1 0 0 0; -#X connect 3 0 0 0; -#X connect 4 0 0 0; -#X connect 7 0 0 0; -#X connect 8 0 0 0; -#X connect 9 0 0 0; -#X connect 10 0 0 0; -#X connect 11 0 0 0; -#X connect 12 0 0 0; -#X connect 13 0 0 0; -#X connect 14 0 13 0; -#X connect 15 0 16 0; -#X connect 16 0 0 0; -#X connect 24 0 0 0; -#X connect 25 0 0 0; -#X connect 27 0 0 0; -#X connect 29 0 0 0; -#X connect 34 0 0 0; -#X connect 35 0 0 0; -#X connect 46 0 0 0; -#X connect 49 0 0 0; -#X connect 51 0 0 0; -#X connect 54 0 0 0; -#X connect 63 0 0 0; +#N canvas 25 23 976 679 12;
+#X obj 260 478 pool;
+#X msg 295 108 set 1 2 3;
+#X obj 254 615 print K;
+#X msg 607 211 getall;
+#X msg 295 137 set A k g;
+#X obj 233 646 print V;
+#X obj 272 584 print D;
+#X msg 295 167 set A l m;
+#X msg 298 196 set 2 34;
+#X msg 297 227 set 3 17;
+#X msg 428 105 clr A;
+#X msg 432 181 get A;
+#X msg 432 213 get 2;
+#X msg 40 132 echodir \$1;
+#X obj 40 111 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X obj 40 213 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
+;
+#X msg 40 234 absdir \$1;
+#X text 427 85 clear value;
+#X text 428 159 get value;
+#X obj 291 557 print C;
+#X text 363 557 command;
+#X text 345 584 directory (abs or rel to current);
+#X text 308 647 data value;
+#X text 326 615 data key;
+#X msg 41 314 pool pool1;
+#X msg 42 343 pool;
+#X text 86 343 set to private;
+#X msg 42 405 reset;
+#X text 41 384 clear all pool data;
+#X msg 613 111 clrall;
+#X text 604 89 clear all values in dir;
+#X text 607 190 get all values in dir;
+#X text 314 479 pool name can be given as argument;
+#X text 603 136 clear all values and dirs;
+#X msg 611 158 clrrec;
+#X msg 605 258 getrec;
+#X text 605 236 get all values in dir and subdirs;
+#X text 670 289 bang at EOL;
+#X text 673 208 bang at EOL;
+#X text 670 257 depth may be given;
+#X text 43 291 set pool name;
+#X text 40 89 at each command;
+#X text 40 73 echo current dir;
+#X text 292 83 set values;
+#X text 35 194 (default on);
+#X text 27 178 report absolute dirs;
+#X msg 43 452 help;
+#X text 86 453 get some info;
+#X text 670 274 default=-1 (= infinite);
+#X msg 609 338 cntall;
+#X text 675 336 count all values in dir;
+#X msg 609 364 cntrec;
+#X text 677 362 ... and subdirs;
+#X text 673 376 (depth may be given);
+#X msg 296 282 add 3 14;
+#X text 294 261 set but don't replace;
+#N canvas 0 0 510 536 dirs 0;
+#X msg 109 27 mkdir fld1;
+#X msg 111 122 chdir;
+#X msg 110 217 updir;
+#X msg 111 354 getsub -1;
+#X text 110 7 make absolute dir;
+#X text 109 51 make relative dir;
+#X msg 110 72 mksub fld2;
+#X text 109 104 change to absolute dir;
+#X msg 110 165 chsub fld2;
+#X text 108 146 change to relative dir;
+#X text 106 198 change to upper dir;
+#X text 107 250 remove absolute dir;
+#X msg 108 269 rmdir fld1;
+#X msg 110 308 rmsub fld2;
+#X text 109 289 remove relative dir;
+#X text 109 336 get subdirs;
+#X text 251 380 -1 ... infinite;
+#X text 167 213 depth may be given;
+#X text 168 229 default=1;
+#X text 209 349 depth may be given;
+#X text 207 365 default=1;
+#X text 108 377 count subdirs;
+#X msg 111 398 cntsub -1;
+#X msg 111 458 getdir;
+#X text 110 438 get current dir;
+#X text 176 458 always absolute;
+#X obj 11 239 s \$0-pool;
+#X connect 0 0 26 0;
+#X connect 1 0 26 0;
+#X connect 2 0 26 0;
+#X connect 3 0 26 0;
+#X connect 6 0 26 0;
+#X connect 8 0 26 0;
+#X connect 12 0 26 0;
+#X connect 13 0 26 0;
+#X connect 22 0 26 0;
+#X connect 23 0 26 0;
+#X restore 718 511 pd dirs;
+#X text 715 485 directory operations;
+#N canvas 0 0 469 436 file 0;
+#X text 117 207 save dir and subdirs;
+#X text 117 165 save data in current dir;
+#X msg 117 184 svdir c:/temp/pool.dat;
+#X msg 117 226 svrec c:/temp/pool.dat;
+#X msg 116 272 lddir c:/temp/pool.dat;
+#X msg 116 319 ldrec c:/temp/pool.dat;
+#X text 117 253 load data into current dir;
+#X text 115 300 load data into current dir and below;
+#X text 132 340 depth (default -1) and;
+#X text 134 356 mkdir flag (default 1) can be given;
+#X text 117 37 save all;
+#X text 117 81 load all (add to existing data);
+#X msg 118 100 load c:/temp/pool.dat;
+#X msg 120 54 save c:/temp/pool.dat;
+#X text 22 12 file operations;
+#X obj 22 188 s \$0-pool;
+#X connect 2 0 15 0;
+#X connect 3 0 15 0;
+#X connect 4 0 15 0;
+#X connect 5 0 15 0;
+#X connect 12 0 15 0;
+#X connect 13 0 15 0;
+#X restore 719 566 pd file;
+#X text 717 543 file operations;
+#X text 717 600 clipboard operations;
+#N canvas 0 0 535 583 clip 0;
+#X text 97 56 copy value associated to key into clipboard;
+#X msg 100 77 copy A;
+#X msg 98 119 cut B;
+#X text 96 101 cut value associated to key into clipboard;
+#X msg 96 401 paste;
+#X msg 98 179 copyall;
+#X text 95 158 copy all values in current dir into clipboard;
+#X msg 97 221 cutall;
+#X text 95 201 cut all values in current dir into clipboard;
+#X text 94 263 copy all values in current dir into clipboard;
+#X text 94 306 cut all values in current dir into clipboard;
+#X msg 97 284 copyrec;
+#X text 194 285 depth may be given (default=-1);
+#X text 193 326 depth may be given (default=-1);
+#X msg 96 326 cutrec 1;
+#X text 194 345 1..only with first level subdirs;
+#X text 96 379 paste clipboard contents into current directory;
+#X text 167 397 depth (default -1) and;
+#X text 169 413 mkdir flag (default 1) can be given;
+#X text 183 448 depth (default -1) and;
+#X text 185 466 mkdir flag (default 1) can be given;
+#X msg 95 453 pasteadd;
+#X text 95 431 paste but don't replace;
+#X msg 94 521 clrclip;
+#X text 171 520 clear clipboard (free memory);
+#X text 22 12 clipboard operations (this is an internal clipboard...)
+;
+#X obj 4 193 s \$0-pool;
+#X connect 1 0 26 0;
+#X connect 2 0 26 0;
+#X connect 4 0 26 0;
+#X connect 5 0 26 0;
+#X connect 7 0 26 0;
+#X connect 11 0 26 0;
+#X connect 14 0 26 0;
+#X connect 21 0 26 0;
+#X connect 23 0 26 0;
+#X restore 719 623 pd clip;
+#X text 717 454 more commands:;
+#X obj 349 429 r \$0-pool;
+#X text 174 500 data is shared among pool objects with the same name
+;
+#X obj 26 10 cnv 15 850 40 empty empty pool 10 22 0 24 -260818 -1 0
+;
+#X text 337 32 http://www.parasitaere-kapazitaeten.net;
+#X text 337 12 a hierarchical storage object \, (C)2002 Thomas Grill
+;
+#X obj 317 529 print A;
+#X text 382 529 attributes;
+#X msg 43 490 getattributes;
+#X msg 136 132 getechodir;
+#X msg 132 232 getabsdir;
+#X msg 146 313 getpool;
+#X connect 0 0 5 0;
+#X connect 0 1 2 0;
+#X connect 0 2 6 0;
+#X connect 0 3 19 0;
+#X connect 0 4 68 0;
+#X connect 1 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 0 0;
+#X connect 11 0 0 0;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
+#X connect 14 0 13 0;
+#X connect 15 0 16 0;
+#X connect 16 0 0 0;
+#X connect 24 0 0 0;
+#X connect 25 0 0 0;
+#X connect 27 0 0 0;
+#X connect 29 0 0 0;
+#X connect 34 0 0 0;
+#X connect 35 0 0 0;
+#X connect 46 0 0 0;
+#X connect 49 0 0 0;
+#X connect 51 0 0 0;
+#X connect 54 0 0 0;
+#X connect 63 0 0 0;
+#X connect 70 0 0 0;
+#X connect 71 0 0 0;
+#X connect 72 0 0 0;
+#X connect 73 0 0 0;
diff --git a/externals/grill/pool/readme.txt b/externals/grill/pool/readme.txt index 6bf4c969..e8053aed 100644 --- a/externals/grill/pool/readme.txt +++ b/externals/grill/pool/readme.txt @@ -55,6 +55,8 @@ Version history: 0.1.1: - attributes (pool,private,echodir,absdir) - added "geti" message for retrieval of a value at an index +- fixed bug in "get" message if key not present +- adapted source to flext 0.4.1 - register methods at class creation 0.1.0: - first public release diff --git a/externals/grill/prepend/main.cpp b/externals/grill/prepend/main.cpp index 466ae70f..91a9a5ff 100644 --- a/externals/grill/prepend/main.cpp +++ b/externals/grill/prepend/main.cpp @@ -10,16 +10,16 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include <flext.h> -#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 202) -#error You need at least flext version 0.2.2 +#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 401) +#error You need at least flext version 0.4.1 #endif -#define PREPEND_VERSION "0.0.2" +#define PREPEND_VERSION "0.0.3" class prepend: public flext_base { - FLEXT_HEADER(prepend, flext_base) + FLEXT_HEADER_S(prepend, flext_base, Setup) public: prepend(int argc,t_atom *argv); @@ -34,6 +34,8 @@ protected: private: + static void Setup(t_class *c); + class reg_t { public: @@ -49,12 +51,12 @@ private: } reg[2]; FLEXT_CALLBACK(m_bang) - FLEXT_CALLBACK_G(m_set) + FLEXT_CALLBACK_V(m_set) FLEXT_CALLBACK_A(m_any0) FLEXT_CALLBACK_A(m_any1) }; -FLEXT_NEW_G("prepend",prepend) +FLEXT_NEW_V("prepend",prepend) @@ -62,16 +64,17 @@ prepend::prepend(int argc,t_atom *argv) { AddInAnything(2); AddOutAnything(); - SetupInOut(); // set up inlets and outlets - - FLEXT_ADDMETHOD_(0,"bang",m_bang); -// FLEXT_ADDMETHOD_(0,"set",m_set); - FLEXT_ADDMETHOD(0,m_any0); - FLEXT_ADDMETHOD(1,m_any1); m_set(argc,argv); } +void prepend::Setup(t_class *c) +{ + FLEXT_CADDMETHOD_(c,0,"bang",m_bang); +// FLEXT_CADDMETHOD_(c,0,"set",m_set); + FLEXT_CADDMETHOD(c,0,m_any0); + FLEXT_CADDMETHOD(c,1,m_any1); +} void prepend::reg_t::Store(const t_symbol *s,int argc,t_atom *argv) { diff --git a/externals/grill/py/pd/thread-1.pd b/externals/grill/py/pd/thread-1.pd index 9a873781..5a9545e2 100644 --- a/externals/grill/py/pd/thread-1.pd +++ b/externals/grill/py/pd/thread-1.pd @@ -1,47 +1,47 @@ -#N canvas 440 61 586 398 12; -#X msg 38 265 help; -#X msg 37 290 doc; -#X msg 73 291 doc+; -#X floatatom 145 323 5 0 0; -#X text 16 14 py/pyext - Python script objects \, (C)2002 Thomas Grill -; -#X text 14 44 This demonstrates threading. See the threads.py file. -; -#X obj 140 216 tgl 15 0 empty empty empty 0 -6 32 8 -262144 -1 -1 0 -1; -#X msg 140 236 detach \$1; -#X floatatom 253 324 5 0 0; -#X obj 275 123 bng 15 250 50 0 empty empty empty 0 -6 32 8 -258699 --1 -1; -#X obj 146 127 bng 15 250 50 0 empty empty empty 0 -6 32 8 -258699 --1 -1; -#X obj 146 154 t b b b; -#X obj 275 150 t b b b; -#X obj 289 179 1; -#X obj 160 181 0; -#X text 87 87 without threads; -#X text 251 85 with threads; -#X text 252 102 non-blocking; -#X text 178 345 watch that!; -#X msg 414 127 stop; -#X text 384 106 you can even stop it; -#X text 115 102 blocking; -#X obj 145 279 pyext threads ex1; -#X connect 0 0 22 0; -#X connect 1 0 22 0; -#X connect 2 0 22 0; -#X connect 6 0 7 0; -#X connect 7 0 22 0; -#X connect 9 0 12 0; -#X connect 10 0 11 0; -#X connect 11 0 22 1; -#X connect 11 1 22 2; -#X connect 11 2 14 0; -#X connect 12 0 22 1; -#X connect 12 1 22 2; -#X connect 12 2 13 0; -#X connect 13 0 6 0; -#X connect 14 0 6 0; -#X connect 19 0 22 0; -#X connect 22 0 3 0; -#X connect 22 1 8 0; +#N canvas 440 61 588 400 12;
+#X msg 38 265 help;
+#X msg 37 290 doc;
+#X msg 73 291 doc+;
+#X floatatom 145 323 5 0 0 0 - - -;
+#X text 16 14 py/pyext - Python script objects \, (C)2002 Thomas Grill
+;
+#X text 14 44 This demonstrates threading. See the threads.py file.
+;
+#X obj 140 216 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
+1;
+#X msg 140 236 detach \$1;
+#X floatatom 253 324 5 0 0 0 - - -;
+#X obj 275 123 bng 15 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
+-1;
+#X obj 146 127 bng 15 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
+-1;
+#X obj 146 154 t b b b;
+#X obj 275 150 t b b b;
+#X obj 289 179 1;
+#X obj 160 181 0;
+#X text 87 87 without threads;
+#X text 251 85 with threads;
+#X text 252 102 non-blocking;
+#X text 178 345 watch that!;
+#X msg 414 127 stop;
+#X text 384 106 you can even stop it;
+#X obj 145 279 pyext threads ex1;
+#X text 93 101 - blocking!! -;
+#X connect 0 0 21 0;
+#X connect 1 0 21 0;
+#X connect 2 0 21 0;
+#X connect 6 0 7 0;
+#X connect 7 0 21 0;
+#X connect 9 0 12 0;
+#X connect 10 0 11 0;
+#X connect 11 0 21 1;
+#X connect 11 1 21 2;
+#X connect 11 2 14 0;
+#X connect 12 0 21 1;
+#X connect 12 1 21 2;
+#X connect 12 2 13 0;
+#X connect 13 0 6 0;
+#X connect 14 0 6 0;
+#X connect 19 0 21 0;
+#X connect 21 0 3 0;
+#X connect 21 1 8 0;
diff --git a/externals/grill/py/readme.txt b/externals/grill/py/readme.txt index 3173ce04..82d88985 100644 --- a/externals/grill/py/readme.txt +++ b/externals/grill/py/readme.txt @@ -73,6 +73,9 @@ o GCC: edit "config-pd-darwin.txt" & run "sh build-pd-darwin.sh" Version history: +0.1.2: +- CHANGE: updates for flext 0.4.1 - method registering within class scope + 0.1.1: - CHANGE: updates for flext 0.4.0 - FIX: crash when module couldn't be loaded diff --git a/externals/grill/py/source/main.h b/externals/grill/py/source/main.h index eaa9f7b6..721a1d43 100644 --- a/externals/grill/py/source/main.h +++ b/externals/grill/py/source/main.h @@ -22,7 +22,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #error You need at least flext version 0.4.1 #endif -#define PY__VERSION "0.1.1" +#define PY__VERSION "0.1.2pre" #define PYEXT_MODULE "pyext" // name for module diff --git a/externals/grill/py/source/py.cpp b/externals/grill/py/source/py.cpp index f6127716..00f1f992 100644 --- a/externals/grill/py/source/py.cpp +++ b/externals/grill/py/source/py.cpp @@ -14,7 +14,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class pyobj: public py { - FLEXT_HEADER(pyobj,py) + FLEXT_HEADER_S(pyobj,py,Setup) public: pyobj(I argc,const t_atom *argv); @@ -50,6 +50,7 @@ protected: V ResetFunction(); private: + static void Setup(t_class *c); FLEXT_CALLBACK(m_bang) FLEXT_CALLBACK(m_reload) @@ -72,6 +73,25 @@ private: FLEXT_LIB_V("py",pyobj) +void pyobj::Setup(t_class *c) +{ + FLEXT_CADDBANG(c,0,m_bang); + FLEXT_CADDMETHOD_(c,0,"reload",m_reload_); + FLEXT_CADDMETHOD_(c,0,"reload.",m_reload); + FLEXT_CADDMETHOD_(c,0,"set",m_set); + FLEXT_CADDMETHOD_(c,0,"doc",m_doc); + FLEXT_CADDMETHOD_(c,0,"doc+",m_doc_); +#ifdef FLEXT_THREADS + FLEXT_CADDMETHOD_(c,0,"detach",m_detach); + FLEXT_CADDMETHOD_(c,0,"stop",m_stop); +#endif + + FLEXT_CADDMETHOD_(c,1,"float",m_py_float); + FLEXT_CADDMETHOD_(c,1,"int",m_py_int); + FLEXT_CADDMETHOD(c,1,m_py_list); + FLEXT_CADDMETHOD(c,1,m_py_any); +} + pyobj::pyobj(I argc,const t_atom *argv): function(NULL),funname(NULL) { @@ -80,22 +100,6 @@ pyobj::pyobj(I argc,const t_atom *argv): AddInAnything(2); AddOutAnything(); - FLEXT_ADDBANG(0,m_bang); - FLEXT_ADDMETHOD_(0,"reload",m_reload_); - FLEXT_ADDMETHOD_(0,"reload.",m_reload); - FLEXT_ADDMETHOD_(0,"set",m_set); - FLEXT_ADDMETHOD_(0,"doc",m_doc); - FLEXT_ADDMETHOD_(0,"doc+",m_doc_); -#ifdef FLEXT_THREADS - FLEXT_ADDMETHOD_(0,"detach",m_detach); - FLEXT_ADDMETHOD_(0,"stop",m_stop); -#endif - - FLEXT_ADDMETHOD_(1,"float",m_py_float); - FLEXT_ADDMETHOD_(1,"int",m_py_int); - FLEXT_ADDMETHOD(1,m_py_list); - FLEXT_ADDMETHOD(1,m_py_any); - if(argc > 2) SetArgs(argc-2,argv+2); else diff --git a/externals/grill/py/source/pyext.cpp b/externals/grill/py/source/pyext.cpp index 8bff5913..958f1882 100644 --- a/externals/grill/py/source/pyext.cpp +++ b/externals/grill/py/source/pyext.cpp @@ -14,12 +14,22 @@ WARRANTIES, see the file, "license.txt," in this distribution. FLEXT_LIB_V("pyext",pyext) -V pyext::setup(t_class *) +V pyext::Setup(t_class *c) { px_head = px_tail = NULL; px_class = class_new(gensym("pyext proxy"),NULL,NULL,sizeof(py_proxy),CLASS_PD|CLASS_NOINLET, A_NULL); ::add_anything(px_class,py_proxy::px_method); // for other inlets + + FLEXT_CADDMETHOD_(c,0,"reload.",m_reload); + FLEXT_CADDMETHOD_(c,0,"reload",m_reload_); + FLEXT_CADDMETHOD_(c,0,"doc",m_doc); + FLEXT_CADDMETHOD_(c,0,"doc+",m_doc_); + +#ifdef FLEXT_THREADS + FLEXT_CADDMETHOD_(c,0,"detach",m_detach); + FLEXT_CADDMETHOD_(c,0,"stop",m_stop); +#endif } pyext *pyext::GetThis(PyObject *self) @@ -165,16 +175,6 @@ pyext::pyext(I argc,const t_atom *argv): AddInAnything(1+inlets); AddOutAnything(outlets); - FLEXT_ADDMETHOD_(0,"reload.",m_reload); - FLEXT_ADDMETHOD_(0,"reload",m_reload_); - FLEXT_ADDMETHOD_(0,"doc",m_doc); - FLEXT_ADDMETHOD_(0,"doc+",m_doc_); - -#ifdef FLEXT_THREADS - FLEXT_ADDMETHOD_(0,"detach",m_detach); - FLEXT_ADDMETHOD_(0,"stop",m_stop); -#endif - if(!pyobj) InitProblem(); } diff --git a/externals/grill/py/source/pyext.h b/externals/grill/py/source/pyext.h index d804d825..4d35e0a4 100644 --- a/externals/grill/py/source/pyext.h +++ b/externals/grill/py/source/pyext.h @@ -16,7 +16,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class pyext: public py { - FLEXT_HEADER_S(pyext,py,setup) + FLEXT_HEADER_S(pyext,py,Setup) public: pyext(I argc,const t_atom *argv); @@ -53,7 +53,7 @@ protected: I inlets,outlets; private: - static V setup(t_class *); + static V Setup(t_class *); static pyext *GetThis(PyObject *self); V ClearBinding(); diff --git a/externals/grill/vasp/pd-ex/freeze1.pd b/externals/grill/vasp/pd-ex/freeze1.pd index b8f74dad..c24eeb61 100644 --- a/externals/grill/vasp/pd-ex/freeze1.pd +++ b/externals/grill/vasp/pd-ex/freeze1.pd @@ -1,4 +1,4 @@ -#N canvas 33 61 969 505 12;
+#N canvas 33 61 975 511 12;
#N canvas 387 42 567 656 freeze 0;
#X obj 26 130 vasp.split 2;
#X obj 27 404 vasp.join 2;
@@ -186,7 +186,7 @@ #X obj 105 115 nbx 12 18 0 1e+008 0 1 empty empty length(frames) 0
-8 0 12 -225271 -1 -1 1e+006 256;
#X obj 85 368 nbx 9 14 -1e+037 1e+037 0 0 empty empty spectral_density
-0 -6 0 10 -262131 -1 -1 0.054238 256;
+0 -6 0 10 -262131 -1 -1 0.009812 256;
#X obj 332 197 cnv 15 100 20 empty empty play_src 5 8 0 10 -261681
-66577 0;
#X obj 447 197 cnv 15 100 20 empty empty read_src 5 8 0 10 -261681
@@ -250,7 +250,7 @@ #X connect 3 0 0 1;
#X connect 3 1 4 0;
#X restore 614 251 pd playdst;
-#N canvas 249 202 519 462 copy 0;
+#N canvas 249 202 527 470 copy 0;
#X obj 27 26 inlet;
#X obj 27 51 t b b;
#X obj 316 19 inlet;
diff --git a/externals/grill/vasp/source/classes.cpp b/externals/grill/vasp/source/classes.cpp index 78c6a0ca..801826dd 100644 --- a/externals/grill/vasp/source/classes.cpp +++ b/externals/grill/vasp/source/classes.cpp @@ -24,7 +24,7 @@ const t_symbol *vasp_base::sym_double; const t_symbol *vasp_base::sym_complex; const t_symbol *vasp_base::sym_vector; -V vasp_base::setup(t_class *) +V vasp_base::Setup(t_class *c) { sym_radio = MakeSymbol("radio"); sym_vasp = MakeSymbol("vasp"); @@ -32,22 +32,22 @@ V vasp_base::setup(t_class *) sym_double = MakeSymbol("double"); sym_complex = MakeSymbol("complex"); sym_vector = MakeSymbol("vector"); -} -vasp_base::vasp_base(): - refresh(false),argchk(false), - unit(xsu_sample),loglvl(0) -{ - FLEXT_ADDMETHOD_(0,"radio",m_radio); + FLEXT_CADDMETHOD_(c,0,"radio",m_radio); // LATER! /* - FLEXT_ADDATTR_VAR1("argchk",argchk); - FLEXT_ADDATTR_VAR1("loglvl",loglvl); - FLEXT_ADDATTR_VAR1_E("unit",unit); + FLEXT_CADDATTR_VAR1(c,"argchk",argchk); + FLEXT_CADDATTR_VAR1(c,"loglvl",loglvl); + FLEXT_CADDATTR_VAR1_E(c,"unit",unit); */ } +vasp_base::vasp_base(): + refresh(false),argchk(false), + unit(xsu_sample),loglvl(0) +{} + vasp_base::~vasp_base() {} @@ -91,20 +91,24 @@ vasp_op::vasp_op(BL op) // ,thrid(0) #endif { - FLEXT_ADDBANG(0,m_dobang); - FLEXT_ADDMETHOD_(0,"vasp",m_vasp); - FLEXT_ADDMETHOD_(0,"set",m_set); - - FLEXT_ADDATTR_VAR("ref",m_getref,m_setref); if(op) FLEXT_ADDATTR_VAR("to",m_getto,m_setto); +} + +V vasp_op::Setup(t_class *c) +{ + FLEXT_CADDBANG(c,0,m_dobang); + FLEXT_CADDMETHOD_(c,0,"vasp",m_vasp); + FLEXT_CADDMETHOD_(c,0,"set",m_set); + + FLEXT_CADDATTR_VAR(c,"ref",m_getref,m_setref); - FLEXT_ADDMETHOD_(0,"stop",m_stop); + FLEXT_CADDMETHOD_(c,0,"stop",m_stop); - FLEXT_ADDATTR_VAR("update",m_getupd,m_setupd); + FLEXT_CADDATTR_VAR(c,"update",m_getupd,m_setupd); #ifdef FLEXT_THREADS - FLEXT_ADDATTR_VAR1("detach",detach); - FLEXT_ADDATTR_VAR1("prior",prior); + FLEXT_CADDATTR_VAR1(c,"detach",detach); + FLEXT_CADDATTR_VAR1(c,"prior",prior); #endif } @@ -252,18 +256,21 @@ vasp_binop::vasp_binop(I argc,const t_atom *argv,const Argument &def,BL op,UL ou AddInAnything(2); AddOutAnything(1); AddOutlets(outcode); +} - FLEXT_ADDMETHOD(1,a_list); - FLEXT_ADDMETHOD_(1,"vasp",a_vasp); - FLEXT_ADDMETHOD_(1,"env",a_env); - FLEXT_ADDMETHOD_(1,"float",a_float); - FLEXT_ADDMETHOD_(1,"double",a_double); - FLEXT_ADDMETHOD_(1,"int",a_int); - FLEXT_ADDMETHOD_(1,"complex",a_complex); - FLEXT_ADDMETHOD_(1,"vector",a_vector); - FLEXT_ADDMETHOD_(1,"radio",a_radio); - - FLEXT_ADDATTR_VAR("arg",m_getarg,m_setarg); +V vasp_binop::Setup(t_class *c) +{ + FLEXT_CADDMETHOD(c,1,a_list); + FLEXT_CADDMETHOD_(c,1,"vasp",a_vasp); + FLEXT_CADDMETHOD_(c,1,"env",a_env); + FLEXT_CADDMETHOD_(c,1,"float",a_float); + FLEXT_CADDMETHOD_(c,1,"double",a_double); + FLEXT_CADDMETHOD_(c,1,"int",a_int); + FLEXT_CADDMETHOD_(c,1,"complex",a_complex); + FLEXT_CADDMETHOD_(c,1,"vector",a_vector); + FLEXT_CADDMETHOD_(c,1,"radio",a_radio); + + FLEXT_CADDATTR_VAR(c,"arg",m_getarg,m_setarg); } V vasp_binop::a_list(I argc,const t_atom *argv) @@ -374,12 +381,15 @@ vasp_anyop::vasp_anyop(I argc,const t_atom *argv,const Argument &def,BL op,UL ou AddInAnything(2); AddOutAnything(1); AddOutlets(outcode); +} - FLEXT_ADDMETHOD(1,a_list); - FLEXT_ADDMETHOD_(1,"vasp",a_list); - FLEXT_ADDMETHOD_(1,"radio",a_radio); +V vasp_anyop::Setup(t_class *c) +{ + FLEXT_CADDMETHOD(c,1,a_list); + FLEXT_CADDMETHOD_(c,1,"vasp",a_list); + FLEXT_CADDMETHOD_(c,1,"radio",a_radio); - FLEXT_ADDATTR_VAR("arg",m_getarg,m_setarg); + FLEXT_CADDATTR_VAR(c,"arg",m_getarg,m_setarg); } V vasp_anyop::a_list(I argc,const t_atom *argv) diff --git a/externals/grill/vasp/source/classes.h b/externals/grill/vasp/source/classes.h index c032abd7..1ef17a3f 100644 --- a/externals/grill/vasp/source/classes.h +++ b/externals/grill/vasp/source/classes.h @@ -18,7 +18,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_base: public flext_base { - FLEXT_HEADER_S(vasp_base,flext_base,setup) + FLEXT_HEADER_S(vasp_base,flext_base,Setup) public: enum xs_unit { @@ -54,7 +54,7 @@ protected: BL ToOutVasp(I outlet,Vasp &v); private: - static V setup(t_class *); + static V Setup(t_class *); FLEXT_CALLBACK_V(m_radio) @@ -67,7 +67,7 @@ private: class vasp_op: public vasp_base { - FLEXT_HEADER(vasp_op,vasp_base) + FLEXT_HEADER_S(vasp_op,vasp_base,Setup) protected: vasp_op(BL withto = false); @@ -128,6 +128,8 @@ protected: #endif private: + static V Setup(t_class *); + virtual V m_bang() = 0; // do! and output current Vasp }; @@ -173,7 +175,7 @@ protected: class vasp_binop: public vasp_tx { - FLEXT_HEADER(vasp_binop,vasp_tx) + FLEXT_HEADER_S(vasp_binop,vasp_tx,Setup) protected: vasp_binop(I argc,const t_atom *argv,const Argument &def = Argument(),BL withto = false,UL outcode = 0); @@ -199,6 +201,8 @@ protected: V m_getarg(AtomList &l) { arg.MakeList(l); } private: + static V Setup(t_class *); + FLEXT_CALLBACK_V(a_list) FLEXT_CALLBACK_V(a_vasp) FLEXT_CALLBACK_V(a_env) @@ -218,7 +222,7 @@ private: class vasp_anyop: public vasp_tx { - FLEXT_HEADER(vasp_anyop,vasp_tx) + FLEXT_HEADER_S(vasp_anyop,vasp_tx,Setup) protected: vasp_anyop(I argc,const t_atom *argv,const Argument &def = Argument(),BL withto = false,UL outcode = 0); @@ -237,6 +241,8 @@ protected: V m_getarg(AtomList &l) { arg.MakeList(l); } private: + static V Setup(t_class *); + FLEXT_CALLBACK_V(a_list) FLEXT_CALLBACK_V(a_radio) diff --git a/externals/grill/vasp/source/obj_chns.cpp b/externals/grill/vasp/source/obj_chns.cpp index facfe5fe..b8c2affc 100755 --- a/externals/grill/vasp/source/obj_chns.cpp +++ b/externals/grill/vasp/source/obj_chns.cpp @@ -26,7 +26,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_channel: public vasp_tx { - FLEXT_HEADER(vasp_channel,vasp_tx) + FLEXT_HEADER_S(vasp_channel,vasp_tx,Setup) public: vasp_channel(I argc,t_atom *argv): @@ -39,9 +39,12 @@ public: AddInAnything(2); AddOutAnything(); + } - FLEXT_ADDMETHOD(1,m_ix); - FLEXT_ADDATTR_VAR("index",ix,m_ix); + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD(c,1,m_ix); + FLEXT_CADDATTR_VAR(c,"index",ix,m_ix); } V m_ix(I i) { ix = i; } @@ -90,7 +93,6 @@ public: { AddInAnything(); AddOutInt(); - SetupInOut(); } virtual V m_bang() diff --git a/externals/grill/vasp/source/obj_frames.cpp b/externals/grill/vasp/source/obj_frames.cpp index c50d5019..9f6b54a7 100644 --- a/externals/grill/vasp/source/obj_frames.cpp +++ b/externals/grill/vasp/source/obj_frames.cpp @@ -29,7 +29,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_frames: public vasp_tx { - FLEXT_HEADER(vasp_frames,vasp_tx) + FLEXT_HEADER_S(vasp_frames,vasp_tx,Setup) public: vasp_frames(I argc,t_atom *argv,BL abs = true): @@ -45,10 +45,14 @@ public: AddInFloat(); AddOutAnything(); - FLEXT_ADDMETHOD(1,m_arg); if(abs) FLEXT_ADDATTR_VAR("frames",frms,m_arg); } + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD(c,1,m_arg); + } + virtual V m_arg(F f) { frms = (I)f; //! \todo unit processing @@ -127,14 +131,18 @@ FLEXT_LIB_V("vasp, vasp.frames+ vasp.f+",vasp_dframes) class vasp_mframes: public vasp_frames { - FLEXT_HEADER(vasp_mframes,vasp_frames) + FLEXT_HEADER_S(vasp_mframes,vasp_frames,Setup) public: vasp_mframes(I argc,t_atom *argv): vasp_frames(argc,argv,false) { if(argc && CanbeFloat(argv[0])) m_arg(GetAFloat(argv[0])); - FLEXT_ADDATTR_VAR("factor",factor,m_arg); + } + + static V Setup(t_class *c) + { + FLEXT_CADDATTR_VAR(c,"factor",factor,m_arg); } virtual Vasp *x_work() @@ -221,7 +229,6 @@ public: { AddInAnything(); AddOutInt(); - SetupInOut(); } virtual V m_bang() { ToOutInt(0,ref.ChkFrames()); } //! \todo unit processing diff --git a/externals/grill/vasp/source/obj_imm.cpp b/externals/grill/vasp/source/obj_imm.cpp index 9ea9791a..4d4000d2 100644 --- a/externals/grill/vasp/source/obj_imm.cpp +++ b/externals/grill/vasp/source/obj_imm.cpp @@ -34,7 +34,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_imm: public vasp_op { - FLEXT_HEADER(vasp_imm,vasp_op) + FLEXT_HEADER_S(vasp_imm,vasp_op,Setup) public: vasp_imm(I argc,t_atom *argv): @@ -48,9 +48,12 @@ public: AddInAnything(); AddInInt(); AddOutAnything(); + } - FLEXT_ADDMETHOD(1,m_frames); - FLEXT_ADDATTR_VAR("frames",frms,m_frames); + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD(c,1,m_frames); + FLEXT_CADDATTR_VAR(c,"frames",frms,m_frames); } V m_frames(I n) { frms = n; } diff --git a/externals/grill/vasp/source/obj_offs.cpp b/externals/grill/vasp/source/obj_offs.cpp index 07bf1982..6ecfeefd 100644 --- a/externals/grill/vasp/source/obj_offs.cpp +++ b/externals/grill/vasp/source/obj_offs.cpp @@ -30,7 +30,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_offset: public vasp_tx { - FLEXT_HEADER(vasp_offset,vasp_tx) + FLEXT_HEADER_S(vasp_offset,vasp_tx,Setup) public: vasp_offset(I argc,t_atom *argv): @@ -44,9 +44,12 @@ public: AddInAnything(); AddInFloat(); AddOutAnything(); + } - FLEXT_ADDMETHOD(1,m_offs); - FLEXT_ADDATTR_VAR("frames",offs,m_offs); + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD(c,1,m_offs); + FLEXT_CADDATTR_VAR(c,"frames",offs,m_offs); } V m_offs(F o) diff --git a/externals/grill/vasp/source/obj_part.cpp b/externals/grill/vasp/source/obj_part.cpp index f1ecf354..5f0e652b 100644 --- a/externals/grill/vasp/source/obj_part.cpp +++ b/externals/grill/vasp/source/obj_part.cpp @@ -31,7 +31,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_part: public vasp_op { - FLEXT_HEADER(vasp_part,vasp_op) + FLEXT_HEADER_S(vasp_part,vasp_op,Setup) public: vasp_part(I argc,t_atom *argv): @@ -41,13 +41,16 @@ public: AddInAnything(2); AddOutAnything(2); - - FLEXT_ADDMETHOD_(1,"list",m_part); - FLEXT_ADDATTR_VAR("parts",m_getpart,m_setpart); } ~vasp_part() { if(part) delete[] part; } + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD_(c,1,"list",m_part); + FLEXT_CADDATTR_VAR(c,"parts",m_getpart,m_setpart); + } + V m_part(I argc,const t_atom *argv) { if(part) delete[] part; parts = 0; diff --git a/externals/grill/vasp/source/obj_peaks.cpp b/externals/grill/vasp/source/obj_peaks.cpp index bade1ff1..003acfaa 100644 --- a/externals/grill/vasp/source/obj_peaks.cpp +++ b/externals/grill/vasp/source/obj_peaks.cpp @@ -31,7 +31,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_qpeaks: public vasp_op { - FLEXT_HEADER(vasp_qpeaks,vasp_op) + FLEXT_HEADER_S(vasp_qpeaks,vasp_op,Setup) public: vasp_qpeaks(I argc,t_atom *argv): @@ -45,9 +45,12 @@ public: AddInAnything(); AddInInt(); AddOutAnything(2); + } - FLEXT_ADDMETHOD(1,m_peaks); - FLEXT_ADDATTR_VAR("peaks",peaks,m_peaks); + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD(c,1,m_peaks); + FLEXT_CADDATTR_VAR(c,"peaks",peaks,m_peaks); } V m_peaks(I n) { peaks = n; } diff --git a/externals/grill/vasp/source/obj_radio.cpp b/externals/grill/vasp/source/obj_radio.cpp index d0c2452e..a3fde97c 100644 --- a/externals/grill/vasp/source/obj_radio.cpp +++ b/externals/grill/vasp/source/obj_radio.cpp @@ -27,7 +27,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_radio: public flext_base { - FLEXT_HEADER(vasp_radio,flext_base) + FLEXT_HEADER_S(vasp_radio,flext_base,Setup) public: @@ -35,8 +35,11 @@ public: { AddInAnything(); AddOutAnything(2); + } - FLEXT_ADDMETHOD(0,m_any); + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD(c,0,m_any); } virtual V m_any(const t_symbol *s,I argc,t_atom *argv); diff --git a/externals/grill/vasp/source/obj_size.cpp b/externals/grill/vasp/source/obj_size.cpp index 1d28b1cb..b061824b 100644 --- a/externals/grill/vasp/source/obj_size.cpp +++ b/externals/grill/vasp/source/obj_size.cpp @@ -30,7 +30,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_size: public vasp_tx { - FLEXT_HEADER(vasp_size,vasp_tx) + FLEXT_HEADER_S(vasp_size,vasp_tx,Setup) public: vasp_size(I argc,t_atom *argv,BL abs = true): @@ -45,9 +45,13 @@ public: AddInFloat(); AddOutAnything(); - FLEXT_ADDMETHOD(1,m_arg); if(abs) FLEXT_ADDATTR_VAR("frames",size,m_arg); - FLEXT_ADDATTR_VAR1("keep",keep); + } + + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD(c,1,m_arg); + FLEXT_CADDATTR_VAR1(c,"keep",keep); } virtual V m_arg(F s) @@ -129,14 +133,18 @@ FLEXT_LIB_V("vasp, vasp.size+ vasp.s+",vasp_dsize) class vasp_msize: public vasp_size { - FLEXT_HEADER(vasp_msize,vasp_size) + FLEXT_HEADER_S(vasp_msize,vasp_size,Setup) public: vasp_msize(I argc,t_atom *argv): vasp_size(argc,argv,false) { if(argc && CanbeFloat(argv[0])) m_arg(GetAFloat(argv[0])); - FLEXT_ADDATTR_VAR("factor",factor,m_arg); + } + + static V Setup(t_class *c) + { + FLEXT_CADDATTR_VAR(c,"factor",factor,m_arg); } virtual Vasp *x_work() diff --git a/externals/grill/vasp/source/obj_split.cpp b/externals/grill/vasp/source/obj_split.cpp index e308e19c..8a3dda94 100644 --- a/externals/grill/vasp/source/obj_split.cpp +++ b/externals/grill/vasp/source/obj_split.cpp @@ -95,7 +95,7 @@ FLEXT_LIB_V("vasp, vasp.split",vasp_split) class vasp_join: public vasp_tx { - FLEXT_HEADER(vasp_join,vasp_tx) + FLEXT_HEADER_S(vasp_join,vasp_tx,Setup) public: vasp_join(I argc,t_atom *argv): @@ -115,12 +115,15 @@ public: AddInAnything(cnt); AddOutAnything(); - - FLEXT_ADDMETHOD_(0,"reset",m_reset); } ~vasp_join() { if(vi) delete[] vi; } + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD_(c,0,"reset",m_reset); + } + virtual Vasp *x_work() { CVasp *ret = new CVasp(ref); for(I i = 0; i < cnt-1; ++i) if(vi[i]) *ret += *vi[i]; @@ -231,7 +234,7 @@ FLEXT_LIB_V("vasp, vasp.spit",vasp_spit) class vasp_gather: public vasp_tx { - FLEXT_HEADER(vasp_gather,vasp_tx) + FLEXT_HEADER_S(vasp_gather,vasp_tx,Setup) public: vasp_gather(I argc,t_atom *argv) @@ -246,12 +249,13 @@ public: AddInAnything(2); AddOutAnything(); - - FLEXT_ADDMETHOD_(0,"reset",m_reset); - FLEXT_ADDMETHOD_(1,"vasp",m_add); } - ~vasp_gather() { } + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD_(c,0,"reset",m_reset); + FLEXT_CADDMETHOD_(c,1,"vasp",m_add); + } virtual Vasp *x_work() { diff --git a/externals/grill/vasp/source/obj_sync.cpp b/externals/grill/vasp/source/obj_sync.cpp index 9d6e3610..a8726328 100644 --- a/externals/grill/vasp/source/obj_sync.cpp +++ b/externals/grill/vasp/source/obj_sync.cpp @@ -31,7 +31,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_sync: public vasp_op { - FLEXT_HEADER(vasp_sync,vasp_op) + FLEXT_HEADER_S(vasp_sync,vasp_op,Setup) public: vasp_sync(I argc,t_atom *argv): @@ -52,12 +52,19 @@ public: AddInAnything(cnt); AddOutAnything(cnt); + } - FLEXT_ADDMETHOD_(0,"reset",m_reset); - + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD_(c,0,"reset",m_reset); } - virtual BL Init() { BL ret = vasp_op::Init(); m_reset(); return ret; } + virtual BL Init() + { + BL ret = vasp_op::Init(); + m_reset(); + return ret; + } ~vasp_sync() { diff --git a/externals/grill/vasp/source/obj_vasp.cpp b/externals/grill/vasp/source/obj_vasp.cpp index 680bede7..2b4319c3 100644 --- a/externals/grill/vasp/source/obj_vasp.cpp +++ b/externals/grill/vasp/source/obj_vasp.cpp @@ -32,7 +32,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_v: public vasp_tx { - FLEXT_HEADER(vasp_v,vasp_tx) + FLEXT_HEADER_S(vasp_v,vasp_tx,Setup) public: @@ -42,12 +42,15 @@ public: AddInAnything(2); AddOutAnything(); + } - FLEXT_ADDMETHOD_(0,"list",m_vasp); + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD_(c,0,"list",m_vasp); - FLEXT_ADDMETHOD_(1,"list",m_set); - FLEXT_ADDMETHOD_(1,"vasp",m_set); - FLEXT_ADDMETHOD_(1,"radio",a_radio); + FLEXT_CADDMETHOD_(c,1,"list",m_set); + FLEXT_CADDMETHOD_(c,1,"vasp",m_set); + FLEXT_CADDMETHOD_(c,1,"radio",a_radio); } V a_radio(I,t_atom *) {} diff --git a/externals/grill/vasp/source/obj_vecs.cpp b/externals/grill/vasp/source/obj_vecs.cpp index 3c0db9f5..2806a806 100644 --- a/externals/grill/vasp/source/obj_vecs.cpp +++ b/externals/grill/vasp/source/obj_vecs.cpp @@ -30,7 +30,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class vasp_vector: public vasp_tx { - FLEXT_HEADER(vasp_vector,vasp_tx) + FLEXT_HEADER_S(vasp_vector,vasp_tx,Setup) public: vasp_vector(I argc,t_atom *argv): @@ -43,9 +43,12 @@ public: AddInAnything(2); AddOutAnything(); + } - FLEXT_ADDMETHOD(1,m_ix); - FLEXT_ADDATTR_VAR("index",ix,m_ix); + static V Setup(t_class *c) + { + FLEXT_CADDMETHOD(c,1,m_ix); + FLEXT_CADDATTR_VAR(c,"index",ix,m_ix); } V m_ix(I i) { ix = i; } diff --git a/externals/grill/vasp/source/ops_rearr.cpp b/externals/grill/vasp/source/ops_rearr.cpp index 0da06cfd..b7712115 100644 --- a/externals/grill/vasp/source/ops_rearr.cpp +++ b/externals/grill/vasp/source/ops_rearr.cpp @@ -99,14 +99,17 @@ BL VecOp::d_shift(OpParam &p) class vasp_shift: public vasp_anyop { - FLEXT_HEADER(vasp_shift,vasp_anyop) + FLEXT_HEADER_S(vasp_shift,vasp_anyop,Setup) public: vasp_shift(I argc,const t_atom *argv): vasp_anyop(argc,argv,VASP_ARG_I(0),true), fill(xsf_zero) + {} + + static V Setup(t_class *c) { - FLEXT_ADDATTR_VAR1_E("fill",fill); + FLEXT_CADDATTR_VAR1_E(c,"fill",fill); } enum xs_fill { diff --git a/externals/grill/vasp/source/ops_resmp.cpp b/externals/grill/vasp/source/ops_resmp.cpp index 0c578284..e7e33bb9 100644 --- a/externals/grill/vasp/source/ops_resmp.cpp +++ b/externals/grill/vasp/source/ops_resmp.cpp @@ -201,15 +201,18 @@ Vasp *VaspOp::m_tilt(OpParam &p,CVasp &src,const Argument &arg,CVasp *dst,BL sym class vasp_tilt: public vasp_anyop { - FLEXT_HEADER(vasp_tilt,vasp_anyop) + FLEXT_HEADER_S(vasp_tilt,vasp_anyop,Setup) public: vasp_tilt(I argc,t_atom *argv): vasp_anyop(argc,argv,VASP_ARG_R(1),true), fill(xtf_zero),inter(xti_4p) + {} + + static V Setup(t_class *c) { - FLEXT_ADDATTR_VAR1_E("fill",fill); - FLEXT_ADDATTR_VAR1_E("inter",inter); + FLEXT_CADDATTR_VAR1_E(c,"fill",fill); + FLEXT_CADDATTR_VAR1_E(c,"inter",inter); } enum xt_fill { diff --git a/externals/grill/vasp/source/ops_search.cpp b/externals/grill/vasp/source/ops_search.cpp index 6401f558..580a4d1b 100644 --- a/externals/grill/vasp/source/ops_search.cpp +++ b/externals/grill/vasp/source/ops_search.cpp @@ -128,15 +128,18 @@ Vasp *VaspOp::m_search(OpParam &p,CVasp &src,const Argument &arg,CVasp *dst,BL s class vasp_search: public vasp_anyop { - FLEXT_HEADER(vasp_search,vasp_anyop) + FLEXT_HEADER_S(vasp_search,vasp_anyop,Setup) public: vasp_search(I argc,t_atom *argv): vasp_anyop(argc,argv,VASP_ARG_R(0),false,XletCode(xlet::tp_float,0)), slope(0),dir(0) + {} + + static V Setup(t_class *c) { - FLEXT_ADDATTR_VAR1("dir",dir); - FLEXT_ADDATTR_VAR1("slope",slope); + FLEXT_CADDATTR_VAR1(c,"dir",dir); + FLEXT_CADDATTR_VAR1(c,"slope",slope); } virtual Vasp *do_work(OpParam &p) = 0; diff --git a/externals/grill/xsample/readme.txt b/externals/grill/xsample/readme.txt index 425b6a7a..a5599f5b 100644 --- a/externals/grill/xsample/readme.txt +++ b/externals/grill/xsample/readme.txt @@ -76,7 +76,7 @@ Version history: - xgroove~, xrecord~: introduced a loop/end bang outlet - added MaxMSP buffer resize recognition - xgroove~: introduced a crossfading loop zone -- adapted source for flext 0.4.1 +- adapted source for flext 0.4.1 - most methods within class scope - introduced attributes 0.2.4: diff --git a/externals/grill/xsample/source/groove.cpp b/externals/grill/xsample/source/groove.cpp index 795eb654..e756f28a 100644 --- a/externals/grill/xsample/source/groove.cpp +++ b/externals/grill/xsample/source/groove.cpp @@ -22,8 +22,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class xgroove: public xinter { -// FLEXT_HEADER_S(xgroove,xinter,setup) - FLEXT_HEADER(xgroove,xinter) + FLEXT_HEADER_S(xgroove,xinter,setup) public: xgroove(I argc,const t_atom *argv); @@ -87,7 +86,7 @@ protected: V mg_pos(F &v) const { v = curpos*s2u; } private: -// static V setup(t_class *c); + static V setup(t_class *c); virtual V s_dsp(); @@ -129,14 +128,24 @@ private: FLEXT_LIB_DSP_V("xgroove~",xgroove) -/* -V xgroove::setup(t_class *) + +V xgroove::setup(t_class *c) { -#ifndef PD - post("loaded xgroove~ - part of xsample objects, version " XSAMPLE_VERSION " - (C) Thomas Grill, 2001-2002"); -#endif + FLEXT_CADDMETHOD_(c,0,"all",m_all); + FLEXT_CADDMETHOD(c,1,m_min); + FLEXT_CADDMETHOD(c,2,m_max); + + FLEXT_CADDATTR_VAR(c,"min",mg_min,m_min); + FLEXT_CADDATTR_VAR(c,"max",mg_max,m_max); + FLEXT_CADDATTR_VAR(c,"pos",mg_pos,m_pos); + + FLEXT_CADDATTR_VAR_E(c,"loop",loopmode,m_loop); + + FLEXT_CADDMETHOD_F(c,0,"xzone",m_xzone); + FLEXT_CADDMETHOD_F(c,0,"xsymm",m_xsymm); + FLEXT_CADDMETHOD_(c,0,"xshape",m_xshape); + FLEXT_CADDMETHOD_B(c,0,"xkeep",m_xkeep); } -*/ xgroove::xgroove(I argc,const t_atom *argv): loopmode(xsl_loop),curpos(0), @@ -175,20 +184,6 @@ xgroove::xgroove(I argc,const t_atom *argv): AddOutFloat(2); // play min & max AddOutBang(); // loop bang - FLEXT_ADDMETHOD_(0,"all",m_all); - FLEXT_ADDMETHOD(1,m_min); - FLEXT_ADDMETHOD(2,m_max); - - FLEXT_ADDATTR_VAR("min",mg_min,m_min); - FLEXT_ADDATTR_VAR("max",mg_max,m_max); - FLEXT_ADDATTR_VAR("pos",mg_pos,m_pos); - - FLEXT_ADDATTR_VAR_E("loop",loopmode,m_loop); - - FLEXT_ADDMETHOD_F(0,"xzone",m_xzone); - FLEXT_ADDMETHOD_F(0,"xsymm",m_xsymm); - FLEXT_ADDMETHOD_(0,"xshape",m_xshape); - FLEXT_ADDMETHOD_B(0,"xkeep",m_xkeep); znbuf = new S *[outchns]; for(I i = 0; i < outchns; ++i) znbuf[i] = new S[0]; diff --git a/externals/grill/xsample/source/main.cpp b/externals/grill/xsample/source/main.cpp index d8182f57..4097ed98 100644 --- a/externals/grill/xsample/source/main.cpp +++ b/externals/grill/xsample/source/main.cpp @@ -36,6 +36,23 @@ FLEXT_LIB_SETUP(xsample,lib_setup) // ------------------------------ +void xsample::setup(t_class *c) +{ + FLEXT_CADDBANG(c,0,m_start); + FLEXT_CADDMETHOD_(c,0,"start",m_start); + FLEXT_CADDMETHOD_(c,0,"stop",m_stop); + + FLEXT_CADDMETHOD_(c,0,"set",m_set); + FLEXT_CADDMETHOD_(c,0,"print",m_print); + FLEXT_CADDMETHOD_(c,0,"refresh",m_refresh); + FLEXT_CADDMETHOD_(c,0,"reset",m_reset); + + FLEXT_CADDATTR_VAR(c,"buffer",mg_buffer,ms_buffer); + FLEXT_CADDATTR_VAR_E(c,"units",unitmode,m_units); + FLEXT_CADDATTR_VAR_E(c,"sclmode",sclmode,m_sclmode); + FLEXT_CADDATTR_GET(c,"scale",s2u); +} + xsample::xsample(): buf(NULL), #if FLEXT_SYS == FLEXT_SYS_MAX @@ -45,21 +62,7 @@ xsample::xsample(): #endif sclmode(xss_unitsinbuf), curmin(0),curmax(1<<30) -{ - FLEXT_ADDBANG(0,m_start); - FLEXT_ADDMETHOD_(0,"start",m_start); - FLEXT_ADDMETHOD_(0,"stop",m_stop); - - FLEXT_ADDMETHOD_(0,"set",m_set); - FLEXT_ADDMETHOD_(0,"print",m_print); - FLEXT_ADDMETHOD_(0,"refresh",m_refresh); - FLEXT_ADDMETHOD_(0,"reset",m_reset); - - FLEXT_ADDATTR_VAR("buffer",mg_buffer,ms_buffer); - FLEXT_ADDATTR_VAR_E("units",unitmode,m_units); - FLEXT_ADDATTR_VAR_E("sclmode",sclmode,m_sclmode); - FLEXT_ADDATTR_GET("scale",s2u); -} +{} xsample::~xsample() { diff --git a/externals/grill/xsample/source/main.h b/externals/grill/xsample/source/main.h index f0c1bff9..dfc8147c 100644 --- a/externals/grill/xsample/source/main.h +++ b/externals/grill/xsample/source/main.h @@ -64,7 +64,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class xsample: public flext_dsp { - FLEXT_HEADER(xsample,flext_dsp) + FLEXT_HEADER_S(xsample,flext_dsp,setup) public: xsample(); @@ -126,6 +126,7 @@ protected: V mg_max(F &v) const { v = curmax*s2u; } private: + static V setup(t_class *c); FLEXT_CALLBACK(m_start) FLEXT_CALLBACK(m_stop) diff --git a/externals/grill/xsample/source/play.cpp b/externals/grill/xsample/source/play.cpp index 3b934ecb..c2e6ef41 100644 --- a/externals/grill/xsample/source/play.cpp +++ b/externals/grill/xsample/source/play.cpp @@ -18,7 +18,6 @@ WARRANTIES, see the file, "license.txt," in this distribution. class xplay: public xinter { -// FLEXT_HEADER_S(xplay,xinter,setup) FLEXT_HEADER(xplay,xinter) public: @@ -34,8 +33,6 @@ public: virtual V m_print(); private: -// static V setup(t_class *c); - virtual V m_signal(I n,S *const *in,S *const *out) { bufchk(); @@ -45,14 +42,6 @@ private: FLEXT_LIB_DSP_V("xplay~",xplay) -/* -V xplay::setup(t_class *) -{ -#ifndef PD - post("loaded xplay~ - part of xsample objects, version " XSAMPLE_VERSION " - (C) Thomas Grill, 2001-2002"); -#endif -} -*/ xplay::xplay(I argc,const t_atom *argv) { diff --git a/externals/grill/xsample/source/record.cpp b/externals/grill/xsample/source/record.cpp index d3ce5cee..318e01d2 100644 --- a/externals/grill/xsample/source/record.cpp +++ b/externals/grill/xsample/source/record.cpp @@ -18,8 +18,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. class xrecord: public xsample { -// FLEXT_HEADER_S(xrecord,xsample,setup) - FLEXT_HEADER(xrecord,xsample) + FLEXT_HEADER_S(xrecord,xsample,setup) public: xrecord(I argc,const t_atom *argv); @@ -67,7 +66,7 @@ protected: V outputmax() { ToOutFloat(outmax,curmax*s2u); } private: -// static V setup(t_class *c); + static V setup(t_class *c); virtual V s_dsp(); @@ -97,14 +96,21 @@ private: FLEXT_LIB_DSP_V("xrecord~",xrecord) -/* -V xrecord::setup(t_class *) + +V xrecord::setup(t_class *c) { -#ifndef PD - post("loaded xrecord~ - part of xsample objects, version " XSAMPLE_VERSION " - (C) Thomas Grill, 2001-2002"); -#endif + FLEXT_CADDMETHOD_F(c,0,"pos",m_pos); + FLEXT_CADDMETHOD_F(c,0,"min",m_min); + FLEXT_CADDMETHOD_F(c,0,"max",m_max); + FLEXT_CADDMETHOD_(c,0,"all",m_all); + + FLEXT_CADDMETHOD_(c,0,"draw",m_draw); + + FLEXT_CADDATTR_VAR1(c,"loop",doloop); + FLEXT_CADDATTR_VAR1(c,"mixmode",mixmode); + FLEXT_CADDATTR_VAR1(c,"sigmode",sigmode); + FLEXT_CADDATTR_VAR(c,"append",appmode,m_append); } -*/ xrecord::xrecord(I argc,const t_atom *argv): dorec(false), @@ -144,19 +150,8 @@ xrecord::xrecord(I argc,const t_atom *argv): AddOutFloat(2); // min & max AddOutBang(); // loop bang - FLEXT_ADDMETHOD_F(0,"pos",m_pos); FLEXT_ADDMETHOD(inchns+1,m_min); FLEXT_ADDMETHOD(inchns+2,m_max); - FLEXT_ADDMETHOD_F(0,"min",m_min); - FLEXT_ADDMETHOD_F(0,"max",m_max); - FLEXT_ADDMETHOD_(0,"all",m_all); - - FLEXT_ADDMETHOD_(0,"draw",m_draw); - - FLEXT_ADDATTR_VAR1("loop",doloop); - FLEXT_ADDATTR_VAR1("mixmode",mixmode); - FLEXT_ADDATTR_VAR1("sigmode",sigmode); - FLEXT_ADDATTR_VAR("append",appmode,m_append); } |