1
/******************************************************
3
* zexy - implementation file
5
* copyleft (c) IOhannes m zm�lnig
7
* 1999:forum::f�r::uml�ute:2005
9
* institute of electronic music and acoustics (iem)
11
******************************************************
13
* license: GNU General Public License v.2
15
******************************************************/
18
(c) 2106:forum::f�r::uml�ute:2005
20
"relay" is like "relay" but doesn't change the incoming list
23
[foo bar( --> [relay foo] --> [bar(
24
[foo bar( --> [relay foo] --> [foor bar(
27
direct, channel, relay, steer, guide, ??
29
in the meantime i choose [relay] (as in mail-relay)
36
/* -------------------------- relay ------------------------------ */
38
static t_class *relay_class;
40
typedef struct _relayelement
51
t_relayelement *x_vec;
52
t_outlet *x_rejectout;
55
static void relay_anything(t_relay *x, t_symbol *sel, int argc, t_atom *argv)
59
if (x->x_type == A_SYMBOL)
61
for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++)
62
if (e->e_w.w_symbol == sel)
64
outlet_anything(e->e_outlet, sel, argc, argv);
68
outlet_anything(x->x_rejectout, sel, argc, argv);
71
static void relay_list(t_relay *x, t_symbol *sel, int argc, t_atom *argv)
75
if (x->x_type == A_FLOAT)
79
outlet_bang(x->x_rejectout);
82
f = atom_getfloat(argv);
83
for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++)
84
if (e->e_w.w_float == f)
86
outlet_anything(e->e_outlet, sel, argc, argv);
90
else /* symbol arguments */
92
if (argc == 0) /* no args: treat as "bang" */
94
for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++)
96
if (e->e_w.w_symbol == &s_bang)
98
outlet_bang(e->e_outlet);
105
for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++)
107
if (e->e_w.w_symbol == &s_list)
109
outlet_anything(e->e_outlet, sel, argc, argv);
114
else if (argv[0].a_type == A_FLOAT) /* one float arg */
116
for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++)
118
if (e->e_w.w_symbol == &s_float)
120
outlet_float(e->e_outlet, argv[0].a_w.w_float);
127
for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++)
129
if (e->e_w.w_symbol == &s_symbol)
131
outlet_symbol(e->e_outlet, argv[0].a_w.w_symbol);
137
outlet_list(x->x_rejectout, &s_list, argc, argv);
141
static void relay_free(t_relay *x)
143
freebytes(x->x_vec, x->x_nelement * sizeof(*x->x_vec));
146
static void *relay_new(t_symbol *s, int argc, t_atom *argv)
150
t_relay *x = (t_relay *)pd_new(relay_class);
159
x->x_type = argv[0].a_type;
160
x->x_nelement = argc;
161
x->x_vec = (t_relayelement *)getbytes(argc * sizeof(*x->x_vec));
162
for (n = 0, e = x->x_vec; n < argc; n++, e++)
164
e->e_outlet = outlet_new(&x->x_obj, &s_list);
165
if (x->x_type == A_FLOAT)
166
e->e_w.w_float = atom_getfloatarg(n, argc, argv);
167
else e->e_w.w_symbol = atom_getsymbolarg(n, argc, argv);
169
x->x_rejectout = outlet_new(&x->x_obj, &s_list);
173
void relay_setup(void)
175
relay_class = class_new(gensym("relay"), (t_newmethod)relay_new,
176
(t_method)relay_free, sizeof(t_relay), 0, A_GIMME, 0);
177
class_addlist(relay_class, relay_list);
178
class_addanything(relay_class, relay_anything);
179
zexy_register("relay");