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 */
8 static int delread_zero
= 0; /* four bytes of zero for delread~, vd~ */
13 t_class
*sigdelwrite_class
;
15 static void *sigdelwrite_new(t_symbol
*s
, t_floatarg msec
)
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
);
22 nsamps
= msec
* sys_getsr() * (float)(0.001f
);
23 if (nsamps
< 1) nsamps
= 1;
24 nsamps
+= ((- nsamps
) & (SAMPBLK
- 1));
26 x
->x_cspace
.c_n
= nsamps
;
28 (t_sample
*)getbytes((nsamps
+ XTRASAMPS
) * sizeof(float));
29 x
->x_cspace
.c_phase
= XTRASAMPS
;
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]);
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
);
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
,