Expanded .cfg loader to include most settings. Based on Christian Determann's patch.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3260 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Björn Stenberg 2003-02-14 14:14:55 +00:00
parent c4d8d970f6
commit 9c16e12390
5 changed files with 287 additions and 47 deletions

View file

@ -1381,3 +1381,13 @@ id: LANG_CPU_SLEEP
desc: in system_settings_menu()
eng: "Power Saving"
new:
id: LANG_SETTINGS_LOADED1
desc: Feedback shown when a .cfg file is loaded
eng: "Settings"
new:
id: LANG_SETTINGS_LOADED2
desc: Feedback shown when a .cfg file is loaded
eng: "loaded"
new:

View file

@ -519,6 +519,8 @@ void settings_apply(void)
cpu_sleep(global_settings.cpu_sleep);
}
static void set_cfg_bool(bool* variable, char* value);
/*
* load settings from disk or RTC RAM
*/
@ -527,6 +529,8 @@ void settings_load(void)
DEBUGF( "reload_all_settings()\n" );
// set_cfg_bool(&global_settings.playlist_shuffle, "off");
/* populate settings with default values */
settings_reset();
@ -776,6 +780,39 @@ static void set_sound(char* value, int type, int* setting)
#endif
}
static void set_cfg_bool(bool* variable, char* value)
{
/* look for the 'n' in 'on' */
if ((value[1] & 0xdf) == 'N')
*variable = true;
else
*variable = false;
}
static void set_cfg_int(int* variable, char* value, int min, int max )
{
*variable = atoi(value);
if (*variable < min)
*variable = min;
else
if (*variable > max)
*variable = max;
}
static void set_cfg_option(int* variable, char* value,
char* options[], int numoptions )
{
int i;
for (i=0; i<numoptions; i++) {
if (!strcasecmp(options[i], value)) {
*variable = i;
break;
}
}
}
bool settings_load_config(char* file)
{
int fd;
@ -803,6 +840,111 @@ bool settings_load_config(char* file)
set_sound(value, SOUND_BALANCE, &global_settings.balance);
else if (!strcasecmp(name, "channels"))
set_sound(value, SOUND_CHANNELS, &global_settings.channel_config);
else if (!strcasecmp(name, "wps"))
strncpy(global_settings.wps_file, value, MAX_FILENAME);
else if (!strcasecmp(name, "lang"))
strncpy(global_settings.lang_file, value, MAX_FILENAME);
#ifdef HAVE_LCD_BITMAP
else if (!strcasecmp(name, "font"))
strncpy(global_settings.font_file, value, MAX_FILENAME);
else if (!strcasecmp(name, "scroll step"))
set_cfg_int(&global_settings.scroll_step, value, 1, LCD_WIDTH);
else if (!strcasecmp(name, "bidir limit"))
set_cfg_int(&global_settings.bidir_limit, value, 0, 200);
else if (!strcasecmp(name, "statusbar"))
set_cfg_bool(&global_settings.statusbar, value);
else if (!strcasecmp(name, "peak meter release"))
set_cfg_int(&global_settings.peak_meter_release, value, 1, 0x7e);
else if (!strcasecmp(name, "peak meter hold")) {
static char* options[] = {
"off","200ms","300ms","500ms",
"1","2","3","4","5","6","7","8","9","10",
"15","20","25","30","45","60","90",
"2min","3min","5min","10min","20min","45min","90min"};
set_cfg_option(&global_settings.peak_meter_hold, value,
options, 28);
}
else if (!strcasecmp(name, "peak meter clip hold")) {
static char* options[] = {
"on","1","2","3","4","5","6","7","8","9","10",
"15","20","25","30","45","60","90",
"2min","3min","5min","10min","20min","45min","90min"};
set_cfg_option(&global_settings.peak_meter_clip_hold, value,
options, 25);
}
else if (!strcasecmp(name, "peak meter dbfs"))
set_cfg_bool(&global_settings.peak_meter_dbfs, value);
else if (!strcasecmp(name, "peak meter min"))
set_cfg_int(&global_settings.peak_meter_min, value, 0, 100);
else if (!strcasecmp(name, "peak meter max"))
set_cfg_int(&global_settings.peak_meter_max, value, 0, 100);
else if (!strcasecmp(name, "peak meter busy"))
set_cfg_bool(&global_settings.peak_meter_performance, value);
#endif
else if (!strcasecmp(name, "shuffle"))
set_cfg_bool(&global_settings.playlist_shuffle, value);
else if (!strcasecmp(name, "repeat")) {
static char* options[] = {"off", "all", "one"};
set_cfg_option(&global_settings.repeat_mode, value, options, 3);
}
else if (!strcasecmp(name, "resume"))
set_cfg_int(&global_settings.resume, value, 0, 3);
else if (!strcasecmp(name, "sort case"))
set_cfg_bool(&global_settings.sort_case, value);
else if (!strcasecmp(name, "show files")) {
static char* options[] = {"all", "supported","music"};
set_cfg_option(&global_settings.dirfilter, value, options, 3);
}
else if (!strcasecmp(name, "follow playlist"))
set_cfg_bool(&global_settings.browse_current, value);
else if (!strcasecmp(name, "play selected"))
set_cfg_bool(&global_settings.play_selected, value);
else if (!strcasecmp(name, "volume display")) {
static char* options[] = {"numeric", "graphic"};
set_cfg_option(&global_settings.volume_type, value, options, 2);
}
else if (!strcasecmp(name, "battery display")) {
static char* options[] = {"numeric", "graphic"};
set_cfg_option(&global_settings.battery_type, value, options, 2);
}
else if (!strcasecmp(name, "time format")) {
static char* options[] = {"24hour", "12hour"};
set_cfg_option(&global_settings.timeformat, value, options, 2);
}
else if (!strcasecmp(name, "contrast"))
set_cfg_int(&global_settings.contrast, value,
0, MAX_CONTRAST_SETTING);
else if (!strcasecmp(name, "scrollbar"))
set_cfg_bool(&global_settings.scrollbar, value);
else if (!strcasecmp(name, "scroll speed"))
set_cfg_int(&global_settings.scroll_speed, value, 1, 10);
else if (!strcasecmp(name, "scan min step")) {
static char* options[] =
{"1","2","3","4","5","6","8","10","15","20","25"};
set_cfg_option(&global_settings.ff_rewind_min_step, value,
options, 11);
}
else if (!strcasecmp(name, "scan accel"))
set_cfg_int(&global_settings.ff_rewind_min_step, value, 0, 15);
else if (!strcasecmp(name, "scroll delay"))
set_cfg_int(&global_settings.scroll_delay, value, 0, 250);
else if (!strcasecmp(name, "backlight timeout")) {
static char* options[] = {
"off","on","1","2","3","4","5","6","7","8","9",
"10","15","20","30","45","60","90"};
set_cfg_option(&global_settings.backlight_timeout, value,
options, 18);
}
else if (!strcasecmp(name, "backlight when plugged"))
set_cfg_bool(&global_settings.backlight_on_when_charging, value);
else if (!strcasecmp(name, "antiskip"))
set_cfg_int(&global_settings.buffer_margin, value, 0, 7);
else if (!strcasecmp(name, "disk spindown"))
set_cfg_int(&global_settings.disk_spindown, value, 3, 254);
#ifdef HAVE_ATA_POWER_OFF
else if (!strcasecmp(name, "disk poweroff"))
set_cfg_bool(&global_settings.disk_poweroff, value);
#endif
#ifdef HAVE_MAS3587F
else if (!strcasecmp(name, "loudness"))
set_sound(value, SOUND_LOUDNESS, &global_settings.loudness);
@ -810,10 +952,42 @@ bool settings_load_config(char* file)
set_sound(value, SOUND_SUPERBASS, &global_settings.bass_boost);
else if (!strcasecmp(name, "auto volume"))
set_sound(value, SOUND_AVC, &global_settings.avc);
else if (!strcasecmp(name, "rec mic gain"))
set_sound(value, SOUND_MIC_GAIN, &global_settings.rec_mic_gain);
else if (!strcasecmp(name, "rec left gain"))
set_sound(value, SOUND_LEFT_GAIN, &global_settings.rec_left_gain);
else if (!strcasecmp(name, "rec right gain"))
set_sound(value, SOUND_RIGHT_GAIN, &global_settings.rec_right_gain);
else if (!strcasecmp(name, "rec quality"))
set_cfg_int(&global_settings.rec_quality, value, 0, 7);
else if (!strcasecmp(name, "rec source")) {
static char* options[] = {"mic", "line", "spdif"};
set_cfg_option(&global_settings.rec_source, value, options, 3);
}
else if (!strcasecmp(name, "rec frequency")) {
static char* options[] = {"44", "48", "32", "22", "24", "16"};
set_cfg_option(&global_settings.rec_frequency, value, options, 6);
}
else if (!strcasecmp(name, "rec channels")) {
static char* options[] = {"stereo", "mono"};
set_cfg_option(&global_settings.rec_channels, value, options, 2);
}
#endif
else if (!strcasecmp(name, "poweroff"))
set_cfg_int(&global_settings.poweroff, value, 0, 15);
else if (!strcasecmp(name, "battery capacity"))
set_cfg_int(&global_settings.battery_capacity, value,
1500, BATTERY_CAPACITY_MAX);
#ifdef HAVE_CHARGE_CTRL
else if (!strcasecmp(name, "deep discharge"))
set_cfg_bool(&global_settings.discharge, value);
else if (!strcasecmp(name, "trickle charge"))
set_cfg_bool(&global_settings.trickle_charge, value);
#endif
}
close(fd);
settings_apply();
settings_save();
return true;
}

View file

@ -128,8 +128,8 @@ struct user_settings
int peak_meter_clip_hold; /* hold time for clips */
bool peak_meter_dbfs; /* show linear or dbfs values */
bool peak_meter_performance; /* true: high performance, else save energy*/
unsigned char peak_meter_min; /* range minimum */
unsigned char peak_meter_max; /* range maximum */
int peak_meter_min; /* range minimum */
int peak_meter_max; /* range maximum */
/* show status bar */
bool statusbar; /* 0=hide, 1=show */

View file

@ -1114,8 +1114,6 @@ bool dirbrowse(char *root)
/* wps config file */
case TREE_ATTR_WPS:
snprintf(buf, sizeof buf, "%s/%s",
currdir, file->name);
wps_load(buf,true);
storefile(file->name, global_settings.wps_file,
MAX_FILENAME);
@ -1123,22 +1121,34 @@ bool dirbrowse(char *root)
break;
case TREE_ATTR_CFG:
snprintf(buf, sizeof buf, "%s/%s",
currdir, file->name);
settings_load_config(buf);
if (!settings_load_config(buf))
break;
lcd_clear_display();
lcd_puts(0,0,str(LANG_SETTINGS_LOADED1));
lcd_puts(0,1,str(LANG_SETTINGS_LOADED2));
#ifdef HAVE_LCD_BITMAP
lcd_update();
/* maybe we have a new font */
lcd_getstringsize("A", &fw, &fh);
tree_max_on_screen = (LCD_HEIGHT - MARGIN_Y) / fh;
/* make sure cursor is on screen */
while ( dircursor > tree_max_on_screen )
{
dircursor--;
dirstart++;
}
#endif
sleep(HZ/2);
restore = true;
break;
case TREE_ATTR_TXT:
snprintf(buf, sizeof buf, "%s/%s",
currdir, file->name);
viewer_run(buf);
restore = true;
break;
case TREE_ATTR_LNG:
snprintf(buf, sizeof buf, "%s/%s",
currdir, file->name);
if(!lang_load(buf)) {
storefile(file->name,
global_settings.lang_file,
@ -1166,8 +1176,6 @@ bool dirbrowse(char *root)
#ifdef HAVE_LCD_BITMAP
case TREE_ATTR_FONT:
snprintf(buf, sizeof buf, "%s/%s",
currdir, file->name);
font_load(buf);
storefile(file->name, global_settings.font_file,
MAX_FILENAME);
@ -1186,8 +1194,6 @@ bool dirbrowse(char *root)
#ifndef SIMULATOR
/* firmware file */
case TREE_ATTR_MOD:
snprintf(buf, sizeof buf, "%s/%s",
currdir, file->name);
rolo_load(buf);
break;
#endif

View file

@ -1,24 +1,85 @@
Custom CFG
File Format Specifications
Custom CFG File Format Specification
Description / General Info
--------------------------
* The .cfg file is used on both the Rockbox Player and Recorder, in order to
load custom settings.
* Currently, only sound settings are supported but this will change in the
future.
File Location
-------------
The files may reside anywhere on the hard disk. The only restriction is that
the filename must end in .cfg
General Info
------------
The .cfg file is used to load settings from a plain text file. A .cfg file may
reside anywhere on the hard disk. The only restriction is that the filename
must end in .cfg
Format Rules
------------
* Each setting must have it's own line.
* Format: setting: value
* Each setting must be on a separate 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, the value will be set to its default value.
Settings (allowed values) [unit]
--------------------------------
volume (0 - 100)
bass (-15 - 15)
treble (-15 - 15)
balance (-100 - 100)
shuffle (on, off)
repeat (off, all, one)
play selected (on, off)
resume (off, ask, on)
scan min step (1, 2, 3, 4, 5, 6, 8, 10, 15, 20, 25) [seconds]
scan accel (0 - 15) [double scan speed every X seconds]
antiskip (0 - 7) [seconds]
sort case (on, off)
show files (all, supported, music)
follow playlist (on, off)
scroll speed (1 - 10) [Hz]
start delay (0 - 250) [1/10s]
scroll step (1 - 112) [pixel]
bidir limit (0 - 200) [% of screen width]
contrast (0 - 63)
backlight timeout (off, on, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
15, 20, 30, 45, 60, 90) [seconds]
backlight when plugged (on, off)
disk spindown (3 - 254) [seconds]
disk poweroff (on, off)
battery capacity (1500 - 2400) [mAh]
idle poweroff (off, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 15, 30, 45, 60) [minutes]
Recorder-specific settings (allowed values) [unit]
---------------------------------------------------
loudness (0 - 17)
bass boost (0 - 100)
auto volume (0=off, 1=2s, 2=4s, 3=8s)
peak meter release (1 - 126)
peak meter hold (off, 200ms, 300ms, 500ms,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
15, 20, 25, 30, 45, 90,
2min, 3min, 5min, 10min, 20min, 45min, 90min)
peak meter clip hold (on, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
15, 20, 25, 30, 45, 60, 90,
2min, 3min, 5min, 10min, 20min, 45min, 90min)
peak meter busy (on, off)
peak meter dbfs (on, off) (on = dbfs, off = linear)
peak meter min (0 - 89) [dB] or (0 - 100) [%]
peak meter max (0 - 89) [dB] or (0 - 100) [%]
volume display (graphic, numeric)
battery display (graphic, numeric)
time format (12hour, 24hour)
deep discharge (on, off)
trickle charge (on, off)
rec quality (0 - 7) (0=smallest size, 7=highest quality)
rec frequency (48, 44, 32, 24, 22, 16) [kHz]
rec source (mic, line, spdif)
rec channels (mono, stereo)
rec mic gain (0 to 15)
rec left gain (0 to 15)
rec right gain (0 to 15)
Example File
------------
@ -26,20 +87,9 @@ volume: 70
bass: 11
treble: 12
balance: 0
channels: 0
loudness: 5
bass boost: 30
auto volume: 0
time format: 12hour
volume display: numeric
show files: supported
wps: car
lang: afrikaans
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)