Get rid of some of the code duplication from checkwps, it still duplicates a lot...
[kugel-rb.git] / apps / settings_list.c
blob5da15a11a933b27643ab5cef9e5ed15506bfdd9c
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2007 Jonathan Gordon
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include "config.h"
23 #include <stdbool.h>
24 #include <string.h>
25 #include "system.h"
26 #include "storage.h"
27 #include "lang.h"
28 #include "talk.h"
29 #include "lcd.h"
30 #include "button.h"
31 #include "backlight.h"
32 #include "settings.h"
33 #include "settings_list.h"
34 #include "sound.h"
35 #include "dsp.h"
36 #include "mpeg.h"
37 #include "audio.h"
38 #include "power.h"
39 #include "powermgmt.h"
40 #include "kernel.h"
41 #include "lcd-remote.h"
42 #include "list.h"
43 #include "rbunicode.h"
44 #ifdef HAVE_LCD_BITMAP
45 #include "peakmeter.h"
46 #endif
47 #include "menus/eq_menu.h"
48 #if CONFIG_TUNER
49 #include "radio.h"
50 #endif
51 #ifdef IPOD_ACCESSORY_PROTOCOL
52 #include "iap.h"
53 #endif
54 #include "statusbar.h"
55 #ifdef HAVE_TOUCHSCREEN
56 #include "touchscreen.h"
57 #include "ctype.h" /* For isspace() */
58 #endif
60 #define NVRAM(bytes) (bytes<<F_NVRAM_MASK_SHIFT)
61 /** NOTE: NVRAM_CONFIG_VERSION is in settings_list.h
62 and you may need to update it if you edit this file */
64 #define UNUSED {.RESERVED=NULL}
65 #define INT(a) {.int_ = a}
66 #define UINT(a) {.uint_ = a}
67 #define BOOL(a) {.bool_ = a}
68 #define CHARPTR(a) {.charptr = a}
69 #define UCHARPTR(a) {.ucharptr = a}
70 #define FUNCTYPE(a) {.func = a}
71 #define NODEFAULT INT(0)
73 /* in all the following macros the args are:
74 - flags: bitwise | or the F_ bits in settings_list.h
75 - var: pointer to the variable being changed (usually in global_settings)
76 - lang_id: LANG_* id to display in menus and setting screens for the setting
77 - default: the default value for the variable, set if settings are reset
78 - name: the name of the setting in config files
79 - cfg_vals: comma separated list of legal values to write to cfg files.
80 The values correspond to the values 0,1,2,etc. of the setting.
81 NULL if just the number itself should be written to the file.
82 No spaces between the values and the commas!
83 - cb: the callback used by the setting screen.
86 /* Use for int settings which use the set_sound() function to set them */
87 #define SOUND_SETTING(flags,var,lang_id,name,setting) \
88 {flags|F_T_INT|F_T_SOUND|F_SOUNDSETTING, &global_settings.var, \
89 lang_id, NODEFAULT,name,NULL, \
90 {.sound_setting=(struct sound_setting[]){{setting}}} }
92 /* Use for bool variables which don't use LANG_SET_BOOL_YES and LANG_SET_BOOL_NO
93 or dont save as "off" or "on" in the cfg.
94 cfgvals are comma separated values (without spaces after the comma!) to write
95 for 'false' and 'true' (in this order)
96 yes_id is the lang_id for the 'yes' (or 'on') option in the menu
97 no_id is the lang_id for the 'no' (or 'off') option in the menu
99 #define BOOL_SETTING(flags,var,lang_id,default,name,cfgvals,yes_id,no_id,cb)\
100 {flags|F_BOOL_SETTING, &global_settings.var, \
101 lang_id, BOOL(default),name,cfgvals, \
102 {.bool_setting=(struct bool_setting[]){{cb,yes_id,no_id}}} }
104 /* bool setting which does use LANG_YES and _NO and save as "off,on" */
105 #define OFFON_SETTING(flags,var,lang_id,default,name,cb) \
106 BOOL_SETTING(flags,var,lang_id,default,name,off_on, \
107 LANG_SET_BOOL_YES,LANG_SET_BOOL_NO,cb)
109 /* int variable which is NOT saved to .cfg files,
110 (Use NVRAM() in the flags to save to the nvram (or nvram.bin file) */
111 #define SYSTEM_SETTING(flags,var,default) \
112 {flags|F_T_INT, &global_status.var,-1, INT(default), \
113 NULL, NULL, UNUSED}
115 /* setting which stores as a filename (or another string) in the .cfgvals
116 The string must be a char array (which all of our string settings are),
117 not just a char pointer.
118 prefix: The absolute path to not save in the variable, ex /.rockbox/wps_file
119 suffix: The file extention (usually...) e.g .wps_file
120 If the prefix is set (not NULL), then the suffix must be set as well.
122 #define TEXT_SETTING(flags,var,name,default,prefix,suffix) \
123 {flags|F_T_UCHARPTR, &global_settings.var,-1, \
124 CHARPTR(default),name,NULL, \
125 {.filename_setting= \
126 (struct filename_setting[]){ \
127 {prefix,suffix,sizeof(global_settings.var)}}} }
129 /* Used for settings which use the set_option() setting screen.
130 The ... arg is a list of pointers to strings to display in the setting
131 screen. These can either be literal strings, or ID2P(LANG_*) */
132 #define CHOICE_SETTING(flags,var,lang_id,default,name,cfg_vals,cb,count,...) \
133 {flags|F_CHOICE_SETTING|F_T_INT, &global_settings.var, lang_id, \
134 INT(default), name, cfg_vals, \
135 {.choice_setting = (struct choice_setting[]){ \
136 {cb, count, {.desc = (const unsigned char*[]) \
137 {__VA_ARGS__}}}}}}
139 /* Similar to above, except the strings to display are taken from cfg_vals,
140 the ... arg is a list of ID's to talk for the strings, can use TALK_ID()'s */
141 #define STRINGCHOICE_SETTING(flags,var,lang_id,default,name,cfg_vals, \
142 cb,count,...) \
143 {flags|F_CHOICE_SETTING|F_T_INT|F_CHOICETALKS, \
144 &global_settings.var, lang_id, \
145 INT(default), name, cfg_vals, \
146 {.choice_setting = (struct choice_setting[]){ \
147 {cb, count, {.talks = (const int[]){__VA_ARGS__}}}}}}
149 /* for settings which use the set_int() setting screen.
150 unit is the UNIT_ define to display/talk.
151 the first one saves a string to the config file,
152 the second one saves the variable value to the config file */
153 #define INT_SETTING_W_CFGVALS(flags, var, lang_id, default, name, cfg_vals, \
154 unit, min, max, step, formatter, get_talk_id, cb) \
155 {flags|F_INT_SETTING|F_T_INT, &global_settings.var, \
156 lang_id, INT(default), name, cfg_vals, \
157 {.int_setting = (struct int_setting[]){ \
158 {cb, unit, min, max, step, formatter, get_talk_id}}}}
159 #define INT_SETTING(flags, var, lang_id, default, name, \
160 unit, min, max, step, formatter, get_talk_id, cb) \
161 {flags|F_INT_SETTING|F_T_INT, &global_settings.var, \
162 lang_id, INT(default), name, NULL, \
163 {.int_setting = (struct int_setting[]){ \
164 {cb, unit, min, max, step, formatter, get_talk_id}}}}
165 #define INT_SETTING_NOWRAP(flags, var, lang_id, default, name, \
166 unit, min, max, step, formatter, get_talk_id, cb) \
167 {flags|F_INT_SETTING|F_T_INT|F_NO_WRAP, &global_settings.var, \
168 lang_id, INT(default), name, NULL, \
169 {.int_setting = (struct int_setting[]){ \
170 {cb, unit, min, max, step, formatter, get_talk_id}}}}
172 #define TABLE_SETTING(flags, var, lang_id, default, name, cfg_vals, \
173 unit, formatter, get_talk_id, cb, count, ...) \
174 {flags|F_TABLE_SETTING|F_T_INT, &global_settings.var, \
175 lang_id, INT(default), name, cfg_vals, \
176 {.table_setting = (struct table_setting[]) { \
177 {cb, formatter, get_talk_id, unit, count, \
178 (const int[]){__VA_ARGS__}}}}}
180 #define CUSTOM_SETTING(flags, var, lang_id, default, name, \
181 load_from_cfg, write_to_cfg, \
182 is_change, set_default) \
183 {flags|F_CUSTOM_SETTING|F_T_CUSTOM|F_BANFROMQS, \
184 &global_settings.var, lang_id, \
185 {.custom = (void*)default}, name, NULL, \
186 {.custom_setting = (struct custom_setting[]){ \
187 {load_from_cfg, write_to_cfg, is_change, set_default}}}}
189 #define VIEWPORT_SETTING(var,name) \
190 TEXT_SETTING(F_THEMESETTING,var,name,"-", NULL, NULL)
192 /* some sets of values which are used more than once, to save memory */
193 static const char off_on[] = "off,on";
194 static const char off_on_ask[] = "off,on,ask";
195 static const char off_number_spell[] = "off,number,spell";
196 #ifdef HAVE_LCD_BITMAP
197 static const char graphic_numeric[] = "graphic,numeric";
198 #endif
200 /* Default theme settings */
201 #define DEFAULT_WPSNAME "cabbiev2"
203 #ifdef HAVE_LCD_BITMAP
205 #if LCD_HEIGHT <= 64
206 #define DEFAULT_FONTNAME "08-Rockfont"
207 #elif LCD_HEIGHT <= 80
208 #define DEFAULT_FONTNAME "11-Sazanami-Mincho"
209 #elif LCD_HEIGHT <= 220
210 #define DEFAULT_FONTNAME "12-Adobe-Helvetica"
211 #elif LCD_HEIGHT <= 320
212 #define DEFAULT_FONTNAME "15-Adobe-Helvetica"
213 #else
214 #define DEFAULT_FONTNAME "12-Adobe-Helvetica"
215 #endif
217 #else
218 #define DEFAULT_FONTNAME ""
219 #endif
221 #ifdef HAVE_LCD_COLOR
222 #define DEFAULT_ICONSET "tango_small"
223 #define DEFAULT_VIEWERS_ICONSET "tango_small_viewers"
224 #elif LCD_DEPTH >= 2
225 #define DEFAULT_ICONSET "tango_small_mono"
226 #define DEFAULT_VIEWERS_ICONSET "tango_small_viewers_mono"
227 #else /* monochrome */
228 #define DEFAULT_ICONSET ""
229 #define DEFAULT_VIEWERS_ICONSET ""
230 #endif
232 #define DEFAULT_THEME_FOREGROUND LCD_RGBPACK(0xce, 0xcf, 0xce)
233 #define DEFAULT_THEME_BACKGROUND LCD_RGBPACK(0x00, 0x00, 0x00)
234 #define DEFAULT_THEME_SELECTOR_START LCD_RGBPACK(0xff, 0xeb, 0x9c)
235 #define DEFAULT_THEME_SELECTOR_END LCD_RGBPACK(0xb5, 0x8e, 0x00)
236 #define DEFAULT_THEME_SELECTOR_TEXT LCD_RGBPACK(0x00, 0x00, 0x00)
238 #define DEFAULT_BACKDROP "cabbiev2"
240 #ifdef HAVE_RECORDING
241 /* these should be in the config.h files */
242 #if CONFIG_CODEC == MAS3587F
243 # define DEFAULT_REC_MIC_GAIN 8
244 # define DEFAULT_REC_LEFT_GAIN 2
245 # define DEFAULT_REC_RIGHT_GAIN 2
246 #elif CONFIG_CODEC == SWCODEC
247 # ifdef HAVE_UDA1380
248 # define DEFAULT_REC_MIC_GAIN 16
249 # define DEFAULT_REC_LEFT_GAIN 0
250 # define DEFAULT_REC_RIGHT_GAIN 0
251 # elif defined(HAVE_TLV320)
252 # define DEFAULT_REC_MIC_GAIN 0
253 # define DEFAULT_REC_LEFT_GAIN 0
254 # define DEFAULT_REC_RIGHT_GAIN 0
255 # elif defined(HAVE_WM8975)
256 # define DEFAULT_REC_MIC_GAIN 16
257 # define DEFAULT_REC_LEFT_GAIN 0
258 # define DEFAULT_REC_RIGHT_GAIN 0
259 # elif defined(HAVE_WM8758)
260 # define DEFAULT_REC_MIC_GAIN 16
261 # define DEFAULT_REC_LEFT_GAIN 0
262 # define DEFAULT_REC_RIGHT_GAIN 0
263 # elif defined(HAVE_WM8731)
264 # define DEFAULT_REC_MIC_GAIN 16
265 # define DEFAULT_REC_LEFT_GAIN 0
266 # define DEFAULT_REC_RIGHT_GAIN 0
267 # endif
268 #endif
270 #endif /* HAVE_RECORDING */
272 static const char* formatter_unit_0_is_off(char *buffer, size_t buffer_size,
273 int val, const char *unit)
275 if (val == 0)
276 return str(LANG_OFF);
277 else
278 snprintf(buffer, buffer_size, "%d %s", val, unit);
279 return buffer;
282 static int32_t getlang_unit_0_is_off(int value, int unit)
284 if (value == 0)
285 return LANG_OFF;
286 else
287 return TALK_ID(value,unit);
290 static const char* formatter_unit_0_is_skip_track(char *buffer, size_t buffer_size,
291 int val, const char *unit)
293 (void)unit;
294 if (val == 0)
295 return str(LANG_SKIP_TRACK);
296 else if (val % 60 == 0)
297 snprintf(buffer, buffer_size, "%d min", val/60);
298 else
299 snprintf(buffer, buffer_size, "%d s", val);
300 return buffer;
303 static int32_t getlang_unit_0_is_skip_track(int value, int unit)
305 (void)unit;
306 if (value == 0)
307 return LANG_SKIP_TRACK;
308 else if (value % 60 == 0)
309 return TALK_ID(value/60, UNIT_MIN);
310 else
311 return TALK_ID(value, UNIT_SEC);
314 #ifdef HAVE_BACKLIGHT
315 static const char* backlight_formatter(char *buffer, size_t buffer_size,
316 int val, const char *unit)
318 if (val == -1)
319 return str(LANG_OFF);
320 else if (val == 0)
321 return str(LANG_ON);
322 else
323 snprintf(buffer, buffer_size, "%d %s", val, unit);
324 return buffer;
326 static int32_t backlight_getlang(int value, int unit)
328 if (value == -1)
329 return LANG_OFF;
330 else if (value == 0)
331 return LANG_ON;
332 else
333 return TALK_ID(value, unit);
335 #endif
337 #ifndef HAVE_WHEEL_ACCELERATION
338 static const char* scanaccel_formatter(char *buffer, size_t buffer_size,
339 int val, const char *unit)
341 (void)unit;
342 if (val == 0)
343 return str(LANG_OFF);
344 else
345 snprintf(buffer, buffer_size, "2x/%ds", val);
346 return buffer;
348 #endif
350 #if CONFIG_CODEC == SWCODEC
351 static void crossfeed_cross_set(int val)
353 (void)val;
354 dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain,
355 global_settings.crossfeed_hf_attenuation,
356 global_settings.crossfeed_hf_cutoff);
359 static const char* db_format(char* buffer, size_t buffer_size, int value,
360 const char* unit)
362 int v = abs(value);
364 snprintf(buffer, buffer_size, "%s%d.%d %s", value < 0 ? "-" : "",
365 v / 10, v % 10, unit);
366 return buffer;
369 static int32_t get_dec_talkid(int value, int unit)
371 return TALK_ID_DECIMAL(value, 1, unit);
374 static int32_t get_precut_talkid(int value, int unit)
376 return TALK_ID_DECIMAL(-value, 1, unit);
379 #endif
380 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
381 static void set_mdb_enable(bool value)
383 sound_set_mdb_enable((int)value);
385 static void set_superbass(bool value)
387 sound_set_superbass((int)value);
389 #endif
391 #ifdef HAVE_LCD_CHARCELLS
392 static const char* jumpscroll_format(char* buffer, size_t buffer_size, int value,
393 const char* unit)
395 (void)unit;
396 switch (value)
398 case 0:
399 return str(LANG_OFF);
400 case 1:
401 return str(LANG_ONE_TIME);
402 case 2:
403 case 3:
404 case 4:
405 snprintf(buffer, buffer_size, "%d", value);
406 break;
407 case 5:
408 return str(LANG_ALWAYS);
410 return buffer;
412 static int32_t jumpscroll_getlang(int value, int unit)
414 switch (value)
416 case 0:
417 return LANG_OFF;
418 case 1:
419 return LANG_ONE_TIME;
420 case 2:
421 case 3:
422 case 4:
423 return TALK_ID(value, unit);
424 case 5:
425 return LANG_ALWAYS;
427 return -1;
429 #endif /* HAVE_LCD_CHARCELLS */
431 #ifdef HAVE_QUICKSCREEN
432 static int find_setting_by_name(char*name)
434 int i = 0;
435 const struct settings_list *setting;
436 while (i<nb_settings)
438 setting = &settings[i];
439 if (setting->cfg_name && !strcmp(setting->cfg_name, name))
441 return i;
443 i++;
445 return -1;
447 static void qs_load_from_cfg(void* var, char*value)
449 *(int*)var = find_setting_by_name(value);
451 static char* qs_write_to_cfg(void* setting, char*buf, int buf_len)
453 const struct settings_list *var = &settings[*(int*)setting];
454 strlcpy(buf, var->cfg_name, buf_len);
455 return buf;
457 static bool qs_is_changed(void* setting, void* defaultval)
459 int i = *(int*)setting;
460 if (i < 0 || i >= nb_settings)
461 return false;
462 const struct settings_list *var = &settings[i];
463 return var != find_setting(defaultval, NULL);
465 static void qs_set_default(void* setting, void* defaultval)
467 find_setting(defaultval, (int*)setting);
469 #endif
470 #ifdef HAVE_TOUCHSCREEN
471 static void tsc_load_from_cfg(void* setting, char*value)
473 struct touchscreen_parameter *var = (struct touchscreen_parameter*) setting;
475 /* Replacement for sscanf(value, "%d ..., &var->A, ...); */
476 int vals[7], count = 0;
477 while(*value != 0 && count < 7)
479 if(isspace(*value))
480 value++;
481 else
483 vals[count++] = atoi(value);
484 while(!isspace(*value))
485 value++;
488 var->A = vals[0];
489 var->B = vals[1];
490 var->C = vals[2];
491 var->D = vals[3];
492 var->E = vals[4];
493 var->F = vals[5];
494 var->divider = vals[6];
497 static char* tsc_write_to_cfg(void* setting, char*buf, int buf_len)
499 const struct touchscreen_parameter *var = (const struct touchscreen_parameter*) setting;
500 snprintf(buf, buf_len, "%d %d %d %d %d %d %d", var->A, var->B, var->C, var->D, var->E, var->F, var->divider);
501 return buf;
503 static bool tsc_is_changed(void* setting, void* defaultval)
505 return memcmp(setting, defaultval, sizeof(struct touchscreen_parameter)) != 0;
507 static void tsc_set_default(void* setting, void* defaultval)
509 memcpy(setting, defaultval, sizeof(struct touchscreen_parameter));
511 #endif
512 const struct settings_list settings[] = {
513 /* sound settings */
514 SOUND_SETTING(F_NO_WRAP,volume, LANG_VOLUME, "volume", SOUND_VOLUME),
515 SOUND_SETTING(0, balance, LANG_BALANCE, "balance", SOUND_BALANCE),
516 SOUND_SETTING(F_NO_WRAP,bass, LANG_BASS, "bass", SOUND_BASS),
517 SOUND_SETTING(F_NO_WRAP,treble, LANG_TREBLE, "treble", SOUND_TREBLE),
519 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
520 SOUND_SETTING(0,loudness, LANG_LOUDNESS, "loudness", SOUND_LOUDNESS),
521 STRINGCHOICE_SETTING(F_SOUNDSETTING,avc,LANG_AUTOVOL,0,"auto volume",
522 "off,20ms,2,4,8,", sound_set_avc, 5,
523 LANG_OFF,TALK_ID(20, UNIT_MS),TALK_ID(2, UNIT_SEC),
524 TALK_ID(4, UNIT_SEC),TALK_ID(8, UNIT_SEC)),
525 OFFON_SETTING(F_SOUNDSETTING, superbass, LANG_SUPERBASS, false, "superbass",
526 set_superbass),
527 #endif
529 CHOICE_SETTING(F_SOUNDSETTING, channel_config, LANG_CHANNEL_CONFIGURATION,
530 0,"channels",
531 "stereo,mono,custom,mono left,mono right,karaoke",
532 sound_set_channels, 6,
533 ID2P(LANG_CHANNEL_STEREO), ID2P(LANG_CHANNEL_MONO),
534 ID2P(LANG_CHANNEL_CUSTOM), ID2P(LANG_CHANNEL_LEFT),
535 ID2P(LANG_CHANNEL_RIGHT), ID2P(LANG_CHANNEL_KARAOKE)),
536 SOUND_SETTING(F_SOUNDSETTING, stereo_width, LANG_STEREO_WIDTH,
537 "stereo_width", SOUND_STEREO_WIDTH),
538 /* playback */
539 OFFON_SETTING(0, playlist_shuffle, LANG_SHUFFLE, false, "shuffle", NULL),
540 SYSTEM_SETTING(NVRAM(4), resume_index, -1),
541 SYSTEM_SETTING(NVRAM(4), resume_offset, -1),
542 CHOICE_SETTING(0, repeat_mode, LANG_REPEAT, REPEAT_OFF, "repeat",
543 "off,all,one,shuffle"
544 #ifdef AB_REPEAT_ENABLE
545 ",ab"
546 #endif
547 , NULL,
548 #ifdef AB_REPEAT_ENABLE
550 #else
552 #endif
553 ID2P(LANG_OFF), ID2P(LANG_ALL), ID2P(LANG_REPEAT_ONE),
554 ID2P(LANG_SHUFFLE)
555 #ifdef AB_REPEAT_ENABLE
556 ,ID2P(LANG_REPEAT_AB)
557 #endif
558 ), /* CHOICE_SETTING( repeat_mode ) */
559 /* LCD */
560 #ifdef HAVE_LCD_CONTRAST
561 /* its easier to leave this one un-macro()ed for the time being */
562 { F_T_INT|F_DEF_ISFUNC|F_INT_SETTING, &global_settings.contrast,
563 LANG_CONTRAST, FUNCTYPE(lcd_default_contrast), "contrast", NULL , {
564 .int_setting = (struct int_setting[]) {
565 { lcd_set_contrast, UNIT_INT, MIN_CONTRAST_SETTING,
566 MAX_CONTRAST_SETTING, 1, NULL, NULL }}}},
567 #endif
568 #ifdef HAVE_BACKLIGHT
569 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, backlight_timeout, LANG_BACKLIGHT, 15,
570 "backlight timeout", off_on, UNIT_SEC, backlight_formatter,
571 backlight_getlang, backlight_set_timeout, 20,
572 -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120),
573 #if CONFIG_CHARGING
574 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, backlight_timeout_plugged,
575 LANG_BACKLIGHT_ON_WHEN_CHARGING, 10,
576 "backlight timeout plugged", off_on, UNIT_SEC,
577 backlight_formatter, backlight_getlang,
578 backlight_set_timeout_plugged, 20,
579 -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120),
580 #endif
581 #endif /* HAVE_BACKLIGHT */
582 #ifdef HAVE_LCD_BITMAP
583 #ifdef HAVE_LCD_INVERT
584 BOOL_SETTING(0, invert, LANG_INVERT, false ,"invert", off_on,
585 LANG_INVERT_LCD_INVERSE, LANG_NORMAL, lcd_set_invert_display),
586 #endif
587 #ifdef HAVE_LCD_FLIP
588 OFFON_SETTING(0, flip_display, LANG_FLIP_DISPLAY, false, "flip display",
589 NULL),
590 #endif
591 /* display */
592 CHOICE_SETTING(F_TEMPVAR|F_THEMESETTING, cursor_style, LANG_INVERT_CURSOR,
593 #ifdef HAVE_LCD_COLOR
594 3, "selector type",
595 "pointer,bar (inverse),bar (color),bar (gradient)", NULL, 4,
596 ID2P(LANG_INVERT_CURSOR_POINTER),
597 ID2P(LANG_INVERT_CURSOR_BAR),
598 ID2P(LANG_INVERT_CURSOR_COLOR),
599 ID2P(LANG_INVERT_CURSOR_GRADIENT)),
600 #else
601 1, "selector type", "pointer,bar (inverse)", NULL, 2,
602 ID2P(LANG_INVERT_CURSOR_POINTER),
603 ID2P(LANG_INVERT_CURSOR_BAR)),
604 #endif
605 CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, statusbar,
606 LANG_STATUS_BAR, STATUSBAR_TOP, "statusbar","off,top,bottom",
607 NULL, 3, ID2P(LANG_OFF), ID2P(LANG_STATUSBAR_TOP),
608 ID2P(LANG_STATUSBAR_BOTTOM)),
609 #ifdef HAVE_REMOTE_LCD
610 CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, remote_statusbar,
611 LANG_REMOTE_STATUSBAR, STATUSBAR_TOP, "remote statusbar","off,top,bottom",
612 NULL, 3, ID2P(LANG_OFF), ID2P(LANG_STATUSBAR_TOP),
613 ID2P(LANG_STATUSBAR_BOTTOM)),
614 #endif
615 CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, scrollbar,
616 LANG_SCROLL_BAR, SCROLLBAR_LEFT, "scrollbar","off,left,right",
617 NULL, 3, ID2P(LANG_OFF), ID2P(LANG_LEFT), ID2P(LANG_RIGHT)),
618 INT_SETTING(F_THEMESETTING, scrollbar_width, LANG_SCROLLBAR_WIDTH, 6,
619 "scrollbar width",UNIT_INT, 3, MAX(LCD_WIDTH/10,25), 1,
620 NULL, NULL, NULL),
621 #if CONFIG_KEYPAD == RECORDER_PAD
622 OFFON_SETTING(F_THEMESETTING,buttonbar, LANG_BUTTON_BAR ,true,"buttonbar", NULL),
623 #endif
624 CHOICE_SETTING(F_THEMESETTING, volume_type, LANG_VOLUME_DISPLAY, 0,
625 "volume display", graphic_numeric, NULL, 2,
626 ID2P(LANG_DISPLAY_GRAPHIC),
627 ID2P(LANG_DISPLAY_NUMERIC)),
628 CHOICE_SETTING(F_THEMESETTING, battery_display, LANG_BATTERY_DISPLAY, 0,
629 "battery display", graphic_numeric, NULL, 2,
630 ID2P(LANG_DISPLAY_GRAPHIC), ID2P(LANG_DISPLAY_NUMERIC)),
631 #if CONFIG_RTC
632 CHOICE_SETTING(0, timeformat, LANG_TIMEFORMAT, 0,
633 "time format", "24hour,12hour", NULL, 2,
634 ID2P(LANG_24_HOUR_CLOCK), ID2P(LANG_12_HOUR_CLOCK)),
635 #endif
636 #endif /* HAVE_LCD_BITMAP */
637 OFFON_SETTING(0,show_icons, LANG_SHOW_ICONS ,true,"show icons", NULL),
638 /* system */
639 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, poweroff, LANG_POWEROFF_IDLE, 10,
640 "idle poweroff", "off", UNIT_MIN, formatter_unit_0_is_off,
641 getlang_unit_0_is_off, set_poweroff_timeout, 15,
642 0,1,2,3,4,5,6,7,8,9,10,15,30,45,60),
643 SYSTEM_SETTING(NVRAM(4), runtime, 0),
644 SYSTEM_SETTING(NVRAM(4), topruntime, 0),
645 INT_SETTING(F_BANFROMQS, max_files_in_playlist,
646 LANG_MAX_FILES_IN_PLAYLIST,
647 #if MEM > 1
648 10000,
649 #else
650 400,
651 #endif
652 "max files in playlist", UNIT_INT, 1000, 32000, 1000,
653 NULL, NULL, NULL),
654 INT_SETTING(F_BANFROMQS, max_files_in_dir, LANG_MAX_FILES_IN_DIR,
655 #if MEM > 1
656 1000,
657 #else
658 200,
659 #endif
660 "max files in dir", UNIT_INT, 50, 10000, 50,
661 NULL, NULL, NULL),
662 #if BATTERY_CAPACITY_INC > 0
663 INT_SETTING(0, battery_capacity, LANG_BATTERY_CAPACITY,
664 BATTERY_CAPACITY_DEFAULT, "battery capacity", UNIT_MAH,
665 BATTERY_CAPACITY_MIN, BATTERY_CAPACITY_MAX,
666 BATTERY_CAPACITY_INC, NULL, NULL, NULL),
667 #endif
668 #if CONFIG_CHARGING
669 OFFON_SETTING(NVRAM(1), car_adapter_mode,
670 LANG_CAR_ADAPTER_MODE, false, "car adapter mode", NULL),
671 #endif
672 #ifdef IPOD_ACCESSORY_PROTOCOL
673 CHOICE_SETTING(0, serial_bitrate, LANG_SERIAL_BITRATE, 0, "serial bitrate",
674 "auto,9600,19200,38400,57600", iap_bitrate_set, 5, ID2P(LANG_SERIAL_BITRATE_AUTO),
675 ID2P(LANG_SERIAL_BITRATE_9600),ID2P(LANG_SERIAL_BITRATE_19200),
676 ID2P(LANG_SERIAL_BITRATE_38400),ID2P(LANG_SERIAL_BITRATE_57600)),
677 #endif
678 #ifdef HAVE_ACCESSORY_SUPPLY
679 OFFON_SETTING(0, accessory_supply, LANG_ACCESSORY_SUPPLY,
680 true, "accessory power supply", accessory_supply_set),
681 #endif
682 /* tuner */
683 #if CONFIG_TUNER
684 OFFON_SETTING(0,fm_force_mono, LANG_FM_MONO_MODE,
685 false, "force fm mono", toggle_mono_mode),
686 SYSTEM_SETTING(NVRAM(4),last_frequency,0),
687 #endif
689 #if BATTERY_TYPES_COUNT > 1
690 CHOICE_SETTING(0, battery_type, LANG_BATTERY_TYPE, 0, "battery type",
691 "alkaline,nimh", NULL, 2, ID2P(LANG_BATTERY_TYPE_ALKALINE),
692 ID2P(LANG_BATTERY_TYPE_NIMH)),
693 #endif
694 #ifdef HAVE_REMOTE_LCD
695 /* remote lcd */
696 INT_SETTING(0, remote_contrast, LANG_CONTRAST,
697 DEFAULT_REMOTE_CONTRAST_SETTING, "remote contrast", UNIT_INT,
698 MIN_REMOTE_CONTRAST_SETTING, MAX_REMOTE_CONTRAST_SETTING, 1,
699 NULL, NULL, lcd_remote_set_contrast),
700 BOOL_SETTING(0, remote_invert, LANG_INVERT, false ,"remote invert", off_on,
701 LANG_INVERT_LCD_INVERSE, LANG_NORMAL,
702 lcd_remote_set_invert_display),
703 OFFON_SETTING(0,remote_flip_display, LANG_FLIP_DISPLAY,
704 false,"remote flip display", NULL),
705 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, remote_backlight_timeout,
706 LANG_BACKLIGHT, 5, "remote backlight timeout", off_on,
707 UNIT_SEC, backlight_formatter, backlight_getlang,
708 remote_backlight_set_timeout, 20,
709 -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120),
710 #if CONFIG_CHARGING
711 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, remote_backlight_timeout_plugged,
712 LANG_BACKLIGHT_ON_WHEN_CHARGING, 10,
713 "remote backlight timeout plugged", off_on, UNIT_SEC,
714 backlight_formatter, backlight_getlang,
715 remote_backlight_set_timeout_plugged, 20,
716 -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120),
717 #endif
718 #ifdef HAVE_REMOTE_LCD_TICKING
719 OFFON_SETTING(0, remote_reduce_ticking, LANG_REDUCE_TICKING,
720 false,"remote reduce ticking", NULL),
721 #endif
722 #endif
724 #ifdef HAVE_BACKLIGHT
725 OFFON_SETTING(0, bl_filter_first_keypress,
726 LANG_BACKLIGHT_FILTER_FIRST_KEYPRESS, false,
727 "backlight filters first keypress", NULL),
728 #ifdef HAVE_REMOTE_LCD
729 OFFON_SETTING(0, remote_bl_filter_first_keypress,
730 LANG_BACKLIGHT_FILTER_FIRST_KEYPRESS, false,
731 "backlight filters first remote keypress", NULL),
732 #endif
733 #endif /* HAVE_BACKLIGHT */
735 /** End of old RTC config block **/
737 #ifdef HAVE_BACKLIGHT
738 OFFON_SETTING(0, caption_backlight, LANG_CAPTION_BACKLIGHT,
739 false, "caption backlight", NULL),
740 #ifdef HAVE_REMOTE_LCD
741 OFFON_SETTING(0, remote_caption_backlight, LANG_CAPTION_BACKLIGHT,
742 false, "remote caption backlight", NULL),
743 #endif
744 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
745 INT_SETTING(F_NO_WRAP, brightness, LANG_BRIGHTNESS,
746 DEFAULT_BRIGHTNESS_SETTING, "brightness",UNIT_INT,
747 MIN_BRIGHTNESS_SETTING, MAX_BRIGHTNESS_SETTING, 1,
748 NULL, NULL, backlight_set_brightness),
749 #endif
750 /* backlight fading */
751 #if defined(HAVE_BACKLIGHT_FADING_INT_SETTING)
752 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, backlight_fade_in,
753 LANG_BACKLIGHT_FADE_IN, 300, "backlight fade in", "off",
754 UNIT_MS, formatter_unit_0_is_off, getlang_unit_0_is_off,
755 backlight_set_fade_in, 7, 0,100,200,300,500,1000,2000),
756 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, backlight_fade_out,
757 LANG_BACKLIGHT_FADE_OUT, 2000, "backlight fade out", "off",
758 UNIT_MS, formatter_unit_0_is_off, getlang_unit_0_is_off,
759 backlight_set_fade_out, 10,
760 0,100,200,300,500,1000,2000,3000,5000,10000),
761 #elif defined(HAVE_BACKLIGHT_FADING_BOOL_SETTING)
762 OFFON_SETTING(0, backlight_fade_in, LANG_BACKLIGHT_FADE_IN,
763 true, "backlight fade in", backlight_set_fade_in),
764 OFFON_SETTING(0, backlight_fade_out, LANG_BACKLIGHT_FADE_OUT,
765 true, "backlight fade out", backlight_set_fade_out),
766 #endif
767 #endif /* HAVE_BACKLIGHT */
768 INT_SETTING(F_PADTITLE, scroll_speed, LANG_SCROLL_SPEED, 9,"scroll speed",
769 UNIT_INT, 0, 15, 1, NULL, NULL, lcd_scroll_speed),
770 INT_SETTING(F_PADTITLE, scroll_delay, LANG_SCROLL_DELAY, 1000,
771 "scroll delay", UNIT_MS, 0, 2500, 100, NULL,
772 NULL, lcd_scroll_delay),
773 INT_SETTING(0, bidir_limit, LANG_BIDIR_SCROLL, 50, "bidir limit",
774 UNIT_PERCENT, 0, 200, 25, NULL, NULL, lcd_bidir_scroll),
775 #ifdef HAVE_REMOTE_LCD
776 INT_SETTING(0, remote_scroll_speed, LANG_SCROLL_SPEED, 9,
777 "remote scroll speed", UNIT_INT, 0,15, 1,
778 NULL, NULL, lcd_remote_scroll_speed),
779 INT_SETTING(0, remote_scroll_step, LANG_SCROLL_STEP, 6,
780 "remote scroll step", UNIT_PIXEL, 1, LCD_REMOTE_WIDTH, 1, NULL,
781 NULL, lcd_remote_scroll_step),
782 INT_SETTING(0, remote_scroll_delay, LANG_SCROLL_DELAY, 1000,
783 "remote scroll delay", UNIT_MS, 0, 2500, 100, NULL, NULL,
784 lcd_remote_scroll_delay),
785 INT_SETTING(0, remote_bidir_limit, LANG_BIDIR_SCROLL, 50,
786 "remote bidir limit", UNIT_PERCENT, 0, 200, 25, NULL, NULL,
787 lcd_remote_bidir_scroll),
788 #endif
789 #ifdef HAVE_LCD_BITMAP
790 OFFON_SETTING(0, offset_out_of_view, LANG_SCREEN_SCROLL_VIEW,
791 false, "Screen Scrolls Out Of View",
792 gui_list_screen_scroll_out_of_view),
793 INT_SETTING(F_PADTITLE, scroll_step, LANG_SCROLL_STEP, 6, "scroll step",
794 UNIT_PIXEL, 1, LCD_WIDTH, 1, NULL, NULL, lcd_scroll_step),
795 INT_SETTING(F_PADTITLE, screen_scroll_step, LANG_SCREEN_SCROLL_STEP, 16,
796 "screen scroll step", UNIT_PIXEL, 1, LCD_WIDTH, 1, NULL, NULL,
797 gui_list_screen_scroll_step),
798 #endif /* HAVE_LCD_BITMAP */
799 #ifdef HAVE_LCD_CHARCELLS
800 INT_SETTING(0, jump_scroll, LANG_JUMP_SCROLL, 0, "jump scroll", UNIT_INT, 0,
801 5, 1, jumpscroll_format, jumpscroll_getlang, lcd_jump_scroll),
802 INT_SETTING(0, jump_scroll_delay, LANG_JUMP_SCROLL_DELAY, 500,
803 "jump scroll delay", UNIT_MS, 0, 2500, 100, NULL, NULL,
804 lcd_jump_scroll_delay),
805 #endif
806 OFFON_SETTING(0,scroll_paginated,LANG_SCROLL_PAGINATED,
807 false,"scroll paginated",NULL),
808 #ifdef HAVE_LCD_COLOR
810 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.fg_color,-1,
811 INT(DEFAULT_THEME_FOREGROUND),"foreground color",NULL,UNUSED},
812 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.bg_color,-1,
813 INT(DEFAULT_THEME_BACKGROUND),"background color",NULL,UNUSED},
814 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lss_color,-1,
815 INT(DEFAULT_THEME_SELECTOR_START),"line selector start color",NULL,
816 UNUSED},
817 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lse_color,-1,
818 INT(DEFAULT_THEME_SELECTOR_END),"line selector end color",NULL,UNUSED},
819 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lst_color,-1,
820 INT(DEFAULT_THEME_SELECTOR_TEXT),"line selector text color",NULL,
821 UNUSED},
823 #endif
824 /* more playback */
825 OFFON_SETTING(0,play_selected,LANG_PLAY_SELECTED,true,"play selected",NULL),
826 OFFON_SETTING(0,party_mode,LANG_PARTY_MODE,false,"party mode",NULL),
827 OFFON_SETTING(0,fade_on_stop,LANG_FADE_ON_STOP,true,"volume fade",NULL),
828 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, ff_rewind_min_step,
829 LANG_FFRW_STEP, 1, "scan min step", NULL, UNIT_SEC,
830 NULL, NULL, NULL, 14, 1,2,3,4,5,6,8,10,15,20,25,30,45,60),
831 CHOICE_SETTING(0, ff_rewind_accel, LANG_FFRW_ACCEL, 2,
832 "seek acceleration", "very fast,fast,normal,slow,very slow", NULL, 5,
833 ID2P(LANG_VERY_FAST), ID2P(LANG_FAST), ID2P(LANG_NORMAL),
834 ID2P(LANG_SLOW) , ID2P(LANG_VERY_SLOW)),
835 #if (CONFIG_CODEC == SWCODEC) && defined(HAVE_DISK_STORAGE)
836 STRINGCHOICE_SETTING(0, buffer_margin, LANG_MP3BUFFER_MARGIN, 0,"antiskip",
837 "5s,15s,30s,1min,2min,3min,5min,10min", NULL, 8,
838 TALK_ID(5, UNIT_SEC), TALK_ID(15, UNIT_SEC),
839 TALK_ID(30, UNIT_SEC), TALK_ID(1, UNIT_MIN),
840 TALK_ID(2, UNIT_MIN), TALK_ID(3, UNIT_MIN),
841 TALK_ID(5, UNIT_MIN), TALK_ID(10, UNIT_MIN)),
842 #elif defined(HAVE_DISK_STORAGE)
843 INT_SETTING(0, buffer_margin, LANG_MP3BUFFER_MARGIN, 0, "antiskip",
844 UNIT_SEC, 0, 7, 1, NULL, NULL, audio_set_buffer_margin),
845 #endif
846 /* disk */
847 #ifdef HAVE_DISK_STORAGE
848 INT_SETTING(0, disk_spindown, LANG_SPINDOWN, 5, "disk spindown",
849 UNIT_SEC, 3, 254, 1, NULL, NULL, storage_spindown),
850 #endif /* HAVE_DISK_STORAGE */
851 /* browser */
852 CHOICE_SETTING(0, dirfilter, LANG_FILTER, SHOW_SUPPORTED, "show files",
853 "all,supported,music,playlists", NULL, 4, ID2P(LANG_ALL),
854 ID2P(LANG_FILTER_SUPPORTED), ID2P(LANG_FILTER_MUSIC),
855 ID2P(LANG_PLAYLISTS)),
856 /* file sorting */
857 OFFON_SETTING(0, sort_case, LANG_SORT_CASE, false, "sort case", NULL),
858 CHOICE_SETTING(0, sort_dir, LANG_SORT_DIR, 0 ,
859 "sort dirs", "alpha,oldest,newest", NULL, 3,
860 ID2P(LANG_SORT_ALPHA), ID2P(LANG_SORT_DATE),
861 ID2P(LANG_SORT_DATE_REVERSE)),
862 CHOICE_SETTING(0, sort_file, LANG_SORT_FILE, 0 ,
863 "sort files", "alpha,oldest,newest,type", NULL, 4,
864 ID2P(LANG_SORT_ALPHA), ID2P(LANG_SORT_DATE),
865 ID2P(LANG_SORT_DATE_REVERSE) , ID2P(LANG_SORT_TYPE)),
866 CHOICE_SETTING(0, interpret_numbers, LANG_SORT_INTERPRET_NUMBERS, 1,
867 "sort interpret number", "digits,numbers",NULL, 2,
868 ID2P(LANG_SORT_INTERPRET_AS_DIGIT),
869 ID2P(LANG_SORT_INTERPRET_AS_NUMBERS)),
870 CHOICE_SETTING(0, show_filename_ext, LANG_SHOW_FILENAME_EXT, 3,
871 "show filename exts", "off,on,unknown,view_all", NULL , 4 ,
872 ID2P(LANG_OFF), ID2P(LANG_ON), ID2P(LANG_UNKNOWN_TYPES),
873 ID2P(LANG_EXT_ONLY_VIEW_ALL)),
874 OFFON_SETTING(0,browse_current,LANG_FOLLOW,false,"follow playlist",NULL),
875 OFFON_SETTING(0,playlist_viewer_icons,LANG_SHOW_ICONS,true,
876 "playlist viewer icons",NULL),
877 OFFON_SETTING(0,playlist_viewer_indices,LANG_SHOW_INDICES,true,
878 "playlist viewer indices",NULL),
879 CHOICE_SETTING(0, playlist_viewer_track_display, LANG_TRACK_DISPLAY, 0,
880 "playlist viewer track display","track name,full path",
881 NULL, 2, ID2P(LANG_DISPLAY_TRACK_NAME_ONLY),
882 ID2P(LANG_DISPLAY_FULL_PATH)),
883 CHOICE_SETTING(0, recursive_dir_insert, LANG_RECURSE_DIRECTORY , RECURSE_ON,
884 "recursive directory insert", off_on_ask, NULL , 3 ,
885 ID2P(LANG_OFF), ID2P(LANG_ON), ID2P(LANG_ASK)),
886 /* bookmarks */
887 CHOICE_SETTING(0, autocreatebookmark, LANG_BOOKMARK_SETTINGS_AUTOCREATE,
888 BOOKMARK_NO, "autocreate bookmarks",
889 "off,on,ask,recent only - on,recent only - ask", NULL, 5,
890 ID2P(LANG_SET_BOOL_NO), ID2P(LANG_SET_BOOL_YES),
891 ID2P(LANG_ASK), ID2P(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_YES),
892 ID2P(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_ASK)),
893 CHOICE_SETTING(0, autoloadbookmark, LANG_BOOKMARK_SETTINGS_AUTOLOAD,
894 BOOKMARK_NO, "autoload bookmarks", off_on_ask, NULL, 3,
895 ID2P(LANG_SET_BOOL_NO), ID2P(LANG_SET_BOOL_YES),
896 ID2P(LANG_ASK)),
897 CHOICE_SETTING(0, usemrb, LANG_BOOKMARK_SETTINGS_MAINTAIN_RECENT_BOOKMARKS,
898 BOOKMARK_NO, "use most-recent-bookmarks",
899 "off,on,unique only", NULL, 3, ID2P(LANG_SET_BOOL_NO),
900 ID2P(LANG_SET_BOOL_YES),
901 ID2P(LANG_BOOKMARK_SETTINGS_UNIQUE_ONLY)),
902 #ifdef HAVE_LCD_BITMAP
903 /* peak meter */
904 STRINGCHOICE_SETTING(0, peak_meter_clip_hold, LANG_PM_CLIP_HOLD, 16,
905 "peak meter clip hold",
906 "on,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,2min"
907 ",3min,5min,10min,20min,45min,90min",
908 peak_meter_set_clip_hold, 25, LANG_PM_ETERNAL,
909 TALK_ID(1, UNIT_SEC), TALK_ID(2, UNIT_SEC),
910 TALK_ID(3, UNIT_SEC), TALK_ID(4, UNIT_SEC),
911 TALK_ID(5, UNIT_SEC), TALK_ID(6, UNIT_SEC),
912 TALK_ID(7, UNIT_SEC), TALK_ID(8, UNIT_SEC),
913 TALK_ID(9, UNIT_SEC), TALK_ID(10, UNIT_SEC),
914 TALK_ID(15, UNIT_SEC), TALK_ID(20, UNIT_SEC),
915 TALK_ID(25, UNIT_SEC), TALK_ID(30, UNIT_SEC),
916 TALK_ID(45, UNIT_SEC), TALK_ID(60, UNIT_SEC),
917 TALK_ID(90, UNIT_SEC), TALK_ID(2, UNIT_MIN),
918 TALK_ID(3, UNIT_MIN), TALK_ID(5, UNIT_MIN),
919 TALK_ID(10, UNIT_MIN), TALK_ID(20, UNIT_MIN),
920 TALK_ID(45, UNIT_MIN), TALK_ID(90, UNIT_MIN)),
921 STRINGCHOICE_SETTING(0, peak_meter_hold, LANG_PM_PEAK_HOLD, 3,
922 "peak meter hold",
923 "off,200ms,300ms,500ms,1,2,3,4,5,6,7,8,9,10,15,20,30,1min",
924 NULL, 18, LANG_OFF, TALK_ID(200, UNIT_MS),
925 TALK_ID(300, UNIT_MS), TALK_ID(500, UNIT_MS),
926 TALK_ID(1, UNIT_SEC), TALK_ID(2, UNIT_SEC),
927 TALK_ID(3, UNIT_SEC), TALK_ID(4, UNIT_SEC),
928 TALK_ID(5, UNIT_SEC), TALK_ID(6, UNIT_SEC),
929 TALK_ID(7, UNIT_SEC), TALK_ID(8, UNIT_SEC),
930 TALK_ID(9, UNIT_SEC), TALK_ID(10, UNIT_SEC),
931 TALK_ID(15, UNIT_SEC), TALK_ID(20, UNIT_SEC),
932 TALK_ID(30, UNIT_SEC), TALK_ID(60, UNIT_SEC)),
933 INT_SETTING(0, peak_meter_release, LANG_PM_RELEASE, 8, "peak meter release",
934 UNIT_PM_TICK, 1, 0x7e, 1, NULL, NULL,NULL),
935 OFFON_SETTING(0,peak_meter_dbfs,LANG_PM_DBFS,true,"peak meter dbfs",NULL),
936 {F_T_INT, &global_settings.peak_meter_min, LANG_PM_MIN,INT(60),
937 "peak meter min", NULL, UNUSED},
938 {F_T_INT, &global_settings.peak_meter_max, LANG_PM_MAX,INT(0),
939 "peak meter max", NULL, UNUSED},
940 #ifdef HAVE_RECORDING
941 OFFON_SETTING(0, peak_meter_clipcounter, LANG_PM_CLIPCOUNTER, false,
942 "peak meter clipcounter", NULL),
943 #endif /* HAVE_RECORDING */
944 #endif /* HAVE_LCD_BITMAP */
945 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
946 SOUND_SETTING(F_SOUNDSETTING, mdb_strength, LANG_MDB_STRENGTH,
947 "mdb strength", SOUND_MDB_STRENGTH),
948 SOUND_SETTING(F_SOUNDSETTING, mdb_harmonics, LANG_MDB_HARMONICS,
949 "mdb harmonics", SOUND_MDB_HARMONICS),
950 SOUND_SETTING(F_SOUNDSETTING, mdb_center, LANG_MDB_CENTER,
951 "mdb center", SOUND_MDB_CENTER),
952 SOUND_SETTING(F_SOUNDSETTING, mdb_shape, LANG_MDB_SHAPE,
953 "mdb shape", SOUND_MDB_SHAPE),
954 OFFON_SETTING(F_SOUNDSETTING, mdb_enable, LANG_MDB_ENABLE,
955 false, "mdb enable", set_mdb_enable),
956 #endif
957 #if CONFIG_CODEC == MAS3507D
958 OFFON_SETTING(F_SOUNDSETTING, line_in,LANG_LINE_IN,false,"line in",NULL),
959 #endif
960 /* voice */
961 OFFON_SETTING(F_TEMPVAR, talk_menu, LANG_VOICE_MENU, true, "talk menu", NULL),
962 CHOICE_SETTING(0, talk_dir, LANG_VOICE_DIR, 0,
963 "talk dir", off_number_spell, NULL, 3,
964 ID2P(LANG_OFF), ID2P(LANG_VOICE_NUMBER),
965 ID2P(LANG_VOICE_SPELL)),
966 OFFON_SETTING(F_TEMPVAR, talk_dir_clip, LANG_VOICE_DIR_TALK, false,
967 "talk dir clip", NULL),
968 CHOICE_SETTING(0, talk_file, LANG_VOICE_FILE, 0,
969 "talk file", off_number_spell, NULL, 3,
970 ID2P(LANG_OFF), ID2P(LANG_VOICE_NUMBER),
971 ID2P(LANG_VOICE_SPELL)),
972 OFFON_SETTING(F_TEMPVAR, talk_file_clip, LANG_VOICE_FILE_TALK, false,
973 "talk file clip", NULL),
974 OFFON_SETTING(F_TEMPVAR, talk_filetype, LANG_VOICE_FILETYPE, false,
975 "talk filetype", NULL),
976 OFFON_SETTING(F_TEMPVAR, talk_battery_level, LANG_TALK_BATTERY_LEVEL, false,
977 "Announce Battery Level", NULL),
979 #ifdef HAVE_RECORDING
980 /* recording */
981 STRINGCHOICE_SETTING(F_RECSETTING, rec_timesplit, LANG_SPLIT_TIME, 0,
982 "rec timesplit",
983 "off,00:05,00:10,00:15,00:30,01:00,01:14,01:20,02:00,"
984 "04:00,06:00,08:00,10:00,12:00,18:00,24:00",
985 NULL, 16, LANG_OFF,
986 TALK_ID(5, UNIT_MIN), TALK_ID(10, UNIT_MIN),
987 TALK_ID(15, UNIT_MIN), TALK_ID(30, UNIT_MIN),
988 TALK_ID(60, UNIT_MIN), TALK_ID(74, UNIT_MIN),
989 TALK_ID(80, UNIT_MIN), TALK_ID(2, UNIT_HOUR),
990 TALK_ID(4, UNIT_HOUR), TALK_ID(6, UNIT_HOUR),
991 TALK_ID(8, UNIT_HOUR), TALK_ID(10, UNIT_HOUR),
992 TALK_ID(12, UNIT_HOUR), TALK_ID(18, UNIT_HOUR),
993 TALK_ID(20, UNIT_HOUR), TALK_ID(24, UNIT_HOUR)),
994 STRINGCHOICE_SETTING(F_RECSETTING, rec_sizesplit, LANG_SPLIT_SIZE, 0,
995 "rec sizesplit",
996 "off,5MB,10MB,15MB,32MB,64MB,75MB,100MB,128MB,"
997 "256MB,512MB,650MB,700MB,1GB,1.5GB,1.75GB",
998 NULL, 16, LANG_OFF,
999 TALK_ID(5, UNIT_MB), TALK_ID(10, UNIT_MB),
1000 TALK_ID(15, UNIT_MB), TALK_ID(32, UNIT_MB),
1001 TALK_ID(64, UNIT_MB), TALK_ID(75, UNIT_MB),
1002 TALK_ID(100, UNIT_MB), TALK_ID(128, UNIT_MB),
1003 TALK_ID(256, UNIT_MB), TALK_ID(512, UNIT_MB),
1004 TALK_ID(650, UNIT_MB), TALK_ID(700, UNIT_MB),
1005 TALK_ID(1024, UNIT_MB), TALK_ID(1536, UNIT_MB),
1006 TALK_ID(1792, UNIT_MB)),
1007 {F_T_INT|F_RECSETTING, &global_settings.rec_channels, LANG_CHANNELS, INT(0),
1008 "rec channels","stereo,mono",UNUSED},
1009 #if CONFIG_CODEC == SWCODEC
1010 {F_T_INT|F_RECSETTING, &global_settings.rec_mono_mode,
1011 LANG_RECORDING_MONO_MODE, INT(0), "rec mono mode","L+R,L,R",UNUSED},
1012 #endif
1013 CHOICE_SETTING(F_RECSETTING, rec_split_type, LANG_SPLIT_TYPE, 0,
1014 "rec split type", "Split,Stop,Shutdown", NULL, 3,
1015 ID2P(LANG_START_NEW_FILE), ID2P(LANG_STOP_RECORDING),ID2P(LANG_STOP_RECORDING_AND_SHUTDOWN)),
1016 CHOICE_SETTING(F_RECSETTING, rec_split_method, LANG_SPLIT_MEASURE, 0,
1017 "rec split method", "Time,Filesize", NULL, 2,
1018 ID2P(LANG_TIME), ID2P(LANG_REC_SIZE)),
1019 {F_T_INT|F_RECSETTING, &global_settings.rec_source, LANG_RECORDING_SOURCE,
1020 INT(0), "rec source",
1021 &HAVE_MIC_REC_(",mic")
1022 HAVE_LINE_REC_(",line")
1023 HAVE_SPDIF_REC_(",spdif")
1024 HAVE_FMRADIO_REC_(",fmradio")[1],
1025 UNUSED},
1026 INT_SETTING(F_RECSETTING, rec_prerecord_time, LANG_RECORD_PRERECORD_TIME, 0,
1027 "prerecording time", UNIT_SEC, 0, 30, 1,
1028 formatter_unit_0_is_off, getlang_unit_0_is_off, NULL),
1030 TEXT_SETTING(F_RECSETTING, rec_directory, "rec path",
1031 REC_BASE_DIR, NULL, NULL),
1032 #ifdef HAVE_BACKLIGHT
1033 CHOICE_SETTING(F_RECSETTING, cliplight, LANG_CLIP_LIGHT, 0,
1034 "cliplight", "off,main,both,remote", NULL,
1035 #ifdef HAVE_REMOTE_LCD
1036 4, ID2P(LANG_OFF), ID2P(LANG_MAIN_UNIT),
1037 ID2P(LANG_REMOTE_MAIN), ID2P(LANG_REMOTE_UNIT)
1038 #else
1039 2, ID2P(LANG_OFF), ID2P(LANG_ON)
1040 #endif
1042 #endif
1043 #ifdef DEFAULT_REC_MIC_GAIN
1044 {F_T_INT|F_RECSETTING,&global_settings.rec_mic_gain,
1045 LANG_GAIN,INT(DEFAULT_REC_MIC_GAIN),
1046 "rec mic gain",NULL,UNUSED},
1047 #endif /* DEFAULT_REC_MIC_GAIN */
1048 #ifdef DEFAULT_REC_LEFT_GAIN
1049 {F_T_INT|F_RECSETTING,&global_settings.rec_left_gain,
1050 LANG_GAIN_LEFT,INT(DEFAULT_REC_LEFT_GAIN),
1051 "rec left gain",NULL,UNUSED},
1052 #endif /* DEFAULT_REC_LEFT_GAIN */
1053 #ifdef DEFAULT_REC_RIGHT_GAIN
1054 {F_T_INT|F_RECSETTING,&global_settings.rec_right_gain,LANG_GAIN_RIGHT,
1055 INT(DEFAULT_REC_RIGHT_GAIN),
1056 "rec right gain",NULL,UNUSED},
1057 #endif /* DEFAULT_REC_RIGHT_GAIN */
1058 #if CONFIG_CODEC == MAS3587F
1059 {F_T_INT|F_RECSETTING,&global_settings.rec_frequency,
1060 LANG_RECORDING_FREQUENCY, INT(0),
1061 "rec frequency","44,48,32,22,24,16", UNUSED},
1062 INT_SETTING(F_RECSETTING, rec_quality, LANG_RECORDING_QUALITY, 5,
1063 "rec quality", UNIT_INT, 0, 7, 1, NULL, NULL, NULL),
1064 OFFON_SETTING(F_RECSETTING, rec_editable, LANG_RECORDING_EDITABLE, false,
1065 "editable recordings", NULL),
1066 #endif /* CONFIG_CODEC == MAS3587F */
1067 #if CONFIG_CODEC == SWCODEC
1068 {F_T_INT|F_RECSETTING,&global_settings.rec_frequency,
1069 LANG_RECORDING_FREQUENCY,INT(REC_FREQ_DEFAULT),
1070 "rec frequency",REC_FREQ_CFG_VAL_LIST,UNUSED},
1071 {F_T_INT|F_RECSETTING,&global_settings.rec_format,
1072 LANG_RECORDING_FORMAT,INT(REC_FORMAT_DEFAULT),
1073 "rec format",REC_FORMAT_CFG_VAL_LIST,UNUSED},
1074 /** Encoder settings start - keep these together **/
1075 /* aiff_enc */
1076 /* (no settings yet) */
1077 /* mp3_enc */
1078 {F_T_INT|F_RECSETTING, &global_settings.mp3_enc_config.bitrate,-1,
1079 INT(MP3_ENC_BITRATE_CFG_DEFAULT),
1080 "mp3_enc bitrate",MP3_ENC_BITRATE_CFG_VALUE_LIST,UNUSED},
1081 /* wav_enc */
1082 /* (no settings yet) */
1083 /* wavpack_enc */
1084 /* (no settings yet) */
1085 /** Encoder settings end **/
1086 #endif /* CONFIG_CODEC == SWCODEC */
1087 /* values for the trigger */
1088 INT_SETTING(F_RECSETTING, rec_start_thres_db, LANG_RECORD_START_THRESHOLD, -35,
1089 "trigger start threshold dB", UNIT_DB, VOLUME_MIN/10, 0, -1, NULL, NULL, NULL),
1090 INT_SETTING(F_RECSETTING, rec_start_thres_linear, LANG_RECORD_START_THRESHOLD, 5,
1091 "trigger start threshold linear", UNIT_PERCENT, 0, 100, 1, NULL, NULL, NULL),
1092 INT_SETTING(F_RECSETTING, rec_stop_thres_db, LANG_RECORD_STOP_THRESHOLD, -45,
1093 "trigger stop threshold dB", UNIT_DB, VOLUME_MIN/10, 0, -1, NULL, NULL, NULL),
1094 INT_SETTING(F_RECSETTING, rec_stop_thres_linear, LANG_RECORD_STOP_THRESHOLD, 10,
1095 "trigger stop threshold linear", UNIT_PERCENT, 0, 100, 1, NULL, NULL, NULL),
1096 TABLE_SETTING(F_RECSETTING, rec_start_duration, LANG_MIN_DURATION, 0,
1097 "trigger start duration",
1098 "0s,1s,2s,5s,10s,15s,20s,25s,30s,1min,2min,5min,10min",
1099 UNIT_SEC, NULL, NULL, NULL, 13,
1100 0,1,2,5,10,15,20,25,30,60,120,300,600),
1101 TABLE_SETTING(F_RECSETTING, rec_stop_postrec, LANG_MIN_DURATION, 0,
1102 "trigger stop duration",
1103 "0s,1s,2s,5s,10s,15s,20s,25s,30s,1min,2min,5min,10min",
1104 UNIT_SEC, NULL, NULL, NULL, 13,
1105 0,1,2,5,10,15,20,25,30,60,120,300,600),
1106 TABLE_SETTING(F_RECSETTING, rec_stop_gap, LANG_RECORD_STOP_GAP, 1,
1107 "trigger min gap",
1108 "0s,1s,2s,5s,10s,15s,20s,25s,30s,1min,2min,5min,10min",
1109 UNIT_SEC, NULL, NULL, NULL, 13,
1110 0,1,2,5,10,15,20,25,30,60,120,300,600),
1111 CHOICE_SETTING(F_RECSETTING, rec_trigger_mode, LANG_RECORD_TRIGGER, TRIG_MODE_OFF,
1112 "trigger mode","off,once,repeat", NULL ,3,
1113 ID2P(LANG_OFF), ID2P(LANG_RECORD_TRIG_NOREARM), ID2P(LANG_REPEAT)),
1114 CHOICE_SETTING(F_RECSETTING, rec_trigger_type, LANG_RECORD_TRIGGER_TYPE, TRIG_TYPE_STOP,
1115 "trigger type","stop,pause,nf stp", NULL ,3,
1116 ID2P(LANG_RECORD_TRIGGER_STOP), ID2P(LANG_PAUSE), ID2P(LANG_RECORD_TRIGGER_NEWFILESTP)),
1117 #endif /* HAVE_RECORDING */
1119 #ifdef HAVE_SPDIF_POWER
1120 OFFON_SETTING(F_SOUNDSETTING, spdif_enable, LANG_SPDIF_ENABLE, false,
1121 "spdif enable", spdif_power_enable),
1122 #endif
1123 CHOICE_SETTING(0, next_folder, LANG_NEXT_FOLDER, FOLDER_ADVANCE_OFF,
1124 "folder navigation", "off,on,random",NULL ,3,
1125 ID2P(LANG_SET_BOOL_NO), ID2P(LANG_SET_BOOL_YES),
1126 ID2P(LANG_RANDOM)),
1128 #ifdef HAVE_TAGCACHE
1129 OFFON_SETTING(0, runtimedb, LANG_RUNTIMEDB_ACTIVE, false,
1130 "gather runtime data", NULL),
1131 #endif
1133 #if CONFIG_CODEC == SWCODEC
1134 /* replay gain */
1135 CHOICE_SETTING(F_SOUNDSETTING, replaygain_type, LANG_REPLAYGAIN_MODE,
1136 REPLAYGAIN_SHUFFLE, "replaygain type",
1137 "track,album,track shuffle,off", NULL, 4, ID2P(LANG_TRACK_GAIN),
1138 ID2P(LANG_ALBUM_GAIN), ID2P(LANG_SHUFFLE_GAIN), ID2P(LANG_OFF)),
1139 OFFON_SETTING(F_SOUNDSETTING, replaygain_noclip, LANG_REPLAYGAIN_NOCLIP,
1140 false, "replaygain noclip", NULL),
1141 INT_SETTING_NOWRAP(F_SOUNDSETTING, replaygain_preamp,
1142 LANG_REPLAYGAIN_PREAMP, 0, "replaygain preamp",
1143 UNIT_DB, -120, 120, 5, db_format, get_dec_talkid, NULL),
1145 CHOICE_SETTING(0, beep, LANG_BEEP, 0, "beep", "off,weak,moderate,strong",
1146 NULL, 4, ID2P(LANG_OFF), ID2P(LANG_WEAK),
1147 ID2P(LANG_MODERATE), ID2P(LANG_STRONG)),
1149 #ifdef HAVE_CROSSFADE
1150 /* crossfade */
1151 CHOICE_SETTING(F_SOUNDSETTING, crossfade, LANG_CROSSFADE_ENABLE, 0,
1152 "crossfade",
1153 "off,shuffle,track skip,shuffle and track skip,always", NULL,
1154 5, ID2P(LANG_OFF), ID2P(LANG_SHUFFLE), ID2P(LANG_TRACKSKIP),
1155 ID2P(LANG_SHUFFLE_TRACKSKIP), ID2P(LANG_ALWAYS)),
1156 INT_SETTING(F_SOUNDSETTING, crossfade_fade_in_delay,
1157 LANG_CROSSFADE_FADE_IN_DELAY, 0,
1158 "crossfade fade in delay", UNIT_SEC, 0, 7, 1, NULL, NULL, NULL),
1159 INT_SETTING(F_SOUNDSETTING, crossfade_fade_out_delay,
1160 LANG_CROSSFADE_FADE_OUT_DELAY, 0,
1161 "crossfade fade out delay", UNIT_SEC, 0, 7, 1, NULL, NULL,NULL),
1162 INT_SETTING(F_SOUNDSETTING, crossfade_fade_in_duration,
1163 LANG_CROSSFADE_FADE_IN_DURATION, 2,
1164 "crossfade fade in duration", UNIT_SEC, 0, 15, 1, NULL, NULL,
1165 NULL),
1166 INT_SETTING(F_SOUNDSETTING, crossfade_fade_out_duration,
1167 LANG_CROSSFADE_FADE_OUT_DURATION, 2,
1168 "crossfade fade out duration", UNIT_SEC, 0, 15, 1, NULL, NULL,
1169 NULL),
1170 CHOICE_SETTING(F_SOUNDSETTING, crossfade_fade_out_mixmode,
1171 LANG_CROSSFADE_FADE_OUT_MODE, 0,
1172 "crossfade fade out mode", "crossfade,mix", NULL, 2,
1173 ID2P(LANG_CROSSFADE), ID2P(LANG_MIX)),
1174 #endif
1176 /* crossfeed */
1177 OFFON_SETTING(F_SOUNDSETTING, crossfeed, LANG_CROSSFEED, false,
1178 "crossfeed", dsp_set_crossfeed),
1179 INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_direct_gain,
1180 LANG_CROSSFEED_DIRECT_GAIN, -15,
1181 "crossfeed direct gain", UNIT_DB, -60, 0, 5,
1182 db_format, get_dec_talkid,dsp_set_crossfeed_direct_gain),
1183 INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_cross_gain,
1184 LANG_CROSSFEED_CROSS_GAIN, -60,
1185 "crossfeed cross gain", UNIT_DB, -120, -30, 5,
1186 db_format, get_dec_talkid, crossfeed_cross_set),
1187 INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_hf_attenuation,
1188 LANG_CROSSFEED_HF_ATTENUATION, -160,
1189 "crossfeed hf attenuation", UNIT_DB, -240, -60, 5,
1190 db_format, get_dec_talkid, crossfeed_cross_set),
1191 INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_hf_cutoff,
1192 LANG_CROSSFEED_HF_CUTOFF, 700,
1193 "crossfeed hf cutoff", UNIT_HERTZ, 500, 2000, 100,
1194 NULL, NULL, crossfeed_cross_set),
1196 /* equalizer */
1197 OFFON_SETTING(F_EQSETTING, eq_enabled, LANG_EQUALIZER_ENABLED, false,
1198 "eq enabled", NULL),
1199 INT_SETTING_NOWRAP(F_EQSETTING, eq_precut, LANG_EQUALIZER_PRECUT, 0,
1200 "eq precut", UNIT_DB, 0, 240, 5, eq_precut_format,
1201 get_precut_talkid, dsp_set_eq_precut),
1202 /* 0..32768 Hz */
1203 INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_cutoff, LANG_EQUALIZER_BAND_CUTOFF,
1204 60, "eq band 0 cutoff", UNIT_HERTZ, EQ_CUTOFF_MIN,
1205 EQ_CUTOFF_MAX, EQ_CUTOFF_STEP, NULL, NULL, NULL),
1206 INT_SETTING_NOWRAP(F_EQSETTING, eq_band1_cutoff, LANG_EQUALIZER_BAND_CENTER,
1207 200, "eq band 1 cutoff", UNIT_HERTZ, EQ_CUTOFF_MIN,
1208 EQ_CUTOFF_MAX, EQ_CUTOFF_STEP, NULL, NULL, NULL),
1209 INT_SETTING_NOWRAP(F_EQSETTING, eq_band2_cutoff, LANG_EQUALIZER_BAND_CENTER,
1210 800, "eq band 2 cutoff", UNIT_HERTZ, EQ_CUTOFF_MIN,
1211 EQ_CUTOFF_MAX, EQ_CUTOFF_STEP, NULL, NULL, NULL),
1212 INT_SETTING_NOWRAP(F_EQSETTING, eq_band3_cutoff, LANG_EQUALIZER_BAND_CENTER,
1213 4000, "eq band 3 cutoff", UNIT_HERTZ, EQ_CUTOFF_MIN,
1214 EQ_CUTOFF_MAX, EQ_CUTOFF_STEP, NULL, NULL, NULL),
1215 INT_SETTING_NOWRAP(F_EQSETTING, eq_band4_cutoff, LANG_EQUALIZER_BAND_CUTOFF,
1216 12000, "eq band 4 cutoff", UNIT_HERTZ, EQ_CUTOFF_MIN,
1217 EQ_CUTOFF_MAX, EQ_CUTOFF_STEP, NULL, NULL, NULL),
1218 /* 0..64 (or 0.0 to 6.4) */
1219 INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_q, LANG_EQUALIZER_BAND_Q, 7,
1220 "eq band 0 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
1221 eq_q_format, get_dec_talkid, NULL),
1222 INT_SETTING_NOWRAP(F_EQSETTING, eq_band1_q, LANG_EQUALIZER_BAND_Q, 10,
1223 "eq band 1 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
1224 eq_q_format, get_dec_talkid, NULL),
1225 INT_SETTING_NOWRAP(F_EQSETTING, eq_band2_q, LANG_EQUALIZER_BAND_Q, 10,
1226 "eq band 2 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
1227 eq_q_format, get_dec_talkid, NULL),
1228 INT_SETTING_NOWRAP(F_EQSETTING, eq_band3_q, LANG_EQUALIZER_BAND_Q, 10,
1229 "eq band 3 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
1230 eq_q_format, get_dec_talkid, NULL),
1231 INT_SETTING_NOWRAP(F_EQSETTING, eq_band4_q, LANG_EQUALIZER_BAND_Q, 7,
1232 "eq band 4 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
1233 eq_q_format, get_dec_talkid, NULL),
1234 /* -240..240 (or -24db to +24db) */
1235 INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_gain, LANG_GAIN, 0,
1236 "eq band 0 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
1237 EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
1238 INT_SETTING_NOWRAP(F_EQSETTING, eq_band1_gain, LANG_GAIN, 0,
1239 "eq band 1 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
1240 EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
1241 INT_SETTING_NOWRAP(F_EQSETTING, eq_band2_gain, LANG_GAIN, 0,
1242 "eq band 2 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
1243 EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
1244 INT_SETTING_NOWRAP(F_EQSETTING, eq_band3_gain, LANG_GAIN, 0,
1245 "eq band 3 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
1246 EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
1247 INT_SETTING_NOWRAP(F_EQSETTING, eq_band4_gain, LANG_GAIN, 0,
1248 "eq band 4 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
1249 EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
1251 /* dithering */
1252 OFFON_SETTING(F_SOUNDSETTING, dithering_enabled, LANG_DITHERING, false,
1253 "dithering enabled", dsp_dither_enable),
1255 /* timestretch */
1256 OFFON_SETTING(F_SOUNDSETTING, timestretch_enabled, LANG_TIMESTRETCH, false,
1257 "timestretch enabled", dsp_timestretch_enable),
1259 /* limiter */
1260 INT_SETTING_NOWRAP(F_SOUNDSETTING, limiter_level,
1261 LANG_COMPRESSOR, 0,
1262 "limiter level", UNIT_DB, 0, MAX_LIMITER_GAIN,
1263 5, db_format, get_dec_talkid, dsp_set_limiter),
1264 #endif
1265 #ifdef HAVE_WM8758
1266 SOUND_SETTING(F_NO_WRAP, bass_cutoff, LANG_BASS_CUTOFF,
1267 "bass cutoff", SOUND_BASS_CUTOFF),
1268 SOUND_SETTING(F_NO_WRAP, treble_cutoff, LANG_TREBLE_CUTOFF,
1269 "treble cutoff", SOUND_TREBLE_CUTOFF),
1270 #endif
1271 #ifdef HAVE_DIRCACHE
1272 OFFON_SETTING(F_BANFROMQS,dircache,LANG_DIRCACHE_ENABLE,false,"dircache",NULL),
1273 SYSTEM_SETTING(NVRAM(4),dircache_size,0),
1274 #endif
1276 #ifdef HAVE_TAGCACHE
1277 #ifdef HAVE_TC_RAMCACHE
1278 OFFON_SETTING(F_BANFROMQS,tagcache_ram,LANG_TAGCACHE_RAM,false,"tagcache_ram",NULL),
1279 #endif
1280 OFFON_SETTING(F_BANFROMQS, tagcache_autoupdate, LANG_TAGCACHE_AUTOUPDATE, false,
1281 "tagcache_autoupdate", NULL),
1282 #endif
1283 CHOICE_SETTING(0, default_codepage, LANG_DEFAULT_CODEPAGE, 0,
1284 "default codepage",
1285 #ifdef HAVE_LCD_BITMAP
1286 /* The order must match with that in unicode.c */
1287 "iso8859-1,iso8859-7,iso8859-8,cp1251,iso8859-11,cp1256,"
1288 "iso8859-9,iso8859-2,cp1250,sjis,gb2312,ksx1001,big5,utf-8",
1289 set_codepage, 14,
1290 ID2P(LANG_CODEPAGE_LATIN1), ID2P(LANG_CODEPAGE_GREEK),
1291 ID2P(LANG_CODEPAGE_HEBREW), ID2P(LANG_CODEPAGE_CYRILLIC),
1292 ID2P(LANG_CODEPAGE_THAI), ID2P(LANG_CODEPAGE_ARABIC),
1293 ID2P(LANG_CODEPAGE_TURKISH),
1294 ID2P(LANG_CODEPAGE_LATIN_EXTENDED),
1295 ID2P(LANG_CODEPAGE_CENTRAL_EUROPEAN),
1296 ID2P(LANG_CODEPAGE_JAPANESE),
1297 ID2P(LANG_CODEPAGE_SIMPLIFIED), ID2P(LANG_CODEPAGE_KOREAN),
1298 ID2P(LANG_CODEPAGE_TRADITIONAL), ID2P(LANG_CODEPAGE_UTF8)),
1299 #else /* !HAVE_LCD_BITMAP */
1300 /* The order must match with that in unicode.c */
1301 "iso8859-1,iso8859-7,cp1251,iso8859-9,iso8859-2,cp1250,utf-8",
1302 set_codepage, 7,
1303 ID2P(LANG_CODEPAGE_LATIN1), ID2P(LANG_CODEPAGE_GREEK),
1304 ID2P(LANG_CODEPAGE_CYRILLIC), ID2P(LANG_CODEPAGE_TURKISH),
1305 ID2P(LANG_CODEPAGE_LATIN_EXTENDED),
1306 ID2P(LANG_CODEPAGE_CENTRAL_EUROPEAN),
1307 ID2P(LANG_CODEPAGE_UTF8)),
1308 #endif
1309 OFFON_SETTING(0, warnon_erase_dynplaylist, LANG_WARN_ERASEDYNPLAYLIST_MENU,
1310 true, "warn when erasing dynamic playlist",NULL),
1312 #ifdef HAVE_BACKLIGHT
1313 #ifdef HAS_BUTTON_HOLD
1314 CHOICE_SETTING(0, backlight_on_button_hold, LANG_BACKLIGHT_ON_BUTTON_HOLD,
1315 1, "backlight on button hold", "normal,off,on",
1316 backlight_set_on_button_hold, 3,
1317 ID2P(LANG_NORMAL), ID2P(LANG_OFF), ID2P(LANG_ON)),
1318 #endif
1320 #ifdef HAVE_LCD_SLEEP_SETTING
1321 STRINGCHOICE_SETTING(0, lcd_sleep_after_backlight_off,
1322 LANG_LCD_SLEEP_AFTER_BACKLIGHT_OFF, 3,
1323 "lcd sleep after backlight off",
1324 "always,never,5,10,15,20,30,45,60,90",
1325 lcd_set_sleep_after_backlight_off, 10,
1326 LANG_ALWAYS, LANG_NEVER, TALK_ID(5, UNIT_SEC),
1327 TALK_ID(10, UNIT_SEC), TALK_ID(15, UNIT_SEC),
1328 TALK_ID(20, UNIT_SEC), TALK_ID(30, UNIT_SEC),
1329 TALK_ID(45, UNIT_SEC),TALK_ID(60, UNIT_SEC),
1330 TALK_ID(90, UNIT_SEC)),
1331 #endif /* HAVE_LCD_SLEEP_SETTING */
1332 #endif /* HAVE_BACKLIGHT */
1334 OFFON_SETTING(0, hold_lr_for_scroll_in_list, -1, true,
1335 "hold_lr_for_scroll_in_list",NULL),
1336 #ifdef HAVE_LCD_BITMAP
1337 CHOICE_SETTING(0, show_path_in_browser, LANG_SHOW_PATH, SHOW_PATH_CURRENT,
1338 "show path in browser", "off,current directory,full path",
1339 NULL, 3, ID2P(LANG_OFF), ID2P(LANG_SHOW_PATH_CURRENT),
1340 ID2P(LANG_DISPLAY_FULL_PATH)),
1341 #endif
1343 #ifdef HAVE_AGC
1344 {F_T_INT,&global_settings.rec_agc_preset_mic,LANG_RECORDING_AGC_PRESET,
1345 INT(1),"agc mic preset",NULL,UNUSED},
1346 {F_T_INT,&global_settings.rec_agc_preset_line,LANG_RECORDING_AGC_PRESET,
1347 INT(1),"agc line preset",NULL,UNUSED},
1348 {F_T_INT,&global_settings.rec_agc_maxgain_mic,-1,INT(104),
1349 "agc maximum mic gain",NULL,UNUSED},
1350 {F_T_INT,&global_settings.rec_agc_maxgain_line,-1,INT(96),
1351 "agc maximum line gain",NULL,UNUSED},
1352 {F_T_INT,&global_settings.rec_agc_cliptime,LANG_RECORDING_AGC_CLIPTIME,
1353 INT(1),"agc cliptime","0.2s,0.4s,0.6s,0.8,1s",UNUSED},
1354 #endif
1356 #ifdef HAVE_REMOTE_LCD
1357 #ifdef HAS_REMOTE_BUTTON_HOLD
1358 CHOICE_SETTING(0, remote_backlight_on_button_hold,
1359 LANG_BACKLIGHT_ON_BUTTON_HOLD, 0,
1360 "remote backlight on button hold",
1361 "normal,off,on", remote_backlight_set_on_button_hold, 3,
1362 ID2P(LANG_NORMAL), ID2P(LANG_OFF), ID2P(LANG_ON)),
1363 #endif
1364 #endif
1365 #ifdef HAVE_HEADPHONE_DETECTION
1366 CHOICE_SETTING(0, unplug_mode, LANG_HEADPHONE_UNPLUG, 0,
1367 "pause on headphone unplug", "off,pause,pause and resume",
1368 NULL, 3, ID2P(LANG_OFF), ID2P(LANG_PAUSE),
1369 ID2P(LANG_HEADPHONE_UNPLUG_RESUME)),
1370 INT_SETTING(0, unplug_rw, LANG_HEADPHONE_UNPLUG_RW, 0,
1371 "rewind duration on pause", UNIT_SEC, 0, 15, 1, NULL, NULL,
1372 NULL),
1373 OFFON_SETTING(0, unplug_autoresume,
1374 LANG_HEADPHONE_UNPLUG_DISABLE_AUTORESUME, false,
1375 "disable autoresume if phones not present",NULL),
1376 #endif
1377 #if CONFIG_TUNER
1378 CHOICE_SETTING(0, fm_region, LANG_FM_REGION, 0,
1379 "fm_region", "eu,us,jp,kr", set_radio_region, 4,
1380 ID2P(LANG_FM_EUROPE), ID2P(LANG_FM_US),
1381 ID2P(LANG_FM_JAPAN), ID2P(LANG_FM_KOREA)),
1382 #endif
1384 OFFON_SETTING(F_BANFROMQS, audioscrobbler, LANG_AUDIOSCROBBLER, false,
1385 "Last.fm Logging", NULL),
1386 #if CONFIG_TUNER
1387 TEXT_SETTING(0, fmr_file, "fmr", "",
1388 FMPRESET_PATH "/", ".fmr"),
1389 #endif
1390 #ifdef HAVE_LCD_BITMAP
1391 TEXT_SETTING(F_THEMESETTING, font_file, "font",
1392 DEFAULT_FONTNAME, FONT_DIR "/", ".fnt"),
1393 #endif
1394 TEXT_SETTING(F_THEMESETTING,wps_file, "wps",
1395 DEFAULT_WPSNAME, WPS_DIR "/", ".wps"),
1396 TEXT_SETTING(0,lang_file,"lang","",LANG_DIR "/",".lng"),
1397 #ifdef HAVE_REMOTE_LCD
1398 TEXT_SETTING(F_THEMESETTING,rwps_file,"rwps",
1399 DEFAULT_WPSNAME, WPS_DIR "/", ".rwps"),
1400 #endif
1401 #if LCD_DEPTH > 1
1402 TEXT_SETTING(F_THEMESETTING,backdrop_file,"backdrop",
1403 DEFAULT_BACKDROP, BACKDROP_DIR "/", ".bmp"),
1404 #endif
1405 #ifdef HAVE_LCD_BITMAP
1406 TEXT_SETTING(0,kbd_file,"kbd","",ROCKBOX_DIR "/",".kbd"),
1407 #endif
1408 #ifdef HAVE_USB_CHARGING_ENABLE
1409 OFFON_SETTING(0,usb_charging,LANG_USB_CHARGING,false,"usb charging",NULL),
1410 #endif
1411 OFFON_SETTING(F_BANFROMQS,cuesheet,LANG_CUESHEET_ENABLE,false,"cuesheet support",
1412 NULL),
1413 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, skip_length,
1414 LANG_SKIP_LENGTH, 0, "skip length",
1415 "track,1s,2s,3s,5s,7s,10s,15s,20s,30s,45s,1min,90s,2min,3min,5min,10min,15min",
1416 UNIT_SEC, formatter_unit_0_is_skip_track,
1417 getlang_unit_0_is_skip_track, NULL,
1418 18, 0,1,2,3,5,7,10,15,20,30,45,60,90,120,180,300,600,900),
1419 CHOICE_SETTING(0, start_in_screen, LANG_START_SCREEN, 1,
1420 "start in screen", "previous,root,files,"
1421 #ifdef HAVE_TAGCACHE
1422 "db,"
1423 #endif
1424 "wps,menu,"
1425 #ifdef HAVE_RECORDING
1426 "recording,"
1427 #endif
1428 #if CONFIG_TUNER
1429 "radio,"
1430 #endif
1431 "bookmarks" ,NULL,
1432 #if defined(HAVE_TAGCACHE)
1433 #if defined(HAVE_RECORDING) && CONFIG_TUNER
1435 #elif defined(HAVE_RECORDING) || CONFIG_TUNER /* only one of them */
1437 #else
1439 #endif
1440 #else
1441 #if defined(HAVE_RECORDING) && CONFIG_TUNER
1443 #elif defined(HAVE_RECORDING) || CONFIG_TUNER /* only one of them */
1445 #else
1447 #endif
1448 #endif
1449 ID2P(LANG_PREVIOUS_SCREEN), ID2P(LANG_MAIN_MENU),
1450 ID2P(LANG_DIR_BROWSER),
1451 #ifdef HAVE_TAGCACHE
1452 ID2P(LANG_TAGCACHE),
1453 #endif
1454 ID2P(LANG_RESUME_PLAYBACK), ID2P(LANG_SETTINGS),
1455 #ifdef HAVE_RECORDING
1456 ID2P(LANG_RECORDING),
1457 #endif
1458 #if CONFIG_TUNER
1459 ID2P(LANG_FM_RADIO),
1460 #endif
1461 ID2P(LANG_BOOKMARK_MENU_RECENT_BOOKMARKS)
1463 SYSTEM_SETTING(NVRAM(1),last_screen,-1),
1464 #if defined(HAVE_RTC_ALARM) && \
1465 (defined(HAVE_RECORDING) || CONFIG_TUNER)
1466 {F_T_INT, &global_settings.alarm_wake_up_screen, LANG_ALARM_WAKEUP_SCREEN,
1467 INT(ALARM_START_WPS), "alarm wakeup screen", ALARM_SETTING_TEXT,UNUSED},
1468 #endif /* HAVE_RTC_ALARM */
1470 /* Customizable icons */
1471 #ifdef HAVE_LCD_BITMAP
1472 TEXT_SETTING(F_THEMESETTING, icon_file, "iconset", DEFAULT_ICONSET,
1473 ICON_DIR "/", ".bmp"),
1474 TEXT_SETTING(F_THEMESETTING, viewers_icon_file, "viewers iconset",
1475 DEFAULT_VIEWERS_ICONSET,
1476 ICON_DIR "/", ".bmp"),
1477 #endif
1478 #ifdef HAVE_REMOTE_LCD
1479 TEXT_SETTING(F_THEMESETTING, remote_icon_file, "remote iconset", "",
1480 ICON_DIR "/", ".bmp"),
1481 TEXT_SETTING(F_THEMESETTING, remote_viewers_icon_file,
1482 "remote viewers iconset", "",
1483 ICON_DIR "/", ".bmp"),
1484 #endif /* HAVE_REMOTE_LCD */
1485 #ifdef HAVE_LCD_COLOR
1486 TEXT_SETTING(F_THEMESETTING, colors_file, "filetype colours", "-",
1487 THEME_DIR "/", ".colours"),
1488 #endif
1489 #ifdef HAVE_BUTTON_LIGHT
1490 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, buttonlight_timeout,
1491 LANG_BUTTONLIGHT_TIMEOUT, 5, "button light timeout", off_on,
1492 UNIT_SEC, backlight_formatter, backlight_getlang,
1493 buttonlight_set_timeout, 20,
1494 -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120),
1495 #endif
1496 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
1497 INT_SETTING(F_NO_WRAP, buttonlight_brightness, LANG_BUTTONLIGHT_BRIGHTNESS,
1498 DEFAULT_BRIGHTNESS_SETTING,
1499 "button light brightness",UNIT_INT, MIN_BRIGHTNESS_SETTING,
1500 MAX_BRIGHTNESS_SETTING, 1, NULL, NULL,
1501 buttonlight_set_brightness),
1502 #endif
1503 #ifndef HAVE_WHEEL_ACCELERATION
1504 INT_SETTING(0, list_accel_start_delay, LANG_LISTACCEL_START_DELAY,
1505 2, "list_accel_start_delay", UNIT_MS, 0, 10, 1,
1506 formatter_unit_0_is_off, getlang_unit_0_is_off, NULL),
1507 INT_SETTING(0, list_accel_wait, LANG_LISTACCEL_ACCEL_SPEED,
1508 3, "list_accel_wait", UNIT_SEC, 1, 10, 1,
1509 scanaccel_formatter, getlang_unit_0_is_off, NULL),
1510 #endif /* HAVE_WHEEL_ACCELERATION */
1511 #if CONFIG_CODEC == SWCODEC
1512 /* keyclick */
1513 CHOICE_SETTING(0, keyclick, LANG_KEYCLICK, 0,
1514 "keyclick", "off,weak,moderate,strong", NULL, 4,
1515 ID2P(LANG_OFF), ID2P(LANG_WEAK), ID2P(LANG_MODERATE),
1516 ID2P(LANG_STRONG)),
1517 OFFON_SETTING(0, keyclick_repeats, LANG_KEYCLICK_REPEATS, false,
1518 "keyclick repeats", NULL),
1519 #endif /* CONFIG_CODEC == SWCODEC */
1520 TEXT_SETTING(0, playlist_catalog_dir, "playlist catalog directory",
1521 PLAYLIST_CATALOG_DEFAULT_DIR, NULL, NULL),
1522 #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
1523 CHOICE_SETTING(0, touchpad_sensitivity, LANG_TOUCHPAD_SENSITIVITY, 0,
1524 "touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2,
1525 ID2P(LANG_NORMAL), ID2P(LANG_HIGH)),
1526 #endif
1527 #ifdef HAVE_QUICKSCREEN
1528 CUSTOM_SETTING(0, qs_item_top, LANG_TOP_QS_ITEM,
1529 &global_settings.dirfilter, "qs top",
1530 qs_load_from_cfg, qs_write_to_cfg,
1531 qs_is_changed, qs_set_default),
1532 CUSTOM_SETTING(0, qs_item_left, LANG_LEFT_QS_ITEM,
1533 &global_settings.playlist_shuffle, "qs left",
1534 qs_load_from_cfg, qs_write_to_cfg,
1535 qs_is_changed, qs_set_default),
1536 CUSTOM_SETTING(0, qs_item_right, LANG_RIGHT_QS_ITEM,
1537 &global_settings.repeat_mode, "qs right",
1538 qs_load_from_cfg, qs_write_to_cfg,
1539 qs_is_changed, qs_set_default),
1540 CUSTOM_SETTING(0, qs_item_bottom, LANG_BOTTOM_QS_ITEM,
1541 &global_settings.dirfilter, "qs bottom",
1542 qs_load_from_cfg, qs_write_to_cfg,
1543 qs_is_changed, qs_set_default),
1544 #endif
1545 #ifdef HAVE_SPEAKER
1546 OFFON_SETTING(0, speaker_enabled, LANG_ENABLE_SPEAKER, false, "speaker",
1547 audiohw_enable_speaker),
1548 #endif
1549 #ifdef HAVE_TOUCHSCREEN
1550 CHOICE_SETTING(0, touch_mode, LANG_TOUCHSCREEN_MODE, TOUCHSCREEN_BUTTON,
1551 "touchscreen mode", "point,grid", NULL, 2,
1552 ID2P(LANG_TOUCHSCREEN_POINT), ID2P(LANG_TOUCHSCREEN_GRID)),
1553 CUSTOM_SETTING(0, ts_calibration_data, -1,
1554 &default_calibration_parameters, "touchscreen calibration",
1555 tsc_load_from_cfg, tsc_write_to_cfg,
1556 tsc_is_changed, tsc_set_default),
1557 #endif
1558 OFFON_SETTING(0, prevent_skip, LANG_PREVENT_SKIPPING, false, "prevent track skip", NULL),
1560 #ifdef HAVE_PITCHSCREEN
1561 OFFON_SETTING(0, pitch_mode_semitone, LANG_SEMITONE, false,
1562 "Semitone pitch change", NULL),
1563 #if CONFIG_CODEC == SWCODEC
1564 OFFON_SETTING(0, pitch_mode_timestretch, LANG_TIMESTRETCH, false,
1565 "Timestretch mode", NULL),
1566 #endif
1567 #endif
1569 /* Customizable list */
1570 #ifdef HAVE_LCD_BITMAP
1571 VIEWPORT_SETTING(ui_vp_config, "ui viewport"),
1572 #ifdef HAVE_REMOTE_LCD
1573 VIEWPORT_SETTING(remote_ui_vp_config, "remote ui viewport"),
1574 #endif
1575 #endif
1578 const int nb_settings = sizeof(settings)/sizeof(*settings);
1580 const struct settings_list* get_settings_list(int*count)
1582 *count = nb_settings;
1583 return settings;