summaryrefslogtreecommitdiff
path: root/apps/plugins/pdbox/PDa/intern/delwrite~.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/pdbox/PDa/intern/delwrite~.c')
-rw-r--r--apps/plugins/pdbox/PDa/intern/delwrite~.c83
1 files changed, 0 insertions, 83 deletions
diff --git a/apps/plugins/pdbox/PDa/intern/delwrite~.c b/apps/plugins/pdbox/PDa/intern/delwrite~.c
index 290793d9e4..825ff2396a 100644
--- a/apps/plugins/pdbox/PDa/intern/delwrite~.c
+++ b/apps/plugins/pdbox/PDa/intern/delwrite~.c
@@ -82,87 +82,4 @@ void delwrite_tilde_setup(void)
82 class_addmethod(sigdelwrite_class, (t_method)sigdelwrite_dsp, 82 class_addmethod(sigdelwrite_class, (t_method)sigdelwrite_dsp,
83 gensym("dsp"), 0); 83 gensym("dsp"), 0);
84} 84}
85#include <m_pd.h>
86#include <m_fixed.h>
87
88extern int ugen_getsortno(void);
89
90#define DEFDELVS 64 /* LATER get this from canvas at DSP time */
91static int delread_zero = 0; /* four bytes of zero for delread~, vd~ */
92
93#include "delay.h"
94
95t_class *sigdelwrite_class;
96
97static void *sigdelwrite_new(t_symbol *s, t_floatarg msec)
98{
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);
116}
117 85
118static t_int *sigdelwrite_perform(t_int *w)
119{
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--)
127 {
128 t_sample f = *in++;
129 if (PD_BADFLOAT(f))
130 f = 0;
131 *bp++ = f;
132 if (bp == ep)
133 {
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;
140 }
141 }
142 c->c_phase = phase;
143 return (w+4);
144}
145
146static void sigdelwrite_dsp(t_sigdelwrite *x, t_signal **sp)
147{
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);
151}
152
153static void sigdelwrite_free(t_sigdelwrite *x)
154{
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));
158}
159
160void delwrite_tilde_setup(void)
161{
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);
168}