static void scope_grgb(t_scope *x, t_symbol *s, int ac, t_atom *av) { t_float grred = (SCOPE_DEFGRRED); t_float grgreen = (SCOPE_DEFGRGREEN); t_float grblue = (SCOPE_DEFGRBLUE); t_canvas *cv; if (s) { loud_floatarg(*(t_pd *)x, 0, ac, av, &grred, SCOPE_MINCOLOR, SCOPE_MAXCOLOR, LOUD_CLIP | LOUD_WARN, LOUD_CLIP | LOUD_WARN, "color"); loud_floatarg(*(t_pd *)x, 1, ac, av, &grgreen, SCOPE_MINCOLOR, SCOPE_MAXCOLOR, LOUD_CLIP | LOUD_WARN, LOUD_CLIP | LOUD_WARN, "color"); loud_floatarg(*(t_pd *)x, 2, ac, av, &grblue, SCOPE_MINCOLOR, SCOPE_MAXCOLOR, LOUD_CLIP | LOUD_WARN, LOUD_CLIP | LOUD_WARN, "color"); } x->x_grred = (int)grred; x->x_grgreen = (int)grgreen; x->x_grblue = (int)grblue; if (cv = scope_isvisible(x)) sys_vgui(".x%lx.c itemconfigure %s -fill #%2.2x%2.2x%2.2x\n", cv, x->x_gridtag, x->x_grred, x->x_grgreen, x->x_grblue); }
static void *scope_new(t_symbol *s, int ac, t_atom *av) { t_scope *x = (t_scope *)pd_new(scope_class); t_scopehandle *sh; t_float width = SCOPE_DEFWIDTH; t_float height = SCOPE_DEFHEIGHT; char buf[64]; x->x_glist = canvas_getcurrent(); x->x_canvas = 0; loud_floatarg(*(t_pd *)x, 0, ac, av, &width, SCOPE_MINWIDTH, 0, LOUD_CLIP | LOUD_WARN, 0, "width"); x->x_width = (int)width; loud_floatarg(*(t_pd *)x, 1, ac, av, &height, SCOPE_MINHEIGHT, 0, LOUD_CLIP | LOUD_WARN, 0, "height"); x->x_height = (int)height; scope_period(x, 0, ac, av); /* CHECKME 6th argument (default 3 for mono, 1 for xy */ scope_bufsize(x, 0, ac, av); scope_range(x, 0, ac, av); scope_delay(x, 0, ac, av); /* CHECKME 11th argument (default 0.) */ scope_trigger(x, 0, ac, av); scope_triglevel(x, 0, ac, av); scope_frgb(x, 0, ac, av); scope_brgb(x, 0, ac, av); scope_grgb(x, 0, ac, av); /* CHECKME last argument (default 0) */ sprintf(x->x_tag, "all%lx", (unsigned long)x); sprintf(x->x_bgtag, "bg%lx", (unsigned long)x); sprintf(x->x_gridtag, "gr%lx", (unsigned long)x); sprintf(x->x_fgtag, "fg%lx", (unsigned long)x); x->x_xymode = 0; x->x_ksr = sys_getsr() * 0.001; /* redundant */ x->x_frozen = 0; inlet_new((t_object *)x, (t_pd *)x, &s_signal, &s_signal); //inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_list, gensym("bufsize")); x->x_clock = clock_new(x, (t_method)scope_tick); scope_clear(x, 0); x->x_handle = pd_new(scopehandle_class); sh = (t_scopehandle *)x->x_handle; sh->h_master = x; sprintf(buf, "_h%lx", (unsigned long)sh); pd_bind(x->x_handle, sh->h_bindsym = gensym(buf)); sprintf(sh->h_outlinetag, "h%lx", (unsigned long)sh); sh->h_dragon = 0; return (x); }
static void scope_delay(t_scope *x, t_symbol *s, int ac, t_atom *av) { t_float delay = (s ? x->x_delay : SCOPE_DEFDELAY); int result = loud_floatarg(*(t_pd *)x, (s ? 0 : 7), ac, av, &delay, SCOPE_MINDELAY, 0, LOUD_CLIP | LOUD_WARN, 0, "delay"); if (!s || result == LOUD_ARGOK) x->x_delay = delay; }
static void scope_trigger(t_scope *x, t_symbol *s, int ac, t_atom *av) { t_float trigmode = (s ? x->x_trigmode : SCOPE_DEFTRIGMODE); loud_floatarg(*(t_pd *)x, (s ? 0 : 9), ac, av, &trigmode, SCOPE_MINTRIGMODE, SCOPE_MAXTRIGMODE, LOUD_CLIP | LOUD_WARN, LOUD_CLIP | LOUD_WARN, "trigger mode"); x->x_trigmode = (int)trigmode; if (x->x_trigmode == SCOPE_TRIGLINEMODE) x->x_retrigger = 0; }
static void scope_brgb(t_scope *x, t_symbol *s, int ac, t_atom *av) { t_float bgred = (s ? x->x_bgred : SCOPE_DEFBGRED); t_float bggreen = (s ? x->x_bggreen : SCOPE_DEFBGGREEN); t_float bgblue = (s ? x->x_bgblue : SCOPE_DEFBGBLUE); t_canvas *cv; loud_floatarg(*(t_pd *)x, (s ? 0 : 14), ac, av, &bgred, SCOPE_MINCOLOR, SCOPE_MAXCOLOR, LOUD_CLIP | LOUD_WARN, LOUD_CLIP | LOUD_WARN, "color"); loud_floatarg(*(t_pd *)x, (s ? 1 : 15), ac, av, &bggreen, SCOPE_MINCOLOR, SCOPE_MAXCOLOR, LOUD_CLIP | LOUD_WARN, LOUD_CLIP | LOUD_WARN, "color"); loud_floatarg(*(t_pd *)x, (s ? 2 : 16), ac, av, &bgblue, SCOPE_MINCOLOR, SCOPE_MAXCOLOR, LOUD_CLIP | LOUD_WARN, LOUD_CLIP | LOUD_WARN, "color"); x->x_bgred = (int)bgred; x->x_bggreen = (int)bggreen; x->x_bgblue = (int)bgblue; if (cv = scope_isvisible(x)) sys_vgui(".x%lx.c itemconfigure %s -fill #%2.2x%2.2x%2.2x\n", cv, x->x_bgtag, x->x_bgred, x->x_bggreen, x->x_bgblue); }
static void scope_range(t_scope *x, t_symbol *s, int ac, t_atom *av) { t_float minval = (s ? x->x_minval : SCOPE_DEFMINVAL); t_float maxval = (s ? x->x_maxval : SCOPE_DEFMAXVAL); loud_floatarg(*(t_pd *)x, (s ? 0 : 5), ac, av, &minval, 0, 0, 0, 0, 0); loud_floatarg(*(t_pd *)x, (s ? 1 : 6), ac, av, &maxval, 0, 0, 0, 0, 0); /* CHECKME swapping, ignoring if equal */ if (minval < maxval) { x->x_minval = minval; x->x_maxval = maxval; } else if (minval > maxval) { x->x_minval = maxval; x->x_maxval = minval; } else if (!s) { x->x_minval = SCOPE_DEFMINVAL; x->x_maxval = SCOPE_DEFMAXVAL; } }
static void scope_period(t_scope *x, t_symbol *s, int ac, t_atom *av) { t_float period = (s ? x->x_period : SCOPE_DEFPERIOD); int result = loud_floatarg(*(t_pd *)x, (s ? 0 : 2), ac, av, &period, SCOPE_MINPERIOD, SCOPE_MAXPERIOD, /* LATER rethink warning rules */ (s ? LOUD_CLIP : LOUD_CLIP | LOUD_WARN), 0, "samples per element"); if (!s && result == LOUD_ARGOVER) fittermax_warning(*(t_pd *)x, "more than %g samples per element requested", SCOPE_MAXPERIOD); if (!s || result == LOUD_ARGOK || result == LOUD_ARGOVER) { x->x_period = (int)period; scope_clear(x, 0); } }
static void *frameaccum_new(t_symbol *s, int ac, t_atom *av) { t_frameaccum *x = (t_frameaccum *)pd_new(frameaccum_class); int size; t_float wrapFlag = FRAMEACCUM_NOWRAP; x->x_size = FRAMEACCUM_INISIZE; x->x_frame = x->x_frameini; if ((size = sys_getblksize()) > FRAMEACCUM_INISIZE) x->x_frame = grow_nodata(&size, &x->x_size, x->x_frame, FRAMEACCUM_INISIZE, x->x_frameini, sizeof(*x->x_frame)); loud_floatarg(*(t_pd *)x, 0, ac, av, &wrapFlag, 0.f, 1.f, LOUD_CLIP | LOUD_WARN | LOUD_ARGUNDER, LOUD_CLIP | LOUD_WARN | LOUD_ARGOVER, "wrapFlag"); x->x_wrapFlag = (wrapFlag) ? 1 : 0; outlet_new((t_object *)x, &s_signal); return (x); }
static void scope_triglevel(t_scope *x, t_symbol *s, int ac, t_atom *av) { t_float triglevel = (s ? x->x_triglevel : SCOPE_DEFTRIGLEVEL); loud_floatarg(*(t_pd *)x, (s ? 0 : 10), ac, av, &triglevel, 0, 0, 0, 0, 0); x->x_triglevel = triglevel; }
static void scope_bufsize(t_scope *x, t_symbol *s, int ac, t_atom *av) { t_float bufsize = (s ? x->x_bufsize : SCOPE_DEFBUFSIZE); int result = loud_floatarg(*(t_pd *)x, (s ? 0 : 4), ac, av, &bufsize, SCOPE_MINBUFSIZE, SCOPE_WARNBUFSIZE, /* LATER rethink warning rules */ (s ? LOUD_CLIP : LOUD_CLIP | LOUD_WARN), 0, "display elements"); if (result == LOUD_ARGOVER) { bufsize = (s ? x->x_bufsize : SCOPE_DEFBUFSIZE); result = loud_floatarg(*(t_pd *)x, (s ? 0 : 4), ac, av, &bufsize, 0, SCOPE_MAXBUFSIZE, 0, LOUD_CLIP | LOUD_WARN, "display elements"); if (!s && result == LOUD_ARGOK) fittermax_warning(*(t_pd *)x, "more than %g display elements requested", SCOPE_WARNBUFSIZE); } if (!s) { x->x_allocsize = SCOPE_DEFBUFSIZE; x->x_bufsize = 0; x->x_xbuffer = x->x_xbufini; x->x_ybuffer = x->x_ybufini; } if (!s || result == LOUD_ARGOK) { int newsize = (int)bufsize; if (newsize > x->x_allocsize) { int nrequested = newsize; int allocsize = x->x_allocsize; int oldsize = x->x_bufsize; x->x_xbuffer = grow_withdata(&nrequested, &oldsize, &allocsize, x->x_xbuffer, SCOPE_DEFBUFSIZE, x->x_xbufini, sizeof(*x->x_xbuffer)); if (nrequested == newsize) { allocsize = x->x_allocsize; oldsize = x->x_bufsize; x->x_ybuffer = grow_withdata(&nrequested, &oldsize, &allocsize, x->x_ybuffer, SCOPE_DEFBUFSIZE, x->x_ybufini, sizeof(*x->x_ybuffer)); } if (nrequested == newsize) { x->x_allocsize = allocsize; x->x_bufsize = newsize; } else { if (x->x_xbuffer != x->x_xbufini) freebytes(x->x_xbuffer, x->x_allocsize * sizeof(*x->x_xbuffer)); if (x->x_ybuffer != x->x_ybufini) freebytes(x->x_ybuffer, x->x_allocsize * sizeof(*x->x_ybuffer)); x->x_allocsize = SCOPE_DEFBUFSIZE; x->x_bufsize = SCOPE_DEFBUFSIZE; x->x_xbuffer = x->x_xbufini; x->x_ybuffer = x->x_ybufini; } } else x->x_bufsize = newsize; scope_clear(x, 0); } }