summaryrefslogtreecommitdiff
path: root/apps/menus/eq_menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/menus/eq_menu.c')
-rw-r--r--apps/menus/eq_menu.c326
1 files changed, 154 insertions, 172 deletions
diff --git a/apps/menus/eq_menu.c b/apps/menus/eq_menu.c
index 279f8255c2..45bf9f41dd 100644
--- a/apps/menus/eq_menu.c
+++ b/apps/menus/eq_menu.c
@@ -240,18 +240,19 @@ enum eq_type {
240 HIGH_SHELF 240 HIGH_SHELF
241}; 241};
242 242
243/* Size of just the slider/srollbar */
244#define SCROLLBAR_SIZE 6
245
243/* Draw the UI for a whole EQ band */ 246/* Draw the UI for a whole EQ band */
244static int draw_eq_slider(struct screen * screen, int x, int y, 247static int draw_eq_slider(struct screen * screen, int x, int y,
245 int width, int cutoff, int q, int gain, bool selected, 248 int width, int cutoff, int q, int gain, bool selected,
246 enum eq_slider_mode mode, enum eq_type type) 249 enum eq_slider_mode mode, int band)
247{ 250{
248 char buf[26]; 251 char buf[26];
249 const char separator[2] = " ";
250 int steps, min_item, max_item; 252 int steps, min_item, max_item;
251 int abs_gain = abs(gain); 253 int abs_gain = abs(gain);
252 int current_x, total_height, separator_width, separator_height; 254 int x1, x2, y1, total_height;
253 int w, h; 255 int w, h;
254 const int slider_height = 6;
255 256
256 switch(mode) { 257 switch(mode) {
257 case Q: 258 case Q:
@@ -273,159 +274,108 @@ static int draw_eq_slider(struct screen * screen, int x, int y,
273 } 274 }
274 275
275 /* Start two pixels in, one for border, one for margin */ 276 /* Start two pixels in, one for border, one for margin */
276 current_x = x + 2; 277 x1 = x + 2;
277 278 y1 = y + 2;
278 /* Figure out how large our separator string is */
279 screen->getstringsize(separator, &separator_width, &separator_height);
280
281 /* Total height includes margins, text, and line selector */
282 total_height = separator_height + slider_height + 2 + 3;
283 279
284 /* Print out the band label */ 280 /* Print out the band label */
285 if (type == LOW_SHELF) { 281 if (band == 0) {
286 screen->putsxy(current_x, y + 2, "LS:"); 282 screen->putsxy(x1, y1, "LS: ");
287 screen->getstringsize("LS:", &w, &h); 283 screen->getstringsize("LS:", &w, &h);
288 } else if (type == HIGH_SHELF) { 284 } else if (band == 4) {
289 screen->putsxy(current_x, y + 2, "HS:"); 285 screen->putsxy(x1, y1, "HS: ");
290 screen->getstringsize("HS:", &w, &h); 286 screen->getstringsize("HS:", &w, &h);
291 } else { 287 } else {
292 screen->putsxy(current_x, y + 2, "PK:"); 288 snprintf(buf, sizeof(buf), "PK%d:", band);
293 screen->getstringsize("PK:", &w, &h); 289 screen->putsxy(x1, y1, buf);
294 }
295 current_x += w;
296
297 /* Print separator */
298 screen->set_drawmode(DRMODE_SOLID);
299 screen->putsxy(current_x, y + 2, separator);
300 current_x += separator_width;
301#if NB_SCREENS > 1
302 if (screen->screen_type == SCREEN_REMOTE) {
303 if (mode == GAIN) {
304 screen->putsxy(current_x, y + 2, str(LANG_GAIN));
305 screen->getstringsize(str(LANG_GAIN), &w, &h);
306 } else if (mode == CUTOFF) {
307 screen->putsxy(current_x, y + 2, str(LANG_EQUALIZER_BAND_CUTOFF));
308 screen->getstringsize(str(LANG_EQUALIZER_BAND_CUTOFF), &w, &h);
309 } else {
310 screen->putsxy(current_x, y + 2, str(LANG_EQUALIZER_BAND_Q));
311 screen->getstringsize(str(LANG_EQUALIZER_BAND_Q), &w, &h);
312 }
313
314 /* Draw horizontal slider. Reuse scrollbar for this */
315 gui_scrollbar_draw(screen, x + 3, y + h + 3, width - 6, slider_height, steps,
316 min_item, max_item, HORIZONTAL);
317
318 /* Print out cutoff part */
319 snprintf(buf, sizeof(buf), "%sGain %s%2d.%ddB",mode==GAIN?" > ":" ", gain < 0 ? "-" : " ",
320 abs_gain / EQ_USER_DIVISOR, abs_gain % EQ_USER_DIVISOR);
321 screen->getstringsize(buf, &w, &h); 290 screen->getstringsize(buf, &w, &h);
322 y = 3*h;
323 screen->putsxy(0, y, buf);
324 /* Print out cutoff part */
325 snprintf(buf, sizeof(buf), "%sCutoff %5dHz",mode==CUTOFF?" > ":" ", cutoff);
326 y += h;
327 screen->putsxy(0, y, buf);
328 snprintf(buf, sizeof(buf), "%sQ setting %d.%d Q",mode==Q?" > ":" ", q / EQ_USER_DIVISOR,
329 q % EQ_USER_DIVISOR);
330 y += h;
331 screen->putsxy(0, y, buf);
332 return y;
333 } 291 }
334#endif
335
336 /* Print out gain part of status line */
337 snprintf(buf, sizeof(buf), "%s%2d.%ddB", gain < 0 ? "-" : " ",
338 abs_gain / EQ_USER_DIVISOR, abs_gain % EQ_USER_DIVISOR);
339 292
293 screen->getstringsize("A", &w, &h);
294 x1 += 5*w; /* 4 chars for label + 1 space = 5 */
295
296 /* Print out gain part of status line (left justify after label) */
340 if (mode == GAIN && selected) 297 if (mode == GAIN && selected)
341 screen->set_drawmode(DRMODE_SOLID | DRMODE_INVERSEVID); 298 screen->set_drawmode(DRMODE_SOLID | DRMODE_INVERSEVID);
299 else
300 screen->set_drawmode(DRMODE_SOLID);
342 301
343 screen->putsxy(current_x, y + 2, buf); 302 snprintf(buf, sizeof(buf), "%s%2d.%d%s", gain < 0 ? "-" : " ",
303 abs_gain / EQ_USER_DIVISOR, abs_gain % EQ_USER_DIVISOR,
304 screen->lcdwidth >= 160 ? "dB" : "");
305 screen->putsxy(x1, y1, buf);
344 screen->getstringsize(buf, &w, &h); 306 screen->getstringsize(buf, &w, &h);
345 current_x += w; 307 x1 += w;
346
347 /* Print separator */
348 screen->set_drawmode(DRMODE_SOLID);
349 screen->putsxy(current_x, y + 2, separator);
350 current_x += separator_width;
351 308
352 /* Print out cutoff part of status line */ 309 /* Print out Q part of status line (right justify) */
353 snprintf(buf, sizeof(buf), "%5dHz", cutoff); 310 if (mode == Q && selected)
354
355 if (mode == CUTOFF && selected)
356 screen->set_drawmode(DRMODE_SOLID | DRMODE_INVERSEVID); 311 screen->set_drawmode(DRMODE_SOLID | DRMODE_INVERSEVID);
312 else
313 screen->set_drawmode(DRMODE_SOLID);
357 314
358 screen->putsxy(current_x, y + 2, buf); 315 snprintf(buf, sizeof(buf), "%d.%d%s", q / EQ_USER_DIVISOR,
316 q % EQ_USER_DIVISOR, screen->lcdwidth >= 160 ? " Q" : "");
359 screen->getstringsize(buf, &w, &h); 317 screen->getstringsize(buf, &w, &h);
360 current_x += w; 318 x2 = x + width - w - 2;
361 319 screen->putsxy(x2, y1, buf);
362 /* Print separator */
363 screen->set_drawmode(DRMODE_SOLID);
364 screen->putsxy(current_x, y + 2, separator);
365 current_x += separator_width;
366
367 /* Print out Q part of status line */
368 snprintf(buf, sizeof(buf), "%d.%d Q", q / EQ_USER_DIVISOR,
369 q % EQ_USER_DIVISOR);
370 320
371 if (mode == Q && selected) 321 /* Print out cutoff part of status line (center between gain & Q) */
322 if (mode == CUTOFF && selected)
372 screen->set_drawmode(DRMODE_SOLID | DRMODE_INVERSEVID); 323 screen->set_drawmode(DRMODE_SOLID | DRMODE_INVERSEVID);
373 324 else
374 screen->putsxy(current_x, y + 2, buf); 325 screen->set_drawmode(DRMODE_SOLID);
326
327 snprintf(buf, sizeof(buf), "%5d%s", cutoff,
328 screen->lcdwidth >= 160 ? "Hz" : "");
375 screen->getstringsize(buf, &w, &h); 329 screen->getstringsize(buf, &w, &h);
376 current_x += w; 330 x1 = x1 + (x2 - x1 - w)/2;
377 331 screen->putsxy(x1, y1, buf);
378 screen->set_drawmode(DRMODE_SOLID);
379 332
380 /* Draw selection box */ 333 /* Draw selection box */
334 total_height = 3 + h + 1 + SCROLLBAR_SIZE + 3;
335 screen->set_drawmode(DRMODE_SOLID);
381 if (selected) { 336 if (selected) {
382 screen->drawrect(x, y, width, total_height); 337 screen->drawrect(x, y, width, total_height);
383 } 338 }
384 339
385 /* Draw horizontal slider. Reuse scrollbar for this */ 340 /* Draw horizontal slider. Reuse scrollbar for this */
386 gui_scrollbar_draw(screen, x + 3, y + h + 3, width - 6, slider_height, steps, 341 gui_scrollbar_draw(screen, x + 3, y1 + h + 1, width - 6, SCROLLBAR_SIZE,
387 min_item, max_item, HORIZONTAL); 342 steps, min_item, max_item, HORIZONTAL);
388 343
389 return total_height; 344 return total_height;
390} 345}
391 346
392/* Draw's all the EQ sliders. Returns the total height of the sliders drawn */ 347/* Draw's all the EQ sliders. Returns the total height of the sliders drawn */
393static int draw_eq_sliders(int current_band, enum eq_slider_mode mode) 348static void draw_eq_sliders(struct screen * screen, int x, int y,
349 int nb_eq_sliders, int start_item,
350 int current_band, enum eq_slider_mode mode)
394{ 351{
395 int i, gain, q, cutoff; 352 int i, gain, q, cutoff;
396 int height = 2; /* Two pixel margin */ 353 int height = y;
397 int slider_width[NB_SCREENS];
398 int *setting = &global_settings.eq_band0_cutoff; 354 int *setting = &global_settings.eq_band0_cutoff;
399 enum eq_type type;
400 355
401 FOR_NB_SCREENS(i) 356 start_item = MIN(start_item, 5-nb_eq_sliders);
402 slider_width[i] = screens[i].getwidth() - 4; /* 2 pixel margin
403 each side */
404 for (i=0; i<5; i++) { 357 for (i=0; i<5; i++) {
405 cutoff = *setting++; 358 cutoff = *setting++;
406 q = *setting++; 359 q = *setting++;
407 gain = *setting++; 360 gain = *setting++;
408 361
409 if (i == 0) { 362 if (i == start_item + nb_eq_sliders)
410 type = LOW_SHELF; 363 break;
411 } else if (i == 4) { 364
412 type = HIGH_SHELF; 365 if (i >= start_item) {
413 } else { 366 height += draw_eq_slider(screen, x, height, screen->lcdwidth - x - 1,
414 type = PEAK; 367 cutoff, q, gain, i == current_band, mode,
368 i);
369 /* add a margin */
370 height++;
415 } 371 }
416 height += draw_eq_slider(&(screens[SCREEN_MAIN]), 2, height,
417 slider_width[SCREEN_MAIN], cutoff, q, gain,
418 i == current_band, mode, type);
419#if NB_SCREENS > 1
420 if (i == current_band)
421 draw_eq_slider(&(screens[SCREEN_REMOTE]), 2, 0,
422 slider_width[SCREEN_REMOTE], cutoff, q, gain,1, mode, type);
423#endif
424 /* add a margin */
425 height += 2;
426 } 372 }
427 373 if (nb_eq_sliders != 5)
428 return height; 374 gui_scrollbar_draw(screen, 0, y, SCROLLBAR_SIZE - 1,
375 screen->lcdheight - y, 5,
376 start_item, start_item + nb_eq_sliders,
377 VERTICAL);
378 return;
429} 379}
430 380
431/* Provides a graphical means of editing the EQ settings */ 381/* Provides a graphical means of editing the EQ settings */
@@ -436,16 +386,34 @@ bool eq_menu_graphical(void)
436 bool has_changed = false; 386 bool has_changed = false;
437 int button; 387 int button;
438 int *setting; 388 int *setting;
439 int current_band, y, step, fast_step, min, max, voice_unit; 389 int current_band, x, y, step, fast_step, min, max, voice_unit;
440 enum eq_slider_mode mode; 390 enum eq_slider_mode mode;
441 enum eq_type current_type; 391 enum eq_type current_type;
442 char buf[24]; 392 char buf[24];
443 int i; 393 int i, w, h, height, start_item, nb_eq_sliders[NB_SCREENS];
394
444 395
445 FOR_NB_SCREENS(i) { 396 FOR_NB_SCREENS(i) {
446 screens[i].setfont(FONT_SYSFIXED); 397 screens[i].setfont(FONT_SYSFIXED);
447 screens[i].clear_display(); 398 screens[i].clear_display();
399
400 /* Figure out how many sliders can be drawn on the screen */
401 screens[i].getstringsize("A", &w, &h);
402
403 /* Total height includes margins (1), text, slider, and line selector (1) */
404 height = 3 + h + 1 + SCROLLBAR_SIZE + 3;
405 nb_eq_sliders[i] = screens[i].lcdheight / height;
406
407 /* Make sure the "Edit Mode" text fits too */
408 height = nb_eq_sliders[i]*height + h + 2;
409 if (height > screens[i].lcdheight)
410 nb_eq_sliders[i]--;
411
412 if (nb_eq_sliders[i] > 5)
413 nb_eq_sliders[i] = 5;
448 } 414 }
415
416 y = h + 1;
449 417
450 /* Start off editing gain on the first band */ 418 /* Start off editing gain on the first band */
451 mode = GAIN; 419 mode = GAIN;
@@ -453,63 +421,77 @@ bool eq_menu_graphical(void)
453 current_band = 0; 421 current_band = 0;
454 422
455 while (!exit_request) { 423 while (!exit_request) {
456 424 FOR_NB_SCREENS(i)
457 FOR_NB_SCREENS(i) { 425 {
458 /* Clear the screen. The drawing routines expect this */ 426 screens[i].clear_display();
459 screens[i].clear_display(); 427
460 /* Draw equalizer band details */ 428 /* Set pointer to the band data currently editable */
461 y = draw_eq_sliders(current_band, mode); 429 if (mode == GAIN) {
462 } 430 /* gain */
463 431 setting = &global_settings.eq_band0_gain;
464 /* Set pointer to the band data currently editable */ 432 setting += current_band * 3;
465 if (mode == GAIN) { 433
466 /* gain */ 434 step = EQ_GAIN_STEP;
467 setting = &global_settings.eq_band0_gain; 435 fast_step = EQ_GAIN_FAST_STEP;
468 setting += current_band * 3; 436 min = EQ_GAIN_MIN;
469 437 max = EQ_GAIN_MAX;
470 step = EQ_GAIN_STEP; 438 voice_unit = UNIT_DB;
471 fast_step = EQ_GAIN_FAST_STEP;
472 min = EQ_GAIN_MIN;
473 max = EQ_GAIN_MAX;
474 voice_unit = UNIT_DB;
475
476 snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE),
477 str(LANG_SYSFONT_GAIN));
478
479 screens[SCREEN_MAIN].putsxy(2, y, buf);
480 } else if (mode == CUTOFF) {
481 /* cutoff */
482 setting = &global_settings.eq_band0_cutoff;
483 setting += current_band * 3;
484
485 step = EQ_CUTOFF_STEP;
486 fast_step = EQ_CUTOFF_FAST_STEP;
487 min = EQ_CUTOFF_MIN;
488 max = EQ_CUTOFF_MAX;
489 voice_unit = UNIT_HERTZ;
490
491 snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE),
492 str(LANG_SYSFONT_EQUALIZER_BAND_CUTOFF));
493
494 screens[SCREEN_MAIN].putsxy(2, y, buf);
495 } else {
496 /* Q */
497 setting = &global_settings.eq_band0_q;
498 setting += current_band * 3;
499
500 step = EQ_Q_STEP;
501 fast_step = EQ_Q_FAST_STEP;
502 min = EQ_Q_MIN;
503 max = EQ_Q_MAX;
504 voice_unit = UNIT_INT;
505 439
506 snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE), 440 snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE),
507 str(LANG_EQUALIZER_BAND_Q)); 441 str(LANG_SYSFONT_GAIN), "(dB)");
508 442
509 screens[SCREEN_MAIN].putsxy(2, y, buf); 443 screens[i].putsxy(0, 0, buf);
510 } 444 } else if (mode == CUTOFF) {
445 /* cutoff */
446 setting = &global_settings.eq_band0_cutoff;
447 setting += current_band * 3;
448
449 step = EQ_CUTOFF_STEP;
450 fast_step = EQ_CUTOFF_FAST_STEP;
451 min = EQ_CUTOFF_MIN;
452 max = EQ_CUTOFF_MAX;
453 voice_unit = UNIT_HERTZ;
454
455 snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE),
456 str(LANG_SYSFONT_EQUALIZER_BAND_CUTOFF), "(Hz)");
457
458 screens[i].putsxy(0, 0, buf);
459 } else {
460 /* Q */
461 setting = &global_settings.eq_band0_q;
462 setting += current_band * 3;
463
464 step = EQ_Q_STEP;
465 fast_step = EQ_Q_FAST_STEP;
466 min = EQ_Q_MIN;
467 max = EQ_Q_MAX;
468 voice_unit = UNIT_INT;
469
470 snprintf(buf, sizeof(buf), str(LANG_SYSFONT_EQUALIZER_EDIT_MODE),
471 str(LANG_EQUALIZER_BAND_Q), "");
472
473 screens[i].putsxy(0, 0, buf);
474 }
475
476 /* Draw scrollbar if needed */
477 if (nb_eq_sliders[i] != 5)
478 {
479 if (current_band == 0) {
480 start_item = 0;
481 } else if (current_band == 4) {
482 start_item = 5 - nb_eq_sliders[i];
483 } else {
484 start_item = current_band - 1;
485 }
486 x = SCROLLBAR_SIZE;
487 } else {
488 x = 1;
489 start_item = 0;
490 }
491 /* Draw equalizer band details */
492 draw_eq_sliders(&screens[i], x, y, nb_eq_sliders[i], start_item,
493 current_band, mode);
511 494
512 FOR_NB_SCREENS(i) {
513 screens[i].update(); 495 screens[i].update();
514 } 496 }
515 497