Skip to content

Commit

Permalink
clone~ working, but not yet reloading when abstraction saved
Browse files Browse the repository at this point in the history
  • Loading branch information
millerpuckette committed Apr 11, 2016
1 parent 4772bc2 commit 7e29725
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 19 deletions.
8 changes: 5 additions & 3 deletions src/d_ugen.c
Expand Up @@ -549,9 +549,9 @@ static int ugen_sortno = 0;
static t_dspcontext *ugen_currentcontext;

/* get a new signal for the current context - used by clone~ object */
t_signal *signal_newfromcontext( void)
t_signal *signal_newfromcontext(int borrowed)
{
return (signal_new(ugen_currentcontext->dc_calcsize,
return (signal_new((borrowed? 0 : ugen_currentcontext->dc_calcsize),
ugen_currentcontext->dc_srate));
}

Expand Down Expand Up @@ -673,7 +673,9 @@ void ugen_connect(t_dspcontext *dc, t_object *x1, int outno, t_object *x2,
for (u2 = dc->dc_ugenlist; u2 && u2->u_obj != x2; u2 = u2->u_next);
if (!u1 || !u2 || siginno < 0)
{
pd_error(u1->u_obj,
if (!u1)
error("object with signal outlets but no DSP method?");
else pd_error(u1->u_obj,
"signal outlet connect to nonsignal inlet (ignored)");
return;
}
Expand Down
42 changes: 31 additions & 11 deletions src/g_clone.c
Expand Up @@ -192,8 +192,18 @@ static void clone_click(t_clone *x, t_floatarg xpos, t_floatarg ypos,
clone_vis(x, 0, 1);
}

static void clone_loadbang(t_clone *x, t_floatarg f)
{
int i;
for (i = 0; i < x->x_n; i++)
if (f == LB_LOAD)
canvas_loadbang(x->x_vec[i].c_x);
else if (f == LB_CLOSE)
canvas_closebang(x->x_vec[i].c_x);
}

void canvas_dodsp(t_canvas *x, int toplevel, t_signal **sp);
t_signal *signal_newfromcontext( void);
t_signal *signal_newfromcontext(int borrowed);
void signal_makereusable(t_signal *sig);

static void clone_dsp(t_clone *x, t_signal **sp)
Expand All @@ -207,32 +217,36 @@ static void clone_dsp(t_clone *x, t_signal **sp)
nout++;
t_signal **tempsigs =
(t_signal **)alloca((nin + 3 * nout) * sizeof(*tempsigs));
/* generate 2 * nout output signals */
for (i = 0; i < 2 * nout; i++)
tempsigs[i] = signal_newfromcontext();
/* load input signals into signal vector to send subpatches */
for (i = 0; i < nin; i++)
{
sp[i]->s_refcount += nin;
tempsigs[2 * nout + i] = sp[i];
}
/* for first copy, write output to first nout temp sigs */
for (i = 0; i < nout; i++)
tempsigs[2 * nout + nin + i] = tempsigs[i];
tempsigs[i] = tempsigs[2 * nout + nin + i] = signal_newfromcontext(1);
canvas_dodsp(x->x_vec[0].c_x, 0, tempsigs + 2*nout);
/* for remaining copies, write to second nout temp sigs */
for (i = 0; i < nout; i++)
tempsigs[2 * nout + nin + i] = tempsigs[nout + i];
for (j = 1; j < x->x_n; j++)
{
for (i = 0; i < nout; i++)
tempsigs[nout+i] = tempsigs[2 * nout + nin + i] =
signal_newfromcontext(1);
canvas_dodsp(x->x_vec[j].c_x, 0, tempsigs + 2*nout);
for (i = 0; i < nout; i++)
{
dsp_add_plus(tempsigs[nout + i]->s_vec, tempsigs[i]->s_vec,
tempsigs[i]->s_vec, tempsigs[i]->s_n);
signal_makereusable(tempsigs[nout + i]);
}
}
/* copy to output signsls */
for (i = 0; i < nout; i++)
{
dsp_add_copy(tempsigs[i]->s_vec, sp[nin+i]->s_vec, tempsigs[i]->s_n);
/* release the temporary signals */
for (i = 0; i < 2 * nout; i++)
signal_makereusable(tempsigs[i]);
}
}

static void *clone_new(t_symbol *s, int argc, t_atom *argv)
Expand Down Expand Up @@ -280,8 +294,10 @@ static void *clone_new(t_symbol *s, int argc, t_atom *argv)
x->x_invec[i].i_owner = x;
x->x_invec[i].i_signal = obj_issignalinlet(&x->x_vec[0].c_x->gl_obj, i);
x->x_invec[i].i_n = i;
inlet_new(&x->x_obj, &x->x_invec[i].i_pd,
(x->x_invec[i].i_signal ? &s_signal : 0), 0);
post("in %d, signal %d", i, x->x_invec[i].i_signal);
if (x->x_invec[i].i_signal)
signalinlet_new(&x->x_obj, 0);
else inlet_new(&x->x_obj, &x->x_invec[i].i_pd, 0, 0);
}
x->x_nout = obj_noutlets(&x->x_vec[0].c_x->gl_obj);
x->x_outvec = (t_out *)getbytes(x->x_nout * sizeof(*x->x_outvec));
Expand Down Expand Up @@ -313,6 +329,10 @@ void clone_setup(void)
A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
class_addmethod(clone_class, (t_method)clone_vis, gensym("vis"),
A_FLOAT, A_FLOAT, 0);
class_addmethod(clone_class, (t_method)clone_loadbang, gensym("loadbang"),
A_FLOAT, 0);
class_addmethod(clone_class, (t_method)clone_dsp,
gensym("dsp"), A_CANT, 0);

clone_in_class = class_new(gensym("clone-inlet"), 0, 0,
sizeof(t_in), CLASS_PD, 0);
Expand Down
2 changes: 2 additions & 0 deletions src/g_editor.c
Expand Up @@ -2400,6 +2400,8 @@ static void glist_donewloadbangs(t_glist *x)
for (sel = x->gl_editor->e_selection; sel; sel = sel->sel_next)
if (pd_class(&sel->sel_what->g_pd) == canvas_class)
canvas_loadbang((t_canvas *)(&sel->sel_what->g_pd));
else if (zgetfn(&sel->sel_what->g_pd, gensym("loadbang")))
vmess(&sel->sel_what->g_pd, gensym("loadbang"), "f", LB_LOAD);
}
}

Expand Down
7 changes: 5 additions & 2 deletions src/g_text.c
Expand Up @@ -1386,8 +1386,11 @@ void text_setto(t_text *x, t_glist *glist, char *buf, int bufsize)
canvas_objtext(glist, xwas, ywas, widthwas, 0, b);
canvas_restoreconnections(glist_getcanvas(glist));
/* if it's an abstraction loadbang it here */
if (newest && pd_class(newest) == canvas_class)
canvas_loadbang((t_canvas *)newest);
if (newest)
if (pd_class(newest) == canvas_class)
canvas_loadbang((t_canvas *)newest);
else if (zgetfn(newest, gensym("loadbang")))
vmess(newest, gensym("loadbang"), "f", LB_LOAD);
}
/* if we made a new "pd" or changed a window name,
update window list */
Expand Down
8 changes: 5 additions & 3 deletions src/m_obj.c
Expand Up @@ -637,10 +637,12 @@ int obj_siginletindex(t_object *x, int m)
{
int n = 0;
t_inlet *i;
if (x->ob_pd->c_firstin && x->ob_pd->c_floatsignalin)
if (x->ob_pd->c_firstin)
{
if (!m--) return (0);
n++;
if (!m--)
return (0);
if (x->ob_pd->c_floatsignalin)
n++;
}
for (i = x->ob_inlet; i; i = i->i_next, m--)
if (i->i_symfrom == &s_signal)
Expand Down

0 comments on commit 7e29725

Please sign in to comment.