summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/settings.c257
1 files changed, 109 insertions, 148 deletions
diff --git a/apps/settings.c b/apps/settings.c
index 450a85b2da..98258f5d8d 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -39,6 +39,8 @@
39#include "status.h" 39#include "status.h"
40#include "atoi.h" 40#include "atoi.h"
41#include "screens.h" 41#include "screens.h"
42#include "ctype.h"
43#include "file.h"
42#ifdef HAVE_LCD_BITMAP 44#ifdef HAVE_LCD_BITMAP
43#include "icons.h" 45#include "icons.h"
44#include "font.h" 46#include "font.h"
@@ -459,161 +461,120 @@ void settings_load(void)
459#endif 461#endif
460} 462}
461 463
462/* 464static int read_line(int fd, char* buffer, int buffer_size)
463 * Loads a .eq file 465{
464 */ 466 int count = 0;
467
468 while (count < buffer_size)
469 {
470 unsigned char c;
471
472 if (1 != read(fd, &c, 1))
473 break;
474
475 if ( c == '\n' )
476 break;
477
478 if ( c == '\r' )
479 continue;
480
481 buffer[count++] = c;
482 }
483
484 if ( count < buffer_size )
485 buffer[count] = 0;
486
487 return count;
488}
489
490/* parse a line from a configuration file. the line format is:
491
492 setting name: setting value
493
494 Any whitespace before setting name or value (after ':') is ignored.
495 A # as first non-whitespace character discards the whole line.
496 Function sets pointers to null-terminated setting name and value.
497 Returns false if no valid config entry was found.
498*/
499
500static bool settings_parseline(char* line, char** name, char** value)
501{
502 char* ptr;
503
504 while ( isspace(*line) )
505 line++;
506
507 if ( *line == '#' )
508 return false;
509
510 ptr = strchr(line, ':');
511 if ( !ptr )
512 return false;
513
514 *name = line;
515 *ptr = 0;
516 ptr++;
517 while (isspace(*ptr))
518 ptr++;
519 *value = ptr;
520 return true;
521}
522
523static void set_eq_sound(char* value, int type, int* setting)
524{
525 int num = atoi(value);
526
527 num = mpeg_phys2val(type, num);
528
529 if ((num > mpeg_sound_max(type)) ||
530 (num < mpeg_sound_min(type)))
531 {
532 num = mpeg_sound_default(type);
533 }
534
535 *setting = num;
536 mpeg_sound_set(type, num);
537}
538
465bool settings_load_eq(char* file) 539bool settings_load_eq(char* file)
466{ 540{
467 char buffer[512];
468 char buf_set[16];
469 char buf_disp[16];
470 char buf_val[8];
471 bool syntax_error = false;
472 int fd; 541 int fd;
473 int i; 542 char line[128];
474 int d = 0;
475 int vtype = 0;
476 int line = 0;
477
478 543
479 lcd_clear_display();
480 fd = open(file, O_RDONLY); 544 fd = open(file, O_RDONLY);
481 545 if (-1 == fd)
482 if (-1 != fd) 546 return false;
547
548 while (read_line(fd, line, sizeof line))
483 { 549 {
484 int numread = read(fd, buffer, sizeof(buffer) - 1); 550 char* name;
485 551 char* value;
486 if (numread > 0) { 552
487 buffer[numread] = 0; 553 if (!settings_parseline(line, &name, &value))
488 for(i=0;i<numread;i++) { 554 continue;
489 switch(buffer[i]) { 555
490 case '[': 556 if (!strcasecmp(name, "volume"))
491 vtype = 1; 557 set_eq_sound(value, SOUND_VOLUME, &global_settings.volume);
492 buf_set[0] = 0; 558 else if (!strcasecmp(name, "bass"))
493 d = 0; 559 set_eq_sound(value, SOUND_BASS, &global_settings.bass);
494 break; 560 else if (!strcasecmp(name, "treble"))
495 case ']': 561 set_eq_sound(value, SOUND_TREBLE, &global_settings.treble);
496 vtype = 2; 562 else if (!strcasecmp(name, "balance"))
497 buf_set[d] = 0; 563 set_eq_sound(value, SOUND_BALANCE, &global_settings.balance);
498 buf_val[0] = 0; 564 else if (!strcasecmp(name, "channels"))
499 d = 0; 565 set_eq_sound(value, SOUND_CHANNELS, &global_settings.bass);
500 break; 566#ifdef HAVE_MAS3587F
501 case '#': 567 else if (!strcasecmp(name, "loudness"))
502 buf_val[d] = 0; 568 set_eq_sound(value, SOUND_LOUDNESS, &global_settings.loudness);
503 vtype = 3; 569 else if (!strcasecmp(name, "bass boost"))
504 break; 570 set_eq_sound(value, SOUND_SUPERBASS, &global_settings.bass_boost);
505 default: 571 else if (!strcasecmp(name, "auto volume"))
506 switch(vtype) { 572 set_eq_sound(value, SOUND_AVC, &global_settings.avc);
507 case 1: 573#endif
508 buf_set[d++] = buffer[i];
509 break;
510 case 2:
511 buf_val[d++] = buffer[i];
512 break;
513 case 3:
514 snprintf(buf_disp,sizeof(buf_disp),"[%s]%s", buf_set, buf_val);
515 lcd_puts(0,line++ % MAX_LINES, buf_disp);
516 lcd_update();
517 sleep(HZ/2);
518 if (!strcasecmp(buf_set,"volume")) {
519 global_settings.volume = (atoi(buf_val)/2);
520 if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME) ||
521 global_settings.volume < mpeg_sound_min(SOUND_VOLUME)) {
522 global_settings.volume = mpeg_sound_default(SOUND_VOLUME);
523 syntax_error = true;
524 }
525 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
526
527 } else
528 if (!strcasecmp(buf_set,"bass")) {
529 if (buf_val[0] == '-')
530 global_settings.bass = ((mpeg_sound_max(SOUND_BASS)/2)-atoi(buf_val+1));
531 else
532 global_settings.bass = (atoi(buf_val)+(mpeg_sound_max(SOUND_BASS)/2));
533 if (global_settings.bass > mpeg_sound_max(SOUND_BASS) ||
534 global_settings.bass < mpeg_sound_min(SOUND_BASS)) {
535 global_settings.bass = mpeg_sound_default(SOUND_BASS);
536 syntax_error = true;
537 }
538 mpeg_sound_set(SOUND_BASS, global_settings.bass);
539 } else
540 if (!strcasecmp(buf_set,"treble")) {
541 if (buf_val[0] == '-')
542 global_settings.treble = ((mpeg_sound_max(SOUND_TREBLE)/2)-atoi(buf_val+1));
543 else
544 global_settings.treble = (atoi(buf_val)+(mpeg_sound_max(SOUND_TREBLE)/2));
545 if (global_settings.treble > mpeg_sound_max(SOUND_TREBLE) ||
546 global_settings.treble < mpeg_sound_min(SOUND_TREBLE)) {
547 global_settings.treble = mpeg_sound_default(SOUND_TREBLE);
548 syntax_error = true;
549 }
550 mpeg_sound_set(SOUND_TREBLE, global_settings.treble);
551 } else
552 if (!strcasecmp(buf_set,"balance")) {
553 if (buf_val[0] == '-')
554 global_settings.balance = -(atoi(buf_val+1)/2);
555 else
556 global_settings.balance = ((atoi(buf_val)/2));
557 if (global_settings.balance > mpeg_sound_max(SOUND_BALANCE) ||
558 global_settings.balance < mpeg_sound_min(SOUND_BALANCE)) {
559 global_settings.balance = mpeg_sound_default(SOUND_BALANCE);
560 syntax_error = true;
561 }
562 mpeg_sound_set(SOUND_BALANCE, global_settings.balance);
563 } else
564 if (!strcasecmp(buf_set,"channels")) {
565 global_settings.channel_config = atoi(buf_val);
566 if (global_settings.channel_config > mpeg_sound_max(SOUND_CHANNELS) ||
567 global_settings.channel_config < mpeg_sound_min(SOUND_CHANNELS)) {
568 global_settings.channel_config = mpeg_sound_default(SOUND_CHANNELS);
569 syntax_error = true;
570 }
571 mpeg_sound_set(SOUND_CHANNELS, global_settings.channel_config);
572 } else
573 if (!strcasecmp(buf_set,"loudness")) {
574 global_settings.loudness = atoi(buf_val);
575 if(global_settings.loudness > mpeg_sound_max(SOUND_LOUDNESS) ||
576 global_settings.loudness < mpeg_sound_min(SOUND_LOUDNESS)) {
577 global_settings.loudness = mpeg_sound_default(SOUND_LOUDNESS);
578 syntax_error = true;
579 }
580 mpeg_sound_set(SOUND_LOUDNESS, global_settings.loudness);
581 } else
582 if (!strcasecmp(buf_set,"bass boost")) {
583 global_settings.bass_boost = (atoi(buf_val)/10);
584 if(global_settings.bass_boost > mpeg_sound_max(SOUND_SUPERBASS) ||
585 global_settings.bass_boost < mpeg_sound_min(SOUND_SUPERBASS)) {
586 global_settings.bass_boost = mpeg_sound_default(SOUND_SUPERBASS);
587 syntax_error = true;
588 }
589 mpeg_sound_set(SOUND_SUPERBASS, global_settings.bass_boost);
590 } else if (!strcasecmp(buf_set,"auto volume")) {
591 global_settings.avc = atoi(buf_val);
592 if (global_settings.avc > mpeg_sound_max(SOUND_AVC) ||
593 global_settings.avc < mpeg_sound_min(SOUND_AVC)) {
594 global_settings.avc = mpeg_sound_default(SOUND_AVC);
595 syntax_error = true;
596 }
597 mpeg_sound_set(SOUND_AVC, global_settings.avc);
598 }
599 if (syntax_error) {
600 lcd_clear_display();
601 lcd_puts(0,1,"SyntaxError");
602 lcd_puts(0,2,buf_set);
603 lcd_update();
604 sleep(HZ);
605 syntax_error = false;
606 }
607 vtype = 0;
608 break;
609 }
610 break;
611 }
612 }
613 }
614 close(fd);
615 } 574 }
616 return(false); 575
576 close(fd);
577 return true;
617} 578}
618 579
619/* 580/*