Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4955
Modified Files: Tag: desiredata d_ugen.c Log Message: use PD_PLUSPLUS_FACE
Index: d_ugen.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/d_ugen.c,v retrieving revision 1.3.4.1.2.5.2.12 retrieving revision 1.3.4.1.2.5.2.13 diff -C2 -d -r1.3.4.1.2.5.2.12 -r1.3.4.1.2.5.2.13 *** d_ugen.c 10 Jul 2007 05:49:58 -0000 1.3.4.1.2.5.2.12 --- d_ugen.c 10 Jul 2007 07:02:00 -0000 1.3.4.1.2.5.2.13 *************** *** 22,25 **** --- 22,26 ---- */
+ #define PD_PLUSPLUS_FACE #include "desire.h" #include <stdlib.h> *************** *** 48,53 **** /* zero out a vector */ t_int *zero_perform(t_int *w) { ! t_float *out = (t_float *)(w[1]); ! int n = (int)(w[2]); while (n--) *out++ = 0; return w+3; --- 49,54 ---- /* zero out a vector */ t_int *zero_perform(t_int *w) { ! t_float *out = (t_float *)w[1]; ! int n = int(w[2]); while (n--) *out++ = 0; return w+3; *************** *** 55,60 ****
t_int *zero_perf8(t_int *w) { ! t_float *out = (t_float *)(w[1]); ! int n = (int)(w[2]); for (; n; n -= 8, out += 8) { out[0] = 0; --- 56,61 ----
t_int *zero_perf8(t_int *w) { ! t_float *out = (t_float *)w[1]; ! int n = int(w[2]); for (; n; n -= 8, out += 8) { out[0] = 0; *************** *** 311,320 **** t_signal *sig; while ((sig = signal_usedlist)) { ! signal_usedlist = sig->s_nextused; ! if (!sig->s_isborrowed) { #ifndef VECTORALIGNMENT ! free(sig->s_vec); #else ! freealignedbytes(sig->s_vec, sig->s_vecsize * sizeof (*sig->s_vec)); #endif } --- 312,321 ---- t_signal *sig; while ((sig = signal_usedlist)) { ! signal_usedlist = sig->nextused; ! if (!sig->isborrowed) { #ifndef VECTORALIGNMENT ! free(sig->v); #else ! freealignedbytes(sig->v, sig->vecsize * sizeof (*sig->v)); #endif } *************** *** 327,334 **** /* mark the signal "reusable." */ extern "C" void signal_makereusable(t_signal *sig) { ! int logn = ilog2(sig->s_vecsize); #if 1 t_signal *s5; ! for (s5 = signal_freeborrowed; s5; s5 = s5->s_nextfree) { if (s5 == sig) { bug("signal_free 3"); --- 328,335 ---- /* mark the signal "reusable." */ extern "C" void signal_makereusable(t_signal *sig) { ! int logn = ilog2(sig->vecsize); #if 1 t_signal *s5; ! for (s5 = signal_freeborrowed; s5; s5 = s5->nextfree) { if (s5 == sig) { bug("signal_free 3"); *************** *** 336,340 **** } } ! for (s5 = signal_freelist[logn]; s5; s5 = s5->s_nextfree) { if (s5 == sig) { bug("signal_free 4"); --- 337,341 ---- } } ! for (s5 = signal_freelist[logn]; s5; s5 = s5->nextfree) { if (s5 == sig) { bug("signal_free 4"); *************** *** 343,359 **** } #endif ! if (ugen_loud) post("free %lx: %d", sig, sig->s_isborrowed); ! if (sig->s_isborrowed) { /* if the signal is borrowed, decrement the borrowed-from signal's reference count, possibly marking it reusable too */ ! t_signal *s2 = sig->s_borrowedfrom; if ((s2 == sig) || !s2) bug("signal_free"); ! s2->s_refcount--; ! if (!s2->s_refcount) signal_makereusable(s2); ! sig->s_nextfree = signal_freeborrowed; signal_freeborrowed = sig; } else { /* if it's a real signal (not borrowed), put it on the free list so we can reuse it. */ if (signal_freelist[logn] == sig) bug("signal_free 2"); ! sig->s_nextfree = signal_freelist[logn]; signal_freelist[logn] = sig; } --- 344,360 ---- } #endif ! if (ugen_loud) post("free %lx: %d", sig, sig->isborrowed); ! if (sig->isborrowed) { /* if the signal is borrowed, decrement the borrowed-from signal's reference count, possibly marking it reusable too */ ! t_signal *s2 = sig->borrowedfrom; if ((s2 == sig) || !s2) bug("signal_free"); ! s2->refcount--; ! if (!s2->refcount) signal_makereusable(s2); ! sig->nextfree = signal_freeborrowed; signal_freeborrowed = sig; } else { /* if it's a real signal (not borrowed), put it on the free list so we can reuse it. */ if (signal_freelist[logn] == sig) bug("signal_free 2"); ! sig->nextfree = signal_freelist[logn]; signal_freelist[logn] = sig; } *************** *** 373,377 **** /* first try to reclaim one from the free list */ ret = *whichlist; ! if (ret) *whichlist = ret->s_nextfree; else { /* LATER figure out what to do for out-of-space here! */ --- 374,378 ---- /* first try to reclaim one from the free list */ ret = *whichlist; ! if (ret) *whichlist = ret->nextfree; else { /* LATER figure out what to do for out-of-space here! */ *************** *** 379,416 **** if (n) { #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; } else { ! ret->s_vec = 0; ! ret->s_isborrowed = 1; } ! ret->s_nextused = signal_usedlist; signal_usedlist = ret; } ! ret->s_n = n; ! ret->s_vecsize = vecsize; ! ret->s_sr = sr; ! ret->s_refcount = 0; ! ret->s_borrowedfrom = 0; ! if (ugen_loud) post("new %lx: %d", ret, ret->s_isborrowed); return ret; }
! static t_signal *signal_newlike(const t_signal *sig) {return signal_new(sig->s_n, sig->s_sr);}
extern "C" void signal_setborrowed(t_signal *sig, t_signal *sig2) { ! if (!sig->s_isborrowed || sig->s_borrowedfrom) bug("signal_setborrowed"); if (sig == sig2) bug("signal_setborrowed 2"); ! sig->s_borrowedfrom = sig2; ! sig->s_vec = sig2->s_vec; ! sig->s_n = sig2->s_n; ! sig->s_vecsize = sig2->s_vecsize; }
! int signal_compatible(t_signal *s1, t_signal *s2) {return s1->s_n == s2->s_n && s1->s_sr == s2->s_sr;}
/* ------------------ ugen ("unit generator") sorting ----------------- */ --- 380,417 ---- if (n) { #ifndef VECTORALIGNMENT ! ret->v = (t_sample *)getbytes(vecsize * sizeof (*ret->v)); #else /* T.Grill - make signal vectors aligned! */ ! ret->v = (t_sample *)getalignedbytes(vecsize * sizeof (*ret->v)); #endif ! ret->isborrowed = 0; } else { ! ret->v = 0; ! ret->isborrowed = 1; } ! ret->nextused = signal_usedlist; signal_usedlist = ret; } ! ret->n = n; ! ret->vecsize = vecsize; ! ret->sr = sr; ! ret->refcount = 0; ! ret->borrowedfrom = 0; ! if (ugen_loud) post("new %lx: %d", ret, ret->isborrowed); return ret; }
! static t_signal *signal_newlike(const t_signal *sig) {return signal_new(sig->n, sig->sr);}
extern "C" void signal_setborrowed(t_signal *sig, t_signal *sig2) { ! if (!sig->isborrowed || sig->borrowedfrom) bug("signal_setborrowed"); if (sig == sig2) bug("signal_setborrowed 2"); ! sig->borrowedfrom = sig2; ! sig->v = sig2->v; ! sig->n = sig2->n; ! sig->vecsize = sig2->vecsize; }
! int signal_compatible(t_signal *s1, t_signal *s2) {return s1->n == s2->n && s1->sr == s2->sr;}
/* ------------------ ugen ("unit generator") sorting ----------------- */ *************** *** 484,494 **** int i, count; t_signal *sig; ! for (count = 0, sig = signal_usedlist; sig; count++, sig = sig->s_nextused) {} post("used signals %d", count); for (i = 0; i < MAXLOGSIG; i++) { ! for (count = 0, sig = signal_freelist[i]; sig; count++, sig = sig->s_nextfree) {} if (count) post("size %d: free %d", (1 << i), count); } ! for (count = 0, sig = signal_freeborrowed; sig; count++, sig = sig->s_nextfree) {} post("free borrowed %d", count); ugen_loud = argc; --- 485,495 ---- int i, count; t_signal *sig; ! for (count = 0, sig = signal_usedlist; sig; count++, sig = sig->nextused) {} post("used signals %d", count); for (i = 0; i < MAXLOGSIG; i++) { ! for (count = 0, sig = signal_freelist[i]; sig; count++, sig = sig->nextfree) {} if (count) post("size %d: free %d", (1 << i), count); } ! for (count = 0, sig = signal_freeborrowed; sig; count++, sig = sig->nextfree) {} post("free borrowed %d", count); ugen_loud = argc; *************** *** 568,572 **** t_siginlet *uin; t_sigoutconnect *oc; ! t_class *klass = pd_class(&u->obj->ob_pd); int i, n; /* suppress creating new signals for the outputs of signal --- 569,573 ---- t_siginlet *uin; t_sigoutconnect *oc; ! t_class *klass = pd_class(u->obj); int i, n; /* suppress creating new signals for the outputs of signal *************** *** 589,596 **** s3 = signal_new(dc->vecsize, dc->srate); /* post("%s: unconnected signal inlet set to zero", class_getname(u->obj->ob_pd)); */ ! if ((scalar = obj_findsignalscalar(u->obj, i))) dsp_add_scalarcopy(scalar, s3->s_vec, s3->s_n); ! else dsp_add_zero(s3->s_vec, s3->s_n); uin->signal = s3; ! s3->s_refcount = 1; } } --- 590,597 ---- s3 = signal_new(dc->vecsize, dc->srate); /* post("%s: unconnected signal inlet set to zero", class_getname(u->obj->ob_pd)); */ ! if ((scalar = obj_findsignalscalar(u->obj, i))) dsp_add_scalarcopy(scalar, s3->v, s3->n); ! else dsp_add_zero(s3->v, s3->n); uin->signal = s3; ! s3->refcount = 1; } } *************** *** 600,604 **** int newrefcount; *sig = uin->signal; ! newrefcount = --(*sig)->s_refcount; /* if the reference count went to zero, we free the signal now, unless it's a subcanvas or outlet; these might keep the --- 601,605 ---- int newrefcount; *sig = uin->signal; ! newrefcount = --(*sig)->refcount; /* if the reference count went to zero, we free the signal now, unless it's a subcanvas or outlet; these might keep the *************** *** 606,610 **** case we increment the reference count; the corresponding decrement is in sig_makereusable(). */ ! if (nofreesigs) (*sig)->s_refcount++; else if (!newrefcount) signal_makereusable(*sig); } --- 607,611 ---- case we increment the reference count; the corresponding decrement is in sig_makereusable(). */ ! if (nofreesigs) (*sig)->refcount++; else if (!newrefcount) signal_makereusable(*sig); } *************** *** 619,633 **** signal_new(0, dc->srate) : signal_new(dc->vecsize, dc->srate); ! (*sig)->s_refcount = uout->nconnect; } /* now call the DSP scheduling routine for the ugen. This routine must fill in "borrowed" signal outputs in case it's either a subcanvas or a signal inlet. */ ! mess1(&u->obj->ob_pd, gensym("dsp"), insig); /* if any output signals aren't connected to anyone, free them now; otherwise they'll either get freed when the reference count goes back to zero, or even later as explained above. */ for (sig = outsig, uout = u->out, i = u->nout; i--; sig++, uout++) { ! if (!(*sig)->s_refcount) signal_makereusable(*sig); } if (ugen_loud) { --- 620,634 ---- signal_new(0, dc->srate) : signal_new(dc->vecsize, dc->srate); ! (*sig)->refcount = uout->nconnect; } /* now call the DSP scheduling routine for the ugen. This routine must fill in "borrowed" signal outputs in case it's either a subcanvas or a signal inlet. */ ! mess1(u->obj, gensym("dsp"), insig); /* if any output signals aren't connected to anyone, free them now; otherwise they'll either get freed when the reference count goes back to zero, or even later as explained above. */ for (sig = outsig, uout = u->out, i = u->nout; i--; sig++, uout++) { ! if (!(*sig)->refcount) signal_makereusable(*sig); } if (ugen_loud) { *************** *** 646,651 **** s2 = uin->signal; if (s2) { ! s1->s_refcount--; ! s2->s_refcount--; if (!signal_compatible(s1, s2)) { pd_error(u->obj, "%s: incompatible signal inputs", class_getname(u->obj->ob_pd)); --- 647,652 ---- s2 = uin->signal; if (s2) { ! s1->refcount--; ! s2->refcount--; if (!signal_compatible(s1, s2)) { pd_error(u->obj, "%s: incompatible signal inputs", class_getname(u->obj->ob_pd)); *************** *** 653,661 **** } s3 = signal_newlike(s1); ! dsp_add_plus(s1->s_vec, s2->s_vec, s3->s_vec, s1->s_n); uin->signal = s3; ! s3->s_refcount = 1; ! if (!s1->s_refcount) signal_makereusable(s1); ! if (!s2->s_refcount) signal_makereusable(s2); } else uin->signal = s1; uin->ngot++; --- 654,662 ---- } s3 = signal_newlike(s1); ! dsp_add_plus(s1->v, s2->v, s3->v, s1->n); uin->signal = s3; ! s3->refcount = 1; ! if (!s1->refcount) signal_makereusable(s1); ! if (!s2->refcount) signal_makereusable(s2); } else uin->signal = s1; uin->ngot++; *************** *** 708,712 **** /* search for an object of class "block~" */ for (u = dc->ugenlist, blk = 0; u; u = u->next) { ! t_pd *zz = &u->obj->ob_pd; if (pd_class(zz) == block_class) { if (blk) pd_error(blk, "conflicting block~ objects in same page"); --- 709,713 ---- /* search for an object of class "block~" */ for (u = dc->ugenlist, blk = 0; u; u = u->next) { ! t_pd *zz = u->obj; if (pd_class(zz) == block_class) { if (blk) pd_error(blk, "conflicting block~ objects in same page"); *************** *** 770,777 **** t_signal **sigp; for (i = 0, sigp = dc->iosigs + dc->ninlets; i < dc->noutlets; i++, sigp++) { ! if ((*sigp)->s_isborrowed && !(*sigp)->s_borrowedfrom) { signal_setborrowed(*sigp, signal_new(parent_vecsize, parent_srate)); ! (*sigp)->s_refcount++; ! if (ugen_loud) post("set %lx->%lx", *sigp, (*sigp)->s_borrowedfrom); } } --- 771,778 ---- t_signal **sigp; for (i = 0, sigp = dc->iosigs + dc->ninlets; i < dc->noutlets; i++, sigp++) { ! if ((*sigp)->isborrowed && !(*sigp)->borrowedfrom) { signal_setborrowed(*sigp, signal_new(parent_vecsize, parent_srate)); ! (*sigp)->refcount++; ! if (ugen_loud) post("set %lx->%lx", *sigp, (*sigp)->borrowedfrom); } } *************** *** 786,790 **** which case outlet epilog code will kick in. */ for (u = dc->ugenlist; u; u = u->next) { ! t_pd *zz = &u->obj->ob_pd; t_signal **outsigs = dc->iosigs; if (outsigs) outsigs += dc->ninlets; --- 787,791 ---- which case outlet epilog code will kick in. */ for (u = dc->ugenlist; u; u = u->next) { ! t_pd *zz = u->obj; t_signal **outsigs = dc->iosigs; if (outsigs) outsigs += dc->ninlets; *************** *** 822,831 **** /* this might imply that we have unfilled "borrowed" outputs which we'd better fill in now. */ for (i = 0, sigp = dc->iosigs + dc->ninlets; i < dc->noutlets; i++, sigp++) { ! if ((*sigp)->s_isborrowed && !(*sigp)->s_borrowedfrom) { t_signal *s3 = signal_new(parent_vecsize, parent_srate); signal_setborrowed(*sigp, s3); ! (*sigp)->s_refcount++; ! dsp_add_zero(s3->s_vec, s3->s_n); ! if (ugen_loud) post("oops, belatedly set %lx->%lx", *sigp, (*sigp)->s_borrowedfrom); } } --- 823,832 ---- /* this might imply that we have unfilled "borrowed" outputs which we'd better fill in now. */ for (i = 0, sigp = dc->iosigs + dc->ninlets; i < dc->noutlets; i++, sigp++) { ! if ((*sigp)->isborrowed && !(*sigp)->borrowedfrom) { t_signal *s3 = signal_new(parent_vecsize, parent_srate); signal_setborrowed(*sigp, s3); ! (*sigp)->refcount++; ! dsp_add_zero(s3->v, s3->n); ! if (ugen_loud) post("oops, belatedly set %lx->%lx", *sigp, (*sigp)->borrowedfrom); } } *************** *** 837,841 **** /* add epilogs for outlets. */ for (u = dc->ugenlist; u; u = u->next) { ! t_pd *zz = &u->obj->ob_pd; if (pd_class(zz) == voutlet_class) { t_signal **iosigs = dc->iosigs; --- 838,842 ---- /* add epilogs for outlets. */ for (u = dc->ugenlist; u; u = u->next) { ! t_pd *zz = u->obj; if (pd_class(zz) == voutlet_class) { t_signal **iosigs = dc->iosigs; *************** *** 1004,1016 **** x->downsample=x->upsample=1; x->s_n = x->coefsize = x->bufsize = 0; ! x->s_vec = x->coeffs = x->buffer = 0; }
void resample_free(t_resample *x) { ! if (x->s_n) free(x->s_vec); if (x->coefsize) free(x->coeffs); if (x->bufsize) free(x->buffer); x->s_n = x->coefsize = x->bufsize = 0; ! x->s_vec = x->coeffs = x->buffer = 0; }
--- 1005,1017 ---- x->downsample=x->upsample=1; x->s_n = x->coefsize = x->bufsize = 0; ! x->v = x->coeffs = x->buffer = 0; }
void resample_free(t_resample *x) { ! if (x->s_n) free(x->v); if (x->coefsize) free(x->coeffs); if (x->bufsize) free(x->buffer); x->s_n = x->coefsize = x->bufsize = 0; ! x->v = x->coeffs = x->buffer = 0; }
*************** *** 1053,1069 **** void resamplefrom_dsp(t_resample *x, t_sample *in, int insize, int outsize, int method) { if (insize==outsize) { ! free(x->s_vec); x->s_n = 0; ! x->s_vec = in; return; } if (x->s_n != outsize) { ! t_float *buf=x->s_vec; free(buf); buf = (t_float *)t_getbytes(outsize * sizeof(*buf)); ! x->s_vec = buf; x->s_n = outsize; } ! resample_dsp(x, in, insize, x->s_vec, x->s_n, method); return; } --- 1054,1070 ---- void resamplefrom_dsp(t_resample *x, t_sample *in, int insize, int outsize, int method) { if (insize==outsize) { ! free(x->v); x->s_n = 0; ! x->v = in; return; } if (x->s_n != outsize) { ! t_float *buf=x->v; free(buf); buf = (t_float *)t_getbytes(outsize * sizeof(*buf)); ! x->v = buf; x->s_n = outsize; } ! resample_dsp(x, in, insize, x->v, x->s_n, method); return; } *************** *** 1071,1087 **** void resampleto_dsp(t_resample *x, t_sample *out, int insize, int outsize, int method) { if (insize==outsize) { ! if (x->s_n) free(x->s_vec); x->s_n = 0; ! x->s_vec = out; return; } if (x->s_n != insize) { ! t_float *buf=x->s_vec; free(buf); buf = (t_float *)t_getbytes(insize * sizeof(*buf)); ! x->s_vec = buf; x->s_n = insize; } ! resample_dsp(x, x->s_vec, x->s_n, out, outsize, method); return; } --- 1072,1088 ---- void resampleto_dsp(t_resample *x, t_sample *out, int insize, int outsize, int method) { if (insize==outsize) { ! if (x->s_n) free(x->v); x->s_n = 0; ! x->v = out; return; } if (x->s_n != insize) { ! t_float *buf=x->v; free(buf); buf = (t_float *)t_getbytes(insize * sizeof(*buf)); ! x->v = buf; x->s_n = insize; } ! resample_dsp(x, x->v, x->s_n, out, outsize, method); return; }