[PD-dev] ugen start/stop (was garray loading)

Sylvain Le Beux artheist at gmail.com
Tue Apr 1 17:40:28 CEST 2008


Ok, I found out that the switch~ external was doing exactly what I wanted,
sorry for the spam.
However, I still wonder why this is a workaround, rather than a feature. I
found out on the pd-dev archive, that the clicking with arrays was an issue.
So I guess I am not the only one facing those problems. I first tought that
the switch~ object was too cpu greedy, but it doesn't change anything ...
Just a thought

Best

S.

2008/4/1, Sylvain Le Beux <artheist at gmail.com>:
>
> Hi,
>
> I think I figured out how dsp on/off was handling with garrays. Let's
> climb up hierachies.
> So, the generic setarray function (that can be found in most of externals
> dealing with arrays) use the function :
>
> garray_usedindsp(x);
>
> This function is defined in g_array.c like this :
>
> void garray_usedindsp(t_garray *x)
> {
>     x->x_usedindsp = 1;
> }
>
> This usedindsp flag then sets the following (still in g_array.c) :
>
> if (x->x_usedindsp)
>         canvas_update_dsp();
>
> Let's then look at canvas_update_dsp function, defined in g_canvas.c :
>
> void canvas_update_dsp(void)
> {
>     if (canvas_dspstate) canvas_start_dsp();
> }
>
> I guess canvas_dspstate is one on dsp start and zero on dsp off ...
> So when turning dsp on, it launches canvas_start_dsp, allright.
>
> static void canvas_start_dsp(void)
> {
>     t_canvas *x;
>     if (canvas_dspstate) ugen_stop();
>     else sys_gui("pdtk_pd_dsp ON\n");
>     ugen_start();
>
>     for (x = canvas_list; x; x = x->gl_next)
>         canvas_dodsp(x, 1, 0);
>
>     canvas_dspstate = 1;
> }
>
> We're almost at it, so the first thing is that when turning dsp on, it
> turns ugen off, which seems quite strange to me, but I supposed it's for
> being sure
> and then is start the ugen. Ok, well, why not.
> Let's now have a look at d_ugen.c
>
> void ugen_stop(void)
> {
>     t_signal *s;
>     int i;
>     if (dsp_chain)
>     {
>         freebytes(dsp_chain, dsp_chainsize * sizeof (t_int));
>         dsp_chain = 0;
>     }
>     signal_cleanup();
>
> }
>
> void ugen_start(void)
> {
>     ugen_stop();
>     ugen_sortno++;
>     dsp_chain = (t_int *)getbytes(sizeof(*dsp_chain));
>     dsp_chain[0] = 0;
>     dsp_chainsize = 1;
>     if (ugen_currentcontext) bug("ugen_start");
> }
>
> So,here we are, when turning dsp on, we anyway call ugen_start, which stop
> the ugen, and here is the problem I have.
> When executing ugen_stop, it flushes out the dspchain buffer, argh ... and
> does the signal_cleanup
> So, it results for me in a click anytime I restart the dsp, because
> previous unfinished buffer was flushed out beforehand.
> But, I also saw that just below definition of signal_cleanup function,
> lies a function called signal_makereusable.
> Does this mean that it is possible to freeze and/or save the current state
> of any signal before switching dsp off ?
> If yes, where should this function lie ?
> Sorry for my poor knowledge of internal Pd dsp functions.
>
> Best
>
> Sylvain
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-dev/attachments/20080401/934dcb6f/attachment.htm>


More information about the Pd-dev mailing list