3 #include "../../pdbox.h"
6 #include "../src/m_pd.h"
7 #include <../src/m_fixed.h>
9 extern int ugen_getsortno(void);
13 #define DEFDELVS 64 /* LATER get this from canvas at DSP time */
15 static int delread_zero
= 0; /* four bytes of zero for delread~, vd~ */
18 static t_class
*sigdelread_class
;
20 typedef struct _sigdelread
24 t_float x_deltime
; /* delay in msec */
25 int x_delsamps
; /* delay in samples */
26 t_float x_sr
; /* samples per msec */
27 t_float x_n
; /* vector size */
28 int x_zerodel
; /* 0 or vecsize depending on read/write order */
31 static void sigdelread_float(t_sigdelread
*x
, t_float f
);
33 static void *sigdelread_new(t_symbol
*s
, t_floatarg f
)
35 t_sigdelread
*x
= (t_sigdelread
*)pd_new(sigdelread_class
);
40 sigdelread_float(x
, f
);
41 outlet_new(&x
->x_obj
, &s_signal
);
45 static void sigdelread_float(t_sigdelread
*x
, t_float f
)
50 t_sigdelwrite
*delwriter
=
51 (t_sigdelwrite
*)pd_findbyclass(x
->x_sym
, sigdelwrite_class
);
56 int delsize
= delwriter
->x_cspace
.c_n
;
58 x
->x_delsamps
= (int)(0.5 + x
->x_sr
* x
->x_deltime
)
59 + x
->x_n
- x
->x_zerodel
;
60 if (x
->x_delsamps
< x
->x_n
) x
->x_delsamps
= x
->x_n
;
61 else if (x
->x_delsamps
> delwriter
->x_cspace
.c_n
- DEFDELVS
)
62 x
->x_delsamps
= delwriter
->x_cspace
.c_n
- DEFDELVS
;
66 static t_int
*sigdelread_perform(t_int
*w
)
68 t_sample
*out
= (t_sample
*)(w
[1]);
69 t_delwritectl
*c
= (t_delwritectl
*)(w
[2]);
70 int delsamps
= *(int *)(w
[3]);
72 int phase
= c
->c_phase
- delsamps
, nsamps
= c
->c_n
;
73 t_sample
*vp
= c
->c_vec
, *bp
, *ep
= vp
+ (c
->c_n
+ XTRASAMPS
);
75 if (phase
< 0) phase
+= nsamps
;
80 if (bp
== ep
) bp
-= nsamps
;
85 static void sigdelread_dsp(t_sigdelread
*x
, t_signal
**sp
)
87 t_sigdelwrite
*delwriter
=
88 (t_sigdelwrite
*)pd_findbyclass(x
->x_sym
, sigdelwrite_class
);
89 x
->x_sr
= sp
[0]->s_sr
* 0.001;
93 sigdelwrite_checkvecsize(delwriter
, sp
[0]->s_n
);
94 x
->x_zerodel
= (delwriter
->x_sortno
== ugen_getsortno() ?
95 0 : delwriter
->x_vecsize
);
96 sigdelread_float(x
, x
->x_deltime
);
97 dsp_add(sigdelread_perform
, 4,
98 sp
[0]->s_vec
, &delwriter
->x_cspace
, &x
->x_delsamps
, sp
[0]->s_n
);
100 else if (*x
->x_sym
->s_name
)
101 error("delread~: %s: no such delwrite~",x
->x_sym
->s_name
);
104 void delread_tilde_setup(void)
106 sigdelread_class
= class_new(gensym("delread~"),
107 (t_newmethod
)sigdelread_new
, 0,
108 sizeof(t_sigdelread
), 0, A_DEFSYM
, A_DEFFLOAT
, 0);
109 class_addmethod(sigdelread_class
, (t_method
)sigdelread_dsp
,
111 class_addfloat(sigdelread_class
, (t_method
)sigdelread_float
);