From 955b2370cc5f754f4eaef41b4d1f0c9e4a5ae7c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 14 Aug 2009 14:57:17 +0000 Subject: new object [multireceive] that is like [receive] but for multiple receive-names (settable) svn path=/trunk/externals/zexy/; revision=11909 --- src/multireceive.c | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/z_zexy.c | 1 + src/z_zexy.h | 1 + 3 files changed, 160 insertions(+) create mode 100644 src/multireceive.c diff --git a/src/multireceive.c b/src/multireceive.c new file mode 100644 index 0000000..9e4c7f0 --- /dev/null +++ b/src/multireceive.c @@ -0,0 +1,158 @@ +/****************************************************** + * + * zexy - implementation file + * + * copyleft (c) IOhannes m zmölnig + * + * 1999:forum::für::umläute:2009 + * + * institute of electronic music and acoustics (iem) + * + ****************************************************** + * + * license: GNU General Public License v.2 + * + ******************************************************/ + +/* +*/ + + +#include "zexy.h" + +/* -------------------------- multireceive ------------------------------ */ + +static t_class *multireceive_class=NULL; +static t_class *multireceive_proxy_class=NULL; + +typedef struct _symlist +{ + t_symbol*s; + struct _symlist*next; +} t_symlist; + +typedef struct _multireceive_proxy +{ + t_object x_obj; + struct _multireceive*x_parent; +} t_multireceive_proxy; + +typedef struct _multireceive +{ + t_object x_obj; + t_multireceive_proxy*x_proxy; + t_symlist*x_symlist; + t_outlet *x_out; +} t_multireceive; + +static void multireceive_any(t_multireceive_proxy *x, t_symbol*s, int argc, t_atom*argv) +{ + outlet_anything(x->x_parent->x_out, s, argc, argv); +} + +static void multireceive_add(t_multireceive *x, t_symbol*s) { + t_symlist*sl=x->x_symlist; + t_symlist*element=NULL; + + if(sl) { + while(sl->next) { + if(s==sl->s) { + // already bound to this symbol + return; + } + sl=sl->next; + } + } + + element=(t_symlist*)getbytes(sizeof(t_symlist)); + element->s=s; + element->next=NULL; + pd_bind(&x->x_proxy->x_obj.ob_pd, s); + + if(sl) { + sl->next=element; + } else { + x->x_symlist=element; + } +} + +static void multireceive_clear(t_multireceive *x) { + t_symlist*sl=x->x_symlist; + t_symlist*current=NULL; + while(sl) { + current=sl; + sl=sl->next; + + pd_unbind(&x->x_proxy->x_obj.ob_pd, current->s); + + current->s=NULL; + current->next=NULL; + freebytes(current, sizeof(t_symlist)); + } + x->x_symlist=NULL; +} + + +static void multireceive_set(t_multireceive *x, t_symbol*s, int argc, t_atom*argv) +{ + multireceive_clear(x); + + while(argc-->0) { + t_symbol*s=atom_getsymbol(argv); + if(A_SYMBOL==argv->a_type) { + multireceive_add(x, s); + } else { + verbose(1, "[multireceive]: ignoring non-symbol receive name"); + } + argv++; + } + +} + +static void multireceive_free(t_multireceive *x) +{ + multireceive_clear(x); + pd_free((t_pd *)x->x_proxy); + outlet_free(x->x_out); + x->x_out=NULL; +} + +static void *multireceive_new(t_symbol *s, int argc, t_atom *argv) +{ + t_multireceive *x = (t_multireceive *)pd_new(multireceive_class); + x->x_proxy=(t_multireceive_proxy*)pd_new(multireceive_proxy_class); + x->x_proxy->x_parent=x; + x->x_symlist=NULL; + x->x_out = outlet_new(&x->x_obj, 0); + + multireceive_set(x, 0, argc, argv); + return (x); +} + +void multireceive_setup(void) +{ + multireceive_class = class_new(gensym("multireceive"), + (t_newmethod)multireceive_new, + (t_method)multireceive_free, + sizeof(t_multireceive), + 0, + A_GIMME, 0); + class_addmethod(multireceive_class, + (t_method)multireceive_set, + gensym("set"), + A_GIMME, 0); + + class_addmethod(multireceive_class, + (t_method)multireceive_add, + gensym("add"), + A_SYMBOL, 0); + + multireceive_proxy_class = class_new(gensym("multireceive proxy"), + 0, 0, + sizeof(t_multireceive_proxy), + CLASS_PD | CLASS_NOINLET, 0); + + class_addanything(multireceive_proxy_class, multireceive_any); + + zexy_register("multireceive"); +} diff --git a/src/z_zexy.c b/src/z_zexy.c index 7456202..340cd61 100644 --- a/src/z_zexy.c +++ b/src/z_zexy.c @@ -51,6 +51,7 @@ void z_zexy_setup(void) multiline_tilde_setup(); /* multiline~ */ multiplex_tilde_setup(); /* multiplex~ */ multiplex_setup(); /* multiplex */ + multireceive_setup(); /* multireceive */ niagara_setup(); /* niagara */ noish_tilde_setup(); /* noish~ */ noisi_tilde_setup(); /* noisi~ */ diff --git a/src/z_zexy.h b/src/z_zexy.h index 310a168..81febdf 100644 --- a/src/z_zexy.h +++ b/src/z_zexy.h @@ -49,6 +49,7 @@ void msgfile_setup(void); /* msgfile */ void multiline_tilde_setup(void); /* multiline~ */ void multiplex_tilde_setup(void); /* multiplex~ */ void multiplex_setup(void); /* multiplex */ +void multireceive_setup(void); /* multireceive */ void niagara_setup(void); /* niagara */ void noish_tilde_setup(void); /* noish~ */ void noisi_tilde_setup(void); /* noisi~ */ -- cgit v1.2.1