Fix pdbox makefile to actually take part in dependency generation
[kugel-rb.git] / apps / plugins / pdbox / PDa / intern / delwrite~.c
blob2f234f7d06c97b7e62160db64d3a1d748714bc24
1 #include "../src/m_pd.h"
2 #include <../src/m_fixed.h>
4 extern int ugen_getsortno(void);
6 #define DEFDELVS 64 /* LATER get this from canvas at DSP time */
7 #ifndef ROCKBOX
8 static int delread_zero = 0; /* four bytes of zero for delread~, vd~ */
9 #endif
11 #include "delay.h"
13 t_class *sigdelwrite_class;
15 static void *sigdelwrite_new(t_symbol *s, t_floatarg msec)
17 int nsamps;
18 t_sigdelwrite *x = (t_sigdelwrite *)pd_new(sigdelwrite_class);
19 if (!*s->s_name) s = gensym("delwrite~");
20 pd_bind(&x->x_obj.ob_pd, s);
21 x->x_sym = s;
22 nsamps = msec * sys_getsr() * (float)(0.001f);
23 if (nsamps < 1) nsamps = 1;
24 nsamps += ((- nsamps) & (SAMPBLK - 1));
25 nsamps += DEFDELVS;
26 x->x_cspace.c_n = nsamps;
27 x->x_cspace.c_vec =
28 (t_sample *)getbytes((nsamps + XTRASAMPS) * sizeof(float));
29 x->x_cspace.c_phase = XTRASAMPS;
30 x->x_sortno = 0;
31 x->x_vecsize = 0;
32 x->x_f = 0;
33 return (x);
36 static t_int *sigdelwrite_perform(t_int *w)
38 t_sample *in = (t_sample *)(w[1]);
39 t_delwritectl *c = (t_delwritectl *)(w[2]);
40 int n = (int)(w[3]);
41 int phase = c->c_phase, nsamps = c->c_n;
42 t_sample *vp = c->c_vec, *bp = vp + phase, *ep = vp + (c->c_n + XTRASAMPS);
43 phase += n;
44 while (n--)
46 t_sample f = *in++;
47 if (PD_BADFLOAT(f))
48 f = 0;
49 *bp++ = f;
50 if (bp == ep)
52 vp[0] = ep[-4];
53 vp[1] = ep[-3];
54 vp[2] = ep[-2];
55 vp[3] = ep[-1];
56 bp = vp + XTRASAMPS;
57 phase -= nsamps;
60 c->c_phase = phase;
61 return (w+4);
64 static void sigdelwrite_dsp(t_sigdelwrite *x, t_signal **sp)
66 dsp_add(sigdelwrite_perform, 3, sp[0]->s_vec, &x->x_cspace, sp[0]->s_n);
67 x->x_sortno = ugen_getsortno();
68 sigdelwrite_checkvecsize(x, sp[0]->s_n);
71 static void sigdelwrite_free(t_sigdelwrite *x)
73 pd_unbind(&x->x_obj.ob_pd, x->x_sym);
74 freebytes(x->x_cspace.c_vec,
75 (x->x_cspace.c_n + XTRASAMPS) * sizeof(float));
78 void delwrite_tilde_setup(void)
80 sigdelwrite_class = class_new(gensym("delwrite~"),
81 (t_newmethod)sigdelwrite_new, (t_method)sigdelwrite_free,
82 sizeof(t_sigdelwrite), 0, A_DEFSYM, A_DEFFLOAT, 0);
83 CLASS_MAINSIGNALIN(sigdelwrite_class, t_sigdelwrite, x_f);
84 class_addmethod(sigdelwrite_class, (t_method)sigdelwrite_dsp,
85 gensym("dsp"), 0);