aboutsummaryrefslogtreecommitdiff
path: root/src/unpack.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/unpack.c')
-rw-r--r--src/unpack.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/unpack.c b/src/unpack.c
new file mode 100644
index 0000000..5c1f7b1
--- /dev/null
+++ b/src/unpack.c
@@ -0,0 +1,104 @@
+/******************************************************
+ *
+ * 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
+ *
+ ******************************************************/
+
+
+/* 2305:forum::für::umläute:2001 */
+
+#include "zexy.h"
+#include <string.h>
+
+/* ------------------------- zunpack ------------------------------- */
+
+/* convert anythings to lists, pass through the rest */
+
+static t_class *zunpack_class;
+
+typedef struct _zunpack
+{
+ t_object x_obj;
+ t_outlet**x_out;
+ t_int*x_index;
+ t_int x_numouts;
+} t_zunpack;
+
+static void zunpack_list(t_zunpack *x, t_symbol *s, int argc, t_atom *argv)
+{
+ int count=(argc<(x->x_numouts))?argc:x->x_numouts;
+
+ while(count--) {
+ outlet_list(x->x_out[count], gensym("list"), 1, argv+count);
+ }
+
+}
+
+static void zunpack_bang(t_zunpack *x)
+{
+ outlet_bang(x->x_out[0]);
+}
+
+static void zunpack_free(t_zunpack *x)
+{
+ int i=0;
+ for(i=0; i<x->x_numouts; i++) {
+ outlet_free(x->x_out[i]);
+ }
+ freebytes(x->x_index, x->x_numouts*sizeof(t_int));
+ freebytes(x->x_out, x->x_numouts*sizeof(t_outlet*));
+
+ x->x_numouts=0;
+ x->x_index=0;
+ x->x_out=0;
+}
+
+static void *zunpack_new(t_symbol*s, int argc, t_atom*argv)
+{
+ t_zunpack *x = (t_zunpack *)pd_new(zunpack_class);
+ int count=(argc>0)?argc:2;
+ int i=0;
+
+ x->x_numouts=count;
+ x->x_index=(t_int*) getbytes(count*sizeof(t_int));
+ x->x_out=(t_outlet**)getbytes(count*sizeof(t_outlet*));
+
+ for(i=0; i<count; i++) {
+ x->x_out[i] =outlet_new(&x->x_obj, 0);
+ x->x_index[i]=count;
+ if(i<argc && argv[i].a_type == A_FLOAT) {
+ x->x_index[i]=atom_getint(argv+i);
+ }
+ }
+
+ return (x);
+}
+
+void zunpack_setup(void)
+{
+
+ zunpack_class = class_new(gensym("unpack"),
+ (t_newmethod)zunpack_new, (t_method)zunpack_free, sizeof(t_zunpack),
+ 0, A_GIMME, 0);
+ class_addcreator((t_newmethod)zunpack_new, gensym("zexy/unpack"), A_GIMME, 0);
+
+ class_addbang(zunpack_class, zunpack_bang);
+ class_addlist(zunpack_class, zunpack_list);
+
+ zexy_register("unpack");
+}
+
+void unpack_setup(void)
+{
+ zunpack_setup();
+}