diff options
Diffstat (limited to 'externals/grill')
39 files changed, 1017 insertions, 511 deletions
diff --git a/externals/grill/flext/config-pd-darwin.txt b/externals/grill/flext/config-pd-darwin.txt index a07cf62f..e017030e 100644 --- a/externals/grill/flext/config-pd-darwin.txt +++ b/externals/grill/flext/config-pd-darwin.txt @@ -22,4 +22,5 @@ INSTDIR=/usr/local/pd/flext # additional compiler flags # (check if they fit for your system!) -# UFLAGS=-maltivec
\ No newline at end of file +UFLAGS=-malign-power -maltivec + diff --git a/externals/grill/flext/flext.cw b/externals/grill/flext/flext.cw Binary files differindex 2d1ea660..79e2896c 100644 --- a/externals/grill/flext/flext.cw +++ b/externals/grill/flext/flext.cw diff --git a/externals/grill/flext/readme.txt b/externals/grill/flext/readme.txt index 8cbf4049..2196fb72 100644 --- a/externals/grill/flext/readme.txt +++ b/externals/grill/flext/readme.txt @@ -111,7 +111,7 @@ see flext.h, fldefs.h and flclass.h for the documented base definitions and clas Version history: 0.4.2: -- port for jMax +- started port for jMax - moved CLASS_MAINSIGNALIN to class scope (fixed "float method overwritten" warning) - unix makefiles: CXX should be commented out if standard (to enable environmental settings) - introduced default returns for the different flext::GetA* functions @@ -120,6 +120,7 @@ Version history: - added new POSIX for ThrCond::TimedWait (but still have to find out when to enable it....) - added CopySamples and ZeroSamples - fixed bug for DSP object with zero signal inlets in PD +- added validity check for sample buffers 0.4.1: - full port for Max@OSX diff --git a/externals/grill/flext/source/flbuf.cpp b/externals/grill/flext/source/flbuf.cpp index ebfe2abf..633f0d45 100644 --- a/externals/grill/flext/source/flbuf.cpp +++ b/externals/grill/flext/source/flbuf.cpp @@ -119,6 +119,24 @@ int flext::buffer::Set(const t_symbol *s,bool nameonly) return ret; } +bool flext::buffer::Valid() const +{ + if(sym) { +#if FLEXT_SYS == FLEXT_SYS_PD + int frames1; + t_sample *data1; + return garray_getfloatarray(arr, &frames1, &data1) != 0; +#elif FLEXT_SYS == FLEXT_SYS_MAX + const _buffer *p = (const _buffer *)sym->s_thing; + return p && p->b_valid; +#else +#error +#endif + } + else return false; +} + + bool flext::buffer::Update() { if(!Ok()) return false; @@ -172,7 +190,7 @@ void flext::buffer::Frames(int fr,bool keep) // copy buffer data to tmp storage tmp = new t_sample[sz]; if(tmp) - BlockMoveData(data,tmp,sizeof(t_sample)*sz); + CopySamples(data,tmp,sz); else error("flext::buffer - not enough memory for keeping buffer~ contents"); } @@ -190,7 +208,7 @@ void flext::buffer::Frames(int fr,bool keep) if(tmp) { // copy data back - BlockMoveData(tmp,data,sizeof(t_sample)*sz); + CopySamples(tmp,data,sz); delete[] tmp; } #else diff --git a/externals/grill/flext/source/fllib.cpp b/externals/grill/flext/source/fllib.cpp index 998cbae3..f061c2cb 100755 --- a/externals/grill/flext/source/fllib.cpp +++ b/externals/grill/flext/source/fllib.cpp @@ -19,7 +19,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define ALIASDEL ',' #define ALIASSLASHES ":/\\" -#if FLEXT_OS == FLEXT_OS_MACOS +#if FLEXT_OS == FLEXT_OS_MAC #define ALIASSLASH ':' #elif FLEXT_OS == FLEXT_OS_WIN #if FLEXT_SYS == FLEXT_SYS_PD diff --git a/externals/grill/flext/source/flprefix.h b/externals/grill/flext/source/flprefix.h index ad1d1edb..dce223e7 100755 --- a/externals/grill/flext/source/flprefix.h +++ b/externals/grill/flext/source/flprefix.h @@ -48,14 +48,15 @@ WARRANTIES, see the file, "license.txt," in this distribution. // --- definitions for FLEXT_OS ---------------------- #define FLEXT_OS_UNKNOWN 0 #define FLEXT_OS_WIN 1 -#define FLEXT_OS_MACOS 2 +#define FLEXT_OS_MAC 2 #define FLEXT_OS_LINUX 3 #define FLEXT_OS_IRIX 4 // --- definitions for FLEXT_OS_API --------------------- #define FLEXT_OSAPI_UNKNOWN 0 -#define FLEXT_OSAPI_MAC_CARBON 1 -#define FLEXT_OSAPI_MAC_OSX 2 +#define FLEXT_OSAPI_MAC_CLASSIC 1 +#define FLEXT_OSAPI_MAC_CARBON 2 +#define FLEXT_OSAPI_MAC_OSX 3 // --- definitions for FLEXT_CPU --------------------- #define FLEXT_CPU_UNKNOWN 0 @@ -160,7 +161,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #ifndef FLEXT_OS #if TARGET_OS_MAC - #define FLEXT_OS FLEXT_OS_MACOS + #define FLEXT_OS FLEXT_OS_MAC #elif TARGET_OS_WIN32 // assume Windows #define FLEXT_OS FLEXT_OS_WIN @@ -205,14 +206,14 @@ WARRANTIES, see the file, "license.txt," in this distribution. #elif defined(__CYGWIN__) || defined(__CYGWIN32__) #define FLEXT_OS FLEXT_OS_WIN #elif defined(__APPLE__) && defined(__MACH__) - #define FLEXT_OS FLEXT_OS_MACOS + #define FLEXT_OS FLEXT_OS_MAC // how about IRIX?? #else #define FLEXT_OS FLEXT_OS_UNKNOWN #endif #endif - #if FLEXT_OS == FLEXT_OS_MACOS + #if FLEXT_OS == FLEXT_OS_MAC #define FLEXT_OSAPI FLEXT_OSAPI_MAC_OSX #else #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN @@ -234,7 +235,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #ifndef FLEXT_OS #if defined(macintosh) - #define FLEXT_OS FLEXT_OS_MACOS + #define FLEXT_OS FLEXT_OS_MAC #else #define FLEXT_OS FLEXT_OS_UNKNOWN #endif @@ -269,7 +270,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #else #error "Flext SYS/OS combination unknown" #endif -#elif FLEXT_OS == FLEXT_OS_MACOS +#elif FLEXT_OS == FLEXT_OS_MAC // #pragma message("Compiling for MacOS") #if FLEXT_SYS == FLEXT_SYS_PD @@ -288,7 +289,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. // set threading model #ifdef FLEXT_THREADS #undef FLEXT_THREADS - #if FLEXT_OS == FLEXT_OS_MACOS && FLEXT_SYS == FLEXT_SYS_MAX + #if FLEXT_OS == FLEXT_OS_MAC && FLEXT_SYS == FLEXT_SYS_MAX // Max crashes with posix threads (but don't know why...) #define FLEXT_THREADS FLEXT_THR_MP #else diff --git a/externals/grill/flext/source/flstdc.h b/externals/grill/flext/source/flstdc.h index e36ec4e4..873f4243 100644 --- a/externals/grill/flext/source/flstdc.h +++ b/externals/grill/flext/source/flstdc.h @@ -71,7 +71,7 @@ typedef t_clock t_qelem; // Include the relevant Max/MSP header files -#if FLEXT_OS == FLEXT_OS_MACOS +#if FLEXT_OS == FLEXT_OS_MAC #ifndef __MRC__ #define powerc #endif diff --git a/externals/grill/flext/source/flsupport.cpp b/externals/grill/flext/source/flsupport.cpp index 3c6ab8f3..f3309ab0 100644 --- a/externals/grill/flext/source/flsupport.cpp +++ b/externals/grill/flext/source/flsupport.cpp @@ -128,13 +128,22 @@ void flext::GetAString(const t_atom &a,char *buf,int szbuf) #endif } +unsigned long flext::AtomHash(const t_atom &a) +{ +#if FLEXT_SYS == FLEXT_SYS_MAX || FLEXT_SYS == FLEXT_SYS_PD + return ((unsigned long)a.a_type<<28)^*(unsigned long *)&a.a_w; +#else +#error Not implemented +#endif +} + unsigned int flext::FoldBits(unsigned long h,int bits) { if(!bits) return 0; const int hmax = (1<<bits)-1; unsigned int ret = 0; for(unsigned int i = 0; i < sizeof(h)*8; i += bits) - ret = ret^((h>>i)&hmax); + ret ^= (h>>i)&hmax; return ret; } diff --git a/externals/grill/flext/source/flsupport.h b/externals/grill/flext/source/flsupport.h index 66f16dac..497351d2 100644 --- a/externals/grill/flext/source/flsupport.h +++ b/externals/grill/flext/source/flsupport.h @@ -95,6 +95,10 @@ public: */ bool Ok() const { return sym != NULL && data != NULL; } + /*! \brief Check if buffer is valid + */ + bool Valid() const; + /*! \brief Check and update if the buffer has been changed (e.g. resized) */ bool Update(); @@ -167,17 +171,21 @@ public: static t_atom *CopyList(int argc,const t_atom *argv); //! Copy a memory region static void CopyMem(void *dst,const void *src,int bytes); - static void CopySamples(t_sample *dst,const t_sample *src,int cnt) { CopyMem(dst,src,cnt*sizeof(t_sample)); } - //! Zero a memory region + static void CopySamples(t_sample *dst,const t_sample *src,int cnt); + //! Set a memory region static void ZeroMem(void *dst,int bytes); - static void ZeroSamples(t_sample *dst,int cnt) { ZeroMem(dst,cnt*sizeof(t_sample)); } + static void SetSamples(t_sample *dst,int cnt,t_sample s); + static void ZeroSamples(t_sample *dst,int cnt) { SetSamples(dst,cnt,0); } //! Sleep for an amount of time static void Sleep(double s); + //! Get a 32 bit hash value frm an atom + static unsigned long AtomHash(const t_atom &a); + /*! \brief Fold value to a number of bits - \remark Good for hash generation + \remark Good for hash tables */ static unsigned int FoldBits(unsigned long h,int bits); diff --git a/externals/grill/flext/source/flutil.cpp b/externals/grill/flext/source/flutil.cpp index 1b1d929a..9be38cf1 100644 --- a/externals/grill/flext/source/flutil.cpp +++ b/externals/grill/flext/source/flutil.cpp @@ -17,9 +17,9 @@ WARRANTIES, see the file, "license.txt," in this distribution. #if FLEXT_OS == FLEXT_OS_WIN #include <windows.h> -#elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || defined(__GNUC__) +#elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_OSX #include <unistd.h> -#elif FLEXT_OS == FLEXT_OS_MACOS +#elif FLEXT_OS == FLEXT_OS_MAC #include <Timer.h> #include <Threads.h> #endif @@ -34,13 +34,41 @@ void flext::ZeroMem(void *dst,int bytes) memset(dst,0,bytes); } +void flext::CopySamples(t_sample *dst,const t_sample *src,int cnt) +{ + int n = cnt>>3; + cnt -= n<<3; + while(n--) { + dst[0] = src[0]; dst[1] = src[1]; + dst[2] = src[2]; dst[3] = src[3]; + dst[4] = src[4]; dst[5] = src[5]; + dst[6] = src[6]; dst[7] = src[7]; + src += 8,dst += 8; + } + + while(cnt--) *(dst++) = *(src++); +} + +void flext::SetSamples(t_sample *dst,int cnt,t_sample s) +{ + int n = cnt>>3; + cnt -= n<<3; + while(n--) { + dst[0] = dst[1] = dst[2] = dst[3] = dst[4] = dst[5] = dst[6] = dst[7] = s; + dst += 8; + } + + while(cnt--) *(dst++) = s; +} + + void flext::Sleep(double s) { #if FLEXT_OS == FLEXT_OS_WIN ::Sleep((long)(s*1000.)); -#elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || defined(__GNUC__) +#elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_OSX usleep((long)(s*1000000.)); -#elif FLEXT_OS == FLEXT_OS_MACOS +#elif FLEXT_OS == FLEXT_OS_MAC // that's just for OS9! UnsignedWide tick; Microseconds(&tick); diff --git a/externals/grill/flext/tutorial/sndobj1/sndobj1.dsp b/externals/grill/flext/tutorial/sndobj1/sndobj1.dsp index 0be35837..36ce74e6 100644 --- a/externals/grill/flext/tutorial/sndobj1/sndobj1.dsp +++ b/externals/grill/flext/tutorial/sndobj1/sndobj1.dsp @@ -43,7 +43,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /c -# ADD CPP /nologo /W3 /O2 /I "..\..\source" /I "f:\prog\packs\sndobj\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PD" /YX /FD /c +# ADD CPP /nologo /W3 /O2 /I "..\..\source" /I "f:\prog\audio\sndobj\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PD" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc07 /d "NDEBUG" @@ -53,7 +53,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib pd.lib flext-pdwin.lib sndobj.lib /nologo /dll /machine:I386 /out:"../pd-msvc/sndobj1~.dll" /libpath:"..\..\pd-msvc" /libpath:"f:\prog\packs\sndobj\lib" +# ADD LINK32 kernel32.lib user32.lib pd.lib flext-pdwin.lib sndobj.lib /nologo /dll /machine:I386 /out:"../pd-msvc/sndobj1~.dll" /libpath:"..\..\pd-msvc" /libpath:"f:\prog\audio\sndobj\lib" !ELSEIF "$(CFG)" == "sndobj1 - Win32 Debug" @@ -69,7 +69,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /ZI /Od /I "..\..\source" /I "f:\prog\packs\sndobj\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PD" /Fr /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /ZI /Od /I "..\..\source" /I "f:\prog\audio\sndobj\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PD" /Fr /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc07 /d "_DEBUG" @@ -79,7 +79,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib pd.lib flext_d-pdwin.lib sndobj.lib /nologo /dll /debug /machine:I386 /out:"msvc-debug/sndobj1~.dll" /pdbtype:sept /libpath:"..\..\pd-msvc" /libpath:"f:\prog\packs\sndobj\lib" +# ADD LINK32 kernel32.lib user32.lib pd.lib flext_d-pdwin.lib sndobj.lib /nologo /dll /debug /machine:I386 /out:"msvc-debug/sndobj1~.dll" /pdbtype:sept /libpath:"..\..\pd-msvc" /libpath:"f:\prog\audio\sndobj\lib" !ENDIF diff --git a/externals/grill/pool/data.cpp b/externals/grill/pool/data.cpp index 4984129b..8d5d41c4 100644 --- a/externals/grill/pool/data.cpp +++ b/externals/grill/pool/data.cpp @@ -16,9 +16,9 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include <stdlib.h> -pooldata::pooldata(const S *s): +pooldata::pooldata(const S *s,I vcnt,I dcnt): sym(s),nxt(NULL),refs(0), - root(nullatom,NULL) + root(nullatom,NULL,vcnt,dcnt) { LOG1("new pool %s",sym?flext_base::GetString(sym):"<private>"); } @@ -28,17 +28,18 @@ pooldata::~pooldata() LOG1("free pool %s",sym?flext_base::GetString(sym):"<private>"); } + const A pooldata::nullatom = { A_NULL }; V pooldata::Reset() { - root.Clear(true); + root.Reset(); } -BL pooldata::MkDir(const AtomList &d) +BL pooldata::MkDir(const AtomList &d,I vcnt,I dcnt) { - root.AddDir(d); + root.AddDir(d,vcnt,dcnt); return true; } @@ -117,6 +118,12 @@ I pooldata::GetAll(const AtomList &d,A *&keys,AtomList *&lst) } } +I pooldata::CntSub(const AtomList &d) +{ + pooldir *pd = root.GetDir(d); + return pd?pd->CntSub():0; +} + I pooldata::GetSub(const AtomList &d,const t_atom **&dirs) { pooldir *pd = root.GetDir(d); @@ -144,7 +151,7 @@ pooldir *pooldata::Copy(const AtomList &d,const A &key,BL cut) if(pd) { AtomList *val = pd->GetVal(key,cut); if(val) { - pooldir *ret = new pooldir(nullatom,NULL); + pooldir *ret = new pooldir(nullatom,NULL,pd->VSize(),pd->DSize()); ret->SetVal(key,val); return ret; } @@ -159,7 +166,8 @@ pooldir *pooldata::CopyAll(const AtomList &d,I depth,BL cut) { pooldir *pd = root.GetDir(d); if(pd) { - pooldir *ret = new pooldir(nullatom,NULL); + // What sizes should we choose here? + pooldir *ret = new pooldir(nullatom,NULL,pd->VSize(),pd->DSize()); if(pd->Copy(ret,depth,cut)) return ret; else { @@ -220,4 +228,59 @@ BL pooldata::SvDir(const AtomList &d,const C *flnm,I depth,BL absdir) return false; } +BL pooldata::LdDirXML(const AtomList &d,const C *flnm,I depth,BL mkdir) +{ + pooldir *pd = root.GetDir(d); + if(pd) { + C tmp[1024]; + const C *t = CnvFlnm(tmp,flnm,sizeof tmp); + if(t) { + ifstream fl(t); + BL ret = fl.good() != 0; + if(ret) { + fl.getline(tmp,sizeof tmp); + ret = !strncmp(tmp,"<?xml",5); + } + if(ret) { + fl.getline(tmp,sizeof tmp); + // DOCTYPE need not be present / only external DOCTYPE is allowed! + if(!strncmp(tmp,"<!DOCTYPE",9)) + fl.getline(tmp,sizeof tmp); + ret = !strncmp(tmp,"<pool>",6); + } + if(ret) + ret = pd->LdDirXML(fl,depth,mkdir); + return ret; + } + else return false; + } + else + return false; +} + +BL pooldata::SvDirXML(const AtomList &d,const C *flnm,I depth,BL absdir) +{ + pooldir *pd = root.GetDir(d); + if(pd) { + C tmp[1024]; + const C *t = CnvFlnm(tmp,flnm,sizeof tmp); + if(t) { + ofstream fl(t); + AtomList tmp; + if(absdir) tmp = d; + if(fl.good()) { + fl << "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" << endl; + fl << "<!DOCTYPE pool SYSTEM \"pool.dtd\">" << endl; + fl << "<pool>" << endl; + BL ret = pd->SvDirXML(fl,depth,tmp); + fl << "</pool>" << endl; + return ret; + } + } + else return false; + } + else + return false; +} + diff --git a/externals/grill/pool/main.cpp b/externals/grill/pool/main.cpp index cf513d87..4397a55b 100644 --- a/externals/grill/pool/main.cpp +++ b/externals/grill/pool/main.cpp @@ -10,7 +10,10 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include "pool.h" -#define POOL_VERSION "0.1.1pre" +#define POOL_VERSION "0.2.0pre" + +#define VCNT 64 +#define DCNT 16 class pool: public flext_base @@ -22,6 +25,8 @@ public: ~pool(); static V setup(t_classid); + + virtual BL Init(); pooldata *Pool() { return pl; } @@ -58,6 +63,9 @@ protected: V m_getall(); // only values V m_getrec(I argc,const A *argv); // also subdirectories V m_getsub(I argc,const A *argv); // only subdirectories + V m_ogetall(); // only values (ordered) + V m_ogetrec(I argc,const A *argv); // also subdirectories (ordered) + V m_ogetsub(I argc,const A *argv); // only subdirectories (ordered) V m_cntall(); // only values V m_cntrec(I argc,const A *argv); // also subdirectories V m_cntsub(I argc,const A *argv); // only subdirectories @@ -74,16 +82,22 @@ protected: V m_copyrec(I argc,const A *argv) { copyrec(MakeSymbol("copyrec"),argc,argv,false); } // cut directory (and subdirs) into clipboard // load/save from/to file - V m_load(I argc,const A *argv); - V m_save(I argc,const A *argv); + V m_load(I argc,const A *argv) { load(argc,argv,false); } + V m_save(I argc,const A *argv) { save(argc,argv,false); } + V m_loadx(I argc,const A *argv) { load(argc,argv,true); } // XML + V m_savex(I argc,const A *argv) { save(argc,argv,true); } // XML // load directories - V m_lddir(I argc,const A *argv); // load values into current dir - V m_ldrec(I argc,const A *argv); // load values recursively + V m_lddir(I argc,const A *argv) { lddir(argc,argv,false); } // load values into current dir + V m_ldrec(I argc,const A *argv) { ldrec(argc,argv,false); } // load values recursively + V m_ldxdir(I argc,const A *argv) { lddir(argc,argv,true); } // load values into current dir (XML) + V m_ldxrec(I argc,const A *argv) { ldrec(argc,argv,true); } // load values recursively (XML) // save directories - V m_svdir(I argc,const A *argv); // save values in current dir - V m_svrec(I argc,const A *argv); // save values recursively + V m_svdir(I argc,const A *argv) { svdir(argc,argv,false); } // save values in current dir + V m_svrec(I argc,const A *argv) { svrec(argc,argv,false); } // save values recursively + V m_svxdir(I argc,const A *argv) { svdir(argc,argv,true); } // save values in current dir (XML) + V m_svxrec(I argc,const A *argv) { svrec(argc,argv,true); } // save values recursively (XML) private: static BL KeyChk(const A &a); @@ -93,20 +107,29 @@ private: V set(const S *tag,I argc,const A *argv,BL over); V getdir(const S *tag); - I getrec(const S *tag,I level,BL cntonly = false,const AtomList &rdir = AtomList()); - I getsub(const S *tag,I level,BL cntonly = false,const AtomList &rdir = AtomList()); + I getrec(const S *tag,I level,BL order,BL cntonly = false,const AtomList &rdir = AtomList()); + I getsub(const S *tag,I level,BL order,BL cntonly = false,const AtomList &rdir = AtomList()); V paste(const S *tag,I argc,const A *argv,BL repl); V copy(const S *tag,I argc,const A *argv,BL cut); V copyall(const S *tag,BL cut,I lvls); V copyrec(const S *tag,I argc,const A *argv,BL cut); + V load(I argc,const A *argv,BL xml); + V save(I argc,const A *argv,BL xml); + V lddir(I argc,const A *argv,BL xml); // load values into current dir + V ldrec(I argc,const A *argv,BL xml); // load values recursively + V svdir(I argc,const A *argv,BL xml); // save values in current dir + V svrec(I argc,const A *argv,BL xml); // save values recursively + V echodir() { if(echo) getdir(MakeSymbol("echo")); } BL priv,absdir,echo; + I vcnt,dcnt; pooldata *pl; AtomList curdir; pooldir *clip; + const S *holdname; static pooldata *head,*tail; @@ -121,6 +144,8 @@ private: FLEXT_ATTRVAR_B(echo) FLEXT_ATTRGET_B(priv) // FLEXT_ATTRGET_B(curdir) + FLEXT_ATTRVAR_I(vcnt) + FLEXT_ATTRVAR_I(dcnt) FLEXT_CALLBACK(m_reset) @@ -144,6 +169,9 @@ private: FLEXT_CALLBACK(m_getall) FLEXT_CALLBACK_V(m_getrec) FLEXT_CALLBACK_V(m_getsub) + FLEXT_CALLBACK(m_ogetall) + FLEXT_CALLBACK_V(m_ogetrec) + FLEXT_CALLBACK_V(m_ogetsub) FLEXT_CALLBACK(m_cntall) FLEXT_CALLBACK_V(m_cntrec) FLEXT_CALLBACK_V(m_cntsub) @@ -164,6 +192,12 @@ private: FLEXT_CALLBACK_V(m_ldrec) FLEXT_CALLBACK_V(m_svdir) FLEXT_CALLBACK_V(m_svrec) + FLEXT_CALLBACK_V(m_loadx) + FLEXT_CALLBACK_V(m_savex) + FLEXT_CALLBACK_V(m_ldxdir) + FLEXT_CALLBACK_V(m_ldxrec) + FLEXT_CALLBACK_V(m_svxdir) + FLEXT_CALLBACK_V(m_svxrec) }; FLEXT_NEW_V("pool",pool); @@ -175,7 +209,7 @@ pooldata *pool::head,*pool::tail; V pool::setup(t_classid c) { post(""); - post("pool %s - hierarchical storage object, (C)2002 Thomas Grill",POOL_VERSION); + post("pool %s - hierarchical storage object,(C)2002-2003 Thomas Grill",POOL_VERSION); post(""); head = tail = NULL; @@ -184,6 +218,8 @@ V pool::setup(t_classid c) FLEXT_CADDATTR_VAR1(c,"absdir",absdir); FLEXT_CADDATTR_VAR1(c,"echodir",echo); FLEXT_CADDATTR_GET(c,"private",priv); + FLEXT_CADDATTR_VAR1(c,"valcnt",vcnt); + FLEXT_CADDATTR_VAR1(c,"dircnt",dcnt); FLEXT_CADDMETHOD_(c,0,"reset",m_reset); FLEXT_CADDMETHOD_(c,0,"set",m_set); @@ -207,6 +243,9 @@ V pool::setup(t_classid c) 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,"ogetall",m_ogetall); + FLEXT_CADDMETHOD_(c,0,"ogetrec",m_ogetrec); + FLEXT_CADDMETHOD_(c,0,"ogetsub",m_ogetsub); FLEXT_CADDMETHOD_(c,0,"cntall",m_cntall); FLEXT_CADDMETHOD_(c,0,"cntrec",m_cntrec); FLEXT_CADDMETHOD_(c,0,"cntsub",m_cntsub); @@ -227,13 +266,20 @@ V pool::setup(t_classid c) FLEXT_CADDMETHOD_(c,0,"ldrec",m_ldrec); FLEXT_CADDMETHOD_(c,0,"svdir",m_svdir); FLEXT_CADDMETHOD_(c,0,"svrec",m_svrec); + FLEXT_CADDMETHOD_(c,0,"loadx",m_loadx); + FLEXT_CADDMETHOD_(c,0,"savex",m_savex); + FLEXT_CADDMETHOD_(c,0,"ldxdir",m_ldxdir); + FLEXT_CADDMETHOD_(c,0,"ldxrec",m_ldxrec); + FLEXT_CADDMETHOD_(c,0,"svxdir",m_svxdir); + FLEXT_CADDMETHOD_(c,0,"svxrec",m_svxrec); } pool::pool(I argc,const A *argv): absdir(true),echo(false),pl(NULL), - clip(NULL) + clip(NULL), + vcnt(VCNT),dcnt(DCNT) { - SetPool(argc >= 1 && IsSymbol(argv[0])?GetSymbol(argv[0]):NULL); + holdname = argc >= 1 && IsSymbol(argv[0])?GetSymbol(argv[0]):NULL; AddInAnything(); AddOutList(); @@ -247,6 +293,15 @@ pool::~pool() FreePool(); } +BL pool::Init() +{ + if(flext_base::Init()) { + SetPool(holdname); + return true; + } + else return false; +} + V pool::SetPool(const S *s) { if(pl) FreePool(); @@ -257,7 +312,7 @@ V pool::SetPool(const S *s) } else { priv = true; - pl = new pooldata; + pl = new pooldata(NULL,vcnt,dcnt); } } @@ -316,7 +371,7 @@ V pool::m_mkdir(I argc,const A *argv,BL abs) AtomList ndir; if(abs) ndir(argc,argv); else (ndir = curdir).Append(argc,argv); - if(!pl->MkDir(ndir)) { + if(!pl->MkDir(ndir,vcnt,dcnt)) { post("%s - mkdir: directory couldn't be created",thisName()); } } @@ -491,7 +546,7 @@ V pool::m_geti(I ix) echodir(); } -I pool::getrec(const S *tag,I level,BL cntonly,const AtomList &rdir) +I pool::getrec(const S *tag,I level,BL order,BL cntonly,const AtomList &rdir) { AtomList gldir(curdir); gldir.Append(rdir); @@ -527,7 +582,7 @@ I pool::getrec(const S *tag,I level,BL cntonly,const AtomList &rdir) else { I lv = level > 0?level-1:-1; for(I i = 0; i < cnt; ++i) { - ret += getrec(tag,lv,cntonly,AtomList(rdir).Append(*r[i])); + ret += getrec(tag,lv,order,cntonly,AtomList(rdir).Append(*r[i])); } delete[] r; } @@ -538,7 +593,15 @@ I pool::getrec(const S *tag,I level,BL cntonly,const AtomList &rdir) V pool::m_getall() { - getrec(MakeSymbol("getall"),0); + getrec(MakeSymbol("getall"),0,false); + ToOutBang(3); + + echodir(); +} + +V pool::m_ogetall() +{ + getrec(MakeSymbol("ogetall"),0,true); ToOutBang(3); echodir(); @@ -556,21 +619,41 @@ V pool::m_getrec(I argc,const A *argv) else post("%s - getrec: invalid level specification - set to infinite",thisName()); } - getrec(MakeSymbol("getrec"),lvls); + getrec(MakeSymbol("getrec"),lvls,false); + ToOutBang(3); + + echodir(); +} + + +V pool::m_ogetrec(I argc,const A *argv) +{ + I lvls = -1; + if(argc > 0) { + if(CanbeInt(argv[0])) { + if(argc > 1) + post("%s - ogetrec: superfluous arguments ignored",thisName()); + lvls = GetAInt(argv[0]); + } + else + post("%s - ogetrec: invalid level specification - set to infinite",thisName()); + } + getrec(MakeSymbol("ogetrec"),lvls,true); ToOutBang(3); echodir(); } -I pool::getsub(const S *tag,I level,BL cntonly,const AtomList &rdir) +I pool::getsub(const S *tag,I level,BL order,BL cntonly,const AtomList &rdir) { AtomList gldir(curdir); gldir.Append(rdir); I ret = 0; - const A **r; + const A **r = NULL; + // CntSub is not used here because it doesn't allow checking for valid directory I cnt = pl->GetSub(gldir,r); if(!r) post("%s - %s: error retrieving directories",thisName(),GetString(tag)); @@ -588,7 +671,7 @@ I pool::getsub(const S *tag,I level,BL cntonly,const AtomList &rdir) } if(level != 0) - ret += getsub(tag,lv,cntonly,AtomList(rdir).Append(*r[i])); + ret += getsub(tag,lv,order,cntonly,AtomList(rdir).Append(*r[i])); } delete[] r; } @@ -609,7 +692,27 @@ V pool::m_getsub(I argc,const A *argv) post("%s - getsub: invalid level specification - set to 0",thisName()); } - getsub(MakeSymbol("getsub"),lvls); + getsub(MakeSymbol("getsub"),lvls,false); + ToOutBang(3); + + echodir(); +} + + +V pool::m_ogetsub(I argc,const A *argv) +{ + I lvls = 0; + if(argc > 0) { + if(CanbeInt(argv[0])) { + if(argc > 1) + post("%s - ogetsub: superfluous arguments ignored",thisName()); + lvls = GetAInt(argv[0]); + } + else + post("%s - ogetsub: invalid level specification - set to 0",thisName()); + } + + getsub(MakeSymbol("ogetsub"),lvls,true); ToOutBang(3); echodir(); @@ -619,7 +722,7 @@ V pool::m_getsub(I argc,const A *argv) V pool::m_cntall() { const S *tag = MakeSymbol("cntall"); - I cnt = getrec(tag,0,true); + I cnt = getrec(tag,0,false,true); ToOutSymbol(3,tag); ToOutBang(2); ToOutBang(1); @@ -643,7 +746,7 @@ V pool::m_cntrec(I argc,const A *argv) post("%s - %s: invalid level specification - set to infinite",thisName(),GetString(tag)); } - I cnt = getrec(tag,lvls,true); + I cnt = getrec(tag,lvls,false,true); ToOutSymbol(3,tag); ToOutBang(2); ToOutBang(1); @@ -668,7 +771,7 @@ V pool::m_cntsub(I argc,const A *argv) post("%s - %s: invalid level specification - set to 0",thisName(),GetString(tag)); } - I cnt = getsub(tag,lvls,true); + I cnt = getsub(tag,lvls,false,true); ToOutSymbol(3,tag); ToOutBang(2); ToOutBang(1); @@ -760,58 +863,60 @@ V pool::copyrec(const S *tag,I argc,const A *argv,BL cut) copyall(tag,cut,lvls); } -V pool::m_load(I argc,const A *argv) +V pool::load(I argc,const A *argv,BL xml) { + const C *sym = xml?"loadx":"load"; const C *flnm = NULL; if(argc > 0) { - if(argc > 1) post("%s - load: superfluous arguments ignored",thisName()); + if(argc > 1) post("%s - %s: superfluous arguments ignored",thisName(),sym); if(IsString(argv[0])) flnm = GetString(argv[0]); } if(!flnm) - post("%s - load: no filename given",thisName()); - else if(!pl->Load(flnm)) - post("%s - load: error loading data",thisName()); + post("%s - %s: no filename given",thisName(),sym); + else if(!(xml?pl->LoadXML(flnm):pl->Load(flnm))) + post("%s - %s: error loading data",thisName(),sym); echodir(); } -V pool::m_save(I argc,const A *argv) +V pool::save(I argc,const A *argv,BL xml) { + const C *sym = xml?"savex":"save"; const C *flnm = NULL; if(argc > 0) { - if(argc > 1) post("%s - save: superfluous arguments ignored",thisName()); + if(argc > 1) post("%s - %s: superfluous arguments ignored",thisName(),sym); if(IsString(argv[0])) flnm = GetString(argv[0]); } if(!flnm) - post("%s - save: no filename given",thisName()); - else if(!pl->Save(flnm)) - post("%s - save: error saving data",thisName()); + post("%s - %s: no filename given",thisName(),sym); + else if(!(xml?pl->SaveXML(flnm):pl->Save(flnm))) + post("%s - %s: error saving data",thisName(),sym); echodir(); } -V pool::m_lddir(I argc,const A *argv) +V pool::lddir(I argc,const A *argv,BL xml) { + const C *sym = xml?"ldxdir":"lddir"; const C *flnm = NULL; if(argc > 0) { - if(argc > 1) post("%s - lddir: superfluous arguments ignored",thisName()); + if(argc > 1) post("%s - %s: superfluous arguments ignored",thisName(),sym); if(IsString(argv[0])) flnm = GetString(argv[0]); } if(!flnm) - post("%s - lddir: invalid filename",thisName()); - else { - if(!pl->LdDir(curdir,flnm,0)) - post("%s - lddir: directory couldn't be loaded",thisName()); - } + post("%s - %s: invalid filename",thisName(),sym); + else if(!(xml?pl->LdDirXML(curdir,flnm,0):pl->LdDir(curdir,flnm,0))) + post("%s - %s: directory couldn't be loaded",thisName(),sym); echodir(); } -V pool::m_ldrec(I argc,const A *argv) +V pool::ldrec(I argc,const A *argv,BL xml) { + const C *sym = xml?"ldxrec":"ldrec"; const C *flnm = NULL; I depth = -1; BL mkdir = true; @@ -821,59 +926,61 @@ V pool::m_ldrec(I argc,const A *argv) if(argc >= 2) { if(CanbeInt(argv[1])) depth = GetAInt(argv[1]); else - post("%s - ldrec: invalid depth argument - set to -1",thisName()); + post("%s - %s: invalid depth argument - set to -1",thisName(),sym); if(argc >= 3) { if(CanbeBool(argv[2])) mkdir = GetABool(argv[2]); else - post("%s - ldrec: invalid mkdir argument - set to true",thisName()); + post("%s - %s: invalid mkdir argument - set to true",thisName(),sym); - if(argc > 3) post("%s - ldrec: superfluous arguments ignored",thisName()); + if(argc > 3) post("%s - %s: superfluous arguments ignored",thisName(),sym); } } } if(!flnm) - post("%s - ldrec: invalid filename",thisName()); + post("%s - %s: invalid filename",thisName(),sym); else { - if(!pl->LdDir(curdir,flnm,depth,mkdir)) - post("%s - ldrec: directory couldn't be saved",thisName()); + if(!(xml?pl->LdDirXML(curdir,flnm,depth,mkdir):pl->LdDir(curdir,flnm,depth,mkdir))) + post("%s - %s: directory couldn't be saved",thisName(),sym); } echodir(); } -V pool::m_svdir(I argc,const A *argv) +V pool::svdir(I argc,const A *argv,BL xml) { + const C *sym = xml?"svxdir":"svdir"; const C *flnm = NULL; if(argc > 0) { - if(argc > 1) post("%s - svdir: superfluous arguments ignored",thisName()); + if(argc > 1) post("%s - %s: superfluous arguments ignored",thisName(),sym); if(IsString(argv[0])) flnm = GetString(argv[0]); } if(!flnm) - post("%s - svdir: invalid filename",thisName()); + post("%s - %s: invalid filename",thisName(),sym); else { - if(!pl->SvDir(curdir,flnm,0,absdir)) - post("%s - svdir: directory couldn't be saved",thisName()); + if(!(xml?pl->SvDirXML(curdir,flnm,0,absdir):pl->SvDir(curdir,flnm,0,absdir))) + post("%s - %s: directory couldn't be saved",thisName(),sym); } echodir(); } -V pool::m_svrec(I argc,const A *argv) +V pool::svrec(I argc,const A *argv,BL xml) { + const C *sym = xml?"svxrec":"svrec"; const C *flnm = NULL; if(argc > 0) { - if(argc > 1) post("%s - svrec: superfluous arguments ignored",thisName()); + if(argc > 1) post("%s - %s: superfluous arguments ignored",thisName(),sym); if(IsString(argv[0])) flnm = GetString(argv[0]); } if(!flnm) - post("%s - svrec: invalid filename",thisName()); + post("%s - %s: invalid filename",thisName(),sym); else { - if(!pl->SvDir(curdir,flnm,-1,absdir)) - post("%s - svrec: directory couldn't be saved",thisName()); + if(!(xml?pl->SvDirXML(curdir,flnm,-1,absdir):pl->SvDir(curdir,flnm,-1,absdir))) + post("%s - %s: directory couldn't be saved",thisName(),sym); } echodir(); diff --git a/externals/grill/pool/pool.cpp b/externals/grill/pool/pool.cpp index 886debc6..5eb48294 100644 --- a/externals/grill/pool/pool.cpp +++ b/externals/grill/pool/pool.cpp @@ -15,6 +15,8 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include <ctype.h> #include <stdlib.h> +#define VBITS 6 +#define DBITS 5 inline I compare(I a,I b) { return a == b?0:(a < b?-1:1); } inline I compare(F a,F b) { return a == b?0:(a < b?-1:1); } @@ -78,41 +80,67 @@ poolval *poolval::Dup() const } -pooldir::pooldir(const A &d,pooldir *p): - parent(p),dirs(NULL),vals(NULL),nxt(NULL) +pooldir::pooldir(const A &d,pooldir *p,I vcnt,I dcnt): + parent(p),nxt(NULL),vals(NULL),dirs(NULL), + vbits(vcnt?Int2Bits(vcnt):VBITS),dbits(dcnt?Int2Bits(dcnt):DBITS), + vsize(1<<vbits),dsize(1<<dbits) { + Reset(); CopyAtom(&dir,&d); } pooldir::~pooldir() { - Clear(true); + Reset(false); + if(nxt) delete nxt; } V pooldir::Clear(BL rec,BL dironly) { - if(rec && dirs) { delete dirs; dirs = NULL; } - if(!dironly && vals) { delete vals; vals = NULL; } + if(rec && dirs) { + for(I i = 0; i < dsize; ++i) if(dirs[i].d) { delete dirs[i].d; dirs[i].d = NULL; } + } + if(!dironly && vals) { + for(I i = 0; i < vsize; ++i) if(vals[i].v) { delete vals[i].v; vals[i].v = NULL; } + } } -pooldir *pooldir::AddDir(I argc,const A *argv) +V pooldir::Reset(BL realloc) +{ + Clear(true,false); + + if(dirs) delete[] dirs; + if(vals) delete[] vals; + + if(realloc) { + dirs = new direntry[dsize]; + ZeroMem(dirs,dsize*sizeof *dirs); + vals = new valentry[vsize]; + ZeroMem(vals,vsize*sizeof *vals); + } + else + dirs = NULL,vals = NULL; +} + +pooldir *pooldir::AddDir(I argc,const A *argv,I vcnt,I dcnt) { if(!argc) return this; - I c = 1; - pooldir *prv = NULL,*ix = dirs; + I c = 1,dix = DIdx(argv[0]); + pooldir *prv = NULL,*ix = dirs[dix].d; for(; ix; prv = ix,ix = ix->nxt) { c = compare(argv[0],ix->dir); if(c <= 0) break; } if(c || !ix) { - pooldir *nd = new pooldir(argv[0],this); + pooldir *nd = new pooldir(argv[0],this,vcnt,dcnt); nd->nxt = ix; if(prv) prv->nxt = nd; - else dirs = nd; + else dirs[dix].d = nd; + dirs[dix].cnt++; ix = nd; } @@ -123,8 +151,8 @@ pooldir *pooldir::GetDir(I argc,const A *argv,BL rmv) { if(!argc) return this; - I c = 1; - pooldir *prv = NULL,*ix = dirs; + I c = 1,dix = DIdx(argv[0]); + pooldir *prv = NULL,*ix = dirs[dix].d; for(; ix; prv = ix,ix = ix->nxt) { c = compare(argv[0],ix->dir); if(c <= 0) break; @@ -138,7 +166,8 @@ pooldir *pooldir::GetDir(I argc,const A *argv,BL rmv) else if(rmv) { pooldir *nd = ix->nxt; if(prv) prv->nxt = nd; - else dirs = nd; + else dirs[dix].d = nd; + dirs[dix].cnt--; ix->nxt = NULL; return ix; } @@ -160,8 +189,8 @@ BL pooldir::DelDir(I argc,const A *argv) V pooldir::SetVal(const A &key,AtomList *data,BL over) { - I c = 1; - poolval *prv = NULL,*ix = vals; + I c = 1,vix = VIdx(key); + poolval *prv = NULL,*ix = vals[vix].v; for(; ix; prv = ix,ix = ix->nxt) { c = compare(key,ix->key); if(c <= 0) break; @@ -175,7 +204,8 @@ V pooldir::SetVal(const A &key,AtomList *data,BL over) nv->nxt = ix; if(prv) prv->nxt = nv; - else vals = nv; + else vals[vix].v = nv; + vals[vix].cnt++; } } else if(over) { @@ -184,9 +214,12 @@ V pooldir::SetVal(const A &key,AtomList *data,BL over) if(data) ix->Set(data); else { + // delete key + poolval *nv = ix->nxt; if(prv) prv->nxt = nv; - else vals = nv; + else vals[vix].v = nv; + vals[vix].cnt--; ix->nxt = NULL; delete ix; } @@ -195,8 +228,8 @@ V pooldir::SetVal(const A &key,AtomList *data,BL over) poolval *pooldir::RefVal(const A &key) { - I c = 1; - poolval *ix = vals; + I c = 1,vix = VIdx(key); + poolval *ix = vals[vix].v; for(; ix; ix = ix->nxt) { c = compare(key,ix->key); if(c <= 0) break; @@ -205,13 +238,17 @@ poolval *pooldir::RefVal(const A &key) return c || !ix?NULL:ix; } + poolval *pooldir::RefVali(I rix) { - I c = 0; - poolval *ix = vals; - for(; ix && c < rix; ix = ix->nxt,++c) {} - - return c == rix?ix:NULL; + for(I vix = 0; vix < vsize; ++vix) + if(rix > vals[vix].cnt) rix -= vals[vix].cnt; + else { + poolval *ix = vals[vix].v; + for(; ix && rix; ix = ix->nxt) --rix; + if(ix && !rix) return ix; + } + return NULL; } flext::AtomList *pooldir::PeekVal(const A &key) @@ -222,8 +259,8 @@ flext::AtomList *pooldir::PeekVal(const A &key) flext::AtomList *pooldir::GetVal(const A &key,BL cut) { - I c = 1; - poolval *prv = NULL,*ix = vals; + I c = 1,vix = VIdx(key); + poolval *prv = NULL,*ix = vals[vix].v; for(; ix; prv = ix,ix = ix->nxt) { c = compare(key,ix->key); if(c <= 0) break; @@ -236,7 +273,8 @@ flext::AtomList *pooldir::GetVal(const A &key,BL cut) if(cut) { poolval *nv = ix->nxt; if(prv) prv->nxt = nv; - else vals = nv; + else vals[vix].v = nv; + vals[vix].cnt--; ix->nxt = NULL; ret = ix->data; ix->data = NULL; delete ix; @@ -247,11 +285,10 @@ flext::AtomList *pooldir::GetVal(const A &key,BL cut) } } -I pooldir::CntAll() +I pooldir::CntAll() const { I cnt = 0; - poolval *ix = vals; - for(; ix; ix = ix->nxt,++cnt) {} + for(I vix = 0; vix < vsize; ++vix) cnt += vals[vix].cnt; return cnt; } @@ -260,10 +297,11 @@ I pooldir::GetKeys(AtomList &keys) I cnt = CntAll(); keys(cnt); - poolval *ix = vals; - for(I i = 0; ix; ++i,ix = ix->nxt) - SetAtom(keys[i],ix->key); - + for(I vix = 0; vix < vsize; ++vix) { + poolval *ix = vals[vix].v; + for(I i = 0; ix; ++i,ix = ix->nxt) + SetAtom(keys[i],ix->key); + } return cnt; } @@ -273,35 +311,42 @@ I pooldir::GetAll(A *&keys,AtomList *&lst,BL cut) keys = new A[cnt]; lst = new AtomList[cnt]; - poolval *ix = vals; - for(I i = 0; ix; ++i) { - SetAtom(keys[i],ix->key); - lst[i] = *ix->data; - - if(cut) { - poolval *t = ix; - vals = ix = ix->nxt; - t->nxt = NULL; delete t; + for(I i = 0,vix = 0; vix < vsize; ++vix) { + poolval *ix = vals[vix].v; + for(; ix; ++i) { + SetAtom(keys[i],ix->key); + lst[i] = *ix->data; + + if(cut) { + poolval *t = ix; + vals[vix].v = ix = ix->nxt; + vals[vix].cnt--; + t->nxt = NULL; delete t; + } + else + ix = ix->nxt; } - else - ix = ix->nxt; } + return cnt; +} + +I pooldir::CntSub() const +{ + I cnt = 0; + for(I dix = 0; dix < dsize; ++dix) cnt += dirs[dix].cnt; return cnt; } + I pooldir::GetSub(const A **&lst) { - I cnt = 0; - pooldir *ix = dirs; - for(; ix; ix = ix->nxt,++cnt) {} + const I cnt = CntSub(); lst = new const A *[cnt]; - - ix = dirs; - for(I i = 0; ix; ix = ix->nxt,++i) { - lst[i] = &ix->dir; + for(I i = 0,dix = 0; dix < dsize; ++dix) { + pooldir *ix = dirs[dix].d; + for(; ix; ix = ix->nxt) lst[i++] = &ix->dir; } - return cnt; } @@ -310,15 +355,19 @@ BL pooldir::Paste(const pooldir *p,I depth,BL repl,BL mkdir) { BL ok = true; - for(poolval *ix = p->vals; ix; ix = ix->nxt) { - SetVal(ix->key,new AtomList(*ix->data),repl); + for(I vi = 0; vi < p->vsize; ++vi) { + for(poolval *ix = p->vals[vi].v; ix; ix = ix->nxt) { + SetVal(ix->key,new AtomList(*ix->data),repl); + } } if(ok && depth) { - for(pooldir *dix = p->dirs; ok && dix; dix = dix->nxt) { - pooldir *ndir = mkdir?AddDir(1,&dix->dir):GetDir(1,&dix->dir); - if(ndir) { - ok = ndir->Paste(dix,depth > 0?depth-1:depth,repl,mkdir); + for(I di = 0; di < p->dsize; ++di) { + for(pooldir *dix = p->dirs[di].d; ok && dix; dix = dix->nxt) { + pooldir *ndir = mkdir?AddDir(1,&dix->dir):GetDir(1,&dix->dir); + if(ndir) { + ok = ndir->Paste(dix,depth > 0?depth-1:depth,repl,mkdir); + } } } } @@ -331,26 +380,30 @@ BL pooldir::Copy(pooldir *p,I depth,BL cut) BL ok = true; if(cut) { - if(p->vals) - ok = false; - else - p->vals = vals, vals = NULL; + for(I vi = 0; vi < vsize; ++vi) { + for(poolval *ix = vals[vi].v; ix; ix = ix->nxt) + p->SetVal(ix->key,ix->data); + vals[vi].cnt = 0; + vals[vi].v = NULL; + } } else { - // inefficient!! p->SetVal has to search through list unnecessarily!! - for(poolval *ix = vals; ix; ix = ix->nxt) { - p->SetVal(ix->key,new AtomList(*ix->data)); + for(I vi = 0; vi < vsize; ++vi) { + for(poolval *ix = vals[vi].v; ix; ix = ix->nxt) { + p->SetVal(ix->key,new AtomList(*ix->data)); + } } } if(ok && depth) { - // also quite inefficient for cut - for(pooldir *dix = dirs; ok && dix; dix = dix->nxt) { - pooldir *ndir = p->AddDir(1,&dix->dir); - if(ndir) - ok = ndir->Copy(dix,depth > 0?depth-1:depth,cut); - else - ok = false; + for(I di = 0; di < dsize; ++di) { + for(pooldir *dix = dirs[di].d; ok && dix; dix = dix->nxt) { + pooldir *ndir = p->AddDir(1,&dix->dir); + if(ndir) + ok = ndir->Copy(dix,depth > 0?depth-1:depth,cut); + else + ok = false; + } } } @@ -436,17 +489,18 @@ static V WriteAtom(ostream &os,const A &a) static V WriteAtoms(ostream &os,const flext::AtomList &l) { for(I i = 0; i < l.Count(); ++i) { +// if(IsSymbol(l[i]) os << "\""; WriteAtom(os,l[i]); - os << ' '; +// if(IsSymbol(l[i]) os << "\""; + if(i < l.Count()-1) os << ' '; } } BL pooldir::LdDir(istream &is,I depth,BL mkdir) { - BL r; for(I i = 1; !is.eof(); ++i) { AtomList d,k,*v = new AtomList; - r = ReadAtoms(is,d,','); + BL r = ReadAtoms(is,d,','); r = r && ReadAtoms(is,k,',') && k.Count() == 1; r = r && ReadAtoms(is,*v,'\n') && v->Count(); @@ -472,10 +526,10 @@ BL pooldir::LdDir(istream &is,I depth,BL mkdir) BL pooldir::SvDir(ostream &os,I depth,const AtomList &dir) { - { - for(poolval *ix = vals; ix; ix = ix->nxt) { + for(I vi = 0; vi < vsize; ++vi) { + for(poolval *ix = vals[vi].v; ix; ix = ix->nxt) { WriteAtoms(os,dir); - os << ", "; + os << " , "; WriteAtom(os,ix->key); os << " , "; WriteAtoms(os,*ix->data); @@ -484,13 +538,77 @@ BL pooldir::SvDir(ostream &os,I depth,const AtomList &dir) } if(depth) { I nd = depth > 0?depth-1:-1; - for(pooldir *ix = dirs; ix; ix = ix->nxt) { - ix->SvDir(os,nd,AtomList(dir).Append(ix->dir)); + for(I di = 0; di < dsize; ++di) { + for(pooldir *ix = dirs[di].d; ix; ix = ix->nxt) { + ix->SvDir(os,nd,AtomList(dir).Append(ix->dir)); + } } } return true; } +BL pooldir::LdDirXML(istream &is,I depth,BL mkdir) +{ +/* + for(I i = 1; !is.eof(); ++i) { + AtomList d,k,*v = new AtomList; + BL r = ReadAtoms(is,d,','); + r = r && ReadAtoms(is,k,',') && k.Count() == 1; + r = r && ReadAtoms(is,*v,'\n') && v->Count(); + + if(r) { + if(depth < 0 || d.Count() <= depth) { + pooldir *nd = mkdir?AddDir(d):GetDir(d); + if(nd) { + nd->SetVal(k[0],v); v = NULL; + } + #ifdef FLEXT_DEBUG + else + post("pool - directory was not found",i); + #endif + } + } + else if(!is.eof()) + post("pool - format mismatch encountered, skipped line %i",i); + + if(v) delete v; + } + return true; +*/ + return false; +} + +BL pooldir::SvDirXML(ostream &os,I depth,const AtomList &dir) +{ + if(dir.Count()) { + os << "<dir key=\""; + WriteAtom(os,dir[dir.Count()-1]); + os << "\">" << endl; + } + + for(I vi = 0; vi < vsize; ++vi) { + for(poolval *ix = vals[vi].v; ix; ix = ix->nxt) { + os << "<value key=\""; + WriteAtom(os,ix->key); + os << "\">"; + WriteAtoms(os,*ix->data); + os << "</value>" << endl; + } + } + + if(depth) { + I nd = depth > 0?depth-1:-1; + for(I di = 0; di < dsize; ++di) { + for(pooldir *ix = dirs[di].d; ix; ix = ix->nxt) { + ix->SvDirXML(os,nd,AtomList(dir).Append(ix->dir)); + } + } + } + + if(dir.Count()) os << "</dir>" << endl; + return true; +} + diff --git a/externals/grill/pool/pool.cw b/externals/grill/pool/pool.cw Binary files differindex a42f2abf..0169ea73 100755 --- a/externals/grill/pool/pool.cw +++ b/externals/grill/pool/pool.cw diff --git a/externals/grill/pool/pool.dsp b/externals/grill/pool/pool.dsp index dd2209ae..f59a4e15 100644 --- a/externals/grill/pool/pool.dsp +++ b/externals/grill/pool/pool.dsp @@ -101,6 +101,10 @@ SOURCE=.\pool.cpp # End Source File # Begin Source File +SOURCE=.\pool.dtd +# End Source File +# Begin Source File + SOURCE=.\pool.h # End Source File # Begin Source File diff --git a/externals/grill/pool/pool.dtd b/externals/grill/pool/pool.dtd new file mode 100644 index 00000000..c5cb5568 --- /dev/null +++ b/externals/grill/pool/pool.dtd @@ -0,0 +1,5 @@ +<!ELEMENT pool ((dir|value)*)> +<!ELEMENT dir ((dir|value)*)> +<!ATTLIST dir key CDATA #REQUIRED> +<!ELEMENT value ANY> +<!ATTLIST value key CDATA #REQUIRED> diff --git a/externals/grill/pool/pool.h b/externals/grill/pool/pool.h index 2fdbbd28..59195555 100644 --- a/externals/grill/pool/pool.h +++ b/externals/grill/pool/pool.h @@ -15,14 +15,15 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include <flext.h> -#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 401) -#error You need at least flext version 0.4.1 +#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 402) +#error You need at least flext version 0.4.2 #endif #include <iostream.h> typedef void V; typedef int I; +typedef unsigned long UL; typedef float F; typedef char C; typedef bool BL; @@ -48,10 +49,12 @@ class pooldir: public flext { public: - pooldir(const A &dir,pooldir *parent); + pooldir(const A &dir,pooldir *parent,I vcnt = 0,I dcnt = 0); ~pooldir(); V Clear(BL rec,BL dironly = false); + V Reset(BL realloc = true); + BL Empty() const { return !dirs && !vals; } BL HasDirs() const { return dirs != NULL; } BL HasVals() const { return vals != NULL; } @@ -60,16 +63,17 @@ public: pooldir *GetDir(const AtomList &d,BL cut = false) { return GetDir(d.Count(),d.Atoms(),cut); } BL DelDir(I argc,const A *argv); BL DelDir(const AtomList &d) { return DelDir(d.Count(),d.Atoms()); } - pooldir *AddDir(I argc,const A *argv); - pooldir *AddDir(const AtomList &d) { return AddDir(d.Count(),d.Atoms()); } + pooldir *AddDir(I argc,const A *argv,I vcnt = 0,I dcnt = 0); + pooldir *AddDir(const AtomList &d,I vcnt = 0,I dcnt = 0) { return AddDir(d.Count(),d.Atoms(),vcnt,dcnt); } V SetVal(const A &key,AtomList *data,BL over = true); V ClrVal(const A &key) { SetVal(key,NULL); } AtomList *PeekVal(const A &key); AtomList *GetVal(const A &key,BL cut = false); - I CntAll(); + I CntAll() const; I GetAll(A *&keys,AtomList *&lst,BL cut = false); I GetKeys(AtomList &keys); + I CntSub() const; I GetSub(const A **&dirs); poolval *RefVal(const A &key); @@ -79,27 +83,42 @@ public: BL Copy(pooldir *p,I depth,BL cur); BL LdDir(istream &is,I depth,BL mkdir); + BL LdDirXML(istream &is,I depth,BL mkdir); BL SvDir(ostream &os,I depth,const AtomList &dir = AtomList()); + BL SvDirXML(ostream &os,I depth,const AtomList &dir = AtomList()); + + int VSize() const { return vsize; } + int DSize() const { return dsize; } + +protected: + int VIdx(const A &v) const { return FoldBits(AtomHash(v),vbits); } + int DIdx(const A &d) const { return FoldBits(AtomHash(d),dbits); } A dir; pooldir *nxt; - pooldir *parent,*dirs; - poolval *vals; + pooldir *parent; + const I vbits,dbits,vsize,dsize; + + struct valentry { int cnt; poolval *v; }; + struct direntry { int cnt; pooldir *d; }; + + valentry *vals; + direntry *dirs; }; class pooldata: public flext { public: - pooldata(const S *s = NULL); + pooldata(const S *s = NULL,I vcnt = 0,I dcnt = 0); ~pooldata(); V Push() { ++refs; } BL Pop() { return --refs > 0; } V Reset(); - BL MkDir(const AtomList &d); + BL MkDir(const AtomList &d,I vcnt = 0,I dcnt = 0); BL ChkDir(const AtomList &d); BL RmDir(const AtomList &d); @@ -112,6 +131,7 @@ public: poolval *Refi(const AtomList &d,I ix); I CntAll(const AtomList &d); I GetAll(const AtomList &d,A *&keys,AtomList *&lst); + I CntSub(const AtomList &d); I GetSub(const AtomList &d,const t_atom **&dirs); BL Paste(const AtomList &d,const pooldir *clip,I depth = -1,BL repl = true,BL mkdir = true); @@ -122,6 +142,10 @@ public: BL SvDir(const AtomList &d,const C *flnm,I depth,BL absdir); BL Load(const C *flnm) { return LdDir(AtomList(),flnm,-1); } BL Save(const C *flnm) { return SvDir(AtomList(),flnm,-1,true); } + BL LdDirXML(const AtomList &d,const C *flnm,I depth,BL mkdir = true); + BL SvDirXML(const AtomList &d,const C *flnm,I depth,BL absdir); + BL LoadXML(const C *flnm) { return LdDirXML(AtomList(),flnm,-1); } + BL SaveXML(const C *flnm) { return SvDirXML(AtomList(),flnm,-1,true); } I refs; const S *sym; diff --git a/externals/grill/pool/pool.help b/externals/grill/pool/pool.help Binary files differindex dfef05f1..959ca32f 100755 --- a/externals/grill/pool/pool.help +++ b/externals/grill/pool/pool.help diff --git a/externals/grill/pool/pool.pd b/externals/grill/pool/pool.pd index 4d5592e3..70fc7461 100644 --- a/externals/grill/pool/pool.pd +++ b/externals/grill/pool/pool.pd @@ -1,10 +1,10 @@ -#N canvas 25 23 980 683 12;
+#N canvas 12 3 926 682 12;
#X msg 295 108 set 1 2 3;
-#X obj 254 615 print K;
+#X obj 308 619 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 obj 259 648 print V;
+#X obj 357 593 print D;
#X msg 295 167 set A l m;
#X msg 298 196 set 2 34;
#X msg 297 227 set 3 17;
@@ -19,11 +19,11 @@ #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 obj 406 564 print C;
+#X text 478 564 command;
+#X text 430 593 directory (abs or rel to current);
+#X text 334 649 data value;
+#X text 380 619 data key;
#X msg 41 314 pool pool1;
#X msg 42 343 pool;
#X text 86 343 set to private;
@@ -32,7 +32,7 @@ #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 175 500 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;
@@ -54,9 +54,8 @@ #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 512 538 dirs 0;
+#N canvas 0 0 514 540 dirs 0;
#X msg 109 27 mkdir fld1;
#X msg 111 122 chdir;
#X msg 110 217 updir;
@@ -96,29 +95,51 @@ #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;
+#N canvas 0 0 815 447 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 text 473 209 save dir and subdirs;
+#X text 473 167 save data in current dir;
+#X text 473 255 load data into current dir;
+#X text 471 302 load data into current dir and below;
+#X text 488 342 depth (default -1) and;
+#X text 490 358 mkdir flag (default 1) can be given;
+#X text 473 39 save all;
+#X text 473 83 load all (add to existing data);
+#X obj 378 190 s \$0-pool;
+#X text 444 12 XML format;
+#X msg 120 54 save pool.dat;
+#X msg 118 100 load pool.dat;
+#X msg 117 184 svdir pool.dat;
+#X msg 117 226 svrec pool.dat;
+#X msg 116 272 lddir pool.dat;
+#X msg 116 319 ldrec pool.dat;
+#X msg 476 56 savex pool.xml;
+#X msg 474 102 loadx pool.xml;
+#X msg 473 186 svxdir pool.xml;
+#X msg 473 228 svxrec pool.xml;
+#X msg 472 274 ldxdir pool.xml;
+#X msg 472 321 ldxrec pool.xml;
+#X connect 20 0 9 0;
+#X connect 21 0 9 0;
+#X connect 22 0 9 0;
+#X connect 23 0 9 0;
+#X connect 24 0 9 0;
+#X connect 25 0 9 0;
+#X connect 26 0 18 0;
+#X connect 27 0 18 0;
+#X connect 28 0 18 0;
+#X connect 29 0 18 0;
+#X connect 30 0 18 0;
+#X connect 31 0 18 0;
#X restore 719 566 pd file;
#X text 717 543 file operations;
#X text 717 600 clipboard operations;
@@ -162,51 +183,54 @@ #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 289 389 r \$0-pool;
+#X text 174 517 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 272 33 http://www.parasitaere-kapazitaeten.net;
-#X obj 317 529 print A;
-#X text 382 529 attributes;
+#X obj 456 541 print A;
+#X text 521 541 attributes;
#X msg 43 490 getattributes;
#X msg 136 132 getechodir;
#X msg 132 232 getabsdir;
#X msg 146 313 getpool;
-#X obj 260 478 pool;
#X text 272 13 a hierarchical storage object \, (C)2002-2003 Thomas
Grill;
-#X connect 0 0 72 0;
-#X connect 2 0 72 0;
-#X connect 3 0 72 0;
-#X connect 6 0 72 0;
-#X connect 7 0 72 0;
-#X connect 8 0 72 0;
-#X connect 9 0 72 0;
-#X connect 10 0 72 0;
-#X connect 11 0 72 0;
-#X connect 12 0 72 0;
+#X msg 296 282 add 2 14;
+#X obj 260 478 pool @valcnt 10 @dircnt 5;
+#X text 332 442 expected value and directory counts;
+#X text 332 457 can be given for optimal performance;
+#X connect 0 0 73 0;
+#X connect 2 0 73 0;
+#X connect 3 0 73 0;
+#X connect 6 0 73 0;
+#X connect 7 0 73 0;
+#X connect 8 0 73 0;
+#X connect 9 0 73 0;
+#X connect 10 0 73 0;
+#X connect 11 0 73 0;
+#X connect 12 0 73 0;
#X connect 13 0 12 0;
#X connect 14 0 15 0;
-#X connect 15 0 72 0;
-#X connect 23 0 72 0;
-#X connect 24 0 72 0;
-#X connect 26 0 72 0;
-#X connect 28 0 72 0;
-#X connect 33 0 72 0;
-#X connect 34 0 72 0;
-#X connect 45 0 72 0;
-#X connect 48 0 72 0;
-#X connect 50 0 72 0;
-#X connect 53 0 72 0;
-#X connect 62 0 72 0;
-#X connect 68 0 72 0;
-#X connect 69 0 72 0;
-#X connect 70 0 72 0;
-#X connect 71 0 72 0;
-#X connect 72 0 4 0;
-#X connect 72 1 1 0;
-#X connect 72 2 5 0;
-#X connect 72 3 18 0;
-#X connect 72 4 66 0;
+#X connect 15 0 73 0;
+#X connect 23 0 73 0;
+#X connect 24 0 73 0;
+#X connect 26 0 73 0;
+#X connect 28 0 73 0;
+#X connect 33 0 73 0;
+#X connect 34 0 73 0;
+#X connect 45 0 73 0;
+#X connect 48 0 73 0;
+#X connect 50 0 73 0;
+#X connect 61 0 73 0;
+#X connect 67 0 73 0;
+#X connect 68 0 73 0;
+#X connect 69 0 73 0;
+#X connect 70 0 73 0;
+#X connect 72 0 73 0;
+#X connect 73 0 4 0;
+#X connect 73 1 1 0;
+#X connect 73 2 5 0;
+#X connect 73 3 18 0;
+#X connect 73 4 65 0;
diff --git a/externals/grill/pool/readme.txt b/externals/grill/pool/readme.txt index 56d7b7b5..62e42669 100644 --- a/externals/grill/pool/readme.txt +++ b/externals/grill/pool/readme.txt @@ -52,17 +52,23 @@ o CodeWarrior: edit "pool.cw" and build Version history: -0.1.1: +0.2.0: - 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 +- extensive use of hashing for keys and directories +- database can be saved/loaded as XML data 0.1.0: - first public release --------------------------------------------------------------------------- +BUGS: +- pool does not handle symbols with spaces or all digits + + TODO list: general: diff --git a/externals/grill/xsample/config-pd-darwin.txt b/externals/grill/xsample/config-pd-darwin.txt index 7fa15a68..0d4ef217 100755 --- a/externals/grill/xsample/config-pd-darwin.txt +++ b/externals/grill/xsample/config-pd-darwin.txt @@ -29,3 +29,8 @@ INSTDIR=${PD}/extra # where should the xsample help be installed? # (leave blank to omit installation) HELPDIR=${PD}/doc/5.reference + +# additional compiler flags +# (check whether they fit your system!) +UFLAGS=-malign-power -maltivec + diff --git a/externals/grill/xsample/config-pd-linux.txt b/externals/grill/xsample/config-pd-linux.txt index 26e62e49..a58077ec 100755 --- a/externals/grill/xsample/config-pd-linux.txt +++ b/externals/grill/xsample/config-pd-linux.txt @@ -26,3 +26,9 @@ INSTDIR=${PD}/extra # where should the xsample help be installed? # (leave blank to omit installation) HELPDIR=${PD}/doc/5.reference + +# additional compiler flags +# (check whether they fit to your system!) +UFLAGS=-mcpu=pentiumpro # gcc 2.95 +# UFLAGS=-mcpu=pentium3 -msse -mfpmath=sse # gcc 3.2 + diff --git a/externals/grill/xsample/make-files.txt b/externals/grill/xsample/make-files.txt index d96d8485..1607b051 100755 --- a/externals/grill/xsample/make-files.txt +++ b/externals/grill/xsample/make-files.txt @@ -3,5 +3,5 @@ SRCS= \ main.cpp play.cpp groove.cpp record.cpp inter.cpp HDRS= \ - main.h inter.ci + main.h inter.h diff --git a/externals/grill/xsample/makefile.pd-darwin b/externals/grill/xsample/makefile.pd-darwin index 0dbb0611..f51f550f 100755 --- a/externals/grill/xsample/makefile.pd-darwin +++ b/externals/grill/xsample/makefile.pd-darwin @@ -18,7 +18,7 @@ FLEXTLIB=$(FLEXTPATH)/flext.a # compiler stuff INCLUDES=$(PDINC) FLAGS=-DFLEXT_SYS=2 -CFLAGS=-O6 -Wno-unused -Wno-parentheses -Wno-switch -Wstrict-prototypes # -maltivec +CFLAGS=${UFLAGS} -O6 -Wno-unused -Wno-parentheses -Wno-switch -Wstrict-prototypes -funroll-loops -fmove-all-movables -frerun-loop-opt -fno-rtti -fno-exceptions LIBS=m LDFLAGS=-bundle -bundle_loader $(PDBIN) diff --git a/externals/grill/xsample/makefile.pd-linux b/externals/grill/xsample/makefile.pd-linux index 9e6dabaf..c8742ea0 100644 --- a/externals/grill/xsample/makefile.pd-linux +++ b/externals/grill/xsample/makefile.pd-linux @@ -17,8 +17,7 @@ FLEXTLIB=$(FLEXTPATH)/flext.a # compiler stuff INCLUDES=$(PDINC) FLAGS=-DFLEXT_SYS=2 -CFLAGS=-O6 -mcpu=pentiumpro -funroll-loops -fmove-all-movables -frerun-loop-opt -finline-functions -#CFLAGS=-O6 -mcpu=pentium3 -msse -mfpmath=sse -funroll-loops -fmove-all-movables -frerun-loop-opt -finline-functions +CFLAGS=${UFLAGS} -O6 -funroll-loops -fmove-all-movables -frerun-loop-opt -finline-functions -fno-rtti -fno-exceptions LIBS=m # ---------------------------------------------- diff --git a/externals/grill/xsample/maxmsp/xgroove~.help b/externals/grill/xsample/maxmsp/xgroove~.help Binary files differindex ee8a244e..e00533b1 100644 --- a/externals/grill/xsample/maxmsp/xgroove~.help +++ b/externals/grill/xsample/maxmsp/xgroove~.help diff --git a/externals/grill/xsample/maxmsp/xplay~.help b/externals/grill/xsample/maxmsp/xplay~.help Binary files differindex 5a210f74..1dbe02d1 100644 --- a/externals/grill/xsample/maxmsp/xplay~.help +++ b/externals/grill/xsample/maxmsp/xplay~.help diff --git a/externals/grill/xsample/pd/xgroove~.pd b/externals/grill/xsample/pd/xgroove~.pd index da24d9ec..f856025d 100644 --- a/externals/grill/xsample/pd/xgroove~.pd +++ b/externals/grill/xsample/pd/xgroove~.pd @@ -1,174 +1,174 @@ -#N canvas 92 110 839 558 12; -#X obj 258 240 hsl 128 15 0.001 3 1 1 empty empty empty 20 8 0 8 -225271 --1 -1 0 1; -#X floatatom 255 261 8 0 0; -#X floatatom 275 312 8 0 0; -#X floatatom 350 312 8 0 0; -#X floatatom 273 372 8 0 0; -#X floatatom 348 372 8 0 0; -#X obj 275 419 loadbang; -#X obj 274 445 metro 30; -#X obj 250 470 snapshot~; -#X floatatom 250 494 8 0 0; -#X msg 258 82 loop \$1; -#X obj 159 27 bng 15 250 50 0 empty empty empty 20 8 0 8 -258699 -1 --1; -#X msg 158 47 stop; -#N canvas 0 0 450 300 graph7 0; -#X array buf 300 float 1; -#A 0 0.841115 0.9094 0.95923 0.989636 0.999991 0.990063 0.960094 0.910649 -0.842757 0.757796 0.65746 0.543816 0.419143 0.285978 0.147021 0.00508036 --0.136962 -0.276228 -0.409895 -0.535265 -0.649771 -0.751121 -0.83725 --0.906401 -0.957205 -0.988587 -0.999947 -0.991051 -0.962051 -0.913577 --0.846573 -0.762418 -0.662823 -0.549777 -0.425604 -0.292801 -0.154064 --0.0122066 0.129898 0.269372 0.403387 0.529223 0.644347 0.746395 0.833328 -0.903378 0.955105 0.987498 0.99986 0.991967 0.963983 0.91644 0.850346 -0.767009 0.668129 0.555721 0.432034 0.299602 0.161097 0.0193266 -0.122836 --0.262506 -0.396859 -0.523173 -0.638875 -0.741645 -0.82937 -0.900294 --0.952984 -0.986339 -0.999729 -0.992844 -0.965842 -0.919283 -0.854067 --0.771564 -0.673418 -0.561622 -0.438457 -0.306392 -0.168126 -0.0264512 -0.115759 0.255627 0.390308 0.517083 0.633384 0.736837 0.825374 0.89717 -0.95079 0.985156 0.999531 0.993672 0.967666 0.922048 0.857765 0.776069 -0.678665 0.567504 0.444838 0.313167 0.175141 0.0335691 -0.108684 -0.248732 --0.383745 -0.510974 -0.627851 -0.732014 -0.821324 -0.894008 -0.948562 --0.983895 -0.999309 -0.994439 -0.96944 -0.924788 -0.861391 -0.780556 --0.683878 -0.573355 -0.451214 -0.319922 -0.182154 -0.0406903 0.101596 -0.241826 0.37715 0.504839 0.62229 0.727131 0.81725 0.890784 0.946286 -0.982602 0.999003 0.99518 0.971156 0.927473 0.864993 0.784974 0.689065 -0.579174 0.457555 0.326665 0.189149 0.047805 -0.0945095 -0.234908 -0.370551 --0.498674 -0.616703 -0.722227 -0.813114 -0.887541 -0.943952 -0.981256 --0.998669 -0.995836 -0.972845 -0.93011 -0.868543 -0.789377 -0.694202 --0.584975 -0.463879 -0.333389 -0.196144 -0.0549212 0.0874133 0.227976 -0.363918 0.492493 0.611072 0.717282 0.80895 0.88422 0.941593 0.979852 -0.998275 0.996467 0.974453 0.932714 0.872048 0.793723 0.699318 0.590728 -0.47018 0.340094 0.20312 0.0620311 -0.0803164 -0.221037 -0.357277 -0.486275 --0.605431 -0.712297 -0.804743 -0.880878 -0.939154 -0.97842 -0.99783 --0.997035 -0.976038 -0.935246 -0.875523 -0.798037 -0.704388 -0.596471 --0.476452 -0.346789 -0.210093 -0.0691412 0.0732124 0.21408 0.350613 -0.480039 0.599733 0.707289 0.800488 0.87748 0.936691 0.976908 0.997349 -0.997554 0.977556 0.937754 0.87893 0.802314 0.709426 0.602164 0.482708 -0.353456 0.217051 0.0762439 -0.0661074 -0.207122 -0.343933 -0.473779 --0.594024 -0.702224 -0.796211 -0.87404 -0.934169 -0.975372 -0.996792 --0.998035 -0.979032 -0.940196 -0.882319 -0.806539 -0.714434 -0.60784 --0.48893 -0.36012 -0.224 -0.0833475 0.0589955 0.200142 0.337238 0.467489 -0.588274 0.69714 0.791867 0.870566 0.931602 0.973768 0.996211 0.998443 -0.980464 0.9426 0.885637 0.810741 0.719392 0.613481 0.495132 0.366748 -0.230939 0.0904412 -0.0518851 -0.193161 -0.33052 -0.461188 -0.582499 --0.692013 -0.787507 -0.867028 -0.928998 -0.972125 -0.995556 -0.998827 --0.98183 -0.944959 -0.888927 -0.81488 -0.724336 -0.619089 -0.501311 --0.373371; -#X coords 0 1 299 -1 300 200 1; -#X restore 521 23 graph; -#X obj 144 486 dac~; -#X msg 157 86 reset; -#X text 290 292 min/max points; -#X text 289 390 min/max points; -#X text 323 494 position; -#X text 181 24 start; -#X text 198 45 stop; -#X msg 156 113 help; -#X text 416 234 speed; -#X text 337 254 (float or signal); -#X obj 656 365 table buf2; -#X floatatom 519 380 8 0 0; -#X obj 519 353 soundfiler; -#X msg 158 172 set buf2; -#X msg 157 144 set buf; -#X msg 372 82 interp \$1; -#X msg 240 312 all; -#X obj 198 341 xgroove~ buf; -#X text 255 10 looping mode; -#X text 370 9 interpolation; -#X msg 20 170 pos 100; -#X msg 35 199 pos 200; -#X obj 152 447 *~; -#X obj 22 242 ramp 10; -#X msg 10 105 xzone \$1; -#X obj 13 62 hsl 128 15 0 300 0 0 empty empty empty -2 -6 0 8 -262144 --1 -1 0 1; -#X floatatom 10 83 5 0 0; -#X obj 258 32 vdl 15 0 0 3 empty empty empty 0 -6 0 8 -262144 -1 -1 -0; -#X text 277 29 once; -#X text 277 45 forward; -#X text 277 61 bidir; -#X obj 372 31 vdl 15 0 0 3 empty empty empty 0 -6 0 8 -262144 -1 -1 -0; -#X text 391 28 none; -#X text 391 44 linear; -#X text 391 60 4-point; -#X obj 520 299 openpanel; -#X msg 521 326 read -resize \$1 buf2; -#X obj 521 275 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 256 134 vdl 15 0 0 4 empty empty empty 0 -6 0 8 -262144 -1 -1 -0; -#X text 255 113 units; -#X msg 256 199 units \$1; -#X obj 364 134 vdl 15 0 0 4 empty empty empty 0 -6 0 8 -262144 -1 -1 -0; -#X text 363 113 scale mode; -#X msg 364 199 sclmode \$1; -#X text 275 131 frames; -#X text 275 147 buffer sz; -#X text 275 163 ms; -#X text 275 178 s; -#X text 383 147 units in loop; -#X text 383 163 buffer; -#X text 383 178 loop; -#X text 383 131 units in buffer; -#X obj 524 440 osc~ 1000; -#X obj 524 498 tabwrite~ buf; -#X obj 536 467 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X msg 557 468 stop; -#X obj 319 343 print A; -#X msg 131 213 getattributes; -#X msg 177 248 getmax; -#X msg 120 248 getmin; -#X connect 0 0 1 0; -#X connect 1 0 31 0; -#X connect 2 0 31 1; -#X connect 3 0 31 2; -#X connect 6 0 7 0; -#X connect 7 0 8 0; -#X connect 8 0 9 0; -#X connect 10 0 31 0; -#X connect 11 0 31 0; -#X connect 12 0 31 0; -#X connect 15 0 31 0; -#X connect 21 0 31 0; -#X connect 26 0 25 0; -#X connect 27 0 31 0; -#X connect 28 0 31 0; -#X connect 29 0 31 0; -#X connect 30 0 31 0; -#X connect 31 0 36 1; -#X connect 31 1 8 0; -#X connect 31 2 4 0; -#X connect 31 3 5 0; -#X connect 31 5 70 0; -#X connect 34 0 37 0; -#X connect 35 0 37 0; -#X connect 36 0 14 0; -#X connect 36 0 14 1; -#X connect 37 0 36 0; -#X connect 37 1 31 0; -#X connect 38 0 31 0; -#X connect 39 0 40 0; -#X connect 40 0 38 0; -#X connect 41 0 10 0; -#X connect 45 0 29 0; -#X connect 49 0 50 0; -#X connect 50 0 26 0; -#X connect 51 0 49 0; -#X connect 52 0 54 0; -#X connect 54 0 31 0; -#X connect 55 0 57 0; -#X connect 57 0 31 0; -#X connect 66 0 67 0; -#X connect 68 0 67 0; -#X connect 69 0 67 0; -#X connect 71 0 31 0; -#X connect 72 0 31 0; -#X connect 73 0 31 0; +#N canvas 92 110 841 560 12;
+#X obj 258 240 hsl 128 15 0.001 3 1 1 empty empty empty 20 8 0 8 -225271
+-1 -1 3600 1;
+#X floatatom 255 261 8 0 0 0 - - -;
+#X floatatom 275 312 8 0 0 0 - - -;
+#X floatatom 350 312 8 0 0 0 - - -;
+#X floatatom 273 372 8 0 0 0 - - -;
+#X floatatom 348 372 8 0 0 0 - - -;
+#X obj 275 419 loadbang;
+#X obj 274 445 metro 30;
+#X obj 250 470 snapshot~;
+#X floatatom 250 494 8 0 0 0 - - -;
+#X msg 258 82 loop \$1;
+#X obj 159 27 bng 15 250 50 0 empty empty empty 20 8 0 8 -258699 -1
+-1;
+#X msg 158 47 stop;
+#N canvas 0 0 450 300 graph7 0;
+#X array buf 300 float 1;
+#A 0 0.841115 0.9094 0.95923 0.989636 0.999991 0.990063 0.960094 0.910649
+0.842757 0.757796 0.65746 0.543816 0.419143 0.285978 0.147021 0.00508036
+-0.136962 -0.276228 -0.409895 -0.535265 -0.649771 -0.751121 -0.83725
+-0.906401 -0.957205 -0.988587 -0.999947 -0.991051 -0.962051 -0.913577
+-0.846573 -0.762418 -0.662823 -0.549777 -0.425604 -0.292801 -0.154064
+-0.0122066 0.129898 0.269372 0.403387 0.529223 0.644347 0.746395 0.833328
+0.903378 0.955105 0.987498 0.99986 0.991967 0.963983 0.91644 0.850346
+0.767009 0.668129 0.555721 0.432034 0.299602 0.161097 0.0193266 -0.122836
+-0.262506 -0.396859 -0.523173 -0.638875 -0.741645 -0.82937 -0.900294
+-0.952984 -0.986339 -0.999729 -0.992844 -0.965842 -0.919283 -0.854067
+-0.771564 -0.673418 -0.561622 -0.438457 -0.306392 -0.168126 -0.0264512
+0.115759 0.255627 0.390308 0.517083 0.633384 0.736837 0.825374 0.89717
+0.95079 0.985156 0.999531 0.993672 0.967666 0.922048 0.857765 0.776069
+0.678665 0.567504 0.444838 0.313167 0.175141 0.0335691 -0.108684 -0.248732
+-0.383745 -0.510974 -0.627851 -0.732014 -0.821324 -0.894008 -0.948562
+-0.983895 -0.999309 -0.994439 -0.96944 -0.924788 -0.861391 -0.780556
+-0.683878 -0.573355 -0.451214 -0.319922 -0.182154 -0.0406903 0.101596
+0.241826 0.37715 0.504839 0.62229 0.727131 0.81725 0.890784 0.946286
+0.982602 0.999003 0.99518 0.971156 0.927473 0.864993 0.784974 0.689065
+0.579174 0.457555 0.326665 0.189149 0.047805 -0.0945095 -0.234908 -0.370551
+-0.498674 -0.616703 -0.722227 -0.813114 -0.887541 -0.943952 -0.981256
+-0.998669 -0.995836 -0.972845 -0.93011 -0.868543 -0.789377 -0.694202
+-0.584975 -0.463879 -0.333389 -0.196144 -0.0549212 0.0874133 0.227976
+0.363918 0.492493 0.611072 0.717282 0.80895 0.88422 0.941593 0.979852
+0.998275 0.996467 0.974453 0.932714 0.872048 0.793723 0.699318 0.590728
+0.47018 0.340094 0.20312 0.0620311 -0.0803164 -0.221037 -0.357277 -0.486275
+-0.605431 -0.712297 -0.804743 -0.880878 -0.939154 -0.97842 -0.99783
+-0.997035 -0.976038 -0.935246 -0.875523 -0.798037 -0.704388 -0.596471
+-0.476452 -0.346789 -0.210093 -0.0691412 0.0732124 0.21408 0.350613
+0.480039 0.599733 0.707289 0.800488 0.87748 0.936691 0.976908 0.997349
+0.997554 0.977556 0.937754 0.87893 0.802314 0.709426 0.602164 0.482708
+0.353456 0.217051 0.0762439 -0.0661074 -0.207122 -0.343933 -0.473779
+-0.594024 -0.702224 -0.796211 -0.87404 -0.934169 -0.975372 -0.996792
+-0.998035 -0.979032 -0.940196 -0.882319 -0.806539 -0.714434 -0.60784
+-0.48893 -0.36012 -0.224 -0.0833475 0.0589955 0.200142 0.337238 0.467489
+0.588274 0.69714 0.791867 0.870566 0.931602 0.973768 0.996211 0.998443
+0.980464 0.9426 0.885637 0.810741 0.719392 0.613481 0.495132 0.366748
+0.230939 0.0904412 -0.0518851 -0.193161 -0.33052 -0.461188 -0.582499
+-0.692013 -0.787507 -0.867028 -0.928998 -0.972125 -0.995556 -0.998827
+-0.98183 -0.944959 -0.888927 -0.81488 -0.724336 -0.619089 -0.501311
+-0.373371;
+#X coords 0 1 299 -1 300 200 1;
+#X restore 521 23 graph;
+#X obj 144 486 dac~;
+#X msg 157 86 reset;
+#X text 290 292 min/max points;
+#X text 289 390 min/max points;
+#X text 323 494 position;
+#X text 181 24 start;
+#X text 198 45 stop;
+#X msg 156 113 help;
+#X text 416 234 speed;
+#X text 337 254 (float or signal);
+#X obj 656 365 table buf2;
+#X floatatom 519 380 8 0 0 0 - - -;
+#X obj 519 353 soundfiler;
+#X msg 158 172 set buf2;
+#X msg 157 144 set buf;
+#X msg 372 82 interp \$1;
+#X msg 240 312 all;
+#X obj 198 341 xgroove~ buf;
+#X text 255 10 looping mode;
+#X text 370 9 interpolation;
+#X msg 20 170 pos 100;
+#X msg 35 199 pos 200;
+#X obj 152 447 *~;
+#X obj 22 242 ramp 10;
+#X msg 10 105 xzone \$1;
+#X obj 13 62 hsl 128 15 0 300 0 0 empty empty empty -2 -6 0 8 -262144
+-1 -1 800 1;
+#X floatatom 10 83 5 0 0 0 - - -;
+#X obj 258 32 vdl 15 0 0 3 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X text 277 29 once;
+#X text 277 45 forward;
+#X text 277 61 bidir;
+#X obj 372 31 vdl 15 0 0 3 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X text 391 28 none;
+#X text 391 44 linear;
+#X text 391 60 4-point;
+#X obj 520 299 openpanel;
+#X msg 521 326 read -resize \$1 buf2;
+#X obj 521 275 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 256 134 vdl 15 0 0 4 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X text 255 113 units;
+#X msg 256 199 units \$1;
+#X obj 364 134 vdl 15 0 0 4 empty empty empty 0 -6 0 8 -262144 -1 -1
+0;
+#X text 363 113 scale mode;
+#X msg 364 199 sclmode \$1;
+#X text 275 131 frames;
+#X text 275 147 buffer sz;
+#X text 275 163 ms;
+#X text 275 178 s;
+#X text 383 147 units in loop;
+#X text 383 163 buffer;
+#X text 383 178 loop;
+#X text 383 131 units in buffer;
+#X obj 524 440 osc~ 1000;
+#X obj 524 498 tabwrite~ buf;
+#X obj 536 467 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 557 468 stop;
+#X obj 319 343 print A;
+#X msg 131 213 getattributes;
+#X msg 177 248 getmax;
+#X msg 120 248 getmin;
+#X connect 0 0 1 0;
+#X connect 1 0 31 0;
+#X connect 2 0 31 1;
+#X connect 3 0 31 2;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 9 0;
+#X connect 10 0 31 0;
+#X connect 11 0 31 0;
+#X connect 12 0 31 0;
+#X connect 15 0 31 0;
+#X connect 21 0 31 0;
+#X connect 26 0 25 0;
+#X connect 27 0 31 0;
+#X connect 28 0 31 0;
+#X connect 29 0 31 0;
+#X connect 30 0 31 0;
+#X connect 31 0 36 1;
+#X connect 31 1 8 0;
+#X connect 31 2 4 0;
+#X connect 31 3 5 0;
+#X connect 31 5 70 0;
+#X connect 34 0 37 0;
+#X connect 35 0 37 0;
+#X connect 36 0 14 0;
+#X connect 36 0 14 1;
+#X connect 37 0 36 0;
+#X connect 37 1 31 0;
+#X connect 38 0 31 0;
+#X connect 39 0 40 0;
+#X connect 40 0 38 0;
+#X connect 41 0 10 0;
+#X connect 45 0 29 0;
+#X connect 49 0 50 0;
+#X connect 50 0 26 0;
+#X connect 51 0 49 0;
+#X connect 52 0 54 0;
+#X connect 54 0 31 0;
+#X connect 55 0 57 0;
+#X connect 57 0 31 0;
+#X connect 66 0 67 0;
+#X connect 68 0 67 0;
+#X connect 69 0 67 0;
+#X connect 71 0 31 0;
+#X connect 72 0 31 0;
+#X connect 73 0 31 0;
diff --git a/externals/grill/xsample/readme.txt b/externals/grill/xsample/readme.txt index 8f88cd2d..07aa5a6a 100644 --- a/externals/grill/xsample/readme.txt +++ b/externals/grill/xsample/readme.txt @@ -10,13 +10,10 @@ Donations for further development of the package are highly appreciated. IMPORTANT INFORMATION for all MaxMSP users: -It is advisable to put the xsample shared library file into the "startup" folder. Hence it will be +It is advisable to put the xsample shared library file into the "max-startup" folder. Hence it will be loaded at Max startup. -If you want to load the xsample library on demand, please run MakeAliases inside the MPW folder. -This will create aliases to the several xsample objects contained in the library. -Move these into the "externals" folder. -(This latter procedure is only tested for OS 9.2, you may experience problems with other MacOS versions) +If you want to load the xsample library on demand, create a [xsample] object in Max/MSP. ---------------------------------------------------------------------------- @@ -44,15 +41,24 @@ o Microsoft Visual C++ 6: edit "xsample.dsp" project file pd - linux: ----------- -o GCC for linux: run "make -f makefile.pd-linux" and as root "make -f makefile.pd-linux install" +o GCC: edit "config-pd-linux.txt" and run "sh ./build-pd-linux.sh" > various versions of GCC die during compile with template optimization turned on -Max/MSP - MacOS: +pd - OSX: +----------- +o GCC: edit "config-pd-darwin.txt" and run "sh ./build-pd-darwin.sh" +> various versions of GCC die during compile with template optimization turned on + +Max/MSP - MacOS9: ---------------- -o Metrowerks CodeWarrior V6: edit "xsample.cw" project file functions +o Metrowerks CodeWarrior: edit "xsample.cw" project file functions o Apple MPW-PR: edit & use the "flext.mpw" makefile +Max/MSP - MacOSX: +---------------- +o Metrowerks CodeWarrior: edit "xsample.cw" project file functions + ---------------------------------------------------------------------------- @@ -71,7 +77,7 @@ Goals/features of the package: Version history: -0.2.5: +0.3.0: - added resources to MaxMSP build - xgroove~, xrecord~: introduced a loop/end bang outlet - added MaxMSP buffer resize recognition @@ -80,7 +86,8 @@ Version history: - introduced attributes - restructured make procedures - corrected names of PD makefile, set help names -- fixed scale mode bug +- fixed scale mode bug with xgroove~ +- added validity check for buffers 0.2.4: - according to flext 0.2.3 changed sample type to t_sample (S) @@ -125,7 +132,6 @@ Version history: TODO list: general: -- Documentation and better example patches - do a smooth (line~) mixin in xrecord~ help patch diff --git a/externals/grill/xsample/source/groove.cpp b/externals/grill/xsample/source/groove.cpp index 62f0c291..60bf617b 100644 --- a/externals/grill/xsample/source/groove.cpp +++ b/externals/grill/xsample/source/groove.cpp @@ -103,8 +103,10 @@ private: virtual V m_signal(I n,S *const *in,S *const *out) { - bufchk(); - posfun(n,in,out); + if(bufchk()) + posfun(n,in,out); + else + zerofun(n,in,out); } FLEXT_CALLBACK_F(m_pos) @@ -195,11 +197,11 @@ xgroove::xgroove(I argc,const t_atom *argv): AddOutFloat("Ending point (rounded to frame)"); // play max AddOutBang("Bang on loop end/rollover"); // loop bang - znbuf = new S *[outchns]; for(I i = 0; i < outchns; ++i) znbuf[i] = new S[0]; - znpos = new S[0]; + znpos = new S[0]; // don't know vector size yet -> m_dsp znidx = new S[0]; + znmul = new S[XZONE_TABLE+1]; m_xshape(); } @@ -304,9 +306,6 @@ V xgroove::m_xshape(I argc,const t_atom *argv) else if(xshparam > 1) xshparam = 1; } - if(znmul) delete[] znmul; - znmul = new S[XZONE_TABLE+1]; - I i; switch(xshape) { case 1: @@ -393,13 +392,11 @@ V xgroove::s_pos_off(I n,S *const *invecs,S *const *outvecs) { S *pos = outvecs[outchns]; - I si; - for(si = 0; si < n; ++si) pos[si] = curpos; + SetSamples(pos,n,curpos); playfun(n,&pos,outvecs); - const F oscl = scale(curpos); - for(si = 0; si < n; ++si) pos[si] = oscl; + SetSamples(pos,n,scale(curpos)); } V xgroove::s_pos_once(I n,S *const *invecs,S *const *outvecs) @@ -427,7 +424,7 @@ V xgroove::s_pos_once(I n,S *const *invecs,S *const *outvecs) playfun(n,&pos,outvecs); - for(I i = 0; i < n; ++i) pos[i] = scale(pos[i]); + arrscale(n,pos,pos); } else s_pos_off(n,invecs,outvecs); @@ -467,7 +464,7 @@ V xgroove::s_pos_loop(I n,S *const *invecs,S *const *outvecs) playfun(n,&pos,outvecs); - for(I i = 0; i < n; ++i) pos[i] = scale(pos[i]); + arrscale(n,pos,pos); } else s_pos_off(n,invecs,outvecs); @@ -523,15 +520,16 @@ V xgroove::s_pos_loopzn(I n,S *const *invecs,S *const *outvecs) playfun(n,&pos,outvecs); - for(I i = 0; i < n; ++i) pos[i] = scale(pos[i]); + arrscale(n,pos,pos); if(inzn) { // only if we were in cross-fade zone playfun(n,&znpos,znbuf); - for(I i = 0; i < n; ++i) znpos[i] = XZONE_TABLE-znidx[i]; - zonefun(znmul,0,XZONE_TABLE+1,1,n,1,1,&znidx,&znidx); - zonefun(znmul,0,XZONE_TABLE+1,1,n,1,1,&znpos,&znpos); + arrscale(n,znidx,znpos,-XZONE_TABLE,-1); + + zonefun(znmul,0,XZONE_TABLE+1,n,1,1,&znidx,&znidx); + zonefun(znmul,0,XZONE_TABLE+1,n,1,1,&znpos,&znpos); for(I o = 0; o < outchns; ++o) { F *ov = outvecs[o],*ob = znbuf[o]; @@ -582,7 +580,7 @@ V xgroove::s_pos_bidir(I n,S *const *invecs,S *const *outvecs) bidir = (I)bd; playfun(n,&pos,outvecs); - for(I i = 0; i < n; ++i) pos[i] = scale(pos[i]); + arrscale(n,pos,pos); } else s_pos_off(n,invecs,outvecs); @@ -614,6 +612,8 @@ V xgroove::s_dsp() SETSIGFUN(posfun,SIGFUN(s_pos_loopzn)); + // linear interpolation should be just ok for fade zone, no? +/* if(interp == xsi_4p) switch(outchns) { case 1: SETSTFUN(zonefun,TMPLSTF(st_play4,1,1)); break; @@ -622,12 +622,14 @@ V xgroove::s_dsp() default: SETSTFUN(zonefun,TMPLSTF(st_play4,1,-1)); } else if(interp == xsi_lin) +*/ switch(outchns) { case 1: SETSTFUN(zonefun,TMPLSTF(st_play2,1,1)); break; case 2: SETSTFUN(zonefun,TMPLSTF(st_play2,1,2)); break; case 4: SETSTFUN(zonefun,TMPLSTF(st_play2,1,4)); break; default: SETSTFUN(zonefun,TMPLSTF(st_play2,1,-1)); } +/* else switch(outchns) { case 1: SETSTFUN(zonefun,TMPLSTF(st_play1,1,1)); break; @@ -635,6 +637,7 @@ V xgroove::s_dsp() case 4: SETSTFUN(zonefun,TMPLSTF(st_play1,1,4)); break; default: SETSTFUN(zonefun,TMPLSTF(st_play1,1,-1)); } +*/ } else SETSIGFUN(posfun,SIGFUN(s_pos_loop)); diff --git a/externals/grill/xsample/source/inter.cpp b/externals/grill/xsample/source/inter.cpp index 42221e1c..f3fba86c 100644 --- a/externals/grill/xsample/source/inter.cpp +++ b/externals/grill/xsample/source/inter.cpp @@ -16,7 +16,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #endif #ifndef TMPLOPT -#include "inter.ci" +#include "inter.h" #endif void xinter::setup(t_classid c) @@ -53,6 +53,13 @@ V xinter::m_stop() V xinter::s_dsp() { + switch(outchns) { + case 1: SETSIGFUN(zerofun,TMPLFUN(s_play0,-1,1)); break; + case 2: SETSIGFUN(zerofun,TMPLFUN(s_play0,-1,2)); break; + case 4: SETSIGFUN(zerofun,TMPLFUN(s_play0,-1,4)); break; + default: SETSIGFUN(zerofun,TMPLFUN(s_play0,-1,-1)); + } + if(doplay) { if(interp == xsi_4p) switch(buf->Channels()*1000+outchns) { diff --git a/externals/grill/xsample/source/inter.ci b/externals/grill/xsample/source/inter.h index 1ce98f61..697c66df 100644..100755 --- a/externals/grill/xsample/source/inter.ci +++ b/externals/grill/xsample/source/inter.h @@ -11,23 +11,18 @@ WARRANTIES, see the file, "license.txt," in this distribution. #ifndef __INTER_H #define __INTER_H -TMPLDEF V xinter::st_play0(const S *bdt,const I smin,const I smax,const F s2u,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) +TMPLDEF V xinter::st_play0(const S *,const I ,const I ,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) { - // stopped - SIGCHNS(BCHNS,inchns,OCHNS,outchns); - -// const S *pos = invecs[0]; - S *const *sig = outvecs; - - for(I ci = 0; ci < outchns; ++ci) - for(I si = 0; si < n; ++si) sig[ci][si] = 0; + // stopped/invalid buffer -> output zero + for(I ci = 0; ci < outchns; ++ci) ZeroSamples(outvecs[ci],n); } -TMPLDEF V xinter::st_play1(const S *bdt,const I smin,const I smax,const F s2u,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) +TMPLDEF V xinter::st_play1(const S *bdt,const I smin,const I smax,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) { SIGCHNS(BCHNS,inchns,OCHNS,outchns); - const S *pos = invecs[0]; + // position info are frame units + const S *pos = invecs[0]; S *const *sig = outvecs; register I si = 0; @@ -55,20 +50,20 @@ TMPLDEF V xinter::st_play1(const S *bdt,const I smin,const I smax,const F s2u,co } // clear rest of output channels (if buffer has less channels) - for(I ci = OCHNS; ci < outchns; ++ci) - for(si = 0; si < n; ++si) sig[ci][si] = 0; + for(I ci = OCHNS; ci < outchns; ++ci) ZeroSamples(sig[ci],n); } -TMPLDEF V xinter::st_play2(const S *bdt,const I smin,const I smax,const F s2u,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) +TMPLDEF V xinter::st_play2(const S *bdt,const I smin,const I smax,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) { const I plen = smax-smin; //curlen; if(plen < 2) { - st_play1 TMPLCALL (bdt,smin,smax,s2u,n,inchns,outchns,invecs,outvecs); + st_play1 TMPLCALL (bdt,smin,smax,n,inchns,outchns,invecs,outvecs); return; } SIGCHNS(BCHNS,inchns,OCHNS,outchns); + // position info are frame units const S *pos = invecs[0]; S *const *sig = outvecs; register I si = 0; @@ -105,21 +100,21 @@ TMPLDEF V xinter::st_play2(const S *bdt,const I smin,const I smax,const F s2u,co } // clear rest of output channels (if buffer has less channels) - for(I ci = OCHNS; ci < outchns; ++ci) - for(si = 0; si < n; ++si) sig[ci][si] = 0; + for(I ci = OCHNS; ci < outchns; ++ci) ZeroSamples(sig[ci],n); } -TMPLDEF V xinter::st_play4(const S *bdt,const I smin,const I smax,const F s2u,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) +TMPLDEF V xinter::st_play4(const S *bdt,const I smin,const I smax,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) { const I plen = smax-smin; //curlen; if(plen < 4) { - if(plen < 2) st_play1 TMPLCALL (bdt,smin,smax,s2u,n,inchns,outchns,invecs,outvecs); - else st_play2 TMPLCALL (bdt,smin,smax,s2u,n,inchns,outchns,invecs,outvecs); + if(plen < 2) st_play1 TMPLCALL (bdt,smin,smax,n,inchns,outchns,invecs,outvecs); + else st_play2 TMPLCALL (bdt,smin,smax,n,inchns,outchns,invecs,outvecs); return; } SIGCHNS(BCHNS,inchns,OCHNS,outchns); + // position info are frame units const S *pos = invecs[0]; S *const *sig = outvecs; register I si = 0; @@ -167,29 +162,28 @@ TMPLDEF V xinter::st_play4(const S *bdt,const I smin,const I smax,const F s2u,co } // clear rest of output channels (if buffer has less channels) - for(I ci = OCHNS; ci < outchns; ++ci) - for(si = 0; si < n; ++si) sig[ci][si] = 0; + for(I ci = OCHNS; ci < outchns; ++ci) ZeroSamples(sig[ci],n); } -TMPLDEF V xinter::s_play0(I n,S *const *invecs,S *const *outvecs) +TMPLDEF inline V xinter::s_play0(I n,S *const *invecs,S *const *outvecs) { - st_play0 TMPLCALL (buf->Data(),curmin,curmax,s2u,n,buf->Channels(),outchns,invecs,outvecs); + st_play0 TMPLCALL (buf->Data(),curmin,curmax,n,buf->Channels(),outchns,invecs,outvecs); } -TMPLDEF V xinter::s_play1(I n,S *const *invecs,S *const *outvecs) +TMPLDEF inline V xinter::s_play1(I n,S *const *invecs,S *const *outvecs) { - st_play1 TMPLCALL (buf->Data(),curmin,curmax,s2u,n,buf->Channels(),outchns,invecs,outvecs); + st_play1 TMPLCALL (buf->Data(),curmin,curmax,n,buf->Channels(),outchns,invecs,outvecs); } -TMPLDEF V xinter::s_play2(I n,S *const *invecs,S *const *outvecs) +TMPLDEF inline V xinter::s_play2(I n,S *const *invecs,S *const *outvecs) { - st_play2 TMPLCALL (buf->Data(),curmin,curmax,s2u,n,buf->Channels(),outchns,invecs,outvecs); + st_play2 TMPLCALL (buf->Data(),curmin,curmax,n,buf->Channels(),outchns,invecs,outvecs); } -TMPLDEF V xinter::s_play4(I n,S *const *invecs,S *const *outvecs) +TMPLDEF inline V xinter::s_play4(I n,S *const *invecs,S *const *outvecs) { - st_play4 TMPLCALL (buf->Data(),curmin,curmax,s2u,n,buf->Channels(),outchns,invecs,outvecs); + st_play4 TMPLCALL (buf->Data(),curmin,curmax,n,buf->Channels(),outchns,invecs,outvecs); } diff --git a/externals/grill/xsample/source/main.cpp b/externals/grill/xsample/source/main.cpp index 2a39950d..2392bdb1 100644 --- a/externals/grill/xsample/source/main.cpp +++ b/externals/grill/xsample/source/main.cpp @@ -72,6 +72,18 @@ xsample::~xsample() } +BL xsample::bufchk() +{ + if(buf->Valid()) { + if(buf->Update()) { +// post("%s - buffer updated",thisName()); + m_refresh(); + } + return true; + } + else + return false; +} I xsample::m_set(I argc,const t_atom *argv) { @@ -115,7 +127,7 @@ V xsample::m_loadbang() V xsample::m_units(xs_unit mode) { - bufchk(); + if(!bufchk()) return; // if invalid do nothing (actually, it should be delayed) if(mode != xsu__) unitmode = mode; switch(unitmode) { @@ -138,7 +150,7 @@ V xsample::m_units(xs_unit mode) V xsample::m_sclmode(xs_sclmd mode) { - bufchk(); + if(!bufchk()) return; // if invalid do nothing (actually, it should be delayed) if(mode != xss__) sclmode = mode; switch(sclmode) { @@ -162,7 +174,7 @@ V xsample::m_sclmode(xs_sclmd mode) V xsample::m_min(F mn) { - bufchk(); + if(!bufchk()) return; // if invalid do nothing (actually, it should be delayed) mn /= s2u; // conversion to samples if(mn < 0) mn = 0; @@ -175,7 +187,7 @@ V xsample::m_min(F mn) V xsample::m_max(F mx) { - bufchk(); + if(!bufchk()) return; // if invalid do nothing (actually, it should be delayed) mx /= s2u; // conversion to samples if(mx > buf->Frames()) mx = (F)buf->Frames(); @@ -188,7 +200,7 @@ V xsample::m_max(F mx) V xsample::m_all() { - bufchk(); + if(!bufchk()) return; // if invalid do nothing (actually, it should be delayed) // curlen = (curmax = buf->Frames())-(curmin = 0); curmin = 0; curmax = buf->Frames(); @@ -203,5 +215,44 @@ V xsample::m_dsp(I /*n*/,S *const * /*insigs*/,S *const * /*outsigs*/) } +V xsample::arrscale(I n,const S *src,S *dst,S add,S mul) +{ + int n8 = n>>3; + n -= n8<<3; + while(n8--) { + dst[0] = (src[0]+add)*mul; + dst[1] = (src[1]+add)*mul; + dst[2] = (src[2]+add)*mul; + dst[3] = (src[3]+add)*mul; + dst[4] = (src[4]+add)*mul; + dst[5] = (src[5]+add)*mul; + dst[6] = (src[6]+add)*mul; + dst[7] = (src[7]+add)*mul; + src += 8,dst += 8; + } + + while(n--) *(dst++) = (*(src++)+add)*mul; +} + +V xsample::arrmul(I n,const S *src,S *dst,S mul) +{ + int n8 = n>>3; + n -= n8<<3; + while(n8--) { + dst[0] = src[0]*mul; + dst[1] = src[1]*mul; + dst[2] = src[2]*mul; + dst[3] = src[3]*mul; + dst[4] = src[4]*mul; + dst[5] = src[5]*mul; + dst[6] = src[6]*mul; + dst[7] = src[7]*mul; + src += 8,dst += 8; + } + + while(n--) *(dst++) = *(src++)*mul; +} + + diff --git a/externals/grill/xsample/source/main.h b/externals/grill/xsample/source/main.h index 94f8885f..03d5d261 100644 --- a/externals/grill/xsample/source/main.h +++ b/externals/grill/xsample/source/main.h @@ -11,19 +11,18 @@ WARRANTIES, see the file, "license.txt," in this distribution. #ifndef __XSAMPLE_H #define __XSAMPLE_H -#define XSAMPLE_VERSION "0.2.5pre3" +#define XSAMPLE_VERSION "0.3.0pre4" #define FLEXT_ATTRIBUTES 1 #include <flext.h> -#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 401) -#error You need at least flext version 0.4.1 +#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 402) +#error You need at least flext version 0.4.2 #endif -// most compilers are somehow broken..... -// in other words: can't handle all C++ features +// most compilers are somehow broken - in other words - can't handle all C++ features #if defined(_MSC_VER) // MS VC 6.0 can't handle <int,int> templates?! -> no optimization @@ -123,8 +122,14 @@ protected: F s2u; // sample to unit conversion factor inline F scale(F smp) const { return (smp-sclmin)*sclmul; } + + static V arrscale(I n,const S *in,S *out,S add,S mul); + inline V arrscale(I n,const S *in,S *out) const { arrscale(n,in,out,(S)-sclmin,sclmul); } + + static V arrmul(I n,const S *in,S *out,S mul); + inline V arrmul(I n,const S *in,S *out) const { arrmul(n,in,out,(S)(1./s2u)); } - BL bufchk() { if(buf->Update()) { m_refresh(); return true; } return false; } + BL bufchk(); V mg_buffer(AtomList &l) { if(buf) { l(1); SetSymbol(l[0],buf->Symbol()); } else l(); } inline V ms_buffer(const AtomList &l) { m_set(l.Count(),l.Atoms()); } @@ -182,7 +187,7 @@ protected: TMPLDEF static V st_##NAME(thisType *obj,I n,S *const *in,S *const *out) { obj->NAME TMPLCALL (n,in,out); } \ TMPLDEF V NAME(I n,S *const *in,S *const *out) - #define TMPLSTFUN(NAME) TMPLDEF static V NAME(const S *bdt,const I smin,const I smax,const F s2u,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) + #define TMPLSTFUN(NAME) TMPLDEF static V NAME(const S *bdt,const I smin,const I smax,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) #define SETSIGFUN(VAR,FUN) v_##VAR = FUN @@ -193,7 +198,7 @@ protected: V (*v_##NAME)(thisType *obj,I n,S *const *in,S *const *out) #define DEFSTCALL(NAME) \ - V (*NAME)(const S *bdt,const I smin,const I smax,const F s2u,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) + V (*NAME)(const S *bdt,const I smin,const I smax,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) #else #ifdef TMPLOPT @@ -212,7 +217,7 @@ protected: #define DEFSIGFUN(NAME) V NAME(I n,S *const *in,S *const *out) #define TMPLSIGFUN(NAME) TMPLDEF V NAME(I n,S *const *in,S *const *out) - #define TMPLSTFUN(NAME) TMPLDEF static V NAME(const S *bdt,const I smin,const I smax,const F s2u,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) + #define TMPLSTFUN(NAME) TMPLDEF static V NAME(const S *bdt,const I smin,const I smax,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) #define SETSIGFUN(VAR,FUN) v_##VAR = FUN @@ -223,7 +228,7 @@ protected: #define SETSTFUN(VAR,FUN) VAR = FUN #define DEFSTCALL(NAME) \ - V (*NAME)(const S *bdt,const I smin,const I smax,const F s2u,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) + V (*NAME)(const S *bdt,const I smin,const I smax,const I n,const I inchns,const I outchns,S *const *invecs,S *const *outvecs) #endif @@ -285,6 +290,7 @@ protected: TMPLSTFUN(st_play4); DEFSIGCALL(playfun); + DEFSIGCALL(zerofun); virtual V s_dsp(); @@ -296,7 +302,7 @@ private: }; #ifdef TMPLOPT -#include "inter.ci" +#include "inter.h" #endif #endif diff --git a/externals/grill/xsample/source/play.cpp b/externals/grill/xsample/source/play.cpp index 50f32e75..037bc1bb 100644 --- a/externals/grill/xsample/source/play.cpp +++ b/externals/grill/xsample/source/play.cpp @@ -32,11 +32,7 @@ public: private: static V setup(t_classid c); - virtual V m_signal(I n,S *const *in,S *const *out) - { - bufchk(); - playfun(n,in,out); - } + virtual V m_signal(I n,S *const *in,S *const *out); }; FLEXT_LIB_DSP_V("xplay~",xplay) @@ -91,7 +87,20 @@ BL xplay::Init() else return false; } - + +V xplay::m_signal(I n,S *const *in,S *const *out) +{ + // check whether buffer is invalid or changed + if(bufchk()) { + // convert position units to frames + arrmul(n,in[0],out[0]); + // call resample routine + playfun(n,out,out); + } + else + zerofun(n,out,out); +} + V xplay::m_help() @@ -117,8 +126,8 @@ V xplay::m_help() post("\tstop: stop playing"); post("\treset: checks buffer"); post("\trefresh: checks buffer and refreshes outlets"); - post("\tunits 0/1/2/3: set units to samples/buffer size/ms/s"); - post("\tinterp 0/1/2: set interpolation to off/4-point/linear"); + post("\t@units 0/1/2/3: set units to samples/buffer size/ms/s"); + post("\t@interp 0/1/2: set interpolation to off/4-point/linear"); post(""); } diff --git a/externals/grill/xsample/source/record.cpp b/externals/grill/xsample/source/record.cpp index ce169e9a..d6b9e70e 100644 --- a/externals/grill/xsample/source/record.cpp +++ b/externals/grill/xsample/source/record.cpp @@ -69,8 +69,7 @@ private: DEFSIGCALL(recfun); virtual V m_signal(I n,S *const *in,S *const *out) { - bufchk(); - recfun(n,in,out); + if(bufchk()) recfun(n,in,out); } FLEXT_CALLVAR_F(mg_pos,m_pos) diff --git a/externals/grill/xsample/xsample.cw b/externals/grill/xsample/xsample.cw Binary files differindex d893d3ef..70783c4d 100755 --- a/externals/grill/xsample/xsample.cw +++ b/externals/grill/xsample/xsample.cw diff --git a/externals/grill/xsample/xsample.dsp b/externals/grill/xsample/xsample.dsp index ec5bffb5..18119476 100644 --- a/externals/grill/xsample/xsample.dsp +++ b/externals/grill/xsample/xsample.dsp @@ -109,6 +109,10 @@ SOURCE=.\source\inter.cpp # End Source File # Begin Source File +SOURCE=.\source\inter.h +# End Source File +# Begin Source File + SOURCE=.\source\main.cpp # End Source File # Begin Source File |