diff options
Diffstat (limited to 'flib')
-rw-r--r-- | flib/src/clean~.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/flib/src/clean~.c b/flib/src/clean~.c index 1261357..0133e18 100644 --- a/flib/src/clean~.c +++ b/flib/src/clean~.c @@ -18,15 +18,20 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -/* cleans 'nan' 'inf' '-inf' from an audio vector */ +/* cleans 'nan' 'inf' '-inf' from an audio vector or control value + * If no argument is given 'dirty' values will be replaced by 0, otherwise values are replaced by the argument value. If an audio vector is given as input, a bang is sent to the right output if 'dirty' values are found */ #include "flib.h" + +#define CLEAN (x->outval == x->inf ? 0 : x->outval) + static t_class *clean_class; typedef struct _clean { t_object x_obj; t_float f; t_outlet *out_r; + t_float outval, inf; } t_clean; static t_int *clean_perform(t_int *w) @@ -35,14 +40,20 @@ static t_int *clean_perform(t_int *w) t_sample *out = (t_sample *)(w[2]); t_int N = (t_int)(w[3]); t_clean *x = (t_clean *)(w[4]); - + t_int dirty = 0; while(N--){ - if(finite(*in)) - *out++ = *in++; + if(!finite(*in)){ + dirty = 1; + *out++ = CLEAN; + + } else - *out++ = 0; + *out++ = *in++; } + if(dirty) + outlet_bang(x->out_r); + return (w+5); } @@ -55,8 +66,8 @@ static void clean_dsp(t_clean *x, t_signal **sp) static void clean_float(t_clean *x, t_float f) { x->f = f; - if(!x->f || !finite(x->f)) - outlet_float(x->out_r, 0); + if(!finite(x->f)) + outlet_float(x->out_r, CLEAN); else outlet_float(x->out_r, x->f); @@ -64,11 +75,19 @@ static void clean_float(t_clean *x, t_float f) -static void *clean_new(void) +static void *clean_new(t_symbol *s, t_int argc, t_atom *argv) { t_clean *x = (t_clean *)pd_new(clean_class); outlet_new(&x->x_obj, &s_signal); x->out_r = outlet_new(&x->x_obj, &s_float); + x->inf = (t_float)HUGE_VAL; + + if(argc) + x->outval = atom_getfloatarg(0, argc, argv); + else + x->outval = x->inf; + + post("%.2f", x->outval); return (void *)x; } @@ -77,7 +96,7 @@ void clean_tilde_setup(void) { clean_class = class_new(gensym("clean~"), (t_newmethod)clean_new, 0, sizeof(t_clean), - CLASS_DEFAULT, 0); + CLASS_DEFAULT, A_GIMME, 0); CLASS_MAINSIGNALIN(clean_class, t_clean,f); class_addfloat(clean_class, clean_float); |