Skip to content
Snippets Groups Projects
Commit 37c0cf15 authored by Ivica Bukvic's avatar Ivica Bukvic
Browse files

bug fix/improvement of select object...

bug fix/improvement of select object (http://sourceforge.net/tracker/?func=detail&aid=3605240&group_id=55736&atid=478072)
parent b9d6f6cd
No related branches found
No related tags found
No related merge requests found
...@@ -323,14 +323,41 @@ static void receive_setup(void) ...@@ -323,14 +323,41 @@ static void receive_setup(void)
static t_class *sel1_class; static t_class *sel1_class;
static t_class *sel1_proxy_class;
typedef struct _sel1_proxy
{
t_pd l_pd;
void *parent;
} t_sel1_proxy;
typedef struct _sel1 typedef struct _sel1
{ {
t_object x_obj; t_object x_obj;
t_atom x_atom; t_atom x_atom;
t_outlet *x_outlet1; t_outlet *x_outlet1;
t_outlet *x_outlet2; t_outlet *x_outlet2;
t_sel1_proxy x_pxy;
} t_sel1; } t_sel1;
static void sel1_proxy_init(t_sel1_proxy *x, t_sel1 *p)
{
x->l_pd = sel1_proxy_class;
x->parent = (void *)p;
}
static void sel1_proxy_float(t_sel1_proxy *x, t_float f)
{
t_sel1 *p = (t_sel1 *)x->parent;
SETFLOAT(&p->x_atom, f);
}
static void sel1_proxy_symbol(t_sel1_proxy *x, t_symbol *s)
{
t_sel1 *p = (t_sel1 *)x->parent;
SETSYMBOL(&p->x_atom, s);
}
static void sel1_float(t_sel1 *x, t_float f) static void sel1_float(t_sel1 *x, t_float f)
{ {
if (x->x_atom.a_type == A_FLOAT && f == x->x_atom.a_w.w_float) if (x->x_atom.a_type == A_FLOAT && f == x->x_atom.a_w.w_float)
...@@ -367,14 +394,14 @@ static void sel2_float(t_sel2 *x, t_float f) ...@@ -367,14 +394,14 @@ static void sel2_float(t_sel2 *x, t_float f)
{ {
t_selectelement *e; t_selectelement *e;
int nelement; int nelement;
if (x->x_type == A_FLOAT || x->x_mixed == 1) if (x->x_type == A_FLOAT || x->x_mixed)
{ {
for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++) for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++)
if (e->e_atom.a_type == A_FLOAT && e->e_atom.a_w.w_float == f) if (e->e_atom.a_type == A_FLOAT && e->e_atom.a_w.w_float == f)
{ {
outlet_bang(e->e_outlet); outlet_bang(e->e_outlet);
return; return;
} }
} }
outlet_float(x->x_rejectout, f); outlet_float(x->x_rejectout, f);
} }
...@@ -387,10 +414,10 @@ static void sel2_symbol(t_sel2 *x, t_symbol *s) ...@@ -387,10 +414,10 @@ static void sel2_symbol(t_sel2 *x, t_symbol *s)
{ {
for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++) for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++)
if (e->e_atom.a_type == A_SYMBOL && e->e_atom.a_w.w_symbol == s) if (e->e_atom.a_type == A_SYMBOL && e->e_atom.a_w.w_symbol == s)
{ {
outlet_bang(e->e_outlet); outlet_bang(e->e_outlet);
return; return;
} }
} }
outlet_symbol(x->x_rejectout, s); outlet_symbol(x->x_rejectout, s);
} }
...@@ -414,16 +441,12 @@ static void *select_new(t_symbol *s, int argc, t_atom *argv) ...@@ -414,16 +441,12 @@ static void *select_new(t_symbol *s, int argc, t_atom *argv)
t_sel1 *x = (t_sel1 *)pd_new(sel1_class); t_sel1 *x = (t_sel1 *)pd_new(sel1_class);
x->x_atom = *argv; x->x_atom = *argv;
x->x_outlet1 = outlet_new(&x->x_obj, &s_bang); x->x_outlet1 = outlet_new(&x->x_obj, &s_bang);
sel1_proxy_init(&x->x_pxy, x);
inlet_new(&x->x_obj, &x->x_pxy.l_pd, 0, 0);
if (argv->a_type == A_FLOAT) if (argv->a_type == A_FLOAT)
{
floatinlet_new(&x->x_obj, &x->x_atom.a_w.w_float);
x->x_outlet2 = outlet_new(&x->x_obj, &s_float); x->x_outlet2 = outlet_new(&x->x_obj, &s_float);
}
else else
{
symbolinlet_new(&x->x_obj, &x->x_atom.a_w.w_symbol);
x->x_outlet2 = outlet_new(&x->x_obj, &s_symbol); x->x_outlet2 = outlet_new(&x->x_obj, &s_symbol);
}
return (x); return (x);
} }
else else
...@@ -432,26 +455,24 @@ static void *select_new(t_symbol *s, int argc, t_atom *argv) ...@@ -432,26 +455,24 @@ static void *select_new(t_symbol *s, int argc, t_atom *argv)
t_selectelement *e; t_selectelement *e;
t_sel2 *x = (t_sel2 *)pd_new(sel2_class); t_sel2 *x = (t_sel2 *)pd_new(sel2_class);
x->x_nelement = argc; x->x_nelement = argc;
x->x_type = argv[0].a_type; x->x_type = argv[0].a_type;
t_int f,s = 0; t_int f, s = 0;
x->x_vec = (t_selectelement *)getbytes(argc * sizeof(*x->x_vec)); x->x_vec = (t_selectelement *)getbytes(argc * sizeof(*x->x_vec));
for (n = 0, e = x->x_vec; n < argc; n++, e++) for (n = 0, e = x->x_vec; n < argc; n++, e++)
{ {
e->e_outlet = outlet_new(&x->x_obj, &s_bang); e->e_outlet = outlet_new(&x->x_obj, &s_bang);
if (argv[n].a_type == A_FLOAT) if (argv[n].a_type == A_FLOAT)
{ {
e->e_atom.a_w.w_float = atom_getfloatarg(n, argc, argv); SETFLOAT(&e->e_atom, atom_getfloatarg(n, argc, argv));
e->e_atom.a_type = A_FLOAT; f = 1;
f = 1; }
}
else else
{ {
e->e_atom.a_w.w_symbol = atom_getsymbolarg(n, argc, argv); SETSYMBOL(&e->e_atom, atom_getsymbolarg(n, argc, argv));
e->e_atom.a_type = A_SYMBOL; s = 1;
s = 1; }
}
} }
x->x_mixed = f * s; x->x_mixed = f * s;
x->x_rejectout = outlet_new(&x->x_obj, &s_float); x->x_rejectout = outlet_new(&x->x_obj, &s_float);
return (x); return (x);
} }
...@@ -460,6 +481,10 @@ static void *select_new(t_symbol *s, int argc, t_atom *argv) ...@@ -460,6 +481,10 @@ static void *select_new(t_symbol *s, int argc, t_atom *argv)
void select_setup(void) void select_setup(void)
{ {
sel1_proxy_class = class_new(gensym("select_inlet"),
0, 0, sizeof(t_sel1_proxy), 0, 0);
class_addfloat(sel1_proxy_class, (t_method)sel1_proxy_float);
class_addsymbol(sel1_proxy_class, (t_method)sel1_proxy_symbol);
sel1_class = class_new(gensym("select"), 0, 0, sel1_class = class_new(gensym("select"), 0, 0,
sizeof(t_sel1), 0, 0); sizeof(t_sel1), 0, 0);
class_addfloat(sel1_class, sel1_float); class_addfloat(sel1_class, sel1_float);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment