aboutsummaryrefslogtreecommitdiff
path: root/src/demultiplex.c
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2005-03-22 20:58:25 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2005-03-22 20:58:25 +0000
commit2b60d55c919e7588f5aff15936e83c300b3660bb (patch)
tree14d860de7f28083d3756ad91b627de70f26788f6 /src/demultiplex.c
parentc500bc542cb7cc78d6dac3f7da3bff626056b1aa (diff)
zexy-2.0:
- use of abstractions for objects that allow it - some objects are build both as externals and abstractions (as slower fallbacks) - code-layout is now 1:1 c-file<->object (this should allow for building of zexy as a collection of externals instead as a big library) - matrix-objects have moved to iemmatrix !! svn path=/trunk/externals/zexy/; revision=2641
Diffstat (limited to 'src/demultiplex.c')
-rw-r--r--src/demultiplex.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/demultiplex.c b/src/demultiplex.c
new file mode 100644
index 0000000..ff26b5d
--- /dev/null
+++ b/src/demultiplex.c
@@ -0,0 +1,115 @@
+/******************************************************
+ *
+ * zexy - implementation file
+ *
+ * copyleft (c) IOhannes m zmölnig
+ *
+ * 1999:forum::für::umläute:2004
+ *
+ * institute of electronic music and acoustics (iem)
+ *
+ ******************************************************
+ *
+ * license: GNU General Public License v.2
+ *
+ ******************************************************/
+
+
+/* 1509:forum::für::umläute:2000 */
+
+/*
+ demux : multiplex the input to a specified output
+
+ TODO:: mux : demultiplex a specified input to the output
+*/
+
+#include "zexy.h"
+#include <stdio.h>
+
+/* ------------------------- demux ------------------------------- */
+
+/*
+ a demultiplexer
+*/
+
+static t_class *demux_class;
+
+typedef struct _demux
+{
+ t_object x_obj;
+
+ int n_out;
+ t_outlet **out, *selected;
+
+
+} t_demux;
+
+static void demux_select(t_demux *x, t_float f)
+{
+ int n = ( (f<0) || (f>x->n_out) ) ? 0 : f;
+ x->selected = x->out[n];
+}
+
+static void demux_list(t_demux *x, t_symbol *s, int argc, t_atom *argv)
+{
+ switch (argc) {
+ case 0:
+ outlet_bang(x->selected);
+ break;
+ case 1:
+ switch (argv->a_type) {
+ case A_FLOAT:
+ outlet_float(x->selected, atom_getfloat(argv));
+ break;
+ case A_SYMBOL:
+ outlet_symbol(x->selected, atom_getsymbol(argv));
+ break;
+ case A_POINTER:
+ outlet_pointer(x->selected, argv->a_w.w_gpointer);
+ break;
+ default:
+ outlet_list(x->selected, s, argc, argv);
+ }
+ break;
+ default:
+ outlet_list(x->selected, s, argc, argv);
+ }
+}
+static void demux_any(t_demux *x, t_symbol *s, int argc, t_atom *argv)
+{
+ outlet_anything(x->selected, s, argc, argv);
+}
+
+static void *demux_new(t_symbol *s, int argc, t_atom *argv)
+{
+ t_demux *x = (t_demux *)pd_new(demux_class);
+ int n = (argc < 2)?2:argc;
+
+ x->n_out = n - 1;
+
+ inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("select"));
+ x->out = (t_outlet **)getbytes(n * sizeof(t_outlet *));
+
+ for (n=0; n<=x->n_out; n++) {
+ x->out[n] = outlet_new(&x->x_obj, 0);
+ }
+
+ x->selected = x->out[0];
+
+ return (x);
+}
+
+void demultiplex_setup(void)
+{
+ demux_class = class_new(gensym("demultiplex"), (t_newmethod)demux_new,
+ 0, sizeof(t_demux), 0, A_GIMME, 0);
+ class_addcreator((t_newmethod)demux_new, gensym("demux"), A_GIMME, 0);
+
+ class_addanything (demux_class, demux_any);
+ class_addlist (demux_class, demux_list);
+
+ class_addmethod (demux_class, (t_method)demux_select, gensym("select"), A_DEFFLOAT, 0);
+
+ class_sethelpsymbol(demux_class, gensym("zexy/demultiplex"));
+ zexy_register("demultiplex");
+}