<div class="gmail_quote">On Tue, Feb 8, 2011 at 6:34 AM, Hans-Christoph Steiner <span dir="ltr">&lt;<a href="mailto:hans@at.or.at" target="_blank">hans@at.or.at</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div style="word-wrap:break-word"><div><br></div><div>I forgot to add, if you want to read a file to load a patch, my guess is that you&#39;ll want to return a t_glist.</div><div><br></div></div></blockquote><div><br></div>

<div>Hm, I actually didn&#39;t even think I could write my own function for evaluating a patch until you mentioned this, but now I see that everything glob_evalfile is doing is also publicly available, and there is no need to hamper with it (unless others think that it _should_ return its t_pd *x).  So.. sweet!  I got a nice objective C class going that manages multiple copies of the same patch, and can talk to each one in private.. will talk more about that on the Pd Everywhere (libpd) mailing list.</div>
<div><br></div><div>Cheers,</div><div>Rich</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div><div>On Feb 6, 2011, at 2:15 AM, Rich E wrote:</div>

<br></div><blockquote type="cite"><div><div></div><div>Update to this: it seems that I can just use t_pd pointers to open and close the patches, although I still need to return the t_pd *x pointer from glob_evalfile().  I don&#39;t know which method is best for opening/closing, with t_canvas or t_pd..  <div>

 <br></div><div>The new methods look like this:</div><div><br></div><div><div>t_pd *glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir)</div><div>{</div><div>    t_pd *x = 0;</div><div>    t_pd *x_loaded = 0;</div>

 <div><br></div><div><span style="white-space:pre-wrap">        </span>/* even though binbuf_evalfile appears to take care of dspstate,</div><div><span style="white-space:pre-wrap">        </span> we have to do it again here, because canvas_startdsp() assumes</div>

 <div><span style="white-space:pre-wrap">        </span> that all toplevel canvases are visible.  LATER check if this</div><div><span style="white-space:pre-wrap">        </span> is still necessary -- probably not. */</div> <div><span style="white-space:pre-wrap">        </span></div>

<div>    int dspstate = canvas_suspend_dsp();</div><div>    binbuf_evalfile(name, dir);</div><div><span style="white-space:pre-wrap">        </span></div> <div>    while ((x != s__X.s_thing) &amp;&amp; (x = s__X.s_thing)) </div>

<div>    {</div><div><span style="white-space:pre-wrap">        </span>vmess(x, gensym(&quot;pop&quot;), &quot;i&quot;, 1);</div><div><span style="white-space:pre-wrap">        </span>x_loaded = x;</div> <div>    }</div><div>    pd_doloadbang();</div>

<div>    canvas_resume_dsp(dspstate);</div><div>    return x_loaded;</div><div>}</div></div><div><br></div><div><div>t_pd *libpd_openfile(const char *basename, const char *dirname) {</div> <div><span style="white-space:pre-wrap">        </span>t_pd *x = glob_evalfile(0, gensym(basename), gensym(dirname));</div>

<div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">        </span>pd_pushsym(x);</div> <div><span style="white-space:pre-wrap">        </span>int dzero = canvas_getdollarzero();<span style="white-space:pre-wrap">        </span></div>

<div><span style="white-space:pre-wrap">        </span>pd_popsym(x);</div> <div><br></div><div><span style="white-space:pre-wrap">        </span>return x;</div><div>}</div><div><br></div><div>void libpd_closefile(t_pd *x) {</div><div>
<span style="white-space:pre-wrap">        </span>pd_free(x);</div>
 <div>}</div><div><br></div><div><br></div><div>I would appreciate any feedback/suggestions from you guys who know the pd API much, much more thoroughly that myself.</div><div><br></div><div>Cheers,</div><div>Rich</div><br>

 <div class="gmail_quote">On Sun, Feb 6, 2011 at 4:49 PM, Rich E <span dir="ltr">&lt;<a href="mailto:reakinator@gmail.com" target="_blank">reakinator@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

 I can&#39;t remember, are questions related to pd&#39;s C API appropriate for pd-list, or are they better asked here?  It seems that everyone who responds to those questions is on this list just as much, anyway.<br><br>
I have been mucking around with opening and closing pd patches using API calls instead of pd&#39;s messaging system.  The reason for this is that I would like to be able to manage (open/close) multiple instances of a patch, and be able to send each copy of the patch a unique message via its $0 argument (see <a href="http://www.mail-archive.com/pd-list@iem.at/msg41648.html" target="_blank">http://www.mail-archive.com/pd-list@iem.at/msg41648.html</a>).  So far, the method has been to hack glob_evalfile to look like:<br>

 <br><div><div><div>t_canvas *glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir)</div><div>{</div><div>    t_pd *x = 0;</div><div><span style="white-space:pre-wrap">        </span>/* even though binbuf_evalfile appears to take care of dspstate,</div>

 <div><span style="white-space:pre-wrap">        </span> we have to do it again here, because canvas_startdsp() assumes</div><div><span style="white-space:pre-wrap">        </span> that all toplevel canvases are visible.  LATER check if this</div>

 <div><span style="white-space:pre-wrap">        </span> is still necessary -- probably not. */</div><div><span style="white-space:pre-wrap">        </span></div><div>    t_canvas *x_canvas = 0; </div> <div><span style="white-space:pre-wrap">        </span></div>

<div>    int dspstate = canvas_suspend_dsp();</div><div>    binbuf_evalfile(name, dir);</div><div><span style="white-space:pre-wrap">        </span></div> <div><span style="white-space:pre-wrap">        </span>while ((x != s__X.s_thing) &amp;&amp; (x = s__X.s_thing)) </div>

<div><span style="white-space:pre-wrap">        </span>{</div><div><span style="white-space:pre-wrap">                </span>x_canvas = canvas_getcurrent();</div> <div><span style="white-space:pre-wrap">                </span>vmess(x, gensym(&quot;pop&quot;), &quot;i&quot;, 1);</div>

<div><span style="white-space:pre-wrap">        </span>}</div><div>    pd_doloadbang();</div> <div>    canvas_resume_dsp(dspstate);</div><div>    return x_canvas;</div><div>}</div></div><div><br></div><div>The only addition is that x_canvas is retrieved before x is &#39;popped&#39; off of pd&#39;s global stack, and is then returned, giving me a handle to close that particular patch with something like:</div>

 </div><div><br></div><div>canvas_menuclose(x_canvas, 0);</div><div><br></div><div>But I realize that in global_evalfile, t_pd and x_canvas point to the same address space.  This leads me to ask, what is the difference between these two pointers?  Is t_canvas a t_pd along with variables for its graphical nature?</div>

 <div><br></div><div>Mathieu also pointed to me (as I was using the first set of these) that canvas_setcurrent() and canvas_unsetcurrent() are aliases of pd_pushsym() and pd_popsym().  Is there a good reason to use one over the other?   </div>

 <div><br></div><div>Last question:  Does anyone see a way that I could get the value of x in glob_evalfile above without changing the function?  I don&#39;t think it is a dangerous change (and it looks like I could just hand x.gl_pd to canvas_menuclose, thereby not really needing a t_canvas pointer), but I would of course prefer to not change the API if possible.</div>

 <div><br></div><div>Cheers,<br><font color="#888888">Rich</font></div> </blockquote></div><br></div></div></div><div> _______________________________________________<br>Pd-dev mailing list<br><a href="mailto:Pd-dev@iem.at" target="_blank">Pd-dev@iem.at</a><br>

<a href="http://lists.puredata.info/listinfo/pd-dev" target="_blank">http://lists.puredata.info/listinfo/pd-dev</a><br></div></blockquote></div><br><div> <span style="border-collapse:separate;border-spacing:0px 0px;color:rgb(0, 0, 0);font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:auto;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><div style="word-wrap:break-word">

<br><div><br></div><div>----------------------------------------------------------------------------</div><div><br></div><div>Terrorism is not an enemy.  It cannot be defeated.  It&#39;s a tactic.  It&#39;s about as sensible to say we declare war on night attacks and expect we&#39;re going to win that war.  We&#39;re not going to win the war on terrorism.        - retired U.S. Army general, William Odom</div>

<br></div></span> </div><br></div></blockquote></div><br>