aboutsummaryrefslogtreecommitdiff
path: root/src/del16write~.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/del16write~.c')
-rw-r--r--src/del16write~.c93
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();
+}
+