From 386b250dd27a237a4498161fbec4e8e1f3eb0438 Mon Sep 17 00:00:00 2001 From: mescalinum Date: Sun, 13 Sep 2009 16:02:50 +0000 Subject: add a usage example of pd_bind/pd_unbind svn path=/trunk/externals/tclpd/; revision=12332 --- dynreceive-help.pd | 22 ++++++++++++++++++++++ dynreceive.tcl | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 dynreceive-help.pd create mode 100644 dynreceive.tcl diff --git a/dynreceive-help.pd b/dynreceive-help.pd new file mode 100644 index 0000000..88a5568 --- /dev/null +++ b/dynreceive-help.pd @@ -0,0 +1,22 @@ +#N canvas 416 120 513 409 10; +#X obj 141 168 s \$0.foo; +#X msg 46 120 bar baz; +#X obj 60 320 dynreceive \$0.foo; +#X floatatom 122 123 5 0 0 0 - - -; +#X symbolatom 177 125 10 0 0 0 - - -; +#X obj 267 125 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X text 43 86 1) send some symbols:; +#X text 45 240 2) try to change the receive symbol:; +#X msg 60 287 set xyz; +#X msg 312 306 \; xyz 1 2 3; +#X obj 60 350 print out; +#X text 39 23 Works like [receive] \, but allows to dynamically set +(or clear) the receive symbol.; +#X text 139 288 <--; +#X connect 1 0 0 0; +#X connect 2 0 10 0; +#X connect 3 0 0 0; +#X connect 4 0 0 0; +#X connect 5 0 0 0; +#X connect 8 0 2 0; diff --git a/dynreceive.tcl b/dynreceive.tcl new file mode 100644 index 0000000..e9c61b5 --- /dev/null +++ b/dynreceive.tcl @@ -0,0 +1,52 @@ +source pdlib.tcl + +pd::class dynreceive { + constructor { + set @sym {} + if {[pd::args] > 0} { + set @sym [pd::arg 0 symbol] + pd_bind [tclpd_get_instance_pd $self] [gensym $@sym] + } + pd::add_outlet $self + } + + destructor { + # don't forget to call pd_unbind, or sending things to a symbol + # bound to dead object will crash pd! + if {$@sym != {}} { + pd_unbind [tclpd_get_instance_pd $self] [gensym $@sym] + } + } + + 0_set { + # send [set empty( to clear the receive symbol + set s [pd::arg 0 symbol] + if {$@sym != {}} { + pd_unbind [tclpd_get_instance_pd $self] [gensym $@sym] + } + if {$s == {empty}} { + set @sym {} + } else { + set @sym $s + pd_bind [tclpd_get_instance_pd $self] [gensym $@sym] + } + } + + 0_bang { + pd::outlet $self 0 bang + } + + 0_float { + pd::outlet $self 0 float [pd::arg 0 float] + } + + 0_symbol { + pd::outlet $self 0 symbol [gensym [pd::arg 0 symbol]] + } + + 0_anything { + set sel [pd::arg 0 symbol] + set argz [lrange $args 1 end] + pd::outlet $self 0 $sel $argz + } +} -- cgit v1.2.1