Add FS #10214. Initial commit of the original PDa code for the GSoC Pure Data plugin...
[kugel-rb.git] / apps / plugins / pdbox / PDa / intern / delwrite~.c
blob290793d9e4c0acca2f84e821ca4d99dcb631b0ae
1 #include <m_pd.h>
2 #include <m_fixed.h>
4 extern int ugen_getsortno(void);
6 #define DEFDELVS 64 /* LATER get this from canvas at DSP time */
7 static int delread_zero = 0; /* four bytes of zero for delread~, vd~ */
9 #include "delay.h"
11 t_class *sigdelwrite_class;
13 static void *sigdelwrite_new(t_symbol *s, t_floatarg msec)
15 int nsamps;
16 t_sigdelwrite *x = (t_sigdelwrite *)pd_new(sigdelwrite_class);
17 if (!*s->s_name) s = gensym("delwrite~");
18 pd_bind(&x->x_obj.ob_pd, s);
19 x->x_sym = s;
20 nsamps = msec * sys_getsr() * (float)(0.001f);
21 if (nsamps < 1) nsamps = 1;
22 nsamps += ((- nsamps) & (SAMPBLK - 1));
23 nsamps += DEFDELVS;
24 x->x_cspace.c_n = nsamps;
25 x->x_cspace.c_vec =
26 (t_sample *)getbytes((nsamps + XTRASAMPS) * sizeof(float));
27 x->x_cspace.c_phase = XTRASAMPS;
28 x->x_sortno = 0;
29 x->x_vecsize = 0;
30 x->x_f = 0;
31 return (x);
34 static t_int *sigdelwrite_perform(t_int *w)
36 t_sample *in = (t_sample *)(w[1]);
37 t_delwritectl *c = (t_delwritectl *)(w[2]);
38 int n = (int)(w[3]);
39 int phase = c->c_phase, nsamps = c->c_n;
40 t_sample *vp = c->c_vec, *bp = vp + phase, *ep = vp + (c->c_n + XTRASAMPS);
41 phase += n;
42 while (n--)
44 t_sample f = *in++;
45 if (PD_BADFLOAT(f))
46 f = 0;
47 *bp++ = f;
48 if (bp == ep)
50 vp[0] = ep[-4];
51 vp[1] = ep[-3];
52 vp[2] = ep[-2];
53 vp[3] = ep[-1];
54 bp = vp + XTRASAMPS;
55 phase -= nsamps;
58 c->c_phase = phase;
59 return (w+4);
62 static void sigdelwrite_dsp(t_sigdelwrite *x, t_signal **sp)
64 dsp_add(sigdelwrite_perform, 3, sp[0]->s_vec, &x->x_cspace, sp[0]->s_n);
65 x->x_sortno = ugen_getsortno();
66 sigdelwrite_checkvecsize(x, sp[0]->s_n);
69 static void sigdelwrite_free(t_sigdelwrite *x)
71 pd_unbind(&x->x_obj.ob_pd, x->x_sym);
72 freebytes(x->x_cspace.c_vec,
73 (x->x_cspace.c_n + XTRASAMPS) * sizeof(float));
76 void delwrite_tilde_setup(void)
78 sigdelwrite_class = class_new(gensym("delwrite~"),
79 (t_newmethod)sigdelwrite_new, (t_method)sigdelwrite_free,
80 sizeof(t_sigdelwrite), 0, A_DEFSYM, A_DEFFLOAT, 0);
81 CLASS_MAINSIGNALIN(sigdelwrite_class, t_sigdelwrite, x_f);
82 class_addmethod(sigdelwrite_class, (t_method)sigdelwrite_dsp,
83 gensym("dsp"), 0);
85 #include <m_pd.h>
86 #include <m_fixed.h>
88 extern int ugen_getsortno(void);
90 #define DEFDELVS 64 /* LATER get this from canvas at DSP time */
91 static int delread_zero = 0; /* four bytes of zero for delread~, vd~ */
93 #include "delay.h"
95 t_class *sigdelwrite_class;
97 static void *sigdelwrite_new(t_symbol *s, t_floatarg msec)
99 int nsamps;
100 t_sigdelwrite *x = (t_sigdelwrite *)pd_new(sigdelwrite_class);
101 if (!*s->s_name) s = gensym("delwrite~");
102 pd_bind(&x->x_obj.ob_pd, s);
103 x->x_sym = s;
104 nsamps = msec * sys_getsr() * (float)(0.001f);
105 if (nsamps < 1) nsamps = 1;
106 nsamps += ((- nsamps) & (SAMPBLK - 1));
107 nsamps += DEFDELVS;
108 x->x_cspace.c_n = nsamps;
109 x->x_cspace.c_vec =
110 (t_sample *)getbytes((nsamps + XTRASAMPS) * sizeof(float));
111 x->x_cspace.c_phase = XTRASAMPS;
112 x->x_sortno = 0;
113 x->x_vecsize = 0;
114 x->x_f = 0;
115 return (x);
118 static t_int *sigdelwrite_perform(t_int *w)
120 t_sample *in = (t_sample *)(w[1]);
121 t_delwritectl *c = (t_delwritectl *)(w[2]);
122 int n = (int)(w[3]);
123 int phase = c->c_phase, nsamps = c->c_n;
124 t_sample *vp = c->c_vec, *bp = vp + phase, *ep = vp + (c->c_n + XTRASAMPS);
125 phase += n;
126 while (n--)
128 t_sample f = *in++;
129 if (PD_BADFLOAT(f))
130 f = 0;
131 *bp++ = f;
132 if (bp == ep)
134 vp[0] = ep[-4];
135 vp[1] = ep[-3];
136 vp[2] = ep[-2];
137 vp[3] = ep[-1];
138 bp = vp + XTRASAMPS;
139 phase -= nsamps;
142 c->c_phase = phase;
143 return (w+4);
146 static void sigdelwrite_dsp(t_sigdelwrite *x, t_signal **sp)
148 dsp_add(sigdelwrite_perform, 3, sp[0]->s_vec, &x->x_cspace, sp[0]->s_n);
149 x->x_sortno = ugen_getsortno();
150 sigdelwrite_checkvecsize(x, sp[0]->s_n);
153 static void sigdelwrite_free(t_sigdelwrite *x)
155 pd_unbind(&x->x_obj.ob_pd, x->x_sym);
156 freebytes(x->x_cspace.c_vec,
157 (x->x_cspace.c_n + XTRASAMPS) * sizeof(float));
160 void delwrite_tilde_setup(void)
162 sigdelwrite_class = class_new(gensym("delwrite~"),
163 (t_newmethod)sigdelwrite_new, (t_method)sigdelwrite_free,
164 sizeof(t_sigdelwrite), 0, A_DEFSYM, A_DEFFLOAT, 0);
165 CLASS_MAINSIGNALIN(sigdelwrite_class, t_sigdelwrite, x_f);
166 class_addmethod(sigdelwrite_class, (t_method)sigdelwrite_dsp,
167 gensym("dsp"), 0);