Add FS #10214. Initial commit of the original PDa code for the GSoC Pure Data plugin...
[kugel-rb.git] / apps / plugins / pdbox / PDa / intern / samphold~.c
blob5ccf3d9cfe33b19920e2b6f3a9273e0009f08f1a
1 #include <m_pd.h>
2 #include <m_fixed.h>
4 typedef struct sigsamphold
6 t_object x_obj;
7 t_sample x_f;
8 t_sample x_lastin;
9 t_sample x_lastout;
10 } t_sigsamphold;
12 t_class *sigsamphold_class;
14 static void *sigsamphold_new(void)
16 t_sigsamphold *x = (t_sigsamphold *)pd_new(sigsamphold_class);
17 inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
18 outlet_new(&x->x_obj, gensym("signal"));
19 x->x_lastin = 0;
20 x->x_lastout = 0;
21 x->x_f = 0;
22 return (x);
25 static t_int *sigsamphold_perform(t_int *w)
27 t_sample *in1 = (t_sample *)(w[1]);
28 t_sample *in2 = (t_sample *)(w[2]);
29 t_sample *out = (t_sample *)(w[3]);
30 t_sigsamphold *x = (t_sigsamphold *)(w[4]);
31 int n = (t_int)(w[5]);
32 int i;
33 t_sample lastin = x->x_lastin;
34 t_sample lastout = x->x_lastout;
35 for (i = 0; i < n; i++, *in1++)
37 t_sample next = *in2++;
38 if (next < lastin) lastout = *in1;
39 *out++ = lastout;
40 lastin = next;
42 x->x_lastin = lastin;
43 x->x_lastout = lastout;
44 return (w+6);
47 static void sigsamphold_dsp(t_sigsamphold *x, t_signal **sp)
49 dsp_add(sigsamphold_perform, 5,
50 sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,
51 x, sp[0]->s_n);
54 static void sigsamphold_reset(t_sigsamphold *x)
56 x->x_lastin = 0x7fffffff;
59 static void sigsamphold_set(t_sigsamphold *x, t_float f)
61 x->x_lastout = f;
64 void samphold_tilde_setup(void)
66 sigsamphold_class = class_new(gensym("samphold~"),
67 (t_newmethod)sigsamphold_new, 0, sizeof(t_sigsamphold), 0, 0);
68 CLASS_MAINSIGNALIN(sigsamphold_class, t_sigsamphold, x_f);
69 class_addmethod(sigsamphold_class, (t_method)sigsamphold_set,
70 gensym("set"), A_FLOAT, 0);
71 class_addmethod(sigsamphold_class, (t_method)sigsamphold_reset,
72 gensym("reset"), 0);
73 class_addmethod(sigsamphold_class, (t_method)sigsamphold_dsp,
74 gensym("dsp"), 0);
76 #include <m_pd.h>
77 #include <m_fixed.h>
79 typedef struct sigsamphold
81 t_object x_obj;
82 t_sample x_f;
83 t_sample x_lastin;
84 t_sample x_lastout;
85 } t_sigsamphold;
87 t_class *sigsamphold_class;
89 static void *sigsamphold_new(void)
91 t_sigsamphold *x = (t_sigsamphold *)pd_new(sigsamphold_class);
92 inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
93 outlet_new(&x->x_obj, gensym("signal"));
94 x->x_lastin = 0;
95 x->x_lastout = 0;
96 x->x_f = 0;
97 return (x);
100 static t_int *sigsamphold_perform(t_int *w)
102 t_sample *in1 = (t_sample *)(w[1]);
103 t_sample *in2 = (t_sample *)(w[2]);
104 t_sample *out = (t_sample *)(w[3]);
105 t_sigsamphold *x = (t_sigsamphold *)(w[4]);
106 int n = (t_int)(w[5]);
107 int i;
108 t_sample lastin = x->x_lastin;
109 t_sample lastout = x->x_lastout;
110 for (i = 0; i < n; i++, *in1++)
112 t_sample next = *in2++;
113 if (next < lastin) lastout = *in1;
114 *out++ = lastout;
115 lastin = next;
117 x->x_lastin = lastin;
118 x->x_lastout = lastout;
119 return (w+6);
122 static void sigsamphold_dsp(t_sigsamphold *x, t_signal **sp)
124 dsp_add(sigsamphold_perform, 5,
125 sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,
126 x, sp[0]->s_n);
129 static void sigsamphold_reset(t_sigsamphold *x)
131 x->x_lastin = 0x7fffffff;
134 static void sigsamphold_set(t_sigsamphold *x, t_float f)
136 x->x_lastout = f;
139 void samphold_tilde_setup(void)
141 sigsamphold_class = class_new(gensym("samphold~"),
142 (t_newmethod)sigsamphold_new, 0, sizeof(t_sigsamphold), 0, 0);
143 CLASS_MAINSIGNALIN(sigsamphold_class, t_sigsamphold, x_f);
144 class_addmethod(sigsamphold_class, (t_method)sigsamphold_set,
145 gensym("set"), A_FLOAT, 0);
146 class_addmethod(sigsamphold_class, (t_method)sigsamphold_reset,
147 gensym("reset"), 0);
148 class_addmethod(sigsamphold_class, (t_method)sigsamphold_dsp,
149 gensym("dsp"), 0);