diff options
-rw-r--r-- | externals/grill/dynext/dynext.vcproj | 5 | ||||
-rwxr-xr-x | externals/grill/dynext/readme.txt | 5 | ||||
-rw-r--r-- | externals/grill/dynext/src/main.cpp | 64 |
3 files changed, 40 insertions, 34 deletions
diff --git a/externals/grill/dynext/dynext.vcproj b/externals/grill/dynext/dynext.vcproj index c7ffc7cd..f7edf246 100644 --- a/externals/grill/dynext/dynext.vcproj +++ b/externals/grill/dynext/dynext.vcproj @@ -20,10 +20,11 @@ <Tool Name="VCCLCompilerTool" Optimization="0" - AdditionalIncludeDirectories="c:\programme\audio\pd-0.39-0\src;..\flext\source" + AdditionalIncludeDirectories="c:\data\pd\pd-cvs\src;..\flext\source" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PD" BasicRuntimeChecks="3" RuntimeLibrary="5" + RuntimeTypeInfo="TRUE" UsePrecompiledHeader="2" PrecompiledHeaderFile=".\pd-msvc/d/dyn.pch" AssemblerListingLocation=".\pd-msvc/d/" @@ -38,7 +39,7 @@ Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" - AdditionalDependencies="pd.lib pthreadVC.lib" + AdditionalDependencies="pd.lib" OutputFile="$(outdir)/dyn~.dll" LinkIncremental="1" SuppressStartupBanner="TRUE" diff --git a/externals/grill/dynext/readme.txt b/externals/grill/dynext/readme.txt index f28d121c..e779840a 100755 --- a/externals/grill/dynext/readme.txt +++ b/externals/grill/dynext/readme.txt @@ -28,6 +28,9 @@ BUGS: CHANGES: -------- +0.1.2: +- optimized DSP path (less copying, no block delay) + 0.1.1: - using aligned memory - cached several symbols @@ -66,3 +69,5 @@ CHANGES: TODO: -------- - add mute attribute +- separate message and signal proxy objects to save memory + diff --git a/externals/grill/dynext/src/main.cpp b/externals/grill/dynext/src/main.cpp index faf3f137..56c55694 100644 --- a/externals/grill/dynext/src/main.cpp +++ b/externals/grill/dynext/src/main.cpp @@ -2,7 +2,7 @@ dyn~ - dynamical object management for PD -Copyright (c)2003-2005 Thomas Grill (gr@grrrr.org) +Copyright (c)2003-2006 Thomas Grill (gr@grrrr.org) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. @@ -19,7 +19,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #error You need at least flext version 0.5.0 #endif -#define DYN_VERSION "0.1.1" +#define DYN_VERSION "0.1.2" #if FLEXT_SYS != FLEXT_SYS_PD @@ -45,7 +45,7 @@ public: dyn(int argc,const t_atom *argv); virtual ~dyn(); - void m_reset() { DoExit(); DoInit(); } + void m_reset(); void m_reload(); // refresh objects/abstractions void m_newobj(int argc,const t_atom *argv); void m_newmsg(int argc,const t_atom *argv); @@ -140,8 +140,6 @@ protected: n = 0,buf = NULL; defsig = 0; } - - static void px_exit(proxy *px) { if(px->buf) FreeAligned(px->buf); } }; // proxy for inbound messages @@ -247,7 +245,7 @@ const t_symbol *dyn::sym_pop = NULL; void dyn::setup(t_classid c) { post(""); - post("dyn~ %s - dynamic object management, (C)2003-2005 Thomas Grill",DYN_VERSION); + post("dyn~ %s - dynamic object management, (C)2003-2006 Thomas Grill",DYN_VERSION); post(""); sym_dynsin = MakeSymbol("dyn_in~"); @@ -259,20 +257,20 @@ void dyn::setup(t_classid c) sym_dyncanvas = MakeSymbol(" dyn~-canvas "); // set up proxy class for inbound messages - pxin_class = class_new(const_cast<t_symbol *>(sym_dynin),(t_newmethod)pxin_new,(t_method)proxy::px_exit,sizeof(proxyin),0, A_NULL); + pxin_class = class_new(const_cast<t_symbol *>(sym_dynin),(t_newmethod)pxin_new,NULL,sizeof(proxyin),0, A_NULL); add_anything(pxin_class,proxyin::px_method); // set up proxy class for inbound signals - pxins_class = class_new(const_cast<t_symbol *>(sym_dynsin),(t_newmethod)pxins_new,(t_method)proxy::px_exit,sizeof(proxyin),0, A_NULL); + pxins_class = class_new(const_cast<t_symbol *>(sym_dynsin),(t_newmethod)pxins_new,NULL,sizeof(proxyin),0, A_NULL); add_dsp(pxins_class,proxyin::dsp); CLASS_MAINSIGNALIN(pxins_class, proxyin, defsig); // set up proxy class for outbound messages - pxout_class = class_new(const_cast<t_symbol *>(sym_dynout),(t_newmethod)pxout_new,(t_method)proxy::px_exit,sizeof(proxyout),0, A_NULL); + pxout_class = class_new(const_cast<t_symbol *>(sym_dynout),(t_newmethod)pxout_new,NULL,sizeof(proxyout),0, A_NULL); add_anything(pxout_class,proxyout::px_method); // set up proxy class for outbound signals - pxouts_class = class_new(const_cast<t_symbol *>(sym_dynsout),(t_newmethod)pxouts_new,(t_method)proxy::px_exit,sizeof(proxyout),0, A_NULL); + pxouts_class = class_new(const_cast<t_symbol *>(sym_dynsout),(t_newmethod)pxouts_new,NULL,sizeof(proxyout),0, A_NULL); add_dsp(pxouts_class,proxyout::dsp); CLASS_MAINSIGNALIN(pxouts_class, proxyout, defsig); @@ -651,6 +649,14 @@ t_gobj *dyn::New(const t_symbol *kind,int _argc_,const t_atom *_argv_,bool add) return newest; } +void dyn::m_reset() +{ + int dsp = canvas_suspend_dsp(); + DoExit(); + DoInit(); + canvas_resume_dsp(dsp); +} + void dyn::m_reload() { post("%s - reload: not implemented yet",thisName()); @@ -837,16 +843,15 @@ void dyn::m_send(int argc,const t_atom *argv) } } - void dyn::proxyin::dsp(proxyin *x,t_signal **sp) { + FLEXT_ASSERT(x->buf && x->n); int n = sp[0]->s_n; if(n != x->n) { - // if vector size has changed make new buffer - if(x->buf) FreeAligned(x->buf); - x->buf = (t_sample *)NewAligned(sizeof(t_sample)*(x->n = n)); + post("dyn~ proxyin - blocksize doesn't match!"); } - dsp_add_copy(x->buf,sp[0]->s_vec,n); + else + dsp_add_copy(x->buf,sp[0]->s_vec,n); } void dyn::proxyin::init(dyn *t,bool s) @@ -860,13 +865,13 @@ void dyn::proxyin::init(dyn *t,bool s) void dyn::proxyout::dsp(proxyout *x,t_signal **sp) { + FLEXT_ASSERT(x->buf && x->n); int n = sp[0]->s_n; if(n != x->n) { - // if vector size has changed make new buffer - if(x->buf) FreeAligned(x->buf); - x->buf = (t_sample *)NewAligned(sizeof(t_sample)*(x->n = n)); + post("dyn~ proxyout - blocksize doesn't match!"); } - dsp_add_copy(sp[0]->s_vec,x->buf,n); + else + dsp_add_copy(sp[0]->s_vec,x->buf,n); } void dyn::proxyout::init(dyn *t,int o,bool s) @@ -879,20 +884,15 @@ void dyn::proxyout::init(dyn *t,int o,bool s) bool dyn::CbDsp() { - // add sub canvas to dsp list (no signal vector to borrow from .. set it to NULL) + int n = Blocksize(); + t_sample *const *in = InSig(),*const *out = OutSig(); + int i; + for(i = 0; i < s_inlets; ++i) pxin[i]->buf = in[i+1],pxin[i]->n = n; + for(i = 0; i < s_outlets; ++i) pxout[i]->buf = out[i],pxout[i]->n = n; + + // add sub canvas to dsp list (no signal vector to borrow from .. set it to NULL) mess1((t_pd *)canvas,const_cast<t_symbol *>(sym_dsp),NULL); return true; } -void dyn::CbSignal() -{ - int i,n = Blocksize(); - t_sample *const *in = InSig(),*const *out = OutSig(); - for(i = 0; i < s_inlets; ++i) - if(pxin[i]->buf) - CopySamples(pxin[i]->buf,in[i+1],n); - - for(i = 0; i < s_outlets; ++i) - if(pxout[i]->buf) - CopySamples(out[i],pxout[i]->buf,n); -} +void dyn::CbSignal() {} |