aboutsummaryrefslogtreecommitdiff
path: root/dynroute.tcl
diff options
context:
space:
mode:
authormescalinum <mescalinum@users.sourceforge.net>2009-08-31 13:42:50 +0000
committermescalinum <mescalinum@users.sourceforge.net>2009-08-31 13:42:50 +0000
commit5cfef34ec9fc67df3149436a83873ce527d4af9d (patch)
tree880033ba25f8e1f8de5ca5e7b48dab56f980b666 /dynroute.tcl
parentaa048d93e8fdae5b8152b3c963da02b3cd244274 (diff)
add usage examples and help
svn path=/trunk/externals/tclpd/; revision=12154
Diffstat (limited to 'dynroute.tcl')
-rw-r--r--dynroute.tcl56
1 files changed, 56 insertions, 0 deletions
diff --git a/dynroute.tcl b/dynroute.tcl
new file mode 100644
index 0000000..ef8553c
--- /dev/null
+++ b/dynroute.tcl
@@ -0,0 +1,56 @@
+source pdlib.tcl
+
+# dynroute: dynamically route messages based on first element
+# non-matching arguments are sent to last inlet
+# constructor: <float> specify the number of outlets (default: 1)
+# send commands to the right inlet
+# available commands:
+# add <atom> <float> route selector <atom> to output number <float>
+# remove <atom> <float> remove previously created routing
+# clear
+
+pd::class dynroute {
+ constructor {
+ pd::add_inlet $self list
+
+ set @num_outlets [pd::arg 0 int]
+ if {$@num_outlets < 0} {set @num_outlets 2}
+
+ for {set i 0} {$i < $@num_outlets} {incr i} {
+ pd::add_outlet $self list
+ }
+
+ set @routing {}
+ }
+
+ 0_list {
+ set sel [pd::arg 0 any]
+ set out [expr {$@num_outlets-1}]
+ catch {set out [dict get $@routing $sel]}
+ pd::outlet $self $out list $args
+ }
+
+ 1_add {
+ set sel [pd::arg 0 any]
+ set out [pd::arg 1 int]
+ if {$out < 0 || $out >= $@num_outlets} {
+ pd::post "error: add: outlet number out of range"
+ return
+ }
+ dict set @routing $sel $out
+ }
+
+ 1_remove {
+ set sel [pd::arg 0 any]
+ set out [pd::arg 1 int]
+ if {$out < 0 || $out >= $@num_outlets} {
+ pd::post "error: add: outlet number out of range"
+ return
+ }
+ catch {dict unset @routing $sel $out}
+ }
+
+ 1_clear {
+ set @routing {}
+ }
+}