[PD-dev] more information on the gui getting stuck on 0.42.5
Miller Puckette
mpuckett at imusic1.ucsd.edu
Thu Mar 18 03:25:37 CET 2010
Hi Ivo -
It's unsafe to issue messages from inside a DSP routine, because the
message could eventually cause tables to relocate or even a rebuild of
the DSP chain. The safe thing is to schedule the message using
clock_delay().
examples are snapshot~ and (more complicatedly) fiddle~ and bonk~.
cheers
Miller
On Wed, Mar 17, 2010 at 09:39:44PM -0400, Ivica Ico Bukvic wrote:
> I finally discovered the problem. It is not pd or pd-extended at all. It
> appears that the original implementation of the wiimote object I based
> l2ork's threaded version on was causing these issues as some of its
> output was callback driven from the external cwiid library, rather than
> being "pushed" by the incoming bang signal. I think this makes sense as
> when those messages are thrown out-of-sync in respect to the patch tree
> traversal (or whatever method is being used to do this), all kinds of
> weird things can happen, like seemingly random truncation of messages
> which becomes more prominent when the message activity increases.
>
> Now, that I redesigned the object so that it only outputs stuff through
> non-signal outlets when it receives bang (as it should), I've yet to
> reproduce a problem which would've been otherwise occurring within
> seconds, but only if I used wiimote button messages to trigger gui
> events (keyboard events did not cause any problems whatsoever, which
> seems to speak in favor of the aforesaid explanation).
>
> So, Hans, this perhaps may be the cause of your problems as well--FWIW
> you may want to check any less common pd objects you may be using in
> specific patches and see if they allow for out-of-sync outputs that are
> threaded separately from Pd's signal tree.
>
> BTW, I would also love to hear thoughts from the hardened Pd devs
> regarding this. I haven't had a chance to read carefully through the
> external (design documentation which likely covers this), as my objects
> were mainly alterations of the existing designs.
>
> Speaking of which, I've also implemented a simple alternative version of
> the phasor~ that outputs bang every time it completes a period (or as
> close as it gets to this moment based on pd's audio engine buffer which
> I believe is 64 bytes). Now I am wondering if having a "bang" outputted
> from a non-signal outlet whose triggering is dictated by the dsp thread
> may cause similar problems in the long run and whether I should simply
> stick to vanilla >~ kinds of solutions for this purpose.
>
> Here's the relevant code (which is essentially identical to the built-in
> phasor with one notable exception towards the bottom):
>
> t_int *disis_phasor_perform(t_int *w)
> {
> t_disis_phasor *x = (t_disis_phasor *)(w[1]);
> t_float *in = (t_float *)(w[2]);
> t_float *out = (t_float *)(w[3]);
> int n = (int)(w[4]);
> double dphase = x->x_phase + UNITBIT32;
> union disis_phasor_tabfudge tf;
> int normhipart;
> float conv = x->x_conv;
> tf.tf_d = UNITBIT32;
> normhipart = tf.tf_i[HIOFFSET];
> tf.tf_d = dphase;
>
> while (n--)
> {
> tf.tf_i[HIOFFSET] = normhipart;
> dphase += *in++ * conv;
> *out++ = tf.tf_d - UNITBIT32;
> tf.tf_d = dphase;
> }
> tf.tf_i[HIOFFSET] = normhipart;
> x->x_phase = tf.tf_d - UNITBIT32;
> //here comes the bang inside the dsp thread
> //is this a bad idea?
> if (x->x_phase_delta > 0.5 && x->x_phase < 0.5) outlet_bang(x->b_out);
> x->x_phase_delta = x->x_phase;
> return (w+5);
> }
>
> Any advice on this one, particularly from the Pd-dev gurus would be most
> appreciated!
>
> Best wishes,
>
> Ico
>
>
>
>
> _______________________________________________
> Pd-dev mailing list
> Pd-dev at iem.at
> http://lists.puredata.info/listinfo/pd-dev
More information about the Pd-dev
mailing list