diff options
Diffstat (limited to 'src/del16write~.c')
-rw-r--r-- | src/del16write~.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/del16write~.c b/src/del16write~.c new file mode 100644 index 0000000..d0ea389 --- /dev/null +++ b/src/del16write~.c @@ -0,0 +1,93 @@ +/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM + * based on d_delay.c from pd: + * Copyright (c) 1997-1999 Miller Puckette. + * For information on usage and redistribution, and for a DISCLAIMER OF ALL + * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ + +/* del16read~, del16write~, vd16~ */ + +#include "iem16_delay.h" + + + +/* ----------------------------- del16write~ ----------------------------- */ + +/* routine to check that all del16writes/del16reads/vds have same vecsize */ +void sigdel16write_checkvecsize(t_sigdel16write *x, int vecsize){ + if (x->x_rsortno != ugen_getsortno()) { + x->x_vecsize = vecsize; + x->x_rsortno = ugen_getsortno(); + } + else if (vecsize != x->x_vecsize) + pd_error(x, "del16read/del16write/vd vector size mismatch"); +} + +static void *sigdel16write_new(t_symbol *s, t_floatarg msec){ + int nsamps; + t_sigdel16write *x = (t_sigdel16write *)pd_new(sigdel16write_class); + if (!*s->s_name) s = gensym("del16write~"); + pd_bind(&x->x_obj.ob_pd, s); + x->x_sym = s; + nsamps = msec * sys_getsr() * (float)(0.001f); + if (nsamps < 1) nsamps = 1; + nsamps += ((- nsamps) & (SAMPBLK - 1)); + nsamps += DEFDELVS; + x->x_cspace.c_n = nsamps; + x->x_cspace.c_vec = + (t_iem16_16bit *)getbytes((nsamps + XTRASAMPS) * sizeof(t_iem16_16bit)); + x->x_cspace.c_phase = XTRASAMPS; + x->x_sortno = 0; + x->x_vecsize = 0; + x->x_f = 0; + return (x); +} + +static t_int *sigdel16write_perform(t_int *w){ + t_float *in = (t_float *)(w[1]); + t_del16writectl *c = (t_del16writectl *)(w[2]); + int n = (int)(w[3]); + int phase = c->c_phase, nsamps = c->c_n; + t_iem16_16bit *vp = c->c_vec, *bp = vp + phase, *ep = vp + (c->c_n + XTRASAMPS); + phase += n; + while (n--) { + *bp++ = (*in++*IEM16_SCALE_UP); + if (bp == ep) { + vp[0] = ep[-4]; + vp[1] = ep[-3]; + vp[2] = ep[-2]; + vp[3] = ep[-1]; + bp = vp + XTRASAMPS; + phase -= nsamps; + } + } + c->c_phase = phase; + return (w+4); +} + +static void sigdel16write_dsp(t_sigdel16write *x, t_signal **sp){ + dsp_add(sigdel16write_perform, 3, sp[0]->s_vec, &x->x_cspace, sp[0]->s_n); + x->x_sortno = ugen_getsortno(); + sigdel16write_checkvecsize(x, sp[0]->s_n); +} + +static void sigdel16write_free(t_sigdel16write *x){ + pd_unbind(&x->x_obj.ob_pd, x->x_sym); + freebytes(x->x_cspace.c_vec, + (x->x_cspace.c_n + XTRASAMPS) * sizeof(t_iem16_16bit)); +} + +static void sigdel16write_setup(void){ + sigdel16write_class = class_new(gensym("del16write~"), + (t_newmethod)sigdel16write_new, (t_method)sigdel16write_free, + sizeof(t_sigdel16write), 0, A_DEFSYM, A_DEFFLOAT, 0); + CLASS_MAINSIGNALIN(sigdel16write_class, t_sigdel16write, x_f); + class_addmethod(sigdel16write_class, (t_method)sigdel16write_dsp, + gensym("dsp"), 0); +} + +// G.Holzmann: for PD-extended build system +void del16write_tilde_setup(void) +{ + sigdel16write_setup(); +} + |