diff options
Diffstat (limited to 'externals/grill/dynext')
-rw-r--r-- | externals/grill/dynext/pd/dyn~-help.pd | 70 | ||||
-rwxr-xr-x | externals/grill/dynext/readme.txt | 2 | ||||
-rw-r--r-- | externals/grill/dynext/src/main.cpp | 208 |
3 files changed, 167 insertions, 113 deletions
diff --git a/externals/grill/dynext/pd/dyn~-help.pd b/externals/grill/dynext/pd/dyn~-help.pd index 86fca988..078cbeca 100644 --- a/externals/grill/dynext/pd/dyn~-help.pd +++ b/externals/grill/dynext/pd/dyn~-help.pd @@ -1,5 +1,5 @@ -#N canvas 36 61 829 548 12;
-#N canvas 71 10 558 565 examples 0;
+#N canvas 50 60 833 552 12;
+#N canvas 71 10 562 569 examples 0;
#X floatatom 148 239 5 0 0 0 - - -;
#X floatatom 105 304 5 0 0 0 - - -;
#X floatatom 113 501 5 0 0 0 - - -;
@@ -71,42 +71,40 @@ conn a 0 0; #X text 187 98 reload all objects (keep connections);
#X msg 127 98 reload;
#X text 218 432 (connections are not drawn at the moment!);
-#N canvas 178 192 582 438 dsp-ex 0;
-#X obj 73 380 dac~;
-#X obj 183 257 hsl 128 15 0 1000 0 0 empty empty empty -2 -6 0 8 -261681
--1 -1 0 1;
-#X obj 194 282 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -6 0
-10 -262144 -1 -1 0 256;
-#X msg 66 78 reset;
-#X obj 467 323 loadbang;
-#X msg 466 347 \; pd dsp 1;
-#X text 65 56 clear all;
-#X obj 47 278 dyn~ 0 1 2 0;
-#X text 70 107 make an oscillator (left);
-#X text 66 167 add an oscillator (double frq \, right);
-#X text 24 17 signals passing through dyn~ are delayed by one block
-;
-#X text 74 239 select frequency;
-#X obj 57 341 *~ 0.2;
-#X obj 141 340 *~ 0.2;
-#X obj 179 313 hsl 128 15 0.001 1 1 0 empty empty empty -2 -6 0 8 -262131
--1 -1 0 1;
-#X text 316 309 gain;
-#X msg 64 129 newobj . o1 osc~ 220 \, conn 0 o1 0 \, conn o1 0 0;
-#X msg 67 187 newobj . m * 1.5 \, newobj . o2 osc~ 330 \, conn 0 m
+#N canvas 178 192 594 450 dsp-ex 0;
+#X obj 63 357 dac~;
+#X obj 173 234 hsl 128 15 0 1000 0 0 empty empty empty -2 -6 0 8 -261681
+-1 -1 2800 1;
+#X obj 184 259 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -6 0
+10 -262144 -1 -1 220.472 256;
+#X msg 56 55 reset;
+#X obj 457 300 loadbang;
+#X msg 456 324 \; pd dsp 1;
+#X text 55 33 clear all;
+#X obj 37 255 dyn~ 0 1 2 0;
+#X text 60 84 make an oscillator (left);
+#X text 56 144 add an oscillator (double frq \, right);
+#X text 64 216 select frequency;
+#X obj 47 318 *~ 0.2;
+#X obj 131 317 *~ 0.2;
+#X obj 169 290 hsl 128 15 0.001 1 1 0 empty empty empty -2 -6 0 8 -262131
+-1 -1 3300 1;
+#X text 306 286 gain;
+#X msg 54 106 newobj . o1 osc~ 220 \, conn 0 o1 0 \, conn o1 0 0;
+#X msg 57 164 newobj . m * 1.5 \, newobj . o2 osc~ 330 \, conn 0 m
0 \, conn m 0 o2 0 \, conn o2 0 1;
#X connect 1 0 2 0;
#X connect 1 0 7 1;
#X connect 3 0 7 0;
#X connect 4 0 5 0;
-#X connect 7 0 12 0;
-#X connect 7 1 13 0;
-#X connect 12 0 0 0;
-#X connect 13 0 0 1;
-#X connect 14 0 12 1;
-#X connect 14 0 13 1;
+#X connect 7 0 11 0;
+#X connect 7 1 12 0;
+#X connect 11 0 0 0;
+#X connect 12 0 0 1;
+#X connect 13 0 11 1;
+#X connect 13 0 12 1;
+#X connect 15 0 7 0;
#X connect 16 0 7 0;
-#X connect 17 0 7 0;
#X restore 514 487 pd dsp-ex;
#X msg 129 156 newmsg . b Hello;
#X msg 128 124 newobj . a + 1;
@@ -118,10 +116,8 @@ patcher; #X text 273 200 make sub patcher;
#X msg 432 198 newobj c d bang;
#X text 561 198 make object in sub patcher;
-#X text 133 12 dynamic object management \, (C)2003-2005 Thomas Grill
-;
#X text 133 30 http://grrrr.org/ext;
-#N canvas 132 483 562 540 proxies 0;
+#N canvas 132 483 566 544 proxies 0;
#X text 25 78 Instead you have to create a "real" object that;
#X text 24 94 gets the message and passes it along to the abstraction.
;
@@ -155,6 +151,8 @@ in it; #X connect 16 0 6 0;
#X restore 626 469 pd proxies;
#X msg 128 387 send a message 1;
+#X text 133 12 dynamic object management \, (C)2003-2006 Thomas Grill
+;
#X connect 1 0 13 0;
#X connect 3 0 13 0;
#X connect 5 0 13 0;
@@ -168,4 +166,4 @@ in it; #X connect 25 0 13 0;
#X connect 28 0 13 0;
#X connect 30 0 13 0;
-#X connect 35 0 13 0;
+#X connect 34 0 13 0;
diff --git a/externals/grill/dynext/readme.txt b/externals/grill/dynext/readme.txt index e779840a..c3270f4f 100755 --- a/externals/grill/dynext/readme.txt +++ b/externals/grill/dynext/readme.txt @@ -30,6 +30,7 @@ CHANGES: 0.1.2: - optimized DSP path (less copying, no block delay) +- separate message and signal proxy objects to save memory 0.1.1: - using aligned memory @@ -69,5 +70,4 @@ 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 56c55694..1baf6902 100644 --- a/externals/grill/dynext/src/main.cpp +++ b/externals/grill/dynext/src/main.cpp @@ -121,7 +121,6 @@ protected: virtual bool CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv); virtual bool CbDsp(); - virtual void CbSignal(); // proxy object @@ -130,15 +129,33 @@ protected: public: t_object obj; dyn *th; - int n; - t_sample *buf; - t_sample defsig; void init(dyn *t) { th = t; - n = 0,buf = NULL; + } + }; + + // proxy object + class sigproxy + : public proxy + { + public: + t_sample defsig; + int n; + t_sample *vec; + + void init(dyn *t) + { + proxy::init(t); defsig = 0; + n = 0,vec = NULL; + } + + void set(int n,t_sample *vec) + { + this->n = n; + this->vec = vec; } }; @@ -147,21 +164,35 @@ protected: public proxy { public: - t_outlet *outlet; + void init(dyn *t) + { + proxy::init(t); + outlet_new(&obj,&s_anything); + } void Message(const t_symbol *s,int argc,const t_atom *argv) { - typedmess((t_pd *)&obj,(t_symbol *)s,argc,(t_atom *)argv); + outlet_anything(obj.te_outlet,(t_symbol *)s,argc,(t_atom *)argv); } - void init(dyn *t,bool s); - static void px_method(proxyin *obj,const t_symbol *s,int argc,const t_atom *argv) { - outlet_anything(obj->outlet,(t_symbol *)s,argc,(t_atom *)argv); + obj->Message(s,argc,argv); } + }; - static void dsp(proxyin *x, t_signal **sp); + // proxy for inbound signals + class sigproxyin: + public sigproxy + { + public: + void init(dyn *t) + { + sigproxy::init(t); + outlet_new(&obj,&s_signal); + } + + static void dsp(sigproxyin *x, t_signal **sp); }; @@ -170,30 +201,49 @@ protected: public proxy { public: - int outlet; - - void init(dyn *t,int o,bool s); + void init(dyn *t,int o) + { + proxy::init(t); + outlet = o; + } static void px_method(proxyout *obj,const t_symbol *s,int argc,const t_atom *argv) { obj->th->ToOutAnything(obj->outlet,s,argc,argv); } - static void dsp(proxyout *x, t_signal **sp); + protected: + int outlet; + }; + + // proxy for outbound messages + class sigproxyout: + public sigproxy + { + public: + void init(dyn *t) + { + sigproxy::init(t); + outlet_new(&obj,&s_signal); + } + + static void dsp(sigproxyout *x, t_signal **sp); }; static t_class *pxin_class,*pxout_class; static t_class *pxins_class,*pxouts_class; - proxyin **pxin; - proxyout **pxout; + int s_inlets,m_inlets,s_outlets,m_outlets; + sigproxyin **pxsin; + proxyin **pxmin; + sigproxyout **pxsout; + proxyout **pxmout; static t_object *pxin_new() { return (t_object *)pd_new(pxin_class); } static t_object *pxins_new() { return (t_object *)pd_new(pxins_class); } static t_object *pxout_new() { return (t_object *)pd_new(pxout_class); } static t_object *pxouts_new() { return (t_object *)pd_new(pxouts_class); } - int m_inlets,s_inlets,m_outlets,s_outlets; t_canvas *canvas; bool stripext,canvasmsg,symreuse; @@ -261,18 +311,18 @@ void dyn::setup(t_classid c) 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,NULL,sizeof(proxyin),0, A_NULL); - add_dsp(pxins_class,proxyin::dsp); - CLASS_MAINSIGNALIN(pxins_class, proxyin, defsig); + pxins_class = class_new(const_cast<t_symbol *>(sym_dynsin),(t_newmethod)pxins_new,NULL,sizeof(sigproxyin),0, A_NULL); + add_dsp(pxins_class,sigproxyin::dsp); + CLASS_MAINSIGNALIN(pxins_class, sigproxyin, defsig); // set up proxy class for outbound messages 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,NULL,sizeof(proxyout),0, A_NULL); - add_dsp(pxouts_class,proxyout::dsp); - CLASS_MAINSIGNALIN(pxouts_class, proxyout, defsig); + pxouts_class = class_new(const_cast<t_symbol *>(sym_dynsout),(t_newmethod)pxouts_new,NULL,sizeof(sigproxyout),0, A_NULL); + add_dsp(pxouts_class,sigproxyout::dsp); + CLASS_MAINSIGNALIN(pxouts_class, sigproxyout, defsig); // set up dyn~ FLEXT_CADDMETHOD_(c,0,"reset",m_reset); @@ -335,7 +385,7 @@ In all cases the 1)s have been chosen as the cleaner solution dyn::dyn(int argc,const t_atom *argv): canvas(NULL), - pxin(NULL),pxout(NULL), + pxsin(NULL),pxmin(NULL),pxsout(NULL),pxmout(NULL), stripext(false),symreuse(true),canvasmsg(false) { if(argc < 4) { @@ -403,20 +453,27 @@ void dyn::NewProxies() { // --- create inlet proxies ------ int i; - pxin = new proxyin *[s_inlets+m_inlets]; + if(s_inlets) pxsin = new sigproxyin *[s_inlets]; + if(m_inlets) pxmin = new proxyin *[m_inlets]; for(i = 0; i < s_inlets+m_inlets; ++i) { - bool sig = i < s_inlets; - t_atom lst[5]; SetInt(lst[0],i*100); SetInt(lst[1],10); SetSymbol(lst[2],sym_dot); SetSymbol(lst[3],sym__); - SetSymbol(lst[4],sig?sym_dynsin:sym_dynin); try { - pxin[i] = (proxyin *)New(k_obj,5,lst,false); - if(pxin[i]) pxin[i]->init(this,sig); + if(i < s_inlets) { + SetSymbol(lst[4],sym_dynsin); + pxsin[i] = (sigproxyin *)New(k_obj,5,lst,false); + if(pxsin[i]) pxsin[i]->init(this); + } + else { + int j = i-s_inlets; + SetSymbol(lst[4],sym_dynin); + pxmin[j] = (proxyin *)New(k_obj,5,lst,false); + if(pxmin[j]) pxmin[j]->init(this); + } } catch(...) { error("%s - Error creating inlet proxy",thisName()); @@ -425,20 +482,27 @@ void dyn::NewProxies() // --- create outlet proxies ------ - pxout = new proxyout *[s_outlets+m_outlets]; + if(s_outlets) pxsout = new sigproxyout *[s_outlets]; + if(m_outlets) pxmout = new proxyout *[m_outlets]; for(i = 0; i < s_outlets+m_outlets; ++i) { - bool sig = i < s_outlets; - t_atom lst[5]; SetInt(lst[0],i*100); SetInt(lst[1],500); SetSymbol(lst[2],sym_dot); SetSymbol(lst[3],sym__); - SetSymbol(lst[4],sig?sym_dynsout:sym_dynout); try { - pxout[i] = (proxyout *)New(k_obj,5,lst,false); - if(pxout[i]) pxout[i]->init(this,i,sig); + if(i < s_outlets) { + SetSymbol(lst[4],sym_dynsout); + pxsout[i] = (sigproxyout *)New(k_obj,5,lst,false); + if(pxsout[i]) pxsout[i]->init(this); + } + else { + int j = i-s_outlets; + SetSymbol(lst[4],sym_dynout); + pxmout[j] = (proxyout *)New(k_obj,5,lst,false); + if(pxmout[j]) pxmout[j]->init(this,i); + } } catch(...) { error("%s - Error creating outlet proxy",thisName()); @@ -449,13 +513,21 @@ void dyn::NewProxies() void dyn::DelProxies() { int i; - if(pxin) { - for(i = 0; i < s_inlets+m_inlets; ++i) glist_delete(canvas,(t_gobj *)pxin[i]); - delete[] pxin; + if(pxsin) { + for(i = 0; i < s_inlets; ++i) glist_delete(canvas,(t_gobj *)pxsin[i]); + delete[] pxsin; pxsin = NULL; + } + if(pxmin) { + for(i = 0; i < m_inlets; ++i) glist_delete(canvas,(t_gobj *)pxmin[i]); + delete[] pxmin; pxmin = NULL; } - if(pxout) { - for(i = 0; i < s_outlets+m_outlets; ++i) glist_delete(canvas,(t_gobj *)pxout[i]); - delete[] pxout; + if(pxsout) { + for(i = 0; i < s_outlets; ++i) glist_delete(canvas,(t_gobj *)pxsout[i]); + delete[] pxsout; pxsout = NULL; + } + if(pxmout) { + for(i = 0; i < m_outlets; ++i) glist_delete(canvas,(t_gobj *)pxmout[i]); + delete[] pxmout; pxmout = NULL; } } @@ -730,14 +802,14 @@ void dyn::ConnDis(bool conn,int argc,const t_atom *argv) d_x = GetAInt(argv[2]); } else if(argc == 2 && CanbeInt(argv[0]) && CanbeInt(argv[1])) { - // direct connection from proxy-in to proxy-out (for testing above all....) + // direct connection from proxy-in to proxy-out s_n = NULL; s_x = GetAInt(argv[0]); d_n = NULL; d_x = GetAInt(argv[1]); } else { - post("%s - connect: [src] srcslot [dst] dstslot",thisName()); + post("%s - connect: [src-name] src-slot [dst-name] dst-slot",thisName()); return; } @@ -757,7 +829,7 @@ void dyn::ConnDis(bool conn,int argc,const t_atom *argv) return; } else { - s_obj = &pxin[s_x]->obj; + s_obj = s_x < s_inlets?&pxsin[s_x]->obj:&pxmin[s_x-s_inlets]->obj; s_cnv = canvas; s_x = 0; // always 0 for proxy } @@ -776,7 +848,7 @@ void dyn::ConnDis(bool conn,int argc,const t_atom *argv) return; } else { - d_obj = &pxout[d_x]->obj; + d_obj = d_x < s_outlets?&pxsout[d_x]->obj:&pxmout[d_x-s_outlets]->obj; d_cnv = canvas; d_x = 0; // always 0 for proxy } @@ -818,7 +890,10 @@ bool dyn::CbMethodResort(int n,const t_symbol *s,int argc,const t_atom *argv) return flext_base::m_method_(n,s,argc,argv); else { // all other messages are forwarded to proxies (and connected objects) - pxin[n-1]->Message(s,argc,argv); + if(n >= s_inlets) + pxmin[n-s_inlets-1]->Message(s,argc,argv); + else + post("%s - message to signal inlet",thisName()); return true; } } @@ -843,56 +918,37 @@ void dyn::m_send(int argc,const t_atom *argv) } } -void dyn::proxyin::dsp(proxyin *x,t_signal **sp) +void dyn::sigproxyin::dsp(sigproxyin *x,t_signal **sp) { - FLEXT_ASSERT(x->buf && x->n); + FLEXT_ASSERT(x->vec && x->n); int n = sp[0]->s_n; if(n != x->n) { post("dyn~ proxyin - blocksize doesn't match!"); } else - dsp_add_copy(x->buf,sp[0]->s_vec,n); + dsp_add_copy(x->vec,sp[0]->s_vec,n); } -void dyn::proxyin::init(dyn *t,bool s) -{ - proxy::init(t); - outlet = outlet_new(&obj,s?&s_signal:&s_anything); -} - - - - -void dyn::proxyout::dsp(proxyout *x,t_signal **sp) +void dyn::sigproxyout::dsp(sigproxyout *x,t_signal **sp) { - FLEXT_ASSERT(x->buf && x->n); + FLEXT_ASSERT(x->vec && x->n); int n = sp[0]->s_n; if(n != x->n) { post("dyn~ proxyout - blocksize doesn't match!"); } else - dsp_add_copy(sp[0]->s_vec,x->buf,n); -} - -void dyn::proxyout::init(dyn *t,int o,bool s) -{ - proxy::init(t); - outlet = o; - if(s) outlet_new(&obj,&s_signal); + dsp_add_copy(sp[0]->s_vec,x->vec,n); } - bool dyn::CbDsp() { 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; + for(i = 0; i < s_inlets; ++i) pxsin[i]->set(n,in[i+1]); + for(i = 0; i < s_outlets; ++i) pxsout[i]->set(n,out[i]); // 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; + return false; } - -void dyn::CbSignal() {} |