diff options
-rw-r--r-- | apps/settings.c | 257 | ||||
-rw-r--r-- | docs/CUSTOM_EQ_FORMAT | 40 | ||||
-rw-r--r-- | firmware/mpeg.c | 45 | ||||
-rw-r--r-- | firmware/mpeg.h | 1 | ||||
-rw-r--r-- | uisimulator/win32/Makefile | 5 | ||||
-rw-r--r-- | uisimulator/x11/Makefile | 5 |
6 files changed, 186 insertions, 167 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 @@ #include "status.h" #include "atoi.h" #include "screens.h" +#include "ctype.h" +#include "file.h" #ifdef HAVE_LCD_BITMAP #include "icons.h" #include "font.h" @@ -459,161 +461,120 @@ void settings_load(void) #endif } -/* - * Loads a .eq file - */ +static int read_line(int fd, char* buffer, int buffer_size) +{ + int count = 0; + + while (count < buffer_size) + { + unsigned char c; + + if (1 != read(fd, &c, 1)) + break; + + if ( c == '\n' ) + break; + + if ( c == '\r' ) + continue; + + buffer[count++] = c; + } + + if ( count < buffer_size ) + buffer[count] = 0; + + return count; +} + +/* parse a line from a configuration file. the line format is: + + setting name: setting value + + Any whitespace before setting name or value (after ':') is ignored. + A # as first non-whitespace character discards the whole line. + Function sets pointers to null-terminated setting name and value. + Returns false if no valid config entry was found. +*/ + +static bool settings_parseline(char* line, char** name, char** value) +{ + char* ptr; + + while ( isspace(*line) ) + line++; + + if ( *line == '#' ) + return false; + + ptr = strchr(line, ':'); + if ( !ptr ) + return false; + + *name = line; + *ptr = 0; + ptr++; + while (isspace(*ptr)) + ptr++; + *value = ptr; + return true; +} + +static void set_eq_sound(char* value, int type, int* setting) +{ + int num = atoi(value); + + num = mpeg_phys2val(type, num); + + if ((num > mpeg_sound_max(type)) || + (num < mpeg_sound_min(type))) + { + num = mpeg_sound_default(type); + } + + *setting = num; + mpeg_sound_set(type, num); +} + bool settings_load_eq(char* file) { - char buffer[512]; - char buf_set[16]; - char buf_disp[16]; - char buf_val[8]; - bool syntax_error = false; int fd; - int i; - int d = 0; - int vtype = 0; - int line = 0; - + char line[128]; - lcd_clear_display(); fd = open(file, O_RDONLY); - - if (-1 != fd) + if (-1 == fd) + return false; + + while (read_line(fd, line, sizeof line)) { - int numread = read(fd, buffer, sizeof(buffer) - 1); - - if (numread > 0) { - buffer[numread] = 0; - for(i=0;i<numread;i++) { - switch(buffer[i]) { - case '[': - vtype = 1; - buf_set[0] = 0; - d = 0; - break; - case ']': - vtype = 2; - buf_set[d] = 0; - buf_val[0] = 0; - d = 0; - break; - case '#': - buf_val[d] = 0; - vtype = 3; - break; - default: - switch(vtype) { - case 1: - buf_set[d++] = buffer[i]; - break; - case 2: - buf_val[d++] = buffer[i]; - break; - case 3: - snprintf(buf_disp,sizeof(buf_disp),"[%s]%s", buf_set, buf_val); - lcd_puts(0,line++ % MAX_LINES, buf_disp); - lcd_update(); - sleep(HZ/2); - if (!strcasecmp(buf_set,"volume")) { - global_settings.volume = (atoi(buf_val)/2); - if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME) || - global_settings.volume < mpeg_sound_min(SOUND_VOLUME)) { - global_settings.volume = mpeg_sound_default(SOUND_VOLUME); - syntax_error = true; - } - mpeg_sound_set(SOUND_VOLUME, global_settings.volume); - - } else - if (!strcasecmp(buf_set,"bass")) { - if (buf_val[0] == '-') - global_settings.bass = ((mpeg_sound_max(SOUND_BASS)/2)-atoi(buf_val+1)); - else - global_settings.bass = (atoi(buf_val)+(mpeg_sound_max(SOUND_BASS)/2)); - if (global_settings.bass > mpeg_sound_max(SOUND_BASS) || - global_settings.bass < mpeg_sound_min(SOUND_BASS)) { - global_settings.bass = mpeg_sound_default(SOUND_BASS); - syntax_error = true; - } - mpeg_sound_set(SOUND_BASS, global_settings.bass); - } else - if (!strcasecmp(buf_set,"treble")) { - if (buf_val[0] == '-') - global_settings.treble = ((mpeg_sound_max(SOUND_TREBLE)/2)-atoi(buf_val+1)); - else - global_settings.treble = (atoi(buf_val)+(mpeg_sound_max(SOUND_TREBLE)/2)); - if (global_settings.treble > mpeg_sound_max(SOUND_TREBLE) || - global_settings.treble < mpeg_sound_min(SOUND_TREBLE)) { - global_settings.treble = mpeg_sound_default(SOUND_TREBLE); - syntax_error = true; - } - mpeg_sound_set(SOUND_TREBLE, global_settings.treble); - } else - if (!strcasecmp(buf_set,"balance")) { - if (buf_val[0] == '-') - global_settings.balance = -(atoi(buf_val+1)/2); - else - global_settings.balance = ((atoi(buf_val)/2)); - if (global_settings.balance > mpeg_sound_max(SOUND_BALANCE) || - global_settings.balance < mpeg_sound_min(SOUND_BALANCE)) { - global_settings.balance = mpeg_sound_default(SOUND_BALANCE); - syntax_error = true; - } - mpeg_sound_set(SOUND_BALANCE, global_settings.balance); - } else - if (!strcasecmp(buf_set,"channels")) { - global_settings.channel_config = atoi(buf_val); - if (global_settings.channel_config > mpeg_sound_max(SOUND_CHANNELS) || - global_settings.channel_config < mpeg_sound_min(SOUND_CHANNELS)) { - global_settings.channel_config = mpeg_sound_default(SOUND_CHANNELS); - syntax_error = true; - } - mpeg_sound_set(SOUND_CHANNELS, global_settings.channel_config); - } else - if (!strcasecmp(buf_set,"loudness")) { - global_settings.loudness = atoi(buf_val); - if(global_settings.loudness > mpeg_sound_max(SOUND_LOUDNESS) || - global_settings.loudness < mpeg_sound_min(SOUND_LOUDNESS)) { - global_settings.loudness = mpeg_sound_default(SOUND_LOUDNESS); - syntax_error = true; - } - mpeg_sound_set(SOUND_LOUDNESS, global_settings.loudness); - } else - if (!strcasecmp(buf_set,"bass boost")) { - global_settings.bass_boost = (atoi(buf_val)/10); - if(global_settings.bass_boost > mpeg_sound_max(SOUND_SUPERBASS) || - global_settings.bass_boost < mpeg_sound_min(SOUND_SUPERBASS)) { - global_settings.bass_boost = mpeg_sound_default(SOUND_SUPERBASS); - syntax_error = true; - } - mpeg_sound_set(SOUND_SUPERBASS, global_settings.bass_boost); - } else if (!strcasecmp(buf_set,"auto volume")) { - global_settings.avc = atoi(buf_val); - if (global_settings.avc > mpeg_sound_max(SOUND_AVC) || - global_settings.avc < mpeg_sound_min(SOUND_AVC)) { - global_settings.avc = mpeg_sound_default(SOUND_AVC); - syntax_error = true; - } - mpeg_sound_set(SOUND_AVC, global_settings.avc); - } - if (syntax_error) { - lcd_clear_display(); - lcd_puts(0,1,"SyntaxError"); - lcd_puts(0,2,buf_set); - lcd_update(); - sleep(HZ); - syntax_error = false; - } - vtype = 0; - break; - } - break; - } - } - } - close(fd); + char* name; + char* value; + + if (!settings_parseline(line, &name, &value)) + continue; + + if (!strcasecmp(name, "volume")) + set_eq_sound(value, SOUND_VOLUME, &global_settings.volume); + else if (!strcasecmp(name, "bass")) + set_eq_sound(value, SOUND_BASS, &global_settings.bass); + else if (!strcasecmp(name, "treble")) + set_eq_sound(value, SOUND_TREBLE, &global_settings.treble); + else if (!strcasecmp(name, "balance")) + set_eq_sound(value, SOUND_BALANCE, &global_settings.balance); + else if (!strcasecmp(name, "channels")) + set_eq_sound(value, SOUND_CHANNELS, &global_settings.bass); +#ifdef HAVE_MAS3587F + else if (!strcasecmp(name, "loudness")) + set_eq_sound(value, SOUND_LOUDNESS, &global_settings.loudness); + else if (!strcasecmp(name, "bass boost")) + set_eq_sound(value, SOUND_SUPERBASS, &global_settings.bass_boost); + else if (!strcasecmp(name, "auto volume")) + set_eq_sound(value, SOUND_AVC, &global_settings.avc); +#endif } - return(false); + + close(fd); + return true; } /* diff --git a/docs/CUSTOM_EQ_FORMAT b/docs/CUSTOM_EQ_FORMAT index e1ba622a0e..e1b0810bca 100644 --- a/docs/CUSTOM_EQ_FORMAT +++ b/docs/CUSTOM_EQ_FORMAT @@ -5,7 +5,6 @@ Description / General Info -------------------------- * The Custom EQ is used on both the Rockbox Player and Recorder, in order to load, well, custom eq settings. -* After editing the .eq file, you may need to reboot your Rockbox. File Location ------------- @@ -14,24 +13,31 @@ the filename must end in .eq Format Rules ------------ -* Each setting must have it's own line -* The setting you wish to change must be in brackets. -* The value must be immediately after the end bracket, with no spaces. -* There must be a # immediately after the value, with no spaces -* Any text after the # will be ignored +* Each setting must have it's own line. +* Lines starting with # are ignored. * If a value is out of the acceptable range for the device, which can vary - depending on the model, a Syntax Error will be displayed and the value - will be set to the default value. + depending on the model, the value will be set to its default value. Example File ------------ -[volume]70# 0 to 100 -[bass]11# player: -15 to 15, recorder: -12 to 12 -[treble]12# player: -15 to 15, recorder: -12 to 12 -[balance]0# -100 to 100 -[channels]0# 0=Stereo, 1=Mono, 2=Mono Left, 3=Mono Right -[loudness]5# 0 to 17, recorder only! -[bass boost]30# 0 to 100, recorder only! -[auto volume]0# 0=off, 1=2s, 2=4s, 3=8s, recorder only! +volume: 70 +bass: 11 +treble: 12 +balance: 0 +channels: 0 +loudness: 5 +bass boost: 30 +auto volume: 0 -This sets each line to the respective values after it. Notice that you can put comments after the #
\ No newline at end of file +This sets each line to the respective values after it. + +Value ranges +------------ +volume: 0 to 100 +bass: player: -15 to 15, recorder: -12 to 12 +treble: player: -15 to 15, recorder: -12 to 12 +balance: -100 to 100 +channels: 0=Stereo, 1=Mono, 2=Mono Left, 3=Mono Right +loudness: 0 to 17 (recorder only) +bass boost: 0 to 100 (recorder only) +auto volume: 0=off, 1=2s, 2=4s, 3=8s (recorder only) diff --git a/firmware/mpeg.c b/firmware/mpeg.c index c6e95dd588..6e2cabe172 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c @@ -1757,6 +1757,51 @@ int mpeg_val2phys(int setting, int value) return result; } +int mpeg_phys2val(int setting, int value) +{ + int result = 0; + + switch(setting) + { + case SOUND_VOLUME: + result = value / 2; + break; + + case SOUND_BALANCE: + result = value / 2; + break; + + case SOUND_BASS: +#ifdef HAVE_MAS3587F + result = value + 12; +#else + result = value + 15; +#endif + break; + + case SOUND_TREBLE: +#ifdef HAVE_MAS3587F + result = value + 12; +#else + result = value + 15; +#endif + break; + +#ifdef HAVE_MAS3587F + case SOUND_LOUDNESS: + result = value; + break; + + case SOUND_SUPERBASS: + result = value / 10; + break; +#endif + } + + return result; +} + + void mpeg_sound_channel_config(int configuration) { #ifdef SIMULATOR diff --git a/firmware/mpeg.h b/firmware/mpeg.h index a67ca922c4..4a92a2fbe9 100644 --- a/firmware/mpeg.h +++ b/firmware/mpeg.h @@ -37,6 +37,7 @@ int mpeg_sound_max(int setting); int mpeg_sound_default(int setting); void mpeg_sound_channel_config(int configuration); int mpeg_val2phys(int setting, int value); +int mpeg_phys2val(int setting, int value); char *mpeg_sound_unit(int setting); int mpeg_sound_numdecimals(int setting); struct mp3entry* mpeg_current_track(void); diff --git a/uisimulator/win32/Makefile b/uisimulator/win32/Makefile index ad0eb2df17..68e50223d0 100644 --- a/uisimulator/win32/Makefile +++ b/uisimulator/win32/Makefile @@ -63,7 +63,7 @@ CFLAGS = $(DEBUG) $(DEFINES) $(INCLUDES) -W -Wall -mwindows APPCFLAGS = $(DEBUG) $(DEFINES) $(APPINCLUDES) -W -Wall -mwindows FIRMSRCS = lcd-recorder.c power.c sprintf.c id3.c usb.c \ - mpeg.c powermgmt.c font.c sysfont.c + mpeg.c powermgmt.c font.c sysfont.c ctype.c APPS = main.c tree.c menu.c credits.c main_menu.c icons.c language.c \ playlist.c showtext.c wps.c wps-display.c settings.c status.c \ @@ -221,6 +221,9 @@ $(OBJDIR)/mpeg.o: $(FIRMWAREDIR)/mpeg.c $(OBJDIR)/sprintf.o: $(COMMON)/sprintf.c $(CC) $(CFLAGS) -c $< -o $@ +$(OBJDIR)/ctype.o: $(COMMON)/ctype.c + $(CC) $(CFLAGS) $(APPINCLUDES) -c $< -o $@ + $(OBJDIR)/strtok.o: $(COMMON)/strtok.c $(CC) $(CFLAGS) -c $< -o $@ diff --git a/uisimulator/x11/Makefile b/uisimulator/x11/Makefile index 81ddaf58a7..930de50d7b 100644 --- a/uisimulator/x11/Makefile +++ b/uisimulator/x11/Makefile @@ -78,7 +78,7 @@ CFLAGS = $(DEBUG) $(DEFINES) $(INCLUDES) -W -Wall APPCFLAGS = $(DEBUG) $(DEFINES) -DAPPSVERSION=\"$(VERSION)\" $(APPINCLUDES) -W -Wall FIRMSRCS = lcd-recorder.c sprintf.c id3.c debug.c usb.c mpeg.c power.c\ - powermgmt.c font.c panic.c sysfont.c + powermgmt.c font.c panic.c sysfont.c ctype.c APPS = main.c tree.c menu.c credits.c main_menu.c language.c\ playlist.c showtext.c wps.c wps-display.c settings.c status.c icons.c\ @@ -263,6 +263,9 @@ $(OBJDIR)/mpeg.o: $(FIRMWAREDIR)/mpeg.c $(OBJDIR)/sprintf.o: $(COMMON)/sprintf.c $(CC) $(CFLAGS) -c $< -o $@ +$(OBJDIR)/ctype.o: $(COMMON)/ctype.c + $(CC) $(CFLAGS) $(APPINCLUDES) -c $< -o $@ + $(OBJDIR)/stubs.o: ../common/stubs.c $(CC) $(CFLAGS) -c $< -o $@ |