Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2630
Modified Files: Tag: desiredata d_ugen.c Log Message: 0.40
Index: d_ugen.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/d_ugen.c,v retrieving revision 1.3.4.1.2.5.2.1 retrieving revision 1.3.4.1.2.5.2.2 diff -C2 -d -r1.3.4.1.2.5.2.1 -r1.3.4.1.2.5.2.2 *** d_ugen.c 8 Dec 2006 04:46:18 -0000 1.3.4.1.2.5.2.1 --- d_ugen.c 8 Dec 2006 07:23:28 -0000 1.3.4.1.2.5.2.2 *************** *** 32,47 **** t_sample *obj_findsignalscalar(t_object *x, int m); static int ugen_loud; EXTERN_STRUCT _vinlet; EXTERN_STRUCT _voutlet;
void vinlet_dspprolog(struct _vinlet *x, t_signal **parentsigs, ! int myvecsize, int phase, int period, int frequency, int downsample, int upsample /* IOhannes */, int reblock, ! int switched); void voutlet_dspprolog(struct _voutlet *x, t_signal **parentsigs, ! int myvecsize, int phase, int period, int frequency, int downsample, int upsample /* IOhannes */, int reblock, ! int switched); void voutlet_dspepilog(struct _voutlet *x, t_signal **parentsigs, ! int myvecsize, int phase, int period, int frequency, int downsample, int upsample /* IOhannes */, int reblock, ! int switched);
t_int *zero_perform(t_int *w) /* zero out a vector */ --- 32,49 ---- t_sample *obj_findsignalscalar(t_object *x, int m); static int ugen_loud; + static t_int *dsp_chain; + static int dsp_chainsize; EXTERN_STRUCT _vinlet; EXTERN_STRUCT _voutlet;
void vinlet_dspprolog(struct _vinlet *x, t_signal **parentsigs, ! int myvecsize, int calcsize, int phase, int period, int frequency, ! int downsample, int upsample, int reblock, int switched); void voutlet_dspprolog(struct _voutlet *x, t_signal **parentsigs, ! int myvecsize, int calcsize, int phase, int period, int frequency, ! int downsample, int upsample, int reblock, int switched); void voutlet_dspepilog(struct _voutlet *x, t_signal **parentsigs, ! int myvecsize, int calcsize, int phase, int period, int frequency, ! int downsample, int upsample, int reblock, int switched);
t_int *zero_perform(t_int *w) /* zero out a vector */ *************** *** 119,128 **** { t_object x_obj; ! int x_vecsize; int x_overlap; int x_phase; /* from 0 to period-1; when zero we run the block */ int x_period; /* submultiple of containing canvas */ int x_frequency; /* supermultiple of comtaining canvas */ ! int x_count; int x_blocklength; /* length of dspchain for this block */ int x_epiloglength; /* length of epilog */ --- 121,132 ---- { t_object x_obj; ! int x_vecsize; /* size of audio signals in this block */ ! int x_calcsize; /* number of samples actually to compute */ int x_overlap; int x_phase; /* from 0 to period-1; when zero we run the block */ int x_period; /* submultiple of containing canvas */ int x_frequency; /* supermultiple of comtaining canvas */ ! int x_count; /* number of times parent block has called us */ ! int x_chainonset; /* beginning of code in DSP chain */ int x_blocklength; /* length of dspchain for this block */ int x_epiloglength; /* length of epilog */ *************** *** 132,136 **** int x_upsample; /* IOhannes: upsampling-factor */ int x_downsample; /* IOhannes: downsampling-factor */ ! } t_block;
--- 136,140 ---- int x_upsample; /* IOhannes: upsampling-factor */ int x_downsample; /* IOhannes: downsampling-factor */ ! int x_return; /* stop right after this block (for one-shots) */ } t_block;
*************** *** 138,142 **** t_floatarg fupsample);
! static void *block_new(t_floatarg fvecsize, t_floatarg foverlap, t_floatarg fupsample) /* IOhannes */ { --- 142,146 ---- t_floatarg fupsample);
! static void *block_new(t_floatarg fcalcsize, t_floatarg foverlap, t_floatarg fupsample) /* IOhannes */ { *************** *** 147,165 **** x->x_switched = 0; x->x_switchon = 1; ! block_set(x, fvecsize, foverlap, fupsample); return (x); }
! static void block_set(t_block *x, t_floatarg fvecsize, t_floatarg foverlap, t_floatarg fupsample) { int upsample, downsample; /* IOhannes */ ! int vecsize = fvecsize; int overlap = foverlap; int dspstate = canvas_suspend_dsp(); if (overlap < 1) overlap = 1; ! if (vecsize < 0) ! vecsize = 0; /* this means we'll get it from parent later. */
/* IOhannes { */ --- 151,170 ---- x->x_switched = 0; x->x_switchon = 1; ! block_set(x, fcalcsize, foverlap, fupsample); return (x); }
! static void block_set(t_block *x, t_floatarg fcalcsize, t_floatarg foverlap, t_floatarg fupsample) { int upsample, downsample; /* IOhannes */ ! int calcsize = fcalcsize; int overlap = foverlap; int dspstate = canvas_suspend_dsp(); + int vecsize; if (overlap < 1) overlap = 1; ! if (calcsize < 0) ! calcsize = 0; /* this means we'll get it from parent later. */
/* IOhannes { */ *************** *** 174,177 **** --- 179,189 ---- /* } IOhannes */
+ /* vecsize is smallest power of 2 large enough to hold calcsize */ + if (calcsize) + { + if ((vecsize = (1 << ilog2(calcsize))) != calcsize) + vecsize *= 2; + } + else vecsize = 0; if (vecsize && (vecsize != (1 << ilog2(vecsize)))) { *************** *** 198,201 **** --- 210,214 ----
+ x->x_calcsize = calcsize; x->x_vecsize = vecsize; x->x_overlap = overlap; *************** *** 221,224 **** --- 234,252 ---- x->x_switchon = (f != 0); } + + static void block_bang(t_block *x) + { + if (x->x_switched && !x->x_switchon) + { + t_int *ip; + x->x_return = 1; + for (ip = dsp_chain + x->x_chainonset; ip; ) + ip = (*(t_perfroutine)(*ip))(ip); + x->x_return = 0; + } + else pd_error(x, "bang to block~ or on-state switch~ has no effect"); + } + + #define PROLOGCALL 2 #define EPILOGCALL 2 *************** *** 250,253 **** --- 278,283 ---- t_block *x = (t_block *)w[1]; int count = x->x_count - 1; + if (x->x_return) + return (0); if (!x->x_reblock) return (w + x->x_epiloglength + EPILOGCALL); *************** *** 276,285 **** class_addmethod(block_class, (t_method)block_dsp, gensym("dsp"), 0); class_addfloat(block_class, block_float); }
/* ------------------ DSP call list ----------------------- */
! static t_int *dsp_chain; ! static int dsp_chainsize;
void dsp_add(t_perfroutine f, int n, ...) --- 306,318 ---- class_addmethod(block_class, (t_method)block_dsp, gensym("dsp"), 0); class_addfloat(block_class, block_float); + class_addbang(block_class, block_bang); }
/* ------------------ DSP call list ----------------------- */
! static t_int dsp_done(t_int *w) ! { ! return (0); ! }
void dsp_add(t_perfroutine f, int n, ...) *************** *** 295,299 **** dsp_chain[dsp_chainsize + i] = va_arg(ap, t_int); va_end(ap); ! dsp_chain[newsize-1] = 0; dsp_chainsize = newsize; } --- 328,332 ---- dsp_chain[dsp_chainsize + i] = va_arg(ap, t_int); va_end(ap); ! dsp_chain[newsize-1] = (t_int)dsp_done; dsp_chainsize = newsize; } *************** *** 309,313 **** for (i = 0; i < n; i++) dsp_chain[dsp_chainsize + i] = vec[i]; ! dsp_chain[newsize-1] = 0; dsp_chainsize = newsize; } --- 342,346 ---- for (i = 0; i < n; i++) dsp_chain[dsp_chainsize + i] = vec[i]; ! dsp_chain[newsize-1] = (t_int)dsp_done; dsp_chainsize = newsize; } *************** *** 318,322 **** { t_int *ip; ! for (ip = dsp_chain; *ip; ) ip = (*(t_perfroutine)(*ip))(ip); dsp_phase++; } --- 351,355 ---- { t_int *ip; ! for (ip = dsp_chain; ip; ) ip = (*(t_perfroutine)(*ip))(ip); dsp_phase++; } *************** *** 355,361 **** { #ifndef VECTORALIGNMENT ! t_freebytes(sig->s_vec, sig->s_n * sizeof (*sig->s_vec)); #else ! freealignedbytes(sig->s_vec, sig->s_n * sizeof (*sig->s_vec)); #endif } --- 388,394 ---- { #ifndef VECTORALIGNMENT ! t_freebytes(sig->s_vec, sig->s_vecsize * sizeof (*sig->s_vec)); #else ! freealignedbytes(sig->s_vec, sig->s_vecsize * sizeof (*sig->s_vec)); #endif } *************** *** 370,374 **** void signal_makereusable(t_signal *sig) { ! int logn = ilog2(sig->s_n); #if 1 t_signal *s5; --- 403,407 ---- void signal_makereusable(t_signal *sig) { ! int logn = ilog2(sig->s_vecsize); #if 1 t_signal *s5; *************** *** 420,424 **** t_signal *signal_new(int n, float sr) { ! int logn, n2; t_signal *ret, **whichlist; t_sample *fp; --- 453,457 ---- t_signal *signal_new(int n, float sr) { ! int logn, n2, vecsize = 0; t_signal *ret, **whichlist; t_sample *fp; *************** *** 426,431 **** if (n) { ! if (n != (1 << logn)) ! bug("signal buffer not a power of 2"); if (logn > MAXLOGSIG) bug("signal buffer too large"); --- 459,464 ---- if (n) { ! if ((vecsize = (1<<logn)) != n) ! vecsize *= 2; if (logn > MAXLOGSIG) bug("signal buffer too large"); *************** *** 445,452 **** { #ifndef VECTORALIGNMENT ! ret->s_vec = (t_sample *)getbytes(n * sizeof (*ret->s_vec)); #else /* T.Grill - make signal vectors aligned! */ ! ret->s_vec = (t_sample *)getalignedbytes(n * sizeof (*ret->s_vec)); #endif ret->s_isborrowed = 0; --- 478,485 ---- { #ifndef VECTORALIGNMENT ! ret->s_vec = (t_sample *)getbytes(vecsize * sizeof (*ret->s_vec)); #else /* T.Grill - make signal vectors aligned! */ ! ret->s_vec = (t_sample *)getalignedbytes(vecsize * sizeof (*ret->s_vec)); #endif ret->s_isborrowed = 0; *************** *** 461,464 **** --- 494,498 ---- } ret->s_n = n; + ret->s_vecsize = vecsize; ret->s_sr = sr; ret->s_refcount = 0; *************** *** 482,485 **** --- 516,520 ---- sig->s_vec = sig2->s_vec; sig->s_n = sig2->s_n; + sig->s_vecsize = sig2->s_vecsize; }
*************** *** 534,538 **** t_signal **dc_iosigs; float dc_srate; ! int dc_vecsize; char dc_toplevel; /* true if "iosigs" is invalid. */ char dc_reblock; /* true if we have to reblock inlets/outlets */ --- 569,574 ---- t_signal **dc_iosigs; float dc_srate; ! int dc_vecsize; /* vector size, power of two */ ! int dc_calcsize; /* number of elements to calculate */ char dc_toplevel; /* true if "iosigs" is invalid. */ char dc_reblock; /* true if we have to reblock inlets/outlets */ *************** *** 564,568 **** ugen_sortno++; dsp_chain = (t_int *)getbytes(sizeof(*dsp_chain)); ! dsp_chain[0] = 0; dsp_chainsize = 1; if (ugen_currentcontext) bug("ugen_start"); --- 600,604 ---- ugen_sortno++; dsp_chain = (t_int *)getbytes(sizeof(*dsp_chain)); ! dsp_chain[0] = (t_int)dsp_done; dsp_chainsize = 1; if (ugen_currentcontext) bug("ugen_start"); *************** *** 861,865 **** float parent_srate; int parent_vecsize; ! int period, frequency, phase, vecsize; float srate; int chainblockbegin; /* DSP chain onset before block prolog code */ --- 897,901 ---- float parent_srate; int parent_vecsize; ! int period, frequency, phase, vecsize, calcsize; float srate; int chainblockbegin; /* DSP chain onset before block prolog code */ *************** *** 915,918 **** --- 951,957 ---- if (vecsize == 0) vecsize = parent_vecsize; + calcsize = blk->x_calcsize; + if (calcsize == 0) + calcsize = vecsize; realoverlap = blk->x_overlap; if (realoverlap > vecsize) realoverlap = vecsize; *************** *** 944,947 **** --- 983,987 ---- srate = parent_srate; vecsize = parent_vecsize; + calcsize = (parent_context ? parent_context->dc_calcsize : vecsize); downsample = upsample = 1;/* IOhannes */ period = frequency = 1; *************** *** 954,957 **** --- 994,998 ---- dc->dc_srate = srate; dc->dc_vecsize = vecsize; + dc->dc_calcsize = calcsize;
/* if we're reblocking or switched, we now have to create output *************** *** 998,1014 **** if (pd_class(zz) == vinlet_class) vinlet_dspprolog((struct _vinlet *)zz, ! dc->dc_iosigs, vecsize, dsp_phase, period, frequency, ! downsample, upsample, /* IOhannes */ ! reblock, switched); else if (pd_class(zz) == voutlet_class) voutlet_dspprolog((struct _voutlet *)zz, ! outsigs, vecsize, dsp_phase, period, frequency, ! downsample, upsample, /* IOhannes */ ! reblock, switched); } chainblockbegin = dsp_chainsize;
if (blk && (reblock || switched)) /* add the block DSP prolog */ dsp_add(block_prolog, 1, blk);
/* Initialize for sorting */ --- 1039,1056 ---- if (pd_class(zz) == vinlet_class) vinlet_dspprolog((struct _vinlet *)zz, ! dc->dc_iosigs, vecsize, calcsize, dsp_phase, period, frequency, ! downsample, upsample, reblock, switched); else if (pd_class(zz) == voutlet_class) voutlet_dspprolog((struct _voutlet *)zz, ! outsigs, vecsize, calcsize, dsp_phase, period, frequency, ! downsample, upsample, reblock, switched); } chainblockbegin = dsp_chainsize;
if (blk && (reblock || switched)) /* add the block DSP prolog */ + { dsp_add(block_prolog, 1, blk); + blk->x_chainonset = dsp_chainsize - 1; + }
/* Initialize for sorting */ *************** *** 1077,1083 **** if (iosigs) iosigs += dc->dc_ninlets; voutlet_dspepilog((struct _voutlet *)zz, ! iosigs, vecsize, dsp_phase, period, frequency, ! downsample, upsample, /* IOhannes */ ! reblock, switched); } } --- 1119,1124 ---- if (iosigs) iosigs += dc->dc_ninlets; voutlet_dspepilog((struct _voutlet *)zz, ! iosigs, vecsize, calcsize, dsp_phase, period, frequency, ! downsample, upsample, reblock, switched); } }