A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 790 lines 25 kB view raw
1/* Copyright (c) 1997-1999 Miller Puckette. 2 * For information on usage and redistribution, and for a DISCLAIMER OF ALL 3 * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ 4 5/* g_7_guis.c written by Thomas Musil (c) IEM KUG Graz Austria 2000-2001 */ 6/* thanks to Miller Puckette, Guenther Geiger and Krzystof Czaja */ 7 8#ifdef ROCKBOX 9#include "plugin.h" 10#include "../../pdbox.h" 11#include "m_pd.h" 12#include "g_canvas.h" 13#include "g_all_guis.h" 14#else /* ROCKBOX */ 15#include <stdlib.h> 16#include <string.h> 17#include <stdio.h> 18#include <ctype.h> 19#include "m_pd.h" 20#include "g_canvas.h" 21#include "t_tk.h" 22#include "g_all_guis.h" 23#include <math.h> 24 25#ifdef MSW 26#include <io.h> 27#else 28#include <unistd.h> 29#endif 30#endif /* ROCKBOX */ 31 32/* ----- vu gui-peak- & rms- vu-meter-display ---------- */ 33 34t_widgetbehavior vu_widgetbehavior; 35static t_class *vu_class; 36 37/* widget helper functions */ 38 39static void vu_update_rms(t_vu *x, t_glist *glist) 40{ 41#ifdef ROCKBOX 42 (void) x; 43 (void) glist; 44#else /* ROCKBOX */ 45 if(glist_isvisible(glist)) 46 { 47 int w4=x->x_gui.x_w/4, off=text_ypix(&x->x_gui.x_obj, glist)-1; 48 int xpos=text_xpix(&x->x_gui.x_obj, glist), quad1=xpos+w4+1, quad3=xpos+x->x_gui.x_w-w4-1; 49 50 sys_vgui(".x%x.c coords %xRCOVER %d %d %d %d\n", 51 glist_getcanvas(glist), x, quad1, off, quad3, 52 off + (x->x_led_size+1)*(IEM_VU_STEPS-x->x_rms)); 53 } 54#endif /* ROCKBOX */ 55} 56 57static void vu_update_peak(t_vu *x, t_glist *glist) 58{ 59#ifdef ROCKBOX 60 (void) x; 61 (void) glist; 62#else /* ROCKBOX */ 63 t_canvas *canvas=glist_getcanvas(glist); 64 65 if(glist_isvisible(glist)) 66 { 67 int xpos=text_xpix(&x->x_gui.x_obj, glist); 68 int ypos=text_ypix(&x->x_gui.x_obj, glist); 69 70 if(x->x_peak) 71 { 72 int i=iemgui_vu_col[x->x_peak]; 73 int j=ypos + (x->x_led_size+1)*(IEM_VU_STEPS+1-x->x_peak) 74 - (x->x_led_size+1)/2; 75 76 sys_vgui(".x%x.c coords %xPLED %d %d %d %d\n", canvas, x, 77 xpos, j, 78 xpos+x->x_gui.x_w+1, j); 79 sys_vgui(".x%x.c itemconfigure %xPLED -fill #%6.6x\n", canvas, x, 80 iemgui_color_hex[i]); 81 } 82 else 83 { 84 int mid=xpos+x->x_gui.x_w/2; 85 86 sys_vgui(".x%x.c itemconfigure %xPLED -fill #%6.6x\n", 87 canvas, x, x->x_gui.x_bcol); 88 sys_vgui(".x%x.c coords %xPLED %d %d %d %d\n", 89 canvas, x, mid, ypos+20, 90 mid, ypos+20); 91 } 92 } 93#endif /* ROCKBOX */ 94} 95 96static void vu_draw_new(t_vu *x, t_glist *glist) 97{ 98#ifdef ROCKBOX 99 (void) x; 100 (void) glist; 101#else /* ROCKBOX */ 102 t_canvas *canvas=glist_getcanvas(glist); 103 104 int xpos=text_xpix(&x->x_gui.x_obj, glist); 105 int ypos=text_ypix(&x->x_gui.x_obj, glist); 106 int w4=x->x_gui.x_w/4, mid=xpos+x->x_gui.x_w/2, 107 quad1=xpos+w4+1; 108 int quad3=xpos+x->x_gui.x_w-w4, 109 end=xpos+x->x_gui.x_w+4; 110 int k1=x->x_led_size+1, k2=IEM_VU_STEPS+1, k3=k1/2; 111 int led_col, yyy, i, k4=ypos-k3; 112 113 sys_vgui(".x%x.c create rectangle %d %d %d %d -fill #%6.6x -tags %xBASE\n", 114 canvas, xpos-1, ypos-2, 115 xpos+x->x_gui.x_w+1, 116 ypos+x->x_gui.x_h+2, x->x_gui.x_bcol, x); 117 for(i=1; i<=IEM_VU_STEPS; i++) 118 { 119 led_col = iemgui_vu_col[i]; 120 yyy = k4 + k1*(k2-i); 121 sys_vgui(".x%x.c create line %d %d %d %d -width %d -fill #%6.6x -tags %xRLED%d\n", 122 canvas, quad1, yyy, quad3, yyy, x->x_led_size, iemgui_color_hex[led_col], x, i); 123 if(((i+2)&3) && (x->x_scale)) 124 sys_vgui(".x%x.c create text %d %d -text {%s} -anchor w \ 125 -font {%s %d bold} -fill #%6.6x -tags %xSCALE%d\n", 126 canvas, end, yyy+k3, iemgui_vu_scale_str[i], x->x_gui.x_font, x->x_gui.x_fontsize, 127 x->x_gui.x_lcol, x, i); 128 } 129 if(x->x_scale) 130 { 131 i=IEM_VU_STEPS+1; 132 yyy = k4 + k1*(k2-i); 133 sys_vgui(".x%x.c create text %d %d -text {%s} -anchor w \ 134 -font {%s %d bold} -fill #%6.6x -tags %xSCALE%d\n", 135 canvas, end, yyy+k3, iemgui_vu_scale_str[i], x->x_gui.x_font, x->x_gui.x_fontsize, 136 x->x_gui.x_lcol, x, i); 137 } 138 sys_vgui(".x%x.c create rectangle %d %d %d %d -fill #%6.6x -outline #%6.6x -tags %xRCOVER\n", 139 canvas, quad1, ypos-1, quad3-1, 140 ypos-1 + k1*IEM_VU_STEPS, x->x_gui.x_bcol, x->x_gui.x_bcol, x); 141 sys_vgui(".x%x.c create line %d %d %d %d -width %d -fill #%6.6x -tags %xPLED\n", 142 canvas, mid, ypos+10, 143 mid, ypos+10, x->x_led_size, x->x_gui.x_bcol, x); 144 sys_vgui(".x%x.c create text %d %d -text {%s} -anchor w \ 145 -font {%s %d bold} -fill #%6.6x -tags %xLABEL\n", 146 canvas, xpos+x->x_gui.x_ldx, ypos+x->x_gui.x_ldy, 147 strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"", 148 x->x_gui.x_font, x->x_gui.x_fontsize, x->x_gui.x_lcol, x); 149 if(!x->x_gui.x_fsf.x_snd_able) 150 { 151 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xOUT%d\n", 152 canvas, 153 xpos-1, ypos + x->x_gui.x_h+1, 154 xpos + IOWIDTH-1, ypos + x->x_gui.x_h+2, 155 x, 0); 156 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xOUT%d\n", 157 canvas, 158 xpos+x->x_gui.x_w+1-IOWIDTH, ypos + x->x_gui.x_h+1, 159 xpos+x->x_gui.x_w+1, ypos + x->x_gui.x_h+2, 160 x, 1); 161 } 162 if(!x->x_gui.x_fsf.x_rcv_able) 163 { 164 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xIN%d\n", 165 canvas, 166 xpos-1, ypos-2, 167 xpos + IOWIDTH-1, ypos-1, 168 x, 0); 169 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xIN%d\n", 170 canvas, 171 xpos+x->x_gui.x_w+1-IOWIDTH, ypos-2, 172 xpos+x->x_gui.x_w+1, ypos-1, 173 x, 1); 174 } 175#endif /* ROCKBOX */ 176} 177 178 179static void vu_draw_move(t_vu *x, t_glist *glist) 180{ 181#ifdef ROCKBOX 182 (void) x; 183 (void) glist; 184#else /* ROCKBOX */ 185 t_canvas *canvas=glist_getcanvas(glist); 186 187 int xpos=text_xpix(&x->x_gui.x_obj, glist); 188 int ypos=text_ypix(&x->x_gui.x_obj, glist); 189 int w4=x->x_gui.x_w/4, quad1=xpos+w4+1; 190 int quad3=xpos+x->x_gui.x_w-w4, 191 end=xpos+x->x_gui.x_w+4; 192 int k1=x->x_led_size+1, k2=IEM_VU_STEPS+1, k3=k1/2; 193 int yyy, i, k4=ypos-k3; 194 195 sys_vgui(".x%x.c coords %xBASE %d %d %d %d\n", 196 canvas, x, xpos-1, ypos-2, 197 xpos+x->x_gui.x_w+1,ypos+x->x_gui.x_h+2); 198 for(i=1; i<=IEM_VU_STEPS; i++) 199 { 200 yyy = k4 + k1*(k2-i); 201 sys_vgui(".x%x.c coords %xRLED%d %d %d %d %d\n", 202 canvas, x, i, quad1, yyy, quad3, yyy); 203 if(((i+2)&3) && (x->x_scale)) 204 sys_vgui(".x%x.c coords %xSCALE%d %d %d\n", 205 canvas, x, i, end, yyy+k3); 206 } 207 if(x->x_scale) 208 { 209 i=IEM_VU_STEPS+1; 210 yyy = k4 + k1*(k2-i); 211 sys_vgui(".x%x.c coords %xSCALE%d %d %d\n", 212 canvas, x, i, end, yyy+k3); 213 } 214 vu_update_peak(x, glist); 215 vu_update_rms(x, glist); 216 sys_vgui(".x%x.c coords %xLABEL %d %d\n", 217 canvas, x, xpos+x->x_gui.x_ldx, 218 ypos+x->x_gui.x_ldy); 219 if(!x->x_gui.x_fsf.x_snd_able) 220 { 221 sys_vgui(".x%x.c coords %xOUT%d %d %d %d %d\n", 222 canvas, x, 0, 223 xpos-1, ypos + x->x_gui.x_h+1, 224 xpos + IOWIDTH-1, ypos + x->x_gui.x_h+2); 225 sys_vgui(".x%x.c coords %xOUT%d %d %d %d %d\n", 226 canvas, x, 1, 227 xpos+x->x_gui.x_w+1-IOWIDTH, ypos + x->x_gui.x_h+1, 228 xpos+x->x_gui.x_w+1, ypos + x->x_gui.x_h+2); 229 } 230 if(!x->x_gui.x_fsf.x_rcv_able) 231 { 232 sys_vgui(".x%x.c coords %xIN%d %d %d %d %d\n", 233 canvas, x, 0, 234 xpos-1, ypos-2, 235 xpos + IOWIDTH-1, ypos-1); 236 sys_vgui(".x%x.c coords %xIN%d %d %d %d %d\n", 237 canvas, x, 1, 238 xpos+x->x_gui.x_w+1-IOWIDTH, ypos-2, 239 xpos+x->x_gui.x_w+1, ypos-1); 240 } 241#endif /* ROCKBOX */ 242} 243 244static void vu_draw_erase(t_vu* x,t_glist* glist) 245{ 246#ifdef ROCKBOX 247 (void) x; 248 (void) glist; 249#else /* ROCKBOX */ 250 int i; 251 t_canvas *canvas=glist_getcanvas(glist); 252 253 sys_vgui(".x%x.c delete %xBASE\n", canvas, x); 254 for(i=1; i<=IEM_VU_STEPS; i++) 255 { 256 sys_vgui(".x%x.c delete %xRLED%d\n", canvas, x, i); 257 if(((i+2)&3) && (x->x_scale)) 258 sys_vgui(".x%x.c delete %xSCALE%d\n", canvas, x, i); 259 } 260 if(x->x_scale) 261 { 262 i=IEM_VU_STEPS+1; 263 sys_vgui(".x%x.c delete %xSCALE%d\n", canvas, x, i); 264 } 265 sys_vgui(".x%x.c delete %xPLED\n", canvas, x); 266 sys_vgui(".x%x.c delete %xRCOVER\n", canvas, x); 267 sys_vgui(".x%x.c delete %xLABEL\n", canvas, x); 268 if(!x->x_gui.x_fsf.x_snd_able) 269 { 270 sys_vgui(".x%x.c delete %xOUT%d\n", canvas, x, 0); 271 sys_vgui(".x%x.c delete %xOUT%d\n", canvas, x, 1); 272 } 273 if(!x->x_gui.x_fsf.x_rcv_able) 274 { 275 sys_vgui(".x%x.c delete %xIN%d\n", canvas, x, 0); 276 sys_vgui(".x%x.c delete %xIN%d\n", canvas, x, 1); 277 } 278#endif /* ROCKBOX */ 279} 280 281static void vu_draw_config(t_vu* x, t_glist* glist) 282{ 283#ifdef ROCKBOX 284 (void) x; 285 (void) glist; 286#else /* ROCKBOX */ 287 int i; 288 t_canvas *canvas=glist_getcanvas(glist); 289 290 sys_vgui(".x%x.c itemconfigure %xBASE -fill #%6.6x\n", canvas, x, x->x_gui.x_bcol); 291 for(i=1; i<=IEM_VU_STEPS; i++) 292 { 293 sys_vgui(".x%x.c itemconfigure %xRLED%d -width %d\n", canvas, x, i, 294 x->x_led_size); 295 if(((i+2)&3) && (x->x_scale)) 296 sys_vgui(".x%x.c itemconfigure %xSCALE%d -text {%s} -font {%s %d bold} -fill #%6.6x\n", 297 canvas, x, i, iemgui_vu_scale_str[i], x->x_gui.x_font, x->x_gui.x_fontsize, 298 x->x_gui.x_fsf.x_selected?IEM_GUI_COLOR_SELECTED:x->x_gui.x_lcol); 299 } 300 if(x->x_scale) 301 { 302 i=IEM_VU_STEPS+1; 303 sys_vgui(".x%x.c itemconfigure %xSCALE%d -text {%s} -font {%s %d bold} -fill #%6.6x\n", 304 canvas, x, i, iemgui_vu_scale_str[i], x->x_gui.x_font, x->x_gui.x_fontsize, 305 x->x_gui.x_fsf.x_selected?IEM_GUI_COLOR_SELECTED:x->x_gui.x_lcol); 306 } 307 sys_vgui(".x%x.c itemconfigure %xLABEL -font {%s %d bold} -fill #%6.6x -text {%s} \n", 308 canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, 309 x->x_gui.x_fsf.x_selected?IEM_GUI_COLOR_SELECTED:x->x_gui.x_lcol, 310 strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:""); 311 312 sys_vgui(".x%x.c itemconfigure %xRCOVER -fill #%6.6x -outline #%6.6x\n", canvas, 313 x, x->x_gui.x_bcol, x->x_gui.x_bcol); 314 sys_vgui(".x%x.c itemconfigure %xPLED -width %d\n", canvas, x, 315 x->x_led_size); 316#endif /* ROCKBOX */ 317} 318 319static void vu_draw_io(t_vu* x, t_glist* glist, int old_snd_rcv_flags) 320{ 321#ifdef ROCKBOX 322 (void) x; 323 (void) glist; 324 (void) old_snd_rcv_flags; 325#else /* ROCKBOX */ 326 int xpos=text_xpix(&x->x_gui.x_obj, glist); 327 int ypos=text_ypix(&x->x_gui.x_obj, glist); 328 t_canvas *canvas=glist_getcanvas(glist); 329 330 if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && !x->x_gui.x_fsf.x_snd_able) 331 { 332 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xOUT%d\n", 333 canvas, 334 xpos-1, ypos + x->x_gui.x_h+1, 335 xpos + IOWIDTH-1, ypos + x->x_gui.x_h+2, 336 x, 0); 337 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xOUT%d\n", 338 canvas, 339 xpos+x->x_gui.x_w+1-IOWIDTH, ypos + x->x_gui.x_h+1, 340 xpos+x->x_gui.x_w+1, ypos + x->x_gui.x_h+2, 341 x, 1); 342 } 343 if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) && x->x_gui.x_fsf.x_snd_able) 344 { 345 sys_vgui(".x%x.c delete %xOUT%d\n", canvas, x, 0); 346 sys_vgui(".x%x.c delete %xOUT%d\n", canvas, x, 1); 347 } 348 if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && !x->x_gui.x_fsf.x_rcv_able) 349 { 350 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xIN%d\n", 351 canvas, 352 xpos-1, ypos-2, 353 xpos + IOWIDTH-1, ypos-1, 354 x, 0); 355 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xIN%d\n", 356 canvas, 357 xpos+x->x_gui.x_w+1-IOWIDTH, ypos-2, 358 xpos+x->x_gui.x_w+1, ypos-1, 359 x, 1); 360 } 361 if(!(old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) && x->x_gui.x_fsf.x_rcv_able) 362 { 363 sys_vgui(".x%x.c delete %xIN%d\n", canvas, x, 0); 364 sys_vgui(".x%x.c delete %xIN%d\n", canvas, x, 1); 365 } 366#endif /* ROCKBOX */ 367} 368 369static void vu_draw_select(t_vu* x,t_glist* glist) 370{ 371#ifdef ROCKBOX 372 (void) x; 373 (void) glist; 374#else /* ROCKBOX */ 375 int i; 376 t_canvas *canvas=glist_getcanvas(glist); 377 378 if(x->x_gui.x_fsf.x_selected) 379 { 380 sys_vgui(".x%x.c itemconfigure %xBASE -outline #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED); 381 for(i=1; i<=IEM_VU_STEPS; i++) 382 { 383 if(((i+2)&3) && (x->x_scale)) 384 sys_vgui(".x%x.c itemconfigure %xSCALE%d -fill #%6.6x\n", 385 canvas, x, i, IEM_GUI_COLOR_SELECTED); 386 } 387 if(x->x_scale) 388 { 389 i=IEM_VU_STEPS+1; 390 sys_vgui(".x%x.c itemconfigure %xSCALE%d -fill #%6.6x\n", 391 canvas, x, i, IEM_GUI_COLOR_SELECTED); 392 } 393 sys_vgui(".x%x.c itemconfigure %xLABEL -fill #%6.6x\n", canvas, x, IEM_GUI_COLOR_SELECTED); 394 } 395 else 396 { 397 sys_vgui(".x%x.c itemconfigure %xBASE -outline #%6.6x\n", canvas, x, IEM_GUI_COLOR_NORMAL); 398 for(i=1; i<=IEM_VU_STEPS; i++) 399 { 400 if(((i+2)&3) && (x->x_scale)) 401 sys_vgui(".x%x.c itemconfigure %xSCALE%d -fill #%6.6x\n", 402 canvas, x, i, x->x_gui.x_lcol); 403 } 404 if(x->x_scale) 405 { 406 i=IEM_VU_STEPS+1; 407 sys_vgui(".x%x.c itemconfigure %xSCALE%d -fill #%6.6x\n", 408 canvas, x, i, x->x_gui.x_lcol); 409 } 410 sys_vgui(".x%x.c itemconfigure %xLABEL -fill #%6.6x\n", canvas, x, x->x_gui.x_lcol); 411 } 412#endif /* ROCKBOX */ 413} 414 415void vu_draw(t_vu *x, t_glist *glist, int mode) 416{ 417 if(mode == IEM_GUI_DRAW_MODE_MOVE) 418 vu_draw_move(x, glist); 419 else if(mode == IEM_GUI_DRAW_MODE_NEW) 420 vu_draw_new(x, glist); 421 else if(mode == IEM_GUI_DRAW_MODE_SELECT) 422 vu_draw_select(x, glist); 423 else if(mode == IEM_GUI_DRAW_MODE_ERASE) 424 vu_draw_erase(x, glist); 425 else if(mode == IEM_GUI_DRAW_MODE_CONFIG) 426 vu_draw_config(x, glist); 427 else if(mode >= IEM_GUI_DRAW_MODE_IO) 428 vu_draw_io(x, glist, mode - IEM_GUI_DRAW_MODE_IO); 429} 430 431/* ------------------------ vu widgetbehaviour----------------------------- */ 432 433 434static void vu_getrect(t_gobj *z, t_glist *glist, 435 int *xp1, int *yp1, int *xp2, int *yp2) 436{ 437 t_vu* x = (t_vu*)z; 438 439 *xp1 = text_xpix(&x->x_gui.x_obj, glist) - 1; 440 *yp1 = text_ypix(&x->x_gui.x_obj, glist) - 2; 441 *xp2 = *xp1 + x->x_gui.x_w + 2; 442 *yp2 = *yp1 + x->x_gui.x_h + 4; 443} 444 445static void vu_save(t_gobj *z, t_binbuf *b) 446{ 447 t_vu *x = (t_vu *)z; 448 int bflcol[3]; 449 t_symbol *srl[3]; 450 451 iemgui_save(&x->x_gui, srl, bflcol); 452 binbuf_addv(b, "ssiisiissiiiiiiii", gensym("#X"),gensym("obj"), 453 (t_int)x->x_gui.x_obj.te_xpix, (t_int)x->x_gui.x_obj.te_ypix, 454 gensym("vu"), x->x_gui.x_w, x->x_gui.x_h, 455 srl[1], srl[2], 456 x->x_gui.x_ldx, x->x_gui.x_ldy, 457 iem_fstyletoint(&x->x_gui.x_fsf), x->x_gui.x_fontsize, 458 bflcol[0], bflcol[2], x->x_scale, 459 iem_symargstoint(&x->x_gui.x_isa)); 460 binbuf_addv(b, ";"); 461} 462 463void vu_check_height(t_vu *x, int h) 464{ 465 int n; 466 467 n = h / IEM_VU_STEPS; 468 if(n < IEM_VU_MINSIZE) 469 n = IEM_VU_MINSIZE; 470 x->x_led_size = n-1; 471 x->x_gui.x_h = IEM_VU_STEPS * n; 472} 473 474static void vu_scale(t_vu *x, t_floatarg fscale) 475{ 476#ifdef ROCKBOX 477 (void) x; 478 (void) fscale; 479#else /* ROCKBOX */ 480 int i, scale = (int)fscale; 481 482 if(scale != 0) scale = 1; 483 if(x->x_scale && !scale) 484 { 485 t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist); 486 487 x->x_scale = (int)scale; 488 if(glist_isvisible(x->x_gui.x_glist)) 489 { 490 for(i=1; i<=IEM_VU_STEPS; i++) 491 { 492 if((i+2)&3) 493 sys_vgui(".x%x.c delete %xSCALE%d\n", canvas, x, i); 494 } 495 i=IEM_VU_STEPS+1; 496 sys_vgui(".x%x.c delete %xSCALE%d\n", canvas, x, i); 497 } 498 } 499 if(!x->x_scale && scale) 500 { 501#ifdef ROCKBOX 502 int end=text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist)+x->x_gui.x_w+4; 503#else /* ROCKBOX */ 504 int w4=x->x_gui.x_w/4, end=text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist)+x->x_gui.x_w+4; 505#endif /* ROCKBOX */ 506 int k1=x->x_led_size+1, k2=IEM_VU_STEPS+1, k3=k1/2; 507 int yyy, k4=text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist)-k3; 508 t_canvas *canvas=glist_getcanvas(x->x_gui.x_glist); 509 510 x->x_scale = (int)scale; 511 if(glist_isvisible(x->x_gui.x_glist)) 512 { 513 for(i=1; i<=IEM_VU_STEPS; i++) 514 { 515 yyy = k4 + k1*(k2-i); 516 if((i+2)&3) 517 sys_vgui(".x%x.c create text %d %d -text {%s} -anchor w \ 518 -font {%s %d bold} -fill #%6.6x -tags %xSCALE%d\n", 519 canvas, end, yyy+k3, iemgui_vu_scale_str[i], x->x_gui.x_font, x->x_gui.x_fontsize, 520 x->x_gui.x_lcol, x, i); 521 } 522 i=IEM_VU_STEPS+1; 523 yyy = k4 + k1*(k2-i); 524 sys_vgui(".x%x.c create text %d %d -text {%s} -anchor w \ 525 -font {%s %d bold} -fill #%6.6x -tags %xSCALE%d\n", 526 canvas, end, yyy+k3, iemgui_vu_scale_str[i], x->x_gui.x_font, x->x_gui.x_fontsize, 527 x->x_gui.x_lcol, x, i); 528 } 529 } 530#endif /* ROCKBOX */ 531} 532 533static void vu_properties(t_gobj *z, t_glist *owner) 534{ 535#ifdef ROCKBOX 536 (void) z; 537 (void) owner; 538#else /* ROCKBOX */ 539 t_vu *x = (t_vu *)z; 540 char buf[800]; 541 t_symbol *srl[3]; 542 543 iemgui_properties(&x->x_gui, srl); 544 sprintf(buf, "pdtk_iemgui_dialog %%s VU-METER \ 545 --------dimensions(pix)(pix):-------- %d %d width: %d %d height: \ 546 empty 0.0 empty 0.0 empty %d \ 547 %d no_scale scale %d %d empty %d \ 548 %s %s \ 549 %s %d %d \ 550 %d %d \ 551 %d %d %d\n", 552 x->x_gui.x_w, IEM_GUI_MINSIZE, x->x_gui.x_h, IEM_VU_STEPS*IEM_VU_MINSIZE, 553 0,/*no_schedule*/ 554 x->x_scale, -1, -1, -1,/*no linlog, no init, no multi*/ 555 "nosndno", srl[1]->s_name,/*no send*/ 556 srl[2]->s_name, x->x_gui.x_ldx, x->x_gui.x_ldy, 557 x->x_gui.x_fsf.x_font_style, x->x_gui.x_fontsize, 558 0xffffff & x->x_gui.x_bcol, -1/*no front-color*/, 0xffffff & x->x_gui.x_lcol); 559 gfxstub_new(&x->x_gui.x_obj.ob_pd, x, buf); 560#endif /* ROCKBOX */ 561} 562 563static void vu_dialog(t_vu *x, t_symbol *s, int argc, t_atom *argv) 564{ 565 t_symbol *srl[3]; 566 int w = (int)atom_getintarg(0, argc, argv); 567 int h = (int)atom_getintarg(1, argc, argv); 568 int scale = (int)atom_getintarg(4, argc, argv); 569 int sr_flags; 570 571#ifdef ROCKBOX 572 (void) s; 573#endif 574 575 srl[0] = gensym("empty"); 576 sr_flags = iemgui_dialog(&x->x_gui, srl, argc, argv); 577 x->x_gui.x_fsf.x_snd_able = 0; 578 x->x_gui.x_isa.x_loadinit = 0; 579 x->x_gui.x_w = iemgui_clip_size(w); 580 vu_check_height(x, h); 581 if(scale != 0) 582 scale = 1; 583 vu_scale(x, (float)scale); 584 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG); 585 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_IO + sr_flags); 586 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE); 587 canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x); 588} 589 590static void vu_size(t_vu *x, t_symbol *s, int ac, t_atom *av) 591{ 592#ifdef ROCKBOX 593 (void) s; 594#endif 595 x->x_gui.x_w = iemgui_clip_size((int)atom_getintarg(0, ac, av)); 596 if(ac > 1) 597 vu_check_height(x, (int)atom_getintarg(1, ac, av)); 598 if(glist_isvisible(x->x_gui.x_glist)) 599 { 600 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE); 601 (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG); 602 canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x); 603 } 604} 605 606static void vu_delta(t_vu *x, t_symbol *s, int ac, t_atom *av) 607{iemgui_delta((void *)x, &x->x_gui, s, ac, av);} 608 609static void vu_pos(t_vu *x, t_symbol *s, int ac, t_atom *av) 610{iemgui_pos((void *)x, &x->x_gui, s, ac, av);} 611 612static void vu_color(t_vu *x, t_symbol *s, int ac, t_atom *av) 613{iemgui_color((void *)x, &x->x_gui, s, ac, av);} 614 615static void vu_receive(t_vu *x, t_symbol *s) 616{iemgui_receive(x, &x->x_gui, s);} 617 618static void vu_label(t_vu *x, t_symbol *s) 619{iemgui_label((void *)x, &x->x_gui, s);} 620 621static void vu_label_pos(t_vu *x, t_symbol *s, int ac, t_atom *av) 622{iemgui_label_pos((void *)x, &x->x_gui, s, ac, av);} 623 624static void vu_label_font(t_vu *x, t_symbol *s, int ac, t_atom *av) 625{iemgui_label_font((void *)x, &x->x_gui, s, ac, av);} 626 627static void vu_float(t_vu *x, t_floatarg rms) 628{ 629 int i; 630 631 if(rms <= IEM_VU_MINDB) 632 x->x_rms = 0; 633 else if(rms >= IEM_VU_MAXDB) 634 x->x_rms = IEM_VU_STEPS; 635 else 636 { 637 int i = (int)(2.0*(rms + IEM_VU_OFFSET)); 638 x->x_rms = iemgui_vu_db2i[i]; 639 } 640 i = (int)(100.0*rms + 10000.5); 641 rms = 0.01*(float)(i - 10000); 642 x->x_fr = rms; 643 outlet_float(x->x_out_rms, rms); 644 vu_update_rms(x, x->x_gui.x_glist); 645} 646 647static void vu_ft1(t_vu *x, t_floatarg peak) 648{ 649 int i; 650 651 if(peak <= IEM_VU_MINDB) 652 x->x_peak = 0; 653 else if(peak >= IEM_VU_MAXDB) 654 x->x_peak = IEM_VU_STEPS; 655 else 656 { 657 int i = (int)(2.0*(peak + IEM_VU_OFFSET)); 658 x->x_peak = iemgui_vu_db2i[i]; 659 } 660 i = (int)(100.0*peak + 10000.5); 661 peak = 0.01*(float)(i - 10000); 662 x->x_fp = peak; 663 outlet_float(x->x_out_peak, peak); 664 vu_update_peak(x, x->x_gui.x_glist); 665} 666 667static void vu_bang(t_vu *x) 668{ 669 outlet_float(x->x_out_peak, x->x_fp); 670 outlet_float(x->x_out_rms, x->x_fr); 671 vu_update_rms(x, x->x_gui.x_glist); 672 vu_update_peak(x, x->x_gui.x_glist); 673} 674 675static void *vu_new(t_symbol *s, int argc, t_atom *argv) 676{ 677 t_vu *x = (t_vu *)pd_new(vu_class); 678 int bflcol[]={-66577, -1, -1}; 679 int w=IEM_GUI_DEFAULTSIZE, h=IEM_VU_STEPS*IEM_VU_DEFAULTSIZE; 680#ifdef ROCKBOX 681 int ldx=-1, ldy=-8, fs=8, scale=1; 682 (void) s; 683#else /* ROCKBOX */ 684 int ldx=-1, ldy=-8, f=0, fs=8, scale=1; 685 int ftbreak=IEM_BNG_DEFAULTBREAKFLASHTIME, fthold=IEM_BNG_DEFAULTHOLDFLASHTIME; 686 char str[144]; 687#endif /* ROCKBOX */ 688 689 iem_inttosymargs(&x->x_gui.x_isa, 0); 690 iem_inttofstyle(&x->x_gui.x_fsf, 0); 691 692 if((argc >= 11)&&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1) 693 &&(IS_A_SYMBOL(argv,2)||IS_A_FLOAT(argv,2)) 694 &&(IS_A_SYMBOL(argv,3)||IS_A_FLOAT(argv,3)) 695 &&IS_A_FLOAT(argv,4)&&IS_A_FLOAT(argv,5) 696 &&IS_A_FLOAT(argv,6)&&IS_A_FLOAT(argv,7) 697 &&IS_A_FLOAT(argv,8)&&IS_A_FLOAT(argv,9)&&IS_A_FLOAT(argv,10)) 698 { 699 w = (int)atom_getintarg(0, argc, argv); 700 h = (int)atom_getintarg(1, argc, argv); 701 iemgui_new_getnames(&x->x_gui, 1, argv); 702 ldx = (int)atom_getintarg(4, argc, argv); 703 ldy = (int)atom_getintarg(5, argc, argv); 704 iem_inttofstyle(&x->x_gui.x_fsf, atom_getintarg(6, argc, argv)); 705 fs = (int)atom_getintarg(7, argc, argv); 706 bflcol[0] = (int)atom_getintarg(8, argc, argv); 707 bflcol[2] = (int)atom_getintarg(9, argc, argv); 708 scale = (int)atom_getintarg(10, argc, argv); 709 } 710 else iemgui_new_getnames(&x->x_gui, 1, 0); 711 if((argc == 12)&&IS_A_FLOAT(argv,11)) 712 iem_inttosymargs(&x->x_gui.x_isa, atom_getintarg(11, argc, argv)); 713 x->x_gui.x_draw = (t_iemfunptr)vu_draw; 714 715 x->x_gui.x_fsf.x_snd_able = 0; 716 x->x_gui.x_fsf.x_rcv_able = 1; 717 x->x_gui.x_glist = (t_glist *)canvas_getcurrent(); 718 if (!strcmp(x->x_gui.x_rcv->s_name, "empty")) 719 x->x_gui.x_fsf.x_rcv_able = 0; 720 if (x->x_gui.x_fsf.x_font_style == 1) 721 strcpy(x->x_gui.x_font, "helvetica"); 722 else if(x->x_gui.x_fsf.x_font_style == 2) 723 strcpy(x->x_gui.x_font, "times"); 724 else { x->x_gui.x_fsf.x_font_style = 0; 725 strcpy(x->x_gui.x_font, "courier"); } 726 if(x->x_gui.x_fsf.x_rcv_able) 727 pd_bind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv); 728 x->x_gui.x_ldx = ldx; 729 x->x_gui.x_ldy = ldy; 730 731 if(fs < 4) 732 fs = 4; 733 x->x_gui.x_fontsize = fs; 734 x->x_gui.x_w = iemgui_clip_size(w); 735 vu_check_height(x, h); 736 iemgui_all_colfromload(&x->x_gui, bflcol); 737 if(scale != 0) 738 scale = 1; 739 x->x_scale = scale; 740 x->x_peak = 0; 741 x->x_rms = 0; 742 x->x_fp = -101.0; 743 x->x_fr = -101.0; 744 iemgui_verify_snd_ne_rcv(&x->x_gui); 745 inlet_new(&x->x_gui.x_obj, &x->x_gui.x_obj.ob_pd, &s_float, gensym("ft1")); 746 x->x_out_rms = outlet_new(&x->x_gui.x_obj, &s_float); 747 x->x_out_peak = outlet_new(&x->x_gui.x_obj, &s_float); 748 return (x); 749} 750 751static void vu_free(t_vu *x) 752{ 753 if(x->x_gui.x_fsf.x_rcv_able) 754 pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv); 755#ifndef ROCKBOX 756 gfxstub_deleteforkey(x); 757#endif 758} 759 760void g_vumeter_setup(void) 761{ 762 vu_class = class_new(gensym("vu"), (t_newmethod)vu_new, (t_method)vu_free, 763 sizeof(t_vu), 0, A_GIMME, 0); 764 class_addbang(vu_class,vu_bang); 765 class_addfloat(vu_class,vu_float); 766 class_addmethod(vu_class, (t_method)vu_ft1, gensym("ft1"), A_FLOAT, 0); 767 class_addmethod(vu_class, (t_method)vu_dialog, gensym("dialog"), 768 A_GIMME, 0); 769 class_addmethod(vu_class, (t_method)vu_size, gensym("size"), A_GIMME, 0); 770 class_addmethod(vu_class, (t_method)vu_scale, gensym("scale"), A_DEFFLOAT, 0); 771 class_addmethod(vu_class, (t_method)vu_delta, gensym("delta"), A_GIMME, 0); 772 class_addmethod(vu_class, (t_method)vu_pos, gensym("pos"), A_GIMME, 0); 773 class_addmethod(vu_class, (t_method)vu_color, gensym("color"), A_GIMME, 0); 774 class_addmethod(vu_class, (t_method)vu_receive, gensym("receive"), A_DEFSYM, 0); 775 class_addmethod(vu_class, (t_method)vu_label, gensym("label"), A_DEFSYM, 0); 776 class_addmethod(vu_class, (t_method)vu_label_pos, gensym("label_pos"), A_GIMME, 0); 777 class_addmethod(vu_class, (t_method)vu_label_font, gensym("label_font"), A_GIMME, 0); 778 vu_widgetbehavior.w_getrectfn = vu_getrect; 779 vu_widgetbehavior.w_displacefn = iemgui_displace; 780 vu_widgetbehavior.w_selectfn = iemgui_select; 781 vu_widgetbehavior.w_activatefn = NULL; 782 vu_widgetbehavior.w_deletefn = iemgui_delete; 783 vu_widgetbehavior.w_visfn = iemgui_vis; 784 vu_widgetbehavior.w_clickfn = NULL; 785 class_setwidget(vu_class,&vu_widgetbehavior); 786 class_sethelpsymbol(vu_class, gensym("vu")); 787 class_setsavefn(vu_class, vu_save); 788 class_setpropertiesfn(vu_class, vu_properties); 789} 790