2 #include "../src/m_pd.h"
3 #include <../src/m_fixed.h>
5 static t_class
*tabwrite_tilde_class
;
7 typedef struct _tabwrite_tilde
13 t_symbol
*x_arrayname
;
18 static void tabwrite_tilde_tick(t_tabwrite_tilde
*x
);
20 static void *tabwrite_tilde_new(t_symbol
*s
)
22 t_tabwrite_tilde
*x
= (t_tabwrite_tilde
*)pd_new(tabwrite_tilde_class
);
23 x
->x_clock
= clock_new(x
, (t_method
)tabwrite_tilde_tick
);
24 x
->x_phase
= 0x7fffffff;
30 static t_int
*tabwrite_tilde_perform(t_int
*w
)
32 t_tabwrite_tilde
*x
= (t_tabwrite_tilde
*)(w
[1]);
33 t_sample
*in
= (t_sample
*)(w
[2]);
34 int n
= (int)(w
[3]), phase
= x
->x_phase
, endphase
= x
->x_nsampsintab
;
35 if (!x
->x_vec
) goto bad
;
39 int nxfer
= endphase
- phase
;
40 t_sample
*fp
= x
->x_vec
+ phase
;
41 if (nxfer
> n
) nxfer
= n
;
48 if (phase
>= endphase
)
50 clock_delay(x
->x_clock
, 0);
59 void tabwrite_tilde_set(t_tabwrite_tilde
*x
, t_symbol
*s
)
64 if (!(a
= (t_garray
*)pd_findbyclass(x
->x_arrayname
, garray_class
)))
66 if (*s
->s_name
) pd_error(x
, "tabwrite~: %s: no such array",
67 x
->x_arrayname
->s_name
);
70 else if (!garray_getfloatarray(a
, &x
->x_nsampsintab
, &x
->x_vec
))
72 error("%s: bad template for tabwrite~", x
->x_arrayname
->s_name
);
75 else garray_usedindsp(a
);
78 static void tabwrite_tilde_dsp(t_tabwrite_tilde
*x
, t_signal
**sp
)
80 tabwrite_tilde_set(x
, x
->x_arrayname
);
81 dsp_add(tabwrite_tilde_perform
, 3, x
, sp
[0]->s_vec
, sp
[0]->s_n
);
84 static void tabwrite_tilde_bang(t_tabwrite_tilde
*x
)
89 static void tabwrite_tilde_float(t_tabwrite_tilde
*x
,t_float n
)
91 if (n
< x
->x_nsampsintab
)
97 static void tabwrite_tilde_stop(t_tabwrite_tilde
*x
)
99 if (x
->x_phase
!= 0x7fffffff)
101 tabwrite_tilde_tick(x
);
102 x
->x_phase
= 0x7fffffff;
106 static void tabwrite_tilde_tick(t_tabwrite_tilde
*x
)
108 t_garray
*a
= (t_garray
*)pd_findbyclass(x
->x_arrayname
, garray_class
);
109 if (!a
) bug("tabwrite_tilde_tick");
110 else garray_redraw(a
);
113 static void tabwrite_tilde_free(t_tabwrite_tilde
*x
)
115 clock_free(x
->x_clock
);
118 void tabwrite_tilde_setup(void)
120 tabwrite_tilde_class
= class_new(gensym("tabwrite~"),
121 (t_newmethod
)tabwrite_tilde_new
, (t_method
)tabwrite_tilde_free
,
122 sizeof(t_tabwrite_tilde
), 0, A_DEFSYM
, 0);
123 CLASS_MAINSIGNALIN(tabwrite_tilde_class
, t_tabwrite_tilde
, x_f
);
124 class_addmethod(tabwrite_tilde_class
, (t_method
)tabwrite_tilde_dsp
,
126 class_addmethod(tabwrite_tilde_class
, (t_method
)tabwrite_tilde_set
,
127 gensym("set"), A_SYMBOL
, 0);
128 class_addmethod(tabwrite_tilde_class
, (t_method
)tabwrite_tilde_stop
,
130 class_addbang(tabwrite_tilde_class
, tabwrite_tilde_bang
);
131 class_addfloat(tabwrite_tilde_class
, tabwrite_tilde_float
);