[PD-cvs] SF.net SVN: pure-data:[10496] branches/pd-extended/0.41/pd/src

eighthave at users.sourceforge.net eighthave at users.sourceforge.net
Sat Jan 10 03:18:04 CET 2009


Revision: 10496
          http://pure-data.svn.sourceforge.net/pure-data/?rev=10496&view=rev
Author:   eighthave
Date:     2009-01-10 02:18:04 +0000 (Sat, 10 Jan 2009)

Log Message:
-----------
checked all merges of files that were modified in branches/pd-extended/v0-40
but had no conflicts with the 0.41-4 merge.  Looks like this should all merge
cleanly with no problems.

Modified Paths:
--------------
    branches/pd-extended/0.41/pd/src/g_array.c
    branches/pd-extended/0.41/pd/src/g_editor.c
    branches/pd-extended/0.41/pd/src/g_io.c
    branches/pd-extended/0.41/pd/src/g_readwrite.c
    branches/pd-extended/0.41/pd/src/g_scalar.c
    branches/pd-extended/0.41/pd/src/g_text.c
    branches/pd-extended/0.41/pd/src/m_binbuf.c
    branches/pd-extended/0.41/pd/src/m_class.c
    branches/pd-extended/0.41/pd/src/m_glob.c
    branches/pd-extended/0.41/pd/src/m_sched.c
    branches/pd-extended/0.41/pd/src/s_audio.c
    branches/pd-extended/0.41/pd/src/s_loader.c
    branches/pd-extended/0.41/pd/src/s_midi.c
    branches/pd-extended/0.41/pd/src/s_midi_alsa.c
    branches/pd-extended/0.41/pd/src/s_midi_pm.c
    branches/pd-extended/0.41/pd/src/s_print.c
    branches/pd-extended/0.41/pd/src/t_tkcmd.c
    branches/pd-extended/0.41/pd/src/x_arithmetic.c
    branches/pd-extended/0.41/pd/src/x_connective.c
    branches/pd-extended/0.41/pd/src/x_list.c
    branches/pd-extended/0.41/pd/src/x_midi.c
    branches/pd-extended/0.41/pd/src/x_misc.c
    branches/pd-extended/0.41/pd/src/x_qlist.c

Modified: branches/pd-extended/0.41/pd/src/g_array.c
===================================================================
--- branches/pd-extended/0.41/pd/src/g_array.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/g_array.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -395,7 +395,7 @@
     int flags = fflags;
     int saveit = ((flags & 1) != 0);
     int style = ((flags & 6) >> 1);
-    float stylewas = template_getfloat(
+    t_float stylewas = template_getfloat(
         template_findbyname(x->x_scalar->sc_template),
             gensym("style"), x->x_scalar->sc_vec, 1);
     if (deleteit != 0)
@@ -450,7 +450,7 @@
         else if (style != stylewas)
             garray_fittograph(x, size, style);
         template_setfloat(scalartemplate, gensym("style"),
-            x->x_scalar->sc_vec, (float)style, 0);
+            x->x_scalar->sc_vec, (t_float)style, 0);
 
         garray_setsaveit(x, (saveit != 0));
         garray_redraw(x);
@@ -462,7 +462,7 @@
 void garray_arrayviewlist_new(t_garray *x)
 {
     int i, xonset=0, yonset=0, type=0, elemsize=0;
-    float yval;
+    t_float yval;
     char cmdbuf[200];
     t_symbol *arraytype;
     t_array *a = garray_getarray_floatonly(x, &yonset, &elemsize);
@@ -480,7 +480,7 @@
     gfxstub_new(&x->x_gobj.g_pd, x, cmdbuf);
     for (i = 0; i < ARRAYPAGESIZE && i < a->a_n; i++)
     {
-        yval = *(float *)(a->a_vec +
+        yval = *(t_float *)(a->a_vec +
                elemsize * i + yonset);
         sys_vgui(".%sArrayWindow.lb insert %d {%d) %g}\n",
                  x->x_realname->s_name,
@@ -495,7 +495,7 @@
                                    t_float fTopItem)
 {
     int i, xonset=0, yonset=0, type=0, elemsize=0, topItem;
-    float yval;
+    t_float yval;
     char cmdbuf[200];
     t_symbol *arraytype;
     t_array *a = garray_getarray_floatonly(x, &yonset, &elemsize);
@@ -526,7 +526,7 @@
          (i < (page + 1) * ARRAYPAGESIZE && i < a->a_n);
          i++)
     {
-        yval = *(float *)(a->a_vec + \
+        yval = *(t_float *)(a->a_vec + \
                elemsize * i + yonset);
         sys_vgui(".%sArrayWindow.lb insert %d {%d) %g}\n",
                  x->x_realname->s_name,
@@ -577,23 +577,23 @@
     /* routine to get screen coordinates of a point in an array */
 void array_getcoordinate(t_glist *glist,
     char *elem, int xonset, int yonset, int wonset, int indx,
-    float basex, float basey, float xinc,
+    t_float basex, t_float basey, t_float xinc,
     t_fielddesc *xfielddesc, t_fielddesc *yfielddesc, t_fielddesc *wfielddesc,
-    float *xp, float *yp, float *wp)
+    t_float *xp, t_float *yp, t_float *wp)
 {
-    float xval, yval, ypix, wpix;
+    t_float xval, yval, ypix, wpix;
     if (xonset >= 0)
-        xval = *(float *)(elem + xonset);
+        xval = *(t_float *)(elem + xonset);
     else xval = indx * xinc;
     if (yonset >= 0)
-        yval = *(float *)(elem + yonset);
+        yval = *(t_float *)(elem + yonset);
     else yval = 0;
     ypix = glist_ytopixels(glist, basey +
         fielddesc_cvttocoord(yfielddesc, yval));
     if (wonset >= 0)
     {
             /* found "w" field which controls linewidth. */
-        float wval = *(float *)(elem + wonset);
+        t_float wval = *(t_float *)(elem + wonset);
         wpix = glist_ytopixels(glist, basey + 
             fielddesc_cvttocoord(yfielddesc, yval) +
                 fielddesc_cvttocoord(wfielddesc, wval)) - ypix;
@@ -607,8 +607,8 @@
     *wp = wpix;
 }
 
-static float array_motion_xcumulative;
-static float array_motion_ycumulative;
+static t_float array_motion_xcumulative;
+static t_float array_motion_ycumulative;
 static t_fielddesc *array_motion_xfield;
 static t_fielddesc *array_motion_yfield;
 static t_glist *array_motion_glist;
@@ -619,9 +619,9 @@
 static int array_motion_npoints;
 static int array_motion_elemsize;
 static int array_motion_altkey;
-static float array_motion_initx;
-static float array_motion_xperpix;
-static float array_motion_yperpix;
+static t_float array_motion_initx;
+static t_float array_motion_xperpix;
+static t_float array_motion_yperpix;
 static int array_motion_lastx;
 static int array_motion_fatten;
 
@@ -640,9 +640,9 @@
         {
             t_word *thisword = (t_word *)(((char *)array_motion_wp) +
                 i * array_motion_elemsize);
-            float xwas = fielddesc_getcoord(array_motion_xfield, 
+            t_float xwas = fielddesc_getcoord(array_motion_xfield, 
                 array_motion_template, thisword, 1);
-            float ywas = (array_motion_yfield ?
+            t_float ywas = (array_motion_yfield ?
                 fielddesc_getcoord(array_motion_yfield, 
                     array_motion_template, thisword, 1) : 0);
             fielddesc_setcoord(array_motion_xfield,
@@ -653,7 +653,7 @@
                 {
                     if (i == 0)
                     {
-                        float newy = ywas + dy * array_motion_yperpix;
+                        t_float newy = ywas + dy * array_motion_yperpix;
                         if (newy < 0)
                             newy = 0;
                         fielddesc_setcoord(array_motion_yfield,
@@ -674,13 +674,13 @@
             /* a y-only plot. */
         int thisx = array_motion_initx + array_motion_xcumulative + 0.5, x2;
         int increment, i, nchange;
-        float newy = array_motion_ycumulative,
+        t_float newy = array_motion_ycumulative,
             oldy = fielddesc_getcoord(array_motion_yfield,
                 array_motion_template,
                     (t_word *)(((char *)array_motion_wp) +
                         array_motion_elemsize * array_motion_lastx),
                             1);
-        float ydiff = newy - oldy;
+        t_float ydiff = newy - oldy;
         if (thisx < 0) thisx = 0;
         else if (thisx >= array_motion_npoints)
             thisx = array_motion_npoints - 1;
@@ -706,7 +706,7 @@
 
 int scalar_doclick(t_word *data, t_template *template, t_scalar *sc,
     t_array *ap, struct _glist *owner,
-    float xloc, float yloc, int xpix, int ypix,
+    t_float xloc, t_float yloc, int xpix, int ypix,
     int shift, int alt, int dbl, int doit);
 
     /* try clicking on an element of the array as a scalar (if clicking
@@ -714,14 +714,14 @@
 static int array_doclick_element(t_array *array, t_glist *glist,
     t_scalar *sc, t_array *ap,
     t_symbol *elemtemplatesym,
-    float linewidth, float xloc, float xinc, float yloc,
+    t_float linewidth, t_float xloc, t_float xinc, t_float yloc,
     t_fielddesc *xfield, t_fielddesc *yfield, t_fielddesc *wfield,
     int xpix, int ypix, int shift, int alt, int dbl, int doit)
 {
     t_canvas *elemtemplatecanvas;
     t_template *elemtemplate;
     int elemsize, yonset, wonset, xonset, i, incr, hit;
-    float xsum;
+    t_float xsum;
 
     if (elemtemplatesym == &s_float)
         return (0);
@@ -735,13 +735,13 @@
     else incr = array->a_n / 300;
     for (i = 0, xsum = 0; i < array->a_n; i += incr)
     {
-        float usexloc, useyloc;
+        t_float usexloc, useyloc;
         if (xonset >= 0)
             usexloc = xloc + fielddesc_cvttocoord(xfield, 
-                *(float *)(((char *)(array->a_vec) + elemsize * i) + xonset));
+                *(t_float *)(((char *)(array->a_vec) + elemsize * i) + xonset));
         else usexloc = xloc + xsum, xsum += xinc;
         useyloc = yloc + (yonset >= 0 ? fielddesc_cvttocoord(yfield,
-            *(float *)(((char *)(array->a_vec) + elemsize * i) + yonset)) : 0);
+            *(t_float *)(((char *)(array->a_vec) + elemsize * i) + yonset)) : 0);
         
         if (hit = scalar_doclick(
             (t_word *)((char *)(array->a_vec) + i * elemsize),
@@ -757,7 +757,7 @@
     they can be static (look in g_canvas.h for candidates). */
 int array_doclick(t_array *array, t_glist *glist, t_scalar *sc, t_array *ap,
     t_symbol *elemtemplatesym,
-    float linewidth, float xloc, float xinc, float yloc, float scalarvis,
+    t_float linewidth, t_float xloc, t_float xinc, t_float yloc, t_float scalarvis,
     t_fielddesc *xfield, t_fielddesc *yfield, t_fielddesc *wfield,
     int xpix, int ypix, int shift, int alt, int dbl, int doit)
 {
@@ -769,12 +769,12 @@
         &elemtemplate, &elemsize, xfield, yfield, wfield,
         &xonset, &yonset, &wonset))
     {
-        float best = 100;
+        t_float best = 100;
             /* if it has more than 2000 points, just check 1000 of them. */
         int incr = (array->a_n <= 2000 ? 1 : array->a_n / 1000);
         for (i = 0; i < array->a_n; i += incr)
         {
-            float pxpix, pypix, pwpix, dx, dy;
+            t_float pxpix, pypix, pwpix, dx, dy;
             array_getcoordinate(glist, (char *)(array->a_vec) + i * elemsize,
                 xonset, yonset, wonset, i, xloc, yloc, xinc,
                 xfield, yfield, wfield, &pxpix, &pypix, &pwpix);
@@ -812,7 +812,7 @@
         best += 0.001;  /* add truncation error margin */
         for (i = 0; i < array->a_n; i += incr)
         {
-            float pxpix, pypix, pwpix, dx, dy, dy2, dy3;
+            t_float pxpix, pypix, pwpix, dx, dy, dy2, dy3;
             array_getcoordinate(glist, (char *)(array->a_vec) + i * elemsize,
                 xonset, yonset, wonset, i, xloc, yloc, xinc,
                 xfield, yfield, wfield, &pxpix, &pypix, &pwpix);
@@ -905,7 +905,7 @@
                         array_motion_ycumulative = 
                             fielddesc_getcoord(yfield, array_motion_template,
                                 (t_word *)(elem + i * elemsize), 1);
-                            /* *(float *)((elem + elemsize * i) + yonset); */
+                            /* *(t_float *)((elem + elemsize * i) + yonset); */
                     }
                     else
                     {
@@ -931,7 +931,7 @@
 static void array_getrect(t_array *array, t_glist *glist,
     int *xp1, int *yp1, int *xp2, int *yp2)
 {
-    float x1 = 0x7fffffff, y1 = 0x7fffffff, x2 = -0x7fffffff, y2 = -0x7fffffff;
+    t_float x1 = 0x7fffffff, y1 = 0x7fffffff, x2 = -0x7fffffff, y2 = -0x7fffffff;
     t_canvas *elemtemplatecanvas;
     t_template *elemtemplate;
     int elemsize, yonset, wonset, xonset, i;
@@ -946,7 +946,7 @@
         else incr = array->a_n / 300;
         for (i = 0; i < array->a_n; i += incr)
         {
-            float pxpix, pypix, pwpix, dx, dy;
+            t_float pxpix, pypix, pwpix, dx, dy;
             array_getcoordinate(glist, (char *)(array->a_vec) +
                 i * elemsize,
                 xonset, yonset, wonset, i, 0, 0, 1,
@@ -1053,7 +1053,7 @@
                 chunk = ARRAYWRITECHUNKSIZE;
             binbuf_addv(b, "si", gensym("#A"), n2);
             for (i = 0; i < chunk; i++)
-                binbuf_addv(b, "f", ((float *)(array->a_vec))[n2+i]);
+                binbuf_addv(b, "f", ((t_word *)(array->a_vec))[n2+i].w_float);
             binbuf_addv(b, ";");
             n2 += chunk;
         }
@@ -1132,7 +1132,7 @@
     /* routine that checks if we're just an array of floats and if
     so returns the goods */
 
-int garray_getfloatarray(t_garray *x, int *size, t_float **vec)
+int garray_getfloatwords(t_garray *x, int *size, t_word **vec)
 {
     int yonset, type, elemsize;
     t_array *a = garray_getarray_floatonly(x, &yonset, &elemsize);
@@ -1147,10 +1147,24 @@
         return (0);
     }
     *size = garray_npoints(x);
-    *vec =  (float *)garray_vec(x);
+    *vec =  (t_word *)garray_vec(x);
     return (1);
 }
+    /* older, non-64-bit safe version, supplied for older externs */
 
+int garray_getfloatarray(t_garray *x, int *size, t_float **vec)
+{
+    if (sizeof(t_word) != sizeof(t_float))
+    {
+        static int warned;
+        if (!warned)
+            post(
+ "warning: extern using garray_getfloatarray() won't work in 64-bit version");
+        warned = 1;
+    }
+    return (garray_getfloatwords(x, size, (t_word **)vec));
+}
+
     /* set the "saveit" flag */
 void garray_setsaveit(t_garray *x, int saveit)
 {
@@ -1168,13 +1182,13 @@
     if (!array)
         error("%s: needs floating-point 'y' field", x->x_realname->s_name);
     else for (i = 0; i < array->a_n; i++)
-        *((float *)((char *)array->a_vec
+        *((t_float *)((char *)array->a_vec
             + elemsize * i) + yonset) = g;
     garray_redraw(x);
 }
 
     /* sum of Fourier components; called from routines below */
-static void garray_dofo(t_garray *x, int npoints, float dcval,
+static void garray_dofo(t_garray *x, int npoints, t_float dcval,
     int nsin, t_float *vsin, int sineflag)
 {
     double phase, phaseincr, fj;
@@ -1201,7 +1215,7 @@
         else
             for (j = 0, fj = 0; j < nsin; j++, fj += phase)
                 sum += vsin[j] * cos(fj);
-        *((float *)((array->a_vec + elemsize * i)) + yonset)
+        *((t_float *)((array->a_vec + elemsize * i)) + yonset)
             = sum;
     }
     garray_redraw(x);
@@ -1270,7 +1284,7 @@
 
     for (i = 0, maxv = 0; i < array->a_n; i++)
     {
-        double v = *((float *)(array->a_vec + elemsize * i)
+        double v = *((t_float *)(array->a_vec + elemsize * i)
             + yonset);
         if (v > maxv)
             maxv = v;
@@ -1281,7 +1295,7 @@
     {
         renormer = f / maxv;
         for (i = 0; i < array->a_n; i++)
-            *((float *)(array->a_vec + elemsize * i) + yonset)
+            *((t_float *)(array->a_vec + elemsize * i) + yonset)
                 *= renormer;
     }
     garray_redraw(x);
@@ -1319,7 +1333,7 @@
             if (argc <= 0) return;
         }
         for (i = 0; i < argc; i++)
-            *((float *)(array->a_vec + elemsize * (i + firstindex)) + yonset)
+            *((t_float *)(array->a_vec + elemsize * (i + firstindex)) + yonset)
                 = atom_getfloat(argv + i);
     }
     garray_redraw(x);
@@ -1390,7 +1404,7 @@
     }
     for (i = 0; i < nelem; i++)
     {
-        if (!fscanf(fd, "%f", ((float *)(array->a_vec +
+        if (!fscanf(fd, "%f", ((t_float *)(array->a_vec +
             elemsize * i) + yonset)))
         {
             post("%s: read %d elements into table of size %d",
@@ -1399,7 +1413,7 @@
         }
     }
     while (i < nelem)
-        *((float *)(array->a_vec +
+        *((t_float *)(array->a_vec +
             elemsize * i) + yonset) = 0, i++;
     fclose(fd);
     garray_redraw(x);
@@ -1427,7 +1441,7 @@
     for (i = 0; i < array->a_n; i++)
     {
         if (fprintf(fd, "%g\n",
-            *(float *)(((array->a_vec + sizeof(t_word) * i)) + yonset)) < 1)
+            *(t_float *)(((array->a_vec + sizeof(t_word) * i)) + yonset)) < 1)
         {
             post("%s: write error", filename->s_name);
             break;

Modified: branches/pd-extended/0.41/pd/src/g_editor.c
===================================================================
--- branches/pd-extended/0.41/pd/src/g_editor.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/g_editor.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -394,7 +394,7 @@
 }
 
 void canvas_disconnect(t_canvas *x,
-    float index1, float outno, float index2, float inno)
+    t_float index1, t_float outno, t_float index2, t_float inno)
 {
     t_linetraverser t;
     t_outconnect *oc;
@@ -802,6 +802,17 @@
             && (x1 > *x1p))
                 *x1p = x1, *y1p = y1, *x2p = x2, *y2p = y2, rval = y; 
     }
+        /* if there are at least two selected objects, we'd prefer
+        to find a selected one (never mind which) to the one we got. */
+    if (x->gl_editor && x->gl_editor->e_selection &&
+        x->gl_editor->e_selection->sel_next && !glist_isselected(x, y))
+    {
+        t_selection *sel;
+        for (sel = x->gl_editor->e_selection; sel; sel = sel->sel_next)
+            if (canvas_hitbox(x, sel->sel_what, xpos, ypos, &x1, &y1, &x2, &y2))
+                *x1p = x1, *y1p = y1, *x2p = x2, *y2p = y2,
+                    rval = sel->sel_what; 
+    }
     return (rval);
 }
 
@@ -902,7 +913,7 @@
 {
 
 
-    float xperpix, yperpix, x1, y1, x2, y2, xpix, ypix, xmargin, ymargin; 
+    t_float xperpix, yperpix, x1, y1, x2, y2, xpix, ypix, xmargin, ymargin; 
     int graphme, redraw = 0;
 
     xperpix = atom_getfloatarg(0, argc, argv);
@@ -976,7 +987,7 @@
 
     /* called from the gui when a popup menu comes back with "properties,"
         "open," or "help." */
-static void canvas_done_popup(t_canvas *x, float which, float xpos, float ypos)
+static void canvas_done_popup(t_canvas *x, t_float which, t_float xpos, t_float ypos)
 {
     char pathbuf[FILENAME_MAX], namebuf[FILENAME_MAX];
     t_gobj *y;
@@ -1215,16 +1226,16 @@
     {
         t_linetraverser t;
         t_outconnect *oc;
-        float fx = xpos, fy = ypos;
+        t_float fx = xpos, fy = ypos;
         t_glist *glist2 = glist_getcanvas(x);
         linetraverser_start(&t, glist2);
         while (oc = linetraverser_next(&t))
         {
-            float lx1 = t.tr_lx1, ly1 = t.tr_ly1,
+            t_float lx1 = t.tr_lx1, ly1 = t.tr_ly1,
                 lx2 = t.tr_lx2, ly2 = t.tr_ly2;
-            float area = (lx2 - lx1) * (fy - ly1) -
+            t_float area = (lx2 - lx1) * (fy - ly1) -
                 (ly2 - ly1) * (fx - lx1);
-            float dsquare = (lx2-lx1) * (lx2-lx1) + (ly2-ly1) * (ly2-ly1);
+            t_float dsquare = (lx2-lx1) * (lx2-lx1) + (ly2-ly1) * (ly2-ly1);
             if (area * area >= 50 * dsquare) continue;
             if ((lx2-lx1) * (fx-lx1) + (ly2-ly1) * (fy-ly1) < 0) continue;
             if ((lx2-lx1) * (lx2-fx) + (ly2-ly1) * (ly2-fy) < 0) continue;
@@ -1520,9 +1531,9 @@
             keynum = 0, gotkeysym = gensym("Right");
 #endif
     if (keynumsym->s_thing && down)
-        pd_float(keynumsym->s_thing, (float)keynum);
+        pd_float(keynumsym->s_thing, (t_float)keynum);
     if (keyupsym->s_thing && !down)
-        pd_float(keyupsym->s_thing, (float)keynum);
+        pd_float(keyupsym->s_thing, (t_float)keynum);
     if (keynamesym->s_thing)
     {
         t_atom at[2];
@@ -1539,7 +1550,7 @@
         if (x->gl_editor->e_grab
             && x->gl_editor->e_keyfn && keynum)
                 (* x->gl_editor->e_keyfn)
-                    (x->gl_editor->e_grab, (float)keynum);
+                    (x->gl_editor->e_grab, (t_float)keynum);
             /* if a text editor is open send the key on, as long as
             it is either "real" (has a key number) or else is an arrow key. */
         else if (x->gl_editor->e_textedfor && (keynum
@@ -1580,6 +1591,12 @@
         else if (!strcmp(gotkeysym->s_name, "Right"))
             canvas_displaceselection(x, shift ? 10 : 1, 0);
     }
+        /* if control key goes up or down, and if we're in edit mode, change
+        cursor to indicate how the click action changes */
+    if (x && keynum == 0 && x->gl_edit &&
+        !strncmp(gotkeysym->s_name, "Control", 7))
+            canvas_setcursor(x, down ?
+                CURSOR_RUNMODE_NOTHING :CURSOR_EDITMODE_NOTHING);
 }
 
 void canvas_motion(t_canvas *x, t_floatarg xpos, t_floatarg ypos,
@@ -2411,7 +2428,7 @@
 static void canvas_font(t_canvas *x, t_floatarg font, t_floatarg resize,
     t_floatarg whichresize)
 {
-    float realresize, realresx = 1, realresy = 1;
+    t_float realresize, realresx = 1, realresy = 1;
     t_canvas *x2 = canvas_getrootfor(x);
     if (!resize) realresize = 1;
     else

Modified: branches/pd-extended/0.41/pd/src/g_io.c
===================================================================
--- branches/pd-extended/0.41/pd/src/g_io.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/g_io.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -295,10 +295,10 @@
     t_canvas *x_canvas;
     t_outlet *x_parentoutlet;
     int x_bufsize;
-    t_float *x_buf;         /* signal buffer; zero if not a signal */
-    t_float *x_endbuf;
-    t_float *x_empty;       /* next to read out of buffer in epilog code */
-    t_float *x_write;       /* next to write in to buffer */
+    t_sample *x_buf;         /* signal buffer; zero if not a signal */
+    t_sample *x_endbuf;
+    t_sample *x_empty;       /* next to read out of buffer in epilog code */
+    t_sample *x_write;       /* next to write in to buffer */
     int x_hop;              /* hopsize */
         /* vice versa from the inlet, if we don't block, this holds the
         parent's outlet signal, valid between the prolog and the dsp setup
@@ -376,7 +376,7 @@
     t_voutlet *x = (t_voutlet *)(w[1]);
     t_float *in = (t_float *)(w[2]);
     int n = (int)(w[3]);
-    t_float *out = x->x_write, *outwas = out;
+    t_sample *out = x->x_write, *outwas = out;
 #if 0
     if (tot < 5) post("-in %lx out %lx n %d", in, out, n);
     if (tot < 5) post("-buf %lx endbuf %lx", x->x_buf, x->x_endbuf);
@@ -396,10 +396,10 @@
 static t_int *voutlet_doepilog(t_int *w)
 {
     t_voutlet *x = (t_voutlet *)(w[1]);
-    t_float *out = (t_float *)(w[2]);
+    t_sample *out = (t_sample *)(w[2]);
 
     int n = (int)(w[3]);
-    t_float *in = x->x_empty;
+    t_sample *in = x->x_empty;
     if (x->x_updown.downsample != x->x_updown.upsample)
         out = x->x_updown.s_vec;
 
@@ -416,8 +416,8 @@
 {
     t_voutlet *x = (t_voutlet *)(w[1]);
     int n = (int)(w[2]);
-    t_float *in  = x->x_empty;
-    t_float *out = x->x_updown.s_vec;
+    t_sample *in  = x->x_empty;
+    t_sample *out = x->x_updown.s_vec;
 
 #if 0
     if (tot < 5) post("outlet in %lx out %lx n %lx", in, out, n), tot++;
@@ -510,9 +510,9 @@
         if (bufsize < myvecsize) bufsize = myvecsize;
         if (bufsize != (oldbufsize = x->x_bufsize))
         {
-            t_float *buf = x->x_buf;
+            t_sample *buf = x->x_buf;
             t_freebytes(buf, oldbufsize * sizeof(*buf));
-            buf = (t_float *)t_getbytes(bufsize * sizeof(*buf));
+            buf = (t_sample *)t_getbytes(bufsize * sizeof(*buf));
             memset((char *)buf, 0, bufsize * sizeof(*buf));
             x->x_bufsize = bufsize;
             x->x_endbuf = buf + bufsize;
@@ -562,7 +562,7 @@
     x->x_parentoutlet = canvas_addoutlet(x->x_canvas,
         &x->x_obj.ob_pd, &s_signal);
     inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
-    x->x_endbuf = x->x_buf = (t_float *)getbytes(0);
+    x->x_endbuf = x->x_buf = (t_sample *)getbytes(0);
     x->x_bufsize = 0;
 
     resample_init(&x->x_updown);

Modified: branches/pd-extended/0.41/pd/src/g_readwrite.c
===================================================================
--- branches/pd-extended/0.41/pd/src/g_readwrite.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/g_readwrite.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -258,8 +258,7 @@
     else if (*format->s_name)
         error("qlist_read: unknown flag: %s", format->s_name);
     
-    if (binbuf_read_via_path(b, filename->s_name,
-        canvas_getdir(canvas)->s_name, cr))
+    if (binbuf_read_via_canvas(b, filename->s_name, canvas, cr))
     {
         pd_error(x, "read failed");
         binbuf_free(b);
@@ -620,15 +619,15 @@
             binbuf_addv(b, "ssfffffffff;", gensym("#X"), gensym("coords"),
                 x->gl_x1, x->gl_y1,
                 x->gl_x2, x->gl_y2,
-                (float)x->gl_pixwidth, (float)x->gl_pixheight,
-                (float)((x->gl_hidetext)?2.:1.),
-                (float)x->gl_xmargin, (float)x->gl_ymargin); 
+                (t_float)x->gl_pixwidth, (t_float)x->gl_pixheight,
+                (t_float)((x->gl_hidetext)?2.:1.),
+                (t_float)x->gl_xmargin, (t_float)x->gl_ymargin); 
                     /* otherwise write in 0.38-compatible form */
         else binbuf_addv(b, "ssfffffff;", gensym("#X"), gensym("coords"),
                 x->gl_x1, x->gl_y1,
                 x->gl_x2, x->gl_y2,
-                (float)x->gl_pixwidth, (float)x->gl_pixheight,
-                (float)x->gl_isgraph);
+                (t_float)x->gl_pixwidth, (t_float)x->gl_pixheight,
+                (t_float)x->gl_isgraph);
     }
 }
 

Modified: branches/pd-extended/0.41/pd/src/g_scalar.c
===================================================================
--- branches/pd-extended/0.41/pd/src/g_scalar.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/g_scalar.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -49,7 +49,7 @@
         int type = datatypes->ds_type;
         if (type == DT_FLOAT)
         {
-            float f;
+            t_float f;
             if (argc)
             {
                 f =  atom_getfloat(argv);
@@ -145,7 +145,7 @@
 }
 
 /* -------------------- widget behavior for scalar ------------ */
-void scalar_getbasexy(t_scalar *x, float *basex, float *basey)
+void scalar_getbasexy(t_scalar *x, t_float *basex, t_float *basey)
 {
     t_template *template = template_findbyname(x->sc_template);
     *basex = template_getfloat(template, gensym("x"), x->sc_vec, 0);
@@ -160,7 +160,7 @@
     t_canvas *templatecanvas = template_findcanvas(template);
     int x1 = 0x7fffffff, x2 = -0x7fffffff, y1 = 0x7fffffff, y2 = -0x7fffffff;
     t_gobj *y;
-    float basex, basey;
+    t_float basex, basey;
     scalar_getbasexy(x, &basex, &basey);
         /* if someone deleted the template canvas, we're just a point */
     if (!templatecanvas)
@@ -195,45 +195,50 @@
     *yp2 = y2; 
 }
 
-static void scalar_select(t_gobj *z, t_glist *owner, int state)
+static void scalar_drawselectrect(t_scalar *x, t_glist *glist, int state)
 {
-    t_scalar *x = (t_scalar *)z;
-    t_symbol *templatesym = x->sc_template;
-    t_template *tmpl;
-    t_atom at;
-    t_gpointer gp;
-    gpointer_init(&gp);
-    gpointer_setglist(&gp, owner, x);
-    SETPOINTER(&at, &gp);
     if (state)
     {
         int x1, y1, x2, y2;
-        if (tmpl = template_findbyname(templatesym))
-            template_notify(tmpl, gensym("select"), 1, &at);
-        gpointer_unset(&gp);
-        
-        scalar_getrect(z, owner, &x1, &y1, &x2, &y2);
+       
+        scalar_getrect(&x->sc_gobj, glist, &x1, &y1, &x2, &y2);
         x1--; x2++; y1--; y2++;
         sys_vgui(".x%lx.c create line %d %d %d %d %d %d %d %d %d %d \
             -width 0 -fill $select_color -tags select%lx\n",
-                glist_getcanvas(owner), x1, y1, x1, y2, x2, y2, x2, y1, x1, y1,
+                glist_getcanvas(glist), x1, y1, x1, y2, x2, y2, x2, y1, x1, y1,
                 x);
     }
     else
     {
-        sys_vgui(".x%lx.c delete select%lx\n", glist_getcanvas(owner), x);
-        if (tmpl = template_findbyname(templatesym))
-            template_notify(tmpl, gensym("deselect"), 1, &at);
-        
+        sys_vgui(".x%lx.c delete select%lx\n", glist_getcanvas(glist), x);
     }
 }
 
+static void scalar_select(t_gobj *z, t_glist *owner, int state)
+{
+    t_scalar *x = (t_scalar *)z;
+    t_template *tmpl;
+    t_symbol *templatesym = x->sc_template;
+    t_atom at;
+    t_gpointer gp;
+    gpointer_init(&gp);
+    gpointer_setglist(&gp, owner, x);
+    SETPOINTER(&at, &gp);
+    if (tmpl = template_findbyname(templatesym))
+        template_notify(tmpl, (state ? gensym("select") : gensym("deselect")),
+            1, &at);
+    gpointer_unset(&gp);
+    scalar_drawselectrect(x, owner, state);
+}
+
 static void scalar_displace(t_gobj *z, t_glist *glist, int dx, int dy)
 {
     t_scalar *x = (t_scalar *)z;
     t_symbol *templatesym = x->sc_template;
     t_template *template = template_findbyname(templatesym);
     t_symbol *zz;
+    t_atom at[3];
+    t_gpointer gp;
     int xonset, yonset, xtype, ytype, gotx, goty;
     if (!template)
     {
@@ -252,12 +257,13 @@
     if (goty)
         *(t_float *)(((char *)(x->sc_vec)) + yonset) +=
             dy * (glist_pixelstoy(glist, 1) - glist_pixelstoy(glist, 0));
+    gpointer_init(&gp);
+    gpointer_setglist(&gp, glist, x);
+    SETPOINTER(&at[0], &gp);
+    SETFLOAT(&at[1], (t_float)dx);
+    SETFLOAT(&at[2], (t_float)dy);
+    template_notify(template, gensym("displace"), 2, at);
     scalar_redraw(x, glist);
-    if (glist_isselected(glist, z))
-    {
-        scalar_select(z, glist, 0);
-        scalar_select(z, glist, 1);
-    }
 }
 
 static void scalar_activate(t_gobj *z, t_glist *owner, int state)
@@ -277,7 +283,7 @@
     t_template *template = template_findbyname(x->sc_template);
     t_canvas *templatecanvas = template_findcanvas(template);
     t_gobj *y;
-    float basex, basey;
+    t_float basex, basey;
     scalar_getbasexy(x, &basex, &basey);
         /* if we don't know how to draw it, make a small rectangle */
     if (!templatecanvas)
@@ -299,6 +305,11 @@
         if (!wb) continue;
         (*wb->w_parentvisfn)(y, owner, x->sc_vec, template, basex, basey, vis);
     }
+    if (glist_isselected(owner, &x->sc_gobj))
+    {
+        scalar_drawselectrect(x, owner, 0);
+        scalar_drawselectrect(x, owner, 1);
+    }
     sys_unqueuegui(x);
 }
 
@@ -316,14 +327,14 @@
 
 int scalar_doclick(t_word *data, t_template *template, t_scalar *sc,
     t_array *ap, struct _glist *owner,
-    float xloc, float yloc, int xpix, int ypix,
+    t_float xloc, t_float yloc, int xpix, int ypix,
     int shift, int alt, int dbl, int doit)
 {
     int hit = 0;
     t_canvas *templatecanvas = template_findcanvas(template);
     t_gobj *y;
-    float basex = template_getfloat(template, gensym("x"), data, 0);
-    float basey = template_getfloat(template, gensym("y"), data, 0);
+    t_float basex = template_getfloat(template, gensym("x"), data, 0);
+    t_float basey = template_getfloat(template, gensym("y"), data, 0);
     for (y = templatecanvas->gl_list; y; y = y->g_next)
     {
         t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd);

Modified: branches/pd-extended/0.41/pd/src/g_text.c
===================================================================
--- branches/pd-extended/0.41/pd/src/g_text.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/g_text.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -943,7 +943,7 @@
 {
     t_text *x = (t_text *)z;
     int width, height, iscomment = (x->te_type == T_TEXT);
-    float x1, y1, x2, y2;
+    t_float x1, y1, x2, y2;
 
         /* for number boxes, we know width and height a priori, and should
         report them here so that graphs can get swelled to fit. */

Modified: branches/pd-extended/0.41/pd/src/m_binbuf.c
===================================================================
--- branches/pd-extended/0.41/pd/src/m_binbuf.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/m_binbuf.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -391,9 +391,6 @@
     x->b_n = newsize;
 }
 
-
-#define MSTACKSIZE 2048
-
 void binbuf_print(t_binbuf *x)
 {
     int i, startedpost = 0, newline = 1;
@@ -535,13 +532,70 @@
     return (gensym(buf2));
 }
 
+#define SMALLMSG 5
+#define HUGEMSG 1000
+#ifdef MSW
+#include <malloc.h>
+#else
+#include <alloca.h>
+#endif
+#if HAVE_ALLOCA
+#define ATOMS_ALLOCA(x, n) ((x) = (t_atom *)((n) < HUGEMSG ?  \
+        alloca((n) * sizeof(t_atom)) : getbytes((n) * sizeof(t_atom))))
+#define ATOMS_FREEA(x, n) ( \
+    ((n) < HUGEMSG || (freebytes((x), (n) * sizeof(t_atom)), 0)))
+#else
+#define ATOMS_ALLOCA(x, n) ((x) = (t_atom *)getbytes((n) * sizeof(t_atom)))
+#define ATOMS_FREEA(x, n) (freebytes((x), (n) * sizeof(t_atom)))
+#endif
+
 void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv)
 {
-    static t_atom mstack[MSTACKSIZE], *msp = mstack, *ems = mstack+MSTACKSIZE;
-    t_atom *stackwas = msp;
+    t_atom smallstack[SMALLMSG], *mstack, *msp;
     t_atom *at = x->b_vec;
     int ac = x->b_n;
-    int nargs;
+    int nargs, maxnargs = 0;
+    if (ac <= SMALLMSG)
+        mstack = smallstack;
+    else
+    {
+#if 1
+            /* count number of args in biggest message.  The wierd
+            treatment of "pd_objectmaker" is because when the message
+            goes out to objectmaker, commas and semis are passed
+            on as regular args (see below).  We're tacitly assuming here
+            that the pd_objectmaker target can't come up via a named
+            destination in the message, only because the original "target"
+            points there. */
+        if (target == &pd_objectmaker)
+            maxnargs = ac;
+        else
+        {
+            int i, j = (target ? 0 : -1);
+            for (i = 0; i < ac; i++)
+            {
+                if (at[i].a_type == A_SEMI)
+                    j = -1;
+                else if (at[i].a_type == A_COMMA)
+                    j = 0;
+                else if (++j > maxnargs)
+                    maxnargs = j;
+            }
+        }
+        if (maxnargs <= SMALLMSG)
+            mstack = smallstack;
+        else ATOMS_ALLOCA(mstack, maxnargs);
+#else
+            /* just pessimistically allocate enough to hold everything
+            at once.  This turned out to run slower in a simple benchmark
+            I tried, perhaps because the extra memory allocation
+            hurt the cache hit rate. */
+        maxnargs = ac;
+        ATOMS_ALLOCA(mstack, maxnargs);
+#endif
+
+    }
+    msp = mstack;
     while (1)
     {
         t_pd *nexttarget;
@@ -601,11 +655,6 @@
         {
             t_symbol *s9;
             if (!ac) goto gotmess;
-            if (msp >= ems)
-            {
-                error("message stack overflow");
-                goto broken;
-            }
             switch (at->a_type)
             {
             case A_SEMI:
@@ -671,31 +720,30 @@
     gotmess:
         if (nargs)
         {
-            switch (stackwas->a_type)
+            switch (mstack->a_type)
             {
             case A_SYMBOL:
-                typedmess(target, stackwas->a_w.w_symbol, nargs-1, stackwas+1);
+                typedmess(target, mstack->a_w.w_symbol, nargs-1, mstack+1);
                 break;
             case A_BLOB: /* MP 20070106 blob type */
                 if (nargs == 1) pd_blob(target, stackwas->a_w.w_blob);
                 else pd_list(target, 0, nargs, stackwas);
                 break;
             case A_FLOAT:
-                if (nargs == 1) pd_float(target, stackwas->a_w.w_float);
-                else pd_list(target, 0, nargs, stackwas);
+                if (nargs == 1) pd_float(target, mstack->a_w.w_float);
+                else pd_list(target, 0, nargs, mstack);
                 break;
             }
         }
-        msp = stackwas;
+        msp = mstack;
         if (!ac) break;
         target = nexttarget;
         at++;
         ac--;
     }
-
-    return;
-broken:
-    msp = stackwas;
+broken: 
+    if (maxnargs > SMALLMSG)
+         ATOMS_FREEA(mstack, maxnargs);
 }
 
 static int binbuf_doopen(char *s, int mode)
@@ -967,7 +1015,7 @@
                                 atom_getfloatarg(2, natom, nextmess),
                             atom_getfloatarg(5, natom, nextmess) -
                                 atom_getfloatarg(3, natom, nextmess),
-                            (float)sys_defaultfont);
+                            (t_float)sys_defaultfont);
                 }
             }
             if (!strcmp(first, "#P"))
@@ -1050,7 +1098,7 @@
                 }
                 else if (!strcmp(second, "slider"))
                 {
-                    float inc = atom_getfloatarg(7, natom, nextmess);
+                    t_float inc = atom_getfloatarg(7, natom, nextmess);
                     if (inc <= 0)
                         inc = 1;
                     binbuf_addv(newb, "ssffsffffffsssfffffffff;",

Modified: branches/pd-extended/0.41/pd/src/m_class.c
===================================================================
--- branches/pd-extended/0.41/pd/src/m_class.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/m_class.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -422,7 +422,7 @@
 {
     int offset = (*x)->c_floatsignalin;
     if (offset > 0)
-        *(t_sample *)(((char *)x) + offset) = f;
+        *(t_float *)(((char *)x) + offset) = f;
     else
         pd_error(x, "%s: float unexpected for signal input",
             (*x)->c_name->s_name);
@@ -481,12 +481,12 @@
 
 static t_symbol *symhash[HASHSIZE];
 
-t_symbol *dogensym(char *s, t_symbol *oldsym)
+t_symbol *dogensym(const char *s, t_symbol *oldsym)
 {
     t_symbol **sym1, *sym2;
     unsigned int hash1 = 0,  hash2 = 0;
     int length = 0;
-    char *s2 = s;
+    const char *s2 = s;
     while (*s2)
     {
         hash1 += *s2;
@@ -513,7 +513,7 @@
     return (sym2);
 }
 
-t_symbol *gensym(char *s)
+t_symbol *gensym(const char *s)
 {
     return(dogensym(s, 0));
 }

Modified: branches/pd-extended/0.41/pd/src/m_glob.c
===================================================================
--- branches/pd-extended/0.41/pd/src/m_glob.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/m_glob.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -49,6 +49,12 @@
 }
 #endif
 
+static void glob_version(t_pd *dummy, float f)
+{
+    if (f > 0)
+        error("file format newer than this version of Pd (trying anyway...)");
+}
+
 void max_default(t_pd *x, t_symbol *s, int argc, t_atom *argv)
 {
     int i;
@@ -113,6 +119,8 @@
     class_addmethod(glob_pdobject, (t_method)glob_ping, gensym("ping"), 0);
     class_addmethod(glob_pdobject, (t_method)glob_savepreferences,
         gensym("save-preferences"), 0);
+    class_addmethod(glob_pdobject, (t_method)glob_version,
+        gensym("version"), A_FLOAT, 0);
 #ifdef UNIX
     class_addmethod(glob_pdobject, (t_method)glob_watchdog,
         gensym("watchdog"), 0);

Modified: branches/pd-extended/0.41/pd/src/m_sched.c
===================================================================
--- branches/pd-extended/0.41/pd/src/m_sched.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/m_sched.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -9,6 +9,9 @@
 #include "m_pd.h"
 #include "m_imp.h"
 #include "s_stuff.h"
+#ifdef MSW
+#include <windows.h>
+#endif
 
     /* LATER consider making this variable.  It's now the LCM of all sample
     rates we expect to see: 32000, 44100, 48000, 88200, 96000. */
@@ -17,7 +20,8 @@
 #define THREAD_LOCKING  
 #include "pthread.h"
 
-
+#define SYS_QUIT_QUIT 1
+#define SYS_QUIT_RESTART 2
 static int sys_quit;
 double sys_time;
 static double sys_time_per_msec = TIMEUNITPERSEC / 1000.;
@@ -26,6 +30,11 @@
 int sys_usecsincelastsleep(void);
 int sys_sleepgrain;
 
+void sched_reopenmeplease(void)   /* request from s_audio for deferred reopen */
+{
+    sys_quit = SYS_QUIT_RESTART;
+}
+
 typedef void (*t_clockmethod)(void *client);
 
 struct _clock
@@ -284,7 +293,7 @@
     }
     if (sched_meterson)
     {
-        float inmax, outmax;
+        t_sample inmax, outmax;
         sys_getmeters(&inmax, &outmax);
         indb = 0.5 + rmstodb(inmax);
         outdb = 0.5 + rmstodb(outmax);
@@ -309,7 +318,7 @@
         sched_diddsp + (int)(sys_dacsr /(double)sys_schedblocksize);
 }
 
-void glob_meters(void *dummy, float f)
+void glob_meters(void *dummy, t_float f)
 {
     if (f == 0)
         sys_getmeters(0, 0);
@@ -328,18 +337,26 @@
 
 void dsp_tick(void);
 
-static int sched_usedacs = 1;
+static int sched_useaudio = SCHED_AUDIO_POLL;
 static double sched_referencerealtime, sched_referencelogicaltime;
 double sys_time_per_dsp_tick;
 
-void sched_set_using_dacs(int flag)
+void sched_set_using_audio(int flag)
 {
-    sched_usedacs = flag;
-    if (!flag)
+    sched_useaudio = flag;
+    if (flag == SCHED_AUDIO_NONE)
     {
         sched_referencerealtime = sys_getrealtime();
         sched_referencelogicaltime = clock_getlogicaltime();
     }
+        if (flag == SCHED_AUDIO_CALLBACK &&
+            sched_useaudio != SCHED_AUDIO_CALLBACK)
+                sys_quit = SYS_QUIT_RESTART;
+        if (flag != SCHED_AUDIO_CALLBACK &&
+            sched_useaudio == SCHED_AUDIO_CALLBACK)
+                post("sorry, can't turn off callbacks yet; restart Pd");
+                    /* not right yet! */
+        
     sys_time_per_dsp_tick = (TIMEUNITPERSEC) *
         ((double)sys_schedblocksize) / sys_dacsr;
 }
@@ -387,7 +404,7 @@
 will now sleep. */
 int (*sys_idlehook)(void);
 
-int m_scheduler( void)
+static void m_pollingscheduler( void)
 {
     int idlecount = 0;
     sys_time_per_dsp_tick = (TIMEUNITPERSEC) *
@@ -398,7 +415,7 @@
 #endif
 
     sys_clearhist();
-    if (sys_sleepgrain < 1000)
+    if (sys_sleepgrain < 100)
         sys_sleepgrain = sys_schedadvance/4;
     if (sys_sleepgrain < 100)
         sys_sleepgrain = 100;
@@ -412,7 +429,7 @@
 
         sys_addhist(0);
     waitfortick:
-        if (sched_usedacs)
+        if (sched_useaudio != SCHED_AUDIO_NONE)
         {
 #ifdef THREAD_LOCKING
             /* T.Grill - send_dacs may sleep -> 
@@ -435,6 +452,11 @@
                 if (!(idlecount & 31))
                 {
                     static double idletime;
+                                        if (sched_useaudio != SCHED_AUDIO_POLL)
+                                        {
+                                                bug("m_pollingscheduler\n");
+                                                return;
+                                        }
                         /* on 32nd idle, start a clock watch;  every
                         32 ensuing idles, check it */
                     if (idlecount == 32)
@@ -443,7 +465,7 @@
                     {
                         post("audio I/O stuck... closing audio\n");
                         sys_close_audio();
-                        sched_set_using_dacs(0);
+                        sched_set_using_audio(SCHED_AUDIO_NONE);
                         goto waitfortick;
                     }
                 }
@@ -477,7 +499,6 @@
         {
             sched_pollformeters();
             sys_reportidle();
-
 #ifdef THREAD_LOCKING
             sys_unlock();   /* unlock while we idle */
 #endif
@@ -491,21 +512,62 @@
 #ifdef THREAD_LOCKING
             sys_lock();
 #endif
-
             sys_addhist(5);
             sched_didnothing++;
-
         }
     }
 
 #ifdef THREAD_LOCKING
     sys_unlock();
 #endif
+}
 
+void sched_audio_callbackfn(void)
+{
+    sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
+    sys_addhist(1);
+    sched_tick(sys_time + sys_time_per_dsp_tick);
+    sys_addhist(2);
+    sys_pollmidiqueue();
+    sys_addhist(3);
+    sys_pollgui();
+    sys_addhist(5);
+    sched_pollformeters();
+    sys_addhist(0);
+}
+
+static void m_callbackscheduler(void)
+{
+    sys_initmidiqueue();
+    while (!sys_quit)
+    {
+#ifdef MSW
+    Sleep(1000);
+#else
+        sleep(1);
+#endif
+        if (sys_idlehook)
+            sys_idlehook();
+    }
+}
+
+int m_mainloop(void)
+{
+    while (sys_quit != SYS_QUIT_QUIT)
+    {
+        if (sched_useaudio == SCHED_AUDIO_CALLBACK)
+            m_callbackscheduler();
+        else m_pollingscheduler();
+        if (sys_quit == SYS_QUIT_RESTART)
+        {
+            sys_quit = 0;
+            sys_close_audio();
+            sys_reopen_audio();
+        }
+    }
     return (0);
 }
 
-
 /* ------------ thread locking ------------------- */
 
 #ifdef THREAD_LOCKING
@@ -536,5 +598,5 @@
 
 void sys_exit(void)
 {
-        sys_quit = 1;
+    sys_quit = SYS_QUIT_QUIT;
 }

Modified: branches/pd-extended/0.41/pd/src/s_audio.c
===================================================================
--- branches/pd-extended/0.41/pd/src/s_audio.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/s_audio.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -32,7 +32,7 @@
 #define DEVDESCSIZE 80
 
 static void audio_getdevs(char *indevlist, int *nindevs,
-    char *outdevlist, int *noutdevs, int *canmulti, 
+    char *outdevlist, int *noutdevs, int *canmulti, int *cancallback, 
         int maxndev, int devdescsize);
 
     /* these are set in this file when opening audio, but then may be reduced,
@@ -42,14 +42,14 @@
 int sys_advance_samples;        /* scheduler advance in samples */
 int sys_blocksize = 0;          /* audio I/O block size in sample frames */
 int sys_audioapi = API_DEFAULT;
-
+int sys_audioapiopened = -1;    /* save last API opened for later closing */
 static int sys_meters;          /* true if we're metering */
-static float sys_inmax;         /* max input amplitude */
-static float sys_outmax;        /* max output amplitude */
+static t_sample sys_inmax;         /* max input amplitude */
+static t_sample sys_outmax;        /* max output amplitude */
 
     /* exported variables */
 int sys_schedadvance;   /* scheduler advance in microseconds */
-float sys_dacsr;
+t_float sys_dacsr;
 
 t_sample *sys_soundout;
 t_sample *sys_soundin;
@@ -68,7 +68,13 @@
 static int audio_audiochoutdev[MAXAUDIOOUTDEV];
 static int audio_rate;
 static int audio_advance;
+static int audio_callback;
 
+static int audio_callback_is_open;  /* reflects true actual state */
+static int audio_nextinchans, audio_nextoutchans;
+void sched_audio_callbackfn(void);
+void sched_reopenmeplease(void);
+
 static int audio_isopen(void)
 {
     return (audio_state &&
@@ -79,7 +85,7 @@
 void sys_get_audio_params(
     int *pnaudioindev, int *paudioindev, int *chindev,
     int *pnaudiooutdev, int *paudiooutdev, int *choutdev,
-    int *prate, int *padvance)
+    int *prate, int *padvance, int *pcallback)
 {
     int i;
     *pnaudioindev = audio_naudioindev;
@@ -92,12 +98,13 @@
             choutdev[i] = audio_audiochoutdev[i]; 
     *prate = audio_rate;
     *padvance = audio_advance;
+    *pcallback = audio_callback;
 }
 
 void sys_save_audio_params(
     int naudioindev, int *audioindev, int *chindev,
     int naudiooutdev, int *audiooutdev, int *choutdev,
-    int rate, int advance)
+    int rate, int advance, int callback)
 {
     int i;
     audio_naudioindev = naudioindev;
@@ -110,6 +117,7 @@
             audio_audiochoutdev[i] = choutdev[i]; 
     audio_rate = rate;
     audio_advance = advance;
+    audio_callback = callback;
 }
 
     /* init routines for any API which needs to set stuff up before
@@ -135,18 +143,18 @@
 {
     int nblk;
     int inbytes = (chin ? chin : 2) *
-                (DEFDACBLKSIZE*sizeof(float));
+                (DEFDACBLKSIZE*sizeof(t_sample));
     int outbytes = (chout ? chout : 2) *
-                (DEFDACBLKSIZE*sizeof(float));
+                (DEFDACBLKSIZE*sizeof(t_sample));
 
     if (sys_soundin)
         freebytes(sys_soundin, 
             (sys_inchannels? sys_inchannels : 2) *
-                (DEFDACBLKSIZE*sizeof(float)));
+                (DEFDACBLKSIZE*sizeof(t_sample)));
     if (sys_soundout)
         freebytes(sys_soundout, 
             (sys_outchannels? sys_outchannels : 2) *
-                (DEFDACBLKSIZE*sizeof(float)));
+                (DEFDACBLKSIZE*sizeof(t_sample)));
     sys_inchannels = chin;
     sys_outchannels = chout;
     sys_dacsr = sr;
@@ -154,10 +162,10 @@
     if (sys_advance_samples < 3 * DEFDACBLKSIZE)
         sys_advance_samples = 3 * DEFDACBLKSIZE;
 
-    sys_soundin = (t_float *)getbytes(inbytes);
+    sys_soundin = (t_sample *)getbytes(inbytes);
     memset(sys_soundin, 0, inbytes);
 
-    sys_soundout = (t_float *)getbytes(outbytes);
+    sys_soundout = (t_sample *)getbytes(outbytes);
     memset(sys_soundout, 0, outbytes);
 
     if (sys_verbose)
@@ -168,14 +176,14 @@
 
 /* ----------------------- public routines ----------------------- */
 
-    /* open audio devices (after cleaning up the specified device and channel
-    vectors).  The audio devices are "zero based" (i.e. "0" means the first
-    one.)  We also save the cleaned-up device specification so that we
-    can later re-open audio and/or show the settings on a dialog window. */
+    /* set audio device settings (after cleaning up the specified device and
+    channel vectors).  The audio devices are "zero based" (i.e. "0" means the
+    first one.)  We can later re-open audio and/or show the settings on a\
+    dialog window. */
 
-void sys_open_audio(int naudioindev, int *audioindev, int nchindev,
+void sys_set_audio_settings(int naudioindev, int *audioindev, int nchindev,
     int *chindev, int naudiooutdev, int *audiooutdev, int nchoutdev,
-    int *choutdev, int rate, int advance, int enable)
+    int *choutdev, int rate, int advance, int callback)
 {
     int i, *ip;
     int defaultchannels = SYS_DEFAULTCH;
@@ -184,17 +192,13 @@
     int realinchans[MAXAUDIOINDEV], realoutchans[MAXAUDIOOUTDEV];
 
     char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
-    int indevs = 0, outdevs = 0, canmulti = 0;
+    int indevs = 0, outdevs = 0, canmulti = 0, cancallback = 0;
     audio_getdevs(indevlist, &indevs, outdevlist, &outdevs, &canmulti,
-        MAXNDEV, DEVDESCSIZE);
-
+        &cancallback, MAXNDEV, DEVDESCSIZE);
     if (sys_externalschedlib)
     {
         return;
     }
-        /* if we're already open close it */
-    if (sys_inchannels || sys_outchannels)
-        sys_close_audio();
 
     if (rate < 1)
         rate = DEFAULTSRATE;
@@ -322,73 +326,12 @@
         outchans += choutdev[i];
         nrealoutdev++;
     }
-        /* if no input or output devices seem to have been specified,
-        this really means just disable audio, which we now do. */
-    if (!inchans && !outchans)
-        enable = 0;
     sys_schedadvance = advance * 1000;
-    sys_setchsr(inchans, outchans, rate);
     sys_log_error(ERR_NOTHING);
-    if (enable)
-    {
-#ifdef USEAPI_PORTAUDIO
-        if (sys_audioapi == API_PORTAUDIO)
-        {
-            int blksize = (sys_blocksize ? sys_blocksize : 64);
-            pa_open_audio(inchans, outchans, rate, sys_soundin, sys_soundout,
-                blksize, sys_advance_samples/blksize,
-                    (naudiooutdev > 0 ? audioindev[0] : 0),
-                        (naudiooutdev > 0 ? audiooutdev[0] : 0));
-        }
-else
-#endif
-#ifdef USEAPI_JACK
-        if (sys_audioapi == API_JACK) 
-            jack_open_audio((nrealindev > 0 ? realinchans[0] : 0),
-                (nrealoutdev > 0 ? realoutchans[0] : 0), rate);
-
-        else
-#endif    
-#ifdef USEAPI_OSS
-        if (sys_audioapi == API_OSS)
-            oss_open_audio(nrealindev, realindev, nrealindev, realinchans,
-                nrealoutdev, realoutdev, nrealoutdev, realoutchans, rate);
-        else
-#endif
-#ifdef USEAPI_ALSA
-            /* for alsa, only one device is supported; it may
-            be open for both input and output. */
-        if (sys_audioapi == API_ALSA)
-            alsa_open_audio(nrealindev, audioindev, nrealindev, realinchans,
-                nrealoutdev, audiooutdev, nrealoutdev, realoutchans, rate);
-        else 
-#endif
-#ifdef USEAPI_SGI
-        if (sys_audioapi == API_SGI)
-        {
-            xtern int sgi_open_audio(int nindev,  int *indev,  int nchin,
-                int *chin,  int noutdev, int *outdev, int nchout, int *chout,
-                int rate);
-            sgi_open_audio(naudioindev, audioindev, nchindev, chindev,
-                    naudiooutdev, audiooutdev, nchoutdev, choutdev, rate);
-        }
-        else
-#endif
-#ifdef USEAPI_MMIO
-        if (sys_audioapi == API_MMIO)
-            mmio_open_audio(nrealindev, audioindev, nrealindev, realinchans,
-                nrealoutdev, audiooutdev, nrealoutdev, realoutchans, rate);
-        else
-#endif
-            post("unknown audio API specified");
-    }
-    sys_save_audio_params(naudioindev, audioindev, chindev,
-        naudiooutdev, audiooutdev, choutdev, sys_dacsr, advance);
-    if (sys_inchannels == 0 && sys_outchannels == 0)
-        enable = 0;
-    audio_state = enable;
-    sys_vgui("set pd_whichapi %d\n",  (audio_isopen() ? sys_audioapi : 0));
-    sched_set_using_dacs(enable);
+    audio_nextinchans = inchans;
+    audio_nextoutchans = outchans;
+    sys_save_audio_params(nrealindev, realindev, realinchans,
+        nrealoutdev, realoutdev, realoutchans, rate, advance, callback);
 }
 
 void sys_close_audio(void)
@@ -400,40 +343,36 @@
     if (!audio_isopen())
         return;
 #ifdef USEAPI_PORTAUDIO
-    if (sys_audioapi == API_PORTAUDIO)
+    if (sys_audioapiopened == API_PORTAUDIO)
         pa_close_audio();
     else 
 #endif
 #ifdef USEAPI_JACK
-    if (sys_audioapi == API_JACK)
+    if (sys_audioapiopened == API_JACK)
         jack_close_audio();
     else
 #endif
 #ifdef USEAPI_OSS
-    if (sys_audioapi == API_OSS)
+    if (sys_audioapiopened == API_OSS)
         oss_close_audio();
     else
 #endif
 #ifdef USEAPI_ALSA
-    if (sys_audioapi == API_ALSA)
+    if (sys_audioapiopened == API_ALSA)
         alsa_close_audio();
     else
 #endif
-#ifdef USEAPI_SGI
-    if (sys_audioapi == API_SGI)
-    {
-        extern void sgi_close_audio(void);
-        sgi_close_audio();
-    }
-    else
-#endif
 #ifdef USEAPI_MMIO
-    if (sys_audioapi == API_MMIO)
+    if (sys_audioapiopened == API_MMIO)
         mmio_close_audio();
     else
 #endif
-        post("sys_close_audio: unknown API %d", sys_audioapi);
+        post("sys_close_audio: unknown API %d", sys_audioapiopened);
     sys_inchannels = sys_outchannels = 0;
+    sys_audioapiopened = -1;
+    sched_set_using_audio(SCHED_AUDIO_NONE);
+    audio_state = 0;
+    audio_callback_is_open = 0;
 }
 
     /* open audio using whatever parameters were last used */
@@ -441,11 +380,73 @@
 {
     int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV];
     int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV];
-    int rate, advance;
+    int rate, advance, callback, outcome = 0;
     sys_get_audio_params(&naudioindev, audioindev, chindev,
-        &naudiooutdev, audiooutdev, choutdev, &rate, &advance);
-    sys_open_audio(naudioindev, audioindev, naudioindev, chindev,
-        naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate, advance, 1);
+        &naudiooutdev, audiooutdev, choutdev, &rate, &advance, &callback);
+    sys_setchsr(audio_nextinchans, audio_nextoutchans, rate);
+    if (!naudioindev && !naudiooutdev)
+    {
+        sched_set_using_audio(SCHED_AUDIO_NONE);
+        return;
+    }
+#ifdef USEAPI_PORTAUDIO
+    if (sys_audioapi == API_PORTAUDIO)
+    {
+        int blksize = (sys_blocksize ? sys_blocksize : 64);
+        outcome = pa_open_audio((naudioindev > 0 ? chindev[0] : 0),
+        (naudiooutdev > 0 ? choutdev[0] : 0), rate, sys_soundin,
+            sys_soundout, blksize, sys_advance_samples/blksize, 
+             (naudioindev > 0 ? audioindev[0] : 0),
+              (naudiooutdev > 0 ? audiooutdev[0] : 0),
+               (callback ? sched_audio_callbackfn : 0));
+    }
+    else
+#endif
+#ifdef USEAPI_JACK
+    if (sys_audioapi == API_JACK) 
+        outcome = jack_open_audio((naudioindev > 0 ? chindev[0] : 0),
+            (naudioindev > 0 ? choutdev[0] : 0), rate);
+
+    else
+#endif    
+#ifdef USEAPI_OSS
+    if (sys_audioapi == API_OSS)
+        outcome = oss_open_audio(naudioindev, audioindev, naudioindev,
+            chindev, naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate);
+    else
+#endif
+#ifdef USEAPI_ALSA
+        /* for alsa, only one device is supported; it may
+        be open for both input and output. */
+    if (sys_audioapi == API_ALSA)
+        outcome = alsa_open_audio(naudioindev, audioindev, naudioindev,
+            chindev, naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate);
+    else 
+#endif
+#ifdef USEAPI_MMIO
+    if (sys_audioapi == API_MMIO)
+        outcome = mmio_open_audio(naudioindev, audioindev, naudioindev,
+            chindev, naudiooutdev, audiooutdev, naudiooutdev, choutdev, rate);
+    else
+#endif
+        post("unknown audio API specified");
+    if (outcome)    /* failed */
+    {
+        audio_state = 0;
+        sched_set_using_audio(SCHED_AUDIO_NONE);
+        sys_audioapiopened = -1;
+        audio_callback_is_open = 0;
+    }
+    else
+    {
+                /* fprintf(stderr, "started w/callback %d\n", callback); */
+        audio_state = 1;
+        sched_set_using_audio(
+            (callback ? SCHED_AUDIO_CALLBACK : SCHED_AUDIO_POLL));
+        sys_audioapiopened = sys_audioapi;
+        audio_callback_is_open = callback;
+    }
+    sys_vgui("set pd_whichapi %d\n",  (outcome == 0 ? sys_audioapi : 0));
 }
 
 int sys_send_dacs(void)
@@ -453,11 +454,11 @@
     if (sys_meters)
     {
         int i, n;
-        float maxsamp;
+        t_sample maxsamp;
         for (i = 0, n = sys_inchannels * DEFDACBLKSIZE, maxsamp = sys_inmax;
             i < n; i++)
         {
-            float f = sys_soundin[i];
+            t_sample f = sys_soundin[i];
             if (f > maxsamp) maxsamp = f;
             else if (-f > maxsamp) maxsamp = -f;
         }
@@ -465,7 +466,7 @@
         for (i = 0, n = sys_outchannels * DEFDACBLKSIZE, maxsamp = sys_outmax;
             i < n; i++)
         {
-            float f = sys_soundout[i];
+            t_sample f = sys_soundout[i];
             if (f > maxsamp) maxsamp = f;
             else if (-f > maxsamp) maxsamp = -f;
         }
@@ -492,14 +493,6 @@
         return (alsa_send_dacs());
     else
 #endif
-#ifdef USEAPI_SGI
-    if (sys_audioapi == API_SGI)
-    {
-        extern int sgi_send_dacs(void);
-        return (sgi_send_dacs());
-    }
-    else
-#endif
 #ifdef USEAPI_MMIO
     if (sys_audioapi == API_MMIO)
         return (mmio_send_dacs());
@@ -509,7 +502,7 @@
     return (0);
 }
 
-float sys_getsr(void)
+t_float sys_getsr(void)
 {
      return (sys_dacsr);
 }
@@ -524,7 +517,7 @@
      return (sys_inchannels);
 }
 
-void sys_getmeters(float *inmax, float *outmax)
+void sys_getmeters(t_sample *inmax, t_sample *outmax)
 {
     if (inmax)
     {
@@ -542,15 +535,17 @@
 }
 
 static void audio_getdevs(char *indevlist, int *nindevs,
-    char *outdevlist, int *noutdevs, int *canmulti, 
+    char *outdevlist, int *noutdevs, int *canmulti, int *cancallback,
         int maxndev, int devdescsize)
 {
     audio_init();
+    *cancallback = 0;   /* may be overridden by specific API implementation */
 #ifdef USEAPI_PORTAUDIO
     if (sys_audioapi == API_PORTAUDIO)
     {
         pa_getdevs(indevlist, nindevs, outdevlist, noutdevs, canmulti,
             maxndev, devdescsize);
+        *cancallback = 1;
     }
     else
 #endif
@@ -578,17 +573,6 @@
     }
     else
 #endif
-#ifdef USEAPI_SGI
-    if (sys_audioapi == API_SGI)
-    {
-        extern void sgi_getdevs(char *indevlist, int *nindevs,
-            char *outdevlist, int *noutdevs, int *canmulti, 
-            int maxndev, int devdescsize);
-        sgi_getdevs(indevlist, nindevs, outdevlist, noutdevs, canmulti,
-            maxndev, devdescsize);
-    }
-    else
-#endif
 #ifdef USEAPI_MMIO
     if (sys_audioapi == API_MMIO)
     {
@@ -614,10 +598,10 @@
 static void sys_listaudiodevs(void )
 {
     char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
-    int nindevs = 0, noutdevs = 0, i, canmulti = 0;
+    int nindevs = 0, noutdevs = 0, i, canmulti = 0, cancallback = 0;
 
     audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
-        MAXNDEV, DEVDESCSIZE);
+        &cancallback, MAXNDEV, DEVDESCSIZE);
 
     if (!nindevs)
         post("no audio input devices found");
@@ -656,26 +640,26 @@
         audioinchan1, audioinchan2, audioinchan3, audioinchan4,
         audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4,
         audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4;
-    int rate, advance;
+    int rate, advance, callback;
         /* these are all the devices on your system: */
     char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE];
-    int nindevs = 0, noutdevs = 0, canmulti = 0, i;
+    int nindevs = 0, noutdevs = 0, canmulti = 0, cancallback = 0, i;
 
     audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti,
-        MAXNDEV, DEVDESCSIZE);
+         &cancallback, MAXNDEV, DEVDESCSIZE);
 
     sys_gui("global audio_indevlist; set audio_indevlist {}\n");
     for (i = 0; i < nindevs; i++)
-        sys_vgui("lappend audio_indevlist \"%s\"\n",
+        sys_vgui("lappend audio_indevlist {%s}\n",
             indevlist + i * DEVDESCSIZE);
 
     sys_gui("global audio_outdevlist; set audio_outdevlist {}\n");
     for (i = 0; i < noutdevs; i++)
-        sys_vgui("lappend audio_outdevlist \"%s\"\n",
+        sys_vgui("lappend audio_outdevlist {%s}\n",
             outdevlist + i * DEVDESCSIZE);
 
     sys_get_audio_params(&naudioindev, audioindev, chindev,
-        &naudiooutdev, audiooutdev, choutdev, &rate, &advance);
+        &naudiooutdev, audiooutdev, choutdev, &rate, &advance, &callback);
 
     /* post("naudioindev %d naudiooutdev %d longform %f",
             naudioindev, naudiooutdev, flongform); */
@@ -702,16 +686,18 @@
 "pdtk_audio_dialog %%s \
 %d %d %d %d %d %d %d %d \
 %d %d %d %d %d %d %d %d \
-%d %d %d %d\n",
+%d %d %d %d %d\n",
         audioindev1, audioindev2, audioindev3, audioindev4, 
         audioinchan1, audioinchan2, audioinchan3, audioinchan4, 
         audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4,
         audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4, 
-        rate, advance, canmulti, (flongform != 0));
+        rate, advance, canmulti, (cancallback ? callback : -1),
+        (flongform != 0));
     gfxstub_deleteforkey(0);
     gfxstub_new(&glob_pdobject, (void *)glob_audio_properties, buf);
 }
 
+extern int pa_foo;
     /* new values from dialog window */
 void glob_audio_dialog(t_pd *dummy, t_symbol *s, int argc, t_atom *argv)
 {
@@ -724,7 +710,7 @@
         /* the new values the dialog came back with: */
     int newrate = atom_getintarg(16, argc, argv);
     int newadvance = atom_getintarg(17, argc, argv);
-    int statewas;
+    int newcallback = atom_getintarg(18, argc, argv);
 
     for (i = 0; i < 4; i++)
     {
@@ -756,11 +742,17 @@
             noutdev++;
         }
     }
-
-    sys_close_audio();
-    sys_open_audio(nindev, newaudioindev, nindev, newaudioinchan,
+    
+    if (newcallback < 0)
+        newcallback = 0;
+    if (!audio_callback_is_open && !newcallback)
+        sys_close_audio();
+    sys_set_audio_settings(nindev, newaudioindev, nindev, newaudioinchan,
         noutdev, newaudiooutdev, noutdev, newaudiooutchan,
-        newrate, newadvance, 1);
+        newrate, newadvance, (newcallback >= 0 ? newcallback : 0));
+    if (!audio_callback_is_open && !newcallback)
+        sys_reopen_audio();
+    else sched_reopenmeplease();
 }
 
 void sys_listdevs(void )
@@ -785,12 +777,6 @@
         sys_listaudiodevs();
     else
 #endif
-#ifdef USEAPI_SGI
-        extern void sgi_listaudiodevs(void);
-    if (sys_audioapi == API_SGI)
-        sgi_listaudiodevs();
-    else
-#endif
 #ifdef USEAPI_MMIO
     if (sys_audioapi == API_MMIO)
         sys_listaudiodevs();
@@ -843,8 +829,6 @@
     else if (audio_isopen())
     {
         sys_close_audio();
-        audio_state = 0;
-        sched_set_using_dacs(0);
     }
 }
 
@@ -859,12 +843,8 @@
     else
     {
         if (audio_isopen())
-        {
             sys_close_audio();
-            sched_set_using_dacs(0);
-        }
     }
-    audio_state = onoff;
 }
 
 void sys_get_audio_apis(char *buf)
@@ -891,10 +871,7 @@
 #else
     sprintf(buf + strlen(buf), "{portaudio %d} ", API_PORTAUDIO);
 #endif
-#ifdef USEAPI_SGI
-    sprintf(buf + strlen(buf), "{SGI %d} ", API_SGI); n++;
 #endif
-#endif
      n++;
 #endif
 #ifdef USEAPI_JACK
@@ -904,7 +881,6 @@
         /* then again, if only one API (or none) we don't offer any choice. */
     if (n < 2)
         strcpy(buf, "{}");
-    
 }
 
 #ifdef USEAPI_ALSA

Modified: branches/pd-extended/0.41/pd/src/s_loader.c
===================================================================
--- branches/pd-extended/0.41/pd/src/s_loader.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/s_loader.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -28,6 +28,9 @@
 #endif
 #include "m_pd.h"
 #include "s_stuff.h"
+#ifdef _MSC_VER  /* This is only for Microsoft's compiler, not cygwin, e.g. */
+#define snprintf sprintf_s
+#endif
 
 typedef void (*t_xxx)(void);
 
@@ -43,7 +46,7 @@
 static char sys_dllextent[] = ".b_i386", sys_dllextent2[] = ".pd_freebsd";
 #endif
 #ifdef __linux__
-#ifdef __ia64__
+#ifdef __x86_64__
 static char sys_dllextent[] = ".l_ia64", sys_dllextent2[] = ".pd_linux";
 #else
 static char sys_dllextent[] = ".l_i386", sys_dllextent2[] = ".pd_linux";
@@ -132,7 +135,7 @@
     symname[i] = 0;
     if (hexmunge)
     {
-        memmove(symname+6, symname, strlen(symname+1));
+        memmove(symname+6, symname, strlen(symname)+1);
         strncpy(symname, "setup_", 6);
     }
     else strcat(symname, "_setup");
@@ -243,3 +246,37 @@
     return ok;
 }
 
+int sys_run_scheduler(const char *externalschedlibname,
+    const char *sys_extraflagsstring)
+{
+    typedef int (*t_externalschedlibmain)(const char *);
+    t_externalschedlibmain externalmainfunc;
+    char filename[MAXPDSTRING];
+    snprintf(filename, sizeof(filename), "%s.%s", externalschedlibname,
+        sys_dllextent);
+    sys_bashfilename(filename, filename);
+#ifdef MSW
+    {
+        HINSTANCE ntdll = LoadLibrary(filename);
+        if (!ntdll)
+        {
+            post("%s: couldn't load external scheduler lib ", filename);
+            return (0);
+        }
+        externalmainfunc =
+            (t_externalschedlibmain)GetProcAddress(ntdll, "main");
+    }
+#else
+    {
+        void *dlobj = dlopen(filename, RTLD_NOW | RTLD_GLOBAL);
+        if (!dlobj)
+        {
+            post("%s: %s", filename, dlerror());
+            return (0);
+        }
+        externalmainfunc = (t_externalschedlibmain)dlsym(dlobj,
+            "pd_extern_sched");
+    }
+#endif
+    return((*externalmainfunc)(sys_extraflagsstring));
+}

Modified: branches/pd-extended/0.41/pd/src/s_midi.c
===================================================================
--- branches/pd-extended/0.41/pd/src/s_midi.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/s_midi.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -245,6 +245,20 @@
    sys_queuemidimess(portno, 1, 0xf8, 0,0);
 }
 
+void outmidi_byte(int portno, int value)
+{
+#ifdef USEAPI_ALSA
+  if (sys_midiapi == API_ALSA)
+    {
+      sys_alsa_putmidibyte(portno, value);
+    }
+  else
+#endif
+    {
+      sys_putmidibyte(portno, value);
+    }
+}
+
 /* ------------------------- MIDI input queue handling ------------------ */
 typedef struct midiparser
 {
@@ -664,12 +678,12 @@
 
     sys_gui("global midi_indevlist; set midi_indevlist {none}\n");
     for (i = 0; i < nindevs; i++)
-        sys_vgui("lappend midi_indevlist \"%s\"\n",
+        sys_vgui("lappend midi_indevlist {%s}\n",
             indevlist + i * DEVDESCSIZE);
 
     sys_gui("global midi_outdevlist; set midi_outdevlist {none}\n");
     for (i = 0; i < noutdevs; i++)
-        sys_vgui("lappend midi_outdevlist \"%s\"\n",
+        sys_vgui("lappend midi_outdevlist {%s}\n",
             outdevlist + i * DEVDESCSIZE);
 
     sys_get_midi_params(&nindev, midiindev, &noutdev, midioutdev);

Modified: branches/pd-extended/0.41/pd/src/s_midi_alsa.c
===================================================================
--- branches/pd-extended/0.41/pd/src/s_midi_alsa.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/s_midi_alsa.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -51,8 +51,16 @@
     int client;
     int i;
     snd_seq_client_info_t *alsainfo;
+    /* do we want to connect pd automatically with other devices ?; see below! */
+    /* LATER: think about a flag to enable/disable automatic connection
+     *        (sometimes it could be a pain)
+     */
+    int autoconnect = 1;
     alsa_nmidiin = 0;
     alsa_nmidiout = 0;
+
+    if (nmidiout == 0 && nmidiin == 0) return;
+
     if(nmidiin>MAXMIDIINDEV )
       {
         post("midi input ports reduced to maximum %d", MAXMIDIINDEV);
@@ -77,25 +85,28 @@
             post("couldn't open alsa sequencer");
             return;
     }
-    for (i=0;i<nmidiout;i++)
+    for (i=0;i<nmidiin;i++)
     {
         int port;
         sprintf(portname,"Pure Data Midi-In %d",i+1);
-        port = snd_seq_create_simple_port(midi_handle,portname,SND_SEQ_PORT_CAP_WRITE |SND_SEQ_PORT_CAP_SUBS_WRITE , SND_SEQ_PORT_TYPE_APPLICATION);
+        port = snd_seq_create_simple_port(midi_handle,portname,
+                                          SND_SEQ_PORT_CAP_WRITE |SND_SEQ_PORT_CAP_SUBS_WRITE, 
+                                          SND_SEQ_PORT_TYPE_APPLICATION);
         alsa_midiinfd[i] = port;        
         if (port < 0) goto error;        
     }
 
-    for (i=0;i<nmidiin;i++)
+    for (i=0;i<nmidiout;i++)
     {
         int port;
         sprintf(portname,"Pure Data Midi-Out %d",i+1);
-        port = snd_seq_create_simple_port(midi_handle,portname,  SND_SEQ_PORT_CAP_SUBS_READ |  SND_SEQ_PORT_CAP_READ, SND_SEQ_PORT_TYPE_APPLICATION);
+        port = snd_seq_create_simple_port(midi_handle,portname,
+                                          SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, 
+                                          SND_SEQ_PORT_TYPE_APPLICATION);
         alsa_midioutfd[i] = port;       
         if (port < 0) goto error;        
     }
    
-    if (nmidiout == 0 && nmidiin == 0) return;
     snd_seq_client_info_malloc(&alsainfo);
     snd_seq_get_client_info(midi_handle,alsainfo);
     snd_seq_client_info_set_name(alsainfo,"Pure Data");
@@ -107,8 +118,67 @@
     snd_midi_event_new(20,&midiev);
     alsa_nmidiout = nmidiout;
     alsa_nmidiin = nmidiin;
+
+    /* JMZ: connect all available devices to pd */
+    if (autoconnect)
+      {
+
+        snd_seq_client_info_t *cinfo;
+        snd_seq_port_info_t *pinfo;
+
+        snd_seq_port_subscribe_t *subs;
+        snd_seq_addr_t other, topd, frompd;
+        /* since i don't know how to connect multiple ports
+         * (connect everything to each port, modulo,...),
+         * i only fully connect where we have only one single port
+         */
+        if(alsa_nmidiin)
+          {
+            topd.client  =client;
+            topd.port    =alsa_midiinfd[0];
+          }
+        if(alsa_nmidiout)
+          {
+            frompd.client  =client;
+            frompd.port    =alsa_midioutfd[0];
+          }
+
+        snd_seq_port_subscribe_alloca(&subs);
+        
+        snd_seq_client_info_alloca(&cinfo);
+        snd_seq_port_info_alloca(&pinfo);
+        snd_seq_client_info_set_client(cinfo, -1);
+        while (snd_seq_query_next_client(midi_handle, cinfo) >= 0)
+          {
+            /* reset query info */
+            int client_id=snd_seq_client_info_get_client(cinfo);
+            
+            if((SND_SEQ_CLIENT_SYSTEM != client_id)&&(client != client_id))
+              { /* skipping port 0 and ourself */
+                snd_seq_port_info_set_client(pinfo, client_id);
+                snd_seq_port_info_set_port(pinfo, -1);
+                while (snd_seq_query_next_port(midi_handle, pinfo) >= 0) 
+                  {
+                    other.client=client_id;
+                    other.port  =snd_seq_port_info_get_port(pinfo);
+                    if(1==alsa_nmidiin) /* only autoconnect 1st port */
+                      {
+                        snd_seq_port_subscribe_set_sender(subs, &other);
+                        snd_seq_port_subscribe_set_dest(subs, &topd);
+                        snd_seq_subscribe_port(midi_handle, subs);
+                      }
+                    if(1==alsa_nmidiout) /* only autoconnect 1st port */
+                      {
+                        snd_seq_port_subscribe_set_sender(subs, &frompd);
+                        snd_seq_port_subscribe_set_dest(subs, &other);
+                        snd_seq_subscribe_port(midi_handle, subs);
+                      }
+                  }
+              }
+          }
+      }
     return;
-  error:
+ error:
     sys_setalarm(1000000);
     post("couldn't open alsa MIDI output device");
     return;
@@ -173,10 +243,8 @@
     {
         // repack into 1 byte char and put somewhere to point at
         unsigned char data = (unsigned char)byte;
-        unsigned char *dataptr = malloc(1);
-        memcpy(dataptr,&byte,1);
 
-        snd_seq_ev_set_sysex(&ev,1,dataptr); //...set_variable *should* have worked but didn't
+        snd_seq_ev_set_sysex(&ev,1,&data); //...set_variable *should* have worked but didn't
         snd_seq_ev_set_direct(&ev);
         snd_seq_ev_set_subs(&ev);
         snd_seq_ev_set_source(&ev,alsa_midioutfd[portno]);

Modified: branches/pd-extended/0.41/pd/src/s_midi_pm.c
===================================================================
--- branches/pd-extended/0.41/pd/src/s_midi_pm.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/s_midi_pm.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -23,7 +23,6 @@
 #include "portaudio.h"
 #include "portmidi.h"
 #include "porttime.h"
-#include "pminternal.h"
 
 static PmStream *mac_midiindevlist[MAXMIDIINDEV];
 static PmStream *mac_midioutdevlist[MAXMIDIOUTDEV];
@@ -142,7 +141,7 @@
         writemidi4(mac_midioutdevlist[portno], byte, 0, 0, 0);
     else if (byte == 0xf0)
     {
-        mess[0] = 0xf7;
+        mess[0] = 0xf0;
         nbytes = 1;
         sysex = 1;
     }
@@ -211,6 +210,38 @@
     }
 }
 
+/* this is non-zero if we are in the middle of transmitting sysex */
+
+int nd_sysex_mode=0;
+
+/* send in 4 bytes of sysex data. if one of the bytes is 0xF7 (sysex end) stop and unset nd_sysex_mode */ 
+void nd_sysex_inword(int midiindev, int status, int data1, int data2, int data3)
+{
+    if (nd_sysex_mode) {
+        sys_midibytein(midiindev, status);
+        if (status == 0xF7)
+            nd_sysex_mode = 0;
+    }
+
+    if (nd_sysex_mode) {
+        sys_midibytein(midiindev, data1);
+        if (data1 == 0xF7)
+            nd_sysex_mode = 0;
+    }
+
+    if (nd_sysex_mode) {
+        sys_midibytein(midiindev, data2);
+        if (data2 == 0xF7)
+            nd_sysex_mode = 0;
+    }
+
+    if (nd_sysex_mode) {
+        sys_midibytein(midiindev, data3);
+        if (data3 == 0xF7)
+            nd_sysex_mode = 0;
+    }
+}
+
 void sys_poll_midi(void)
 {
     int i, nmess;
@@ -223,6 +254,7 @@
             int status = Pm_MessageStatus(buffer.message);
             int data1  = Pm_MessageData1(buffer.message);
             int data2  = Pm_MessageData2(buffer.message);
+            int data3 = ((buffer.message >> 24) & 0xFF);
             int msgtype = (status >> 4) - 8;
             switch (msgtype)
             {
@@ -241,8 +273,12 @@
                 sys_midibytein(i, data1);
                 break;
             case 7:
-                sys_midibytein(i, status);
+                nd_sysex_mode=1;
+                nd_sysex_inword(i, status, data1, data2, data3);
                 break; 
+            default:
+                if (nd_sysex_mode)
+                    nd_sysex_inword(i, status, data1, data2, data3);
             }
         }
     }

Modified: branches/pd-extended/0.41/pd/src/s_print.c
===================================================================
--- branches/pd-extended/0.41/pd/src/s_print.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/s_print.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -83,7 +83,7 @@
     }
 }
 
-void postfloat(float f)
+void postfloat(t_float f)
 {
     char buf[80];
     t_atom a;
@@ -118,7 +118,7 @@
     int i;
     if(level>sys_verbose)return;
     dopost("verbose(");
-    postfloat((float)level);
+    postfloat((t_float)level);
     dopost("):");
     
     va_start(ap, fmt);

Modified: branches/pd-extended/0.41/pd/src/t_tkcmd.c
===================================================================
--- branches/pd-extended/0.41/pd/src/t_tkcmd.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/t_tkcmd.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -429,6 +429,7 @@
 #endif
 
 #ifdef HAVE_UNISTD_H
+    sprintf(cmdbuf, "\"%s\" -guiport %d\n", pdbuf, portno);
     childpid = fork();
     if (childpid < 0)
     {
@@ -438,7 +439,6 @@
     }
     else if (!childpid)                 /* we're the child */
     {
-        sprintf(cmdbuf, "\"%s\" -guiport %d\n", pdbuf, portno);
 #ifdef DEBUGCONNECT     
         fprintf(debugfd, "%s", cmdbuf);
         fflush(debugfd);
@@ -639,19 +639,11 @@
 {
     const char *argv = Tcl_GetVar(interp, "argv", 0);
     int portno, argno = 0;
-        /* argument passing seems to be different in MSW as opposed to
-        unix-likes.  Here we check if we got sent a "port number" as an
-        argument.  If so. we're to connect to a previously running pd (i.e.,
-        pd got started first).  If not, we start Pd from here. */
-#ifdef MSW
     if (argv && (portno = atoi(argv)) > 1)
-#else
-    char *firstspace;
-    if (argv && (firstspace = strchr(argv, ' ')) && (portno = atoi(firstspace)) > 1)
-#endif
         pdgui_setsock(portno);
 #ifdef DEBUGCONNECT
-    debugfd = fopen("/Users/msp/bratwurst", "w");
+        pd_portno = portno;
+    debugfd = fopen("/tmp/bratwurst", "w");
     fprintf(debugfd, "turning stderr back on\n");
     fflush(debugfd);
     dup2(fileno(debugfd), 2);

Modified: branches/pd-extended/0.41/pd/src/x_arithmetic.c
===================================================================
--- branches/pd-extended/0.41/pd/src/x_arithmetic.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/x_arithmetic.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -575,8 +575,8 @@
 
 static void tan_float(t_object *x, t_float f)
 {
-    float c = cosf(f);
-    float t = (c == 0 ? 0 : sinf(f)/c);
+    t_float c = cosf(f);
+    t_float t = (c == 0 ? 0 : sinf(f)/c);
     outlet_float(x->ob_outlet, t);
 }
 
@@ -599,15 +599,12 @@
 typedef struct _atan2
 {
     t_object x_ob;
-    float x_f;
+    t_float x_f;
 } t_atan2;
 
 static void *atan2_new(void)
 {
     t_atan2 *x = (t_atan2 *)pd_new(atan2_class);
-    static int warned;
-    if (!warned)
-        post("warning: atan2 inlets switched from Pd 0.37 to 0.38"), warned=1;
     floatinlet_new(&x->x_ob, &x->x_f);
     x->x_f = 0;
     outlet_new(&x->x_ob, &s_float);
@@ -616,7 +613,7 @@
 
 static void atan2_float(t_atan2 *x, t_float f)
 {
-    float r = (f == 0 && x->x_f == 0 ? 0 : atan2f(f, x->x_f));
+    t_float r = (f == 0 && x->x_f == 0 ? 0 : atan2f(f, x->x_f));
     outlet_float(x->x_ob.ob_outlet, r);
 }
 
@@ -631,7 +628,7 @@
 
 static void sqrt_float(t_object *x, t_float f)
 {
-    float r = (f > 0 ? sqrtf(f) : 0);
+    t_float r = (f > 0 ? sqrtf(f) : 0);
     outlet_float(x->ob_outlet, r);
 }
 
@@ -646,7 +643,7 @@
 
 static void log_float(t_object *x, t_float f)
 {
-    float r = (f > 0 ? logf(f) : -1000);
+    t_float r = (f > 0 ? logf(f) : -1000);
     outlet_float(x->ob_outlet, r);
 }
 
@@ -663,7 +660,7 @@
 #define MAXLOG 87.3365
 static void exp_float(t_object *x, t_float f)
 {
-    float g;
+    t_float g;
     if (f > MAXLOG) f = MAXLOG;
     g = expf(f);
     outlet_float(x->ob_outlet, g);
@@ -690,9 +687,9 @@
 typedef struct _clip
 {
     t_object x_ob;
-    float x_f1;
-    float x_f2;
-    float x_f3;
+    t_float x_f1;
+    t_float x_f2;
+    t_float x_f3;
 } t_clip;
 
 static void *clip_new(t_floatarg f1, t_floatarg f2)

Modified: branches/pd-extended/0.41/pd/src/x_connective.c
===================================================================
--- branches/pd-extended/0.41/pd/src/x_connective.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/x_connective.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -506,7 +506,7 @@
     int nelement;
     if (x->x_type == A_FLOAT)
     {
-        float f;
+        t_float f;
         if (!argc) return;
         f = atom_getfloat(argv);
         for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++)
@@ -1056,7 +1056,7 @@
 typedef struct _spigot
 {
     t_object x_obj;
-    float x_state;
+    t_float x_state;
 } t_spigot;
 
 static void *spigot_new(t_floatarg f)
@@ -1117,7 +1117,7 @@
 {
     t_object x_ob;
     t_outlet *x_out2;
-    float x_y;
+    t_float x_y;
 } t_moses;
 
 static void *moses_new(t_floatarg f)
@@ -1173,6 +1173,8 @@
 
 static void until_float(t_until *x, t_float f)
 {
+    if (f < 0)
+        f = 0;
     x->x_run = 1;
     x->x_count = f;
     while (x->x_run && x->x_count)

Modified: branches/pd-extended/0.41/pd/src/x_list.c
===================================================================
--- branches/pd-extended/0.41/pd/src/x_list.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/x_list.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -54,6 +54,7 @@
 {
     t_pd l_pd;          /* object to point inlets to */
     int l_n;            /* number of items */
+    int l_npointer;     /* number of pointers */
     t_listelem *l_vec;  /* pointer to items */
 } t_alist;
 
@@ -99,7 +100,7 @@
 static void alist_init(t_alist *x)
 {
     x->l_pd = alist_class;
-    x->l_n = 0;
+    x->l_n = x->l_npointer = 0;
     x->l_vec = 0;
 }
 
@@ -126,11 +127,16 @@
         return;
     }
     x->l_n = argc;
+    x->l_npointer = 0;
     for (i = 0; i < argc; i++)
     {
         x->l_vec[i].l_a = argv[i];
         if (x->l_vec[i].l_a.a_type == A_POINTER)
+        {
+            x->l_npointer++;
             gpointer_copy(x->l_vec[i].l_a.a_w.w_gpointer, &x->l_vec[i].l_p);
+            x->l_vec[i].l_a.a_w.w_gpointer = &x->l_vec[i].l_p;
+        }
     }
 }
 
@@ -145,12 +151,17 @@
         return;
     }
     x->l_n = argc+1;
+    x->l_npointer = 0;
     SETSYMBOL(&x->l_vec[0].l_a, s);
     for (i = 0; i < argc; i++)
     {
         x->l_vec[i+1].l_a = argv[i];
         if (x->l_vec[i+1].l_a.a_type == A_POINTER)
+        {
+            x->l_npointer++;            
             gpointer_copy(x->l_vec[i+1].l_a.a_w.w_gpointer, &x->l_vec[i+1].l_p);
+            x->l_vec[i].l_a.a_w.w_gpointer = &x->l_vec[i].l_p;
+        }
     }
 }
 
@@ -161,6 +172,29 @@
         to[i] = x->l_vec[i].l_a;
 }
 
+
+static void alist_clone(t_alist *x, t_alist *y)
+{
+    int i;
+    y->l_pd = alist_class;
+    y->l_n = x->l_n;
+    y->l_npointer = x->l_npointer;
+    if (!(y->l_vec = (t_listelem *)getbytes(y->l_n * sizeof(*y->l_vec))))
+    {
+        y->l_n = 0;
+        error("list_alloc: out of memory");
+    }
+    else for (i = 0; i < x->l_n; i++)
+    {
+        y->l_vec[i].l_a = x->l_vec[i].l_a;
+        if (y->l_vec[i].l_a.a_type == A_POINTER)
+        {
+            gpointer_copy(y->l_vec[i].l_a.a_w.w_gpointer, &y->l_vec[i].l_p);
+            y->l_vec[i].l_a.a_w.w_gpointer = &y->l_vec[i].l_p;
+        }
+    }
+}
+
 static void alist_setup(void)
 {
     alist_class = class_new(gensym("list inlet"),
@@ -196,8 +230,19 @@
     int n, outc = x->x_alist.l_n + argc;
     ATOMS_ALLOCA(outv, outc);
     atoms_copy(argc, argv, outv);
-    alist_toatoms(&x->x_alist, outv+argc);
-    outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+    if (x->x_alist.l_npointer)
+    {
+        t_alist y;
+        alist_clone(&x->x_alist, &y);
+        alist_toatoms(&y, outv+argc);
+        outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+        alist_clear(&y);
+    }
+    else
+    {
+        alist_toatoms(&x->x_alist, outv+argc);
+        outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+    }
     ATOMS_FREEA(outv, outc);
 }
 
@@ -209,8 +254,19 @@
     ATOMS_ALLOCA(outv, outc);
     SETSYMBOL(outv, s);
     atoms_copy(argc, argv, outv + 1);
-    alist_toatoms(&x->x_alist, outv + 1 + argc);
-    outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+    if (x->x_alist.l_npointer)
+    {
+        t_alist y;
+        alist_clone(&x->x_alist, &y);
+        alist_toatoms(&y, outv + 1 + argc);
+        outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+        alist_clear(&y);
+    }
+    else
+    {
+        alist_toatoms(&x->x_alist, outv + 1 + argc);
+        outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+    }
     ATOMS_FREEA(outv, outc);
 }
 
@@ -255,22 +311,46 @@
     t_atom *outv;
     int n, outc = x->x_alist.l_n + argc;
     ATOMS_ALLOCA(outv, outc);
-    alist_toatoms(&x->x_alist, outv);
     atoms_copy(argc, argv, outv + x->x_alist.l_n);
-    outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+    if (x->x_alist.l_npointer)
+    {
+        t_alist y;
+        alist_clone(&x->x_alist, &y);
+        alist_toatoms(&y, outv);
+        outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+        alist_clear(&y);
+    }
+    else
+    {
+        alist_toatoms(&x->x_alist, outv);
+        outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+    }
     ATOMS_FREEA(outv, outc);
 }
 
+
+
 static void list_prepend_anything(t_list_prepend *x, t_symbol *s,
     int argc, t_atom *argv)
 {
     t_atom *outv;
     int n, outc = x->x_alist.l_n + argc + 1;
     ATOMS_ALLOCA(outv, outc);
-    alist_toatoms(&x->x_alist, outv);
     SETSYMBOL(outv + x->x_alist.l_n, s);
     atoms_copy(argc, argv, outv + x->x_alist.l_n + 1);
-    outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+    if (x->x_alist.l_npointer)
+    {
+        t_alist y;
+        alist_clone(&x->x_alist, &y);
+        alist_toatoms(&y, outv);
+        outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+        alist_clear(&y);
+    }
+    else
+    {
+        alist_toatoms(&x->x_alist, outv);
+        outlet_list(x->x_obj.ob_outlet, &s_list, outc, outv);
+    }
     ATOMS_FREEA(outv, outc);
 }
 
@@ -408,13 +488,13 @@
 static void list_length_list(t_list_length *x, t_symbol *s,
     int argc, t_atom *argv)
 {
-    outlet_float(x->x_obj.ob_outlet, (float)argc);
+    outlet_float(x->x_obj.ob_outlet, (t_float)argc);
 }
 
 static void list_length_anything(t_list_length *x, t_symbol *s,
     int argc, t_atom *argv)
 {
-    outlet_float(x->x_obj.ob_outlet, (float)argc+1);
+    outlet_float(x->x_obj.ob_outlet, (t_float)argc+1);
 }
 
 static void list_length_setup(void)

Modified: branches/pd-extended/0.41/pd/src/x_midi.c
===================================================================
--- branches/pd-extended/0.41/pd/src/x_midi.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/x_midi.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -12,7 +12,9 @@
 void outmidi_aftertouch(int portno, int channel, int value);
 void outmidi_polyaftertouch(int portno, int channel, int pitch, int value);
 void outmidi_mclk(int portno);
+void outmidi_byte(int portno, int value);
 
+
 /* ----------------------- midiin and sysexin ------------------------- */
 
 static t_symbol *midiin_sym, *sysexin_sym;
@@ -32,8 +34,8 @@
     x->x_outlet1 = outlet_new(&x->x_obj, &s_float);
     x->x_outlet2 = outlet_new(&x->x_obj, &s_float);
     pd_bind(&x->x_obj.ob_pd, midiin_sym);
-#ifndef __linux__
-    pd_error(x, "midiin: works under Linux only");
+#ifdef WIN32
+    pd_error(x, "midiin: windows: not supported");
 #endif
     return (x);
 }
@@ -55,8 +57,8 @@
     x->x_outlet1 = outlet_new(&x->x_obj, &s_float);
     x->x_outlet2 = outlet_new(&x->x_obj, &s_float);
     pd_bind(&x->x_obj.ob_pd, sysexin_sym);
-#ifndef __linux__
-    pd_error(x, "sysexin: works under Linux only");
+#ifdef WIN32
+    pd_error(x, "sysexin: windows: not supported");
 #endif
     return (x);
 }
@@ -133,9 +135,9 @@
 
 static void notein_list(t_notein *x, t_symbol *s, int argc, t_atom *argv)
 {
-    float pitch = atom_getfloatarg(0, argc, argv);
-    float velo = atom_getfloatarg(1, argc, argv);
-    float channel = atom_getfloatarg(2, argc, argv);
+    t_float pitch = atom_getfloatarg(0, argc, argv);
+    t_float velo = atom_getfloatarg(1, argc, argv);
+    t_float channel = atom_getfloatarg(2, argc, argv);
     if (x->x_channel != 0)
     {
         if (channel != x->x_channel) return;
@@ -274,8 +276,8 @@
 
 static void pgmin_list(t_pgmin *x, t_symbol *s, int argc, t_atom *argv)
 {
-    float value = atom_getfloatarg(0, argc, argv);
-    float channel = atom_getfloatarg(1, argc, argv);
+    t_float value = atom_getfloatarg(0, argc, argv);
+    t_float channel = atom_getfloatarg(1, argc, argv);
     if (x->x_channel != 0)
     {
         if (channel != x->x_channel) return;
@@ -540,8 +542,8 @@
 
 static void midiclkin_list(t_midiclkin *x, t_symbol *s, int argc, t_atom *argv)
 {
-    float value = atom_getfloatarg(0, argc, argv);
-    float count = atom_getfloatarg(1, argc, argv);
+    t_float value = atom_getfloatarg(0, argc, argv);
+    t_float count = atom_getfloatarg(1, argc, argv);
     outlet_float(x->x_outlet2, count);
     outlet_float(x->x_outlet1, value);
 }
@@ -564,9 +566,9 @@
 void inmidi_clk(double timing)
 {
 
-    static float prev = 0;
-    static float count = 0;
-    float cur,diff;
+    static t_float prev = 0;
+    static t_float count = 0;
+    t_float cur,diff;
 
     if (midiclkin_sym->s_thing)
     {
@@ -615,8 +617,8 @@
 static void midirealtimein_list(t_midirealtimein *x, t_symbol *s,
     int argc, t_atom *argv)
 {
-    float portno = atom_getfloatarg(0, argc, argv);
-    float byte = atom_getfloatarg(1, argc, argv);
+    t_float portno = atom_getfloatarg(0, argc, argv);
+    t_float byte = atom_getfloatarg(1, argc, argv);
 
     outlet_float(x->x_outlet2, portno);
     outlet_float(x->x_outlet1, byte);
@@ -674,7 +676,7 @@
 
 static void midiout_float(t_midiout *x, t_floatarg f)
 {
-    sys_putmidibyte(x->x_portno - 1, f);
+    outmidi_byte(x->x_portno - 1, f);
 }
 
 static void midiout_setup(void)
@@ -1058,7 +1060,7 @@
 
 typedef struct voice
 {
-    float v_pitch;
+    t_float v_pitch;
     int v_used;
     unsigned long v_serial;
 } t_voice;
@@ -1068,14 +1070,14 @@
     t_object x_obj;
     int x_n;
     t_voice *x_vec;
-    float x_vel;
+    t_float x_vel;
     t_outlet *x_pitchout;
     t_outlet *x_velout;
     unsigned long x_serial;
     int x_steal;
 } t_poly;
 
-static void *poly_new(float fnvoice, float fsteal)
+static void *poly_new(t_float fnvoice, t_float fsteal)
 {
     int i, n = fnvoice;
     t_poly *x = (t_poly *)pd_new(poly_class);

Modified: branches/pd-extended/0.41/pd/src/x_misc.c
===================================================================
--- branches/pd-extended/0.41/pd/src/x_misc.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/x_misc.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -29,8 +29,11 @@
 #endif
 
 #if defined (__APPLE__) || defined (__FreeBSD__)
-#define HZ CLK_TCK
+#define CLOCKHZ CLK_TCK
 #endif
+#if defined (__linux__)
+#define CLOCKHZ sysconf(_SC_CLK_TCK)
+#endif
 
 /* -------------------------- random ------------------------------ */
 /* this is strictly homebrew and untested. */
@@ -74,7 +77,7 @@
     outlet_float(x->x_obj.ob_outlet, nval);
 }
 
-static void random_seed(t_random *x, float f, float glob)
+static void random_seed(t_random *x, t_float f, t_float glob)
 {
     x->x_state = f;
 }
@@ -292,16 +295,16 @@
 static void cputime_bang2(t_cputime *x)
 {
 #ifdef HAVE_UNISTD_H
-    float elapsedcpu;
+    t_float elapsedcpu;
     struct tms newcputime;
     times(&newcputime);
     elapsedcpu = 1000 * (
         newcputime.tms_utime + newcputime.tms_stime -
-            x->x_setcputime.tms_utime - x->x_setcputime.tms_stime) / HZ;
+            x->x_setcputime.tms_utime - x->x_setcputime.tms_stime) / CLOCKHZ;
     outlet_float(x->x_obj.ob_outlet, elapsedcpu);
 #endif
 #ifdef MSW
-    float elapsedcpu;
+    t_float elapsedcpu;
     FILETIME ignorethis, ignorethat;
     LARGE_INTEGER usertime, kerneltime;
     BOOL retval;

Modified: branches/pd-extended/0.41/pd/src/x_qlist.c
===================================================================
--- branches/pd-extended/0.41/pd/src/x_qlist.c	2009-01-10 01:15:48 UTC (rev 10495)
+++ branches/pd-extended/0.41/pd/src/x_qlist.c	2009-01-10 02:18:04 UTC (rev 10496)
@@ -22,9 +22,9 @@
     void *x_binbuf;
     int x_onset;                /* playback position */
     t_clock *x_clock;
-    float x_tempo;
+    t_float x_tempo;
     double x_whenclockset;
-    float x_clockdelay;
+    t_float x_clockdelay;
     t_symbol *x_dir;
     t_canvas *x_canvas;
     int x_reentered;
@@ -104,7 +104,8 @@
             if (ap->a_type != A_SYMBOL) continue;
             else if (!(target = ap->a_w.w_symbol->s_thing))
             {
-                error("qlist: %s: no such object", ap->a_w.w_symbol->s_name);
+                pd_error(x, "qlist: %s: no such object",
+                    ap->a_w.w_symbol->s_name);
                 continue;
             }
             ap++;
@@ -184,10 +185,10 @@
     if (!strcmp(format->s_name, "cr"))
         cr = 1;
     else if (*format->s_name)
-        error("qlist_read: unknown flag: %s", format->s_name);
+        pd_error(x, "qlist_read: unknown flag: %s", format->s_name);
 
     if (binbuf_read_via_canvas(x->x_binbuf, filename->s_name, x->x_canvas, cr))
-            error("%s: read failed", filename->s_name);
+            pd_error(x, "%s: read failed", filename->s_name);
     x->x_onset = 0x7fffffff;
     x->x_reentered = 1;
 }
@@ -201,9 +202,9 @@
     if (!strcmp(format->s_name, "cr"))
         cr = 1;
     else if (*format->s_name)
-        error("qlist_read: unknown flag: %s", format->s_name);
+        pd_error(x, "qlist_read: unknown flag: %s", format->s_name);
     if (binbuf_write(x->x_binbuf, buf, "", cr))
-            error("%s: write failed", filename->s_name);
+            pd_error(x, "%s: write failed", filename->s_name);
 }
 
 static void qlist_print(t_qlist *x)
@@ -214,14 +215,14 @@
 
 static void qlist_tempo(t_qlist *x, t_float f)
 {
-    float newtempo;
+    t_float newtempo;
     if (f < 1e-20) f = 1e-20;
     else if (f > 1e20) f = 1e20;
     newtempo = 1./f;
     if (x->x_whenclockset != 0)
     {
-        float elapsed = clock_gettimesince(x->x_whenclockset);
-        float left = x->x_clockdelay - elapsed;
+        t_float elapsed = clock_gettimesince(x->x_whenclockset);
+        t_float left = x->x_clockdelay - elapsed;
         if (left < 0) left = 0;
         left *= newtempo / x->x_tempo;
         clock_delay(x->x_clock, left);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Pd-cvs mailing list