Fix off-by-one buffer error
[maemo-rb.git] / apps / settings_list.c
blobeb62b9b9759b1fe62333b651fc5ba985bb117db9
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-extra.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 "sound.h"
33 #include "settings.h"
34 #include "settings_list.h"
35 #include "usb.h"
36 #include "dsp.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
59 #ifdef HAVE_HOTKEY
60 #include "onplay.h"
61 #endif
63 #define NVRAM(bytes) (bytes<<F_NVRAM_MASK_SHIFT)
64 /** NOTE: NVRAM_CONFIG_VERSION is in settings_list.h
65 and you may need to update it if you edit this file */
67 #define UNUSED {.RESERVED=NULL}
68 #define INT(a) {.int_ = a}
69 #define UINT(a) {.uint_ = a}
70 #define BOOL(a) {.bool_ = a}
71 #define CHARPTR(a) {.charptr = a}
72 #define UCHARPTR(a) {.ucharptr = a}
73 #define FUNCTYPE(a) {.func = a}
74 #define NODEFAULT INT(0)
76 /* in all the following macros the args are:
77 - flags: bitwise | or the F_ bits in settings_list.h
78 - var: pointer to the variable being changed (usually in global_settings)
79 - lang_id: LANG_* id to display in menus and setting screens for the setting
80 - default: the default value for the variable, set if settings are reset
81 - name: the name of the setting in config files
82 - cfg_vals: comma separated list of legal values to write to cfg files.
83 The values correspond to the values 0,1,2,etc. of the setting.
84 NULL if just the number itself should be written to the file.
85 No spaces between the values and the commas!
86 - cb: the callback used by the setting screen.
89 /* Use for int settings which use the set_sound() function to set them */
90 #define SOUND_SETTING(flags,var,lang_id,name,setting) \
91 {flags|F_T_INT|F_T_SOUND|F_SOUNDSETTING, &global_settings.var, \
92 lang_id, NODEFAULT,name,NULL, \
93 {.sound_setting=(struct sound_setting[]){{setting}}} }
95 /* Use for bool variables which don't use LANG_SET_BOOL_YES and LANG_SET_BOOL_NO
96 or dont save as "off" or "on" in the cfg.
97 cfgvals are comma separated values (without spaces after the comma!) to write
98 for 'false' and 'true' (in this order)
99 yes_id is the lang_id for the 'yes' (or 'on') option in the menu
100 no_id is the lang_id for the 'no' (or 'off') option in the menu
102 #define BOOL_SETTING(flags,var,lang_id,default,name,cfgvals,yes_id,no_id,cb)\
103 {flags|F_BOOL_SETTING, &global_settings.var, \
104 lang_id, BOOL(default),name,cfgvals, \
105 {.bool_setting=(struct bool_setting[]){{cb,yes_id,no_id}}} }
107 /* bool setting which does use LANG_YES and _NO and save as "off,on" */
108 #define OFFON_SETTING(flags,var,lang_id,default,name,cb) \
109 BOOL_SETTING(flags,var,lang_id,default,name,off_on, \
110 LANG_SET_BOOL_YES,LANG_SET_BOOL_NO,cb)
112 /* int variable which is NOT saved to .cfg files,
113 (Use NVRAM() in the flags to save to the nvram (or nvram.bin file) */
114 #define SYSTEM_SETTING(flags,var,default) \
115 {flags|F_T_INT, &global_status.var,-1, INT(default), \
116 NULL, NULL, UNUSED}
118 /* setting which stores as a filename (or another string) in the .cfgvals
119 The string must be a char array (which all of our string settings are),
120 not just a char pointer.
121 prefix: The absolute path to not save in the variable, ex /.rockbox/wps_file
122 suffix: The file extention (usually...) e.g .wps_file
123 If the prefix is set (not NULL), then the suffix must be set as well.
125 #define TEXT_SETTING(flags,var,name,default,prefix,suffix) \
126 {flags|F_T_UCHARPTR, &global_settings.var,-1, \
127 CHARPTR(default),name,NULL, \
128 {.filename_setting= \
129 (struct filename_setting[]){ \
130 {prefix,suffix,sizeof(global_settings.var)}}} }
132 /* Used for settings which use the set_option() setting screen.
133 The ... arg is a list of pointers to strings to display in the setting
134 screen. These can either be literal strings, or ID2P(LANG_*) */
135 #define CHOICE_SETTING(flags,var,lang_id,default,name,cfg_vals,cb,count,...) \
136 {flags|F_CHOICE_SETTING|F_T_INT, &global_settings.var, lang_id, \
137 INT(default), name, cfg_vals, \
138 {.choice_setting = (struct choice_setting[]){ \
139 {cb, count, {.desc = (const unsigned char*[]) \
140 {__VA_ARGS__}}}}}}
142 /* Similar to above, except the strings to display are taken from cfg_vals,
143 the ... arg is a list of ID's to talk for the strings, can use TALK_ID()'s */
144 #define STRINGCHOICE_SETTING(flags,var,lang_id,default,name,cfg_vals, \
145 cb,count,...) \
146 {flags|F_CHOICE_SETTING|F_T_INT|F_CHOICETALKS, \
147 &global_settings.var, lang_id, \
148 INT(default), name, cfg_vals, \
149 {.choice_setting = (struct choice_setting[]){ \
150 {cb, count, {.talks = (const int[]){__VA_ARGS__}}}}}}
152 /* for settings which use the set_int() setting screen.
153 unit is the UNIT_ define to display/talk.
154 the first one saves a string to the config file,
155 the second one saves the variable value to the config file */
156 #define INT_SETTING_W_CFGVALS(flags, var, lang_id, default, name, cfg_vals, \
157 unit, min, max, step, formatter, get_talk_id, cb) \
158 {flags|F_INT_SETTING|F_T_INT, &global_settings.var, \
159 lang_id, INT(default), name, cfg_vals, \
160 {.int_setting = (struct int_setting[]){ \
161 {cb, unit, min, max, step, formatter, get_talk_id}}}}
162 #define INT_SETTING(flags, var, lang_id, default, name, \
163 unit, min, max, step, formatter, get_talk_id, cb) \
164 {flags|F_INT_SETTING|F_T_INT, &global_settings.var, \
165 lang_id, INT(default), name, NULL, \
166 {.int_setting = (struct int_setting[]){ \
167 {cb, unit, min, max, step, formatter, get_talk_id}}}}
168 #define INT_SETTING_NOWRAP(flags, var, lang_id, default, name, \
169 unit, min, max, step, formatter, get_talk_id, cb) \
170 {flags|F_INT_SETTING|F_T_INT|F_NO_WRAP, &global_settings.var, \
171 lang_id, INT(default), name, NULL, \
172 {.int_setting = (struct int_setting[]){ \
173 {cb, unit, min, max, step, formatter, get_talk_id}}}}
175 #define TABLE_SETTING(flags, var, lang_id, default, name, cfg_vals, \
176 unit, formatter, get_talk_id, cb, count, ...) \
177 {flags|F_TABLE_SETTING|F_T_INT, &global_settings.var, \
178 lang_id, INT(default), name, cfg_vals, \
179 {.table_setting = (struct table_setting[]) { \
180 {cb, formatter, get_talk_id, unit, count, \
181 (const int[]){__VA_ARGS__}}}}}
183 #define CUSTOM_SETTING(flags, var, lang_id, default, name, \
184 load_from_cfg, write_to_cfg, \
185 is_change, set_default) \
186 {flags|F_CUSTOM_SETTING|F_T_CUSTOM|F_BANFROMQS, \
187 &global_settings.var, lang_id, \
188 {.custom = (void*)default}, name, NULL, \
189 {.custom_setting = (struct custom_setting[]){ \
190 {load_from_cfg, write_to_cfg, is_change, set_default}}}}
192 #define VIEWPORT_SETTING(var,name) \
193 TEXT_SETTING(F_THEMESETTING,var,name,"-", NULL, NULL)
195 /* some sets of values which are used more than once, to save memory */
196 static const char off_on[] = "off,on";
197 static const char off_on_ask[] = "off,on,ask";
198 static const char off_number_spell[] = "off,number,spell";
199 #ifdef HAVE_LCD_BITMAP
200 static const char graphic_numeric[] = "graphic,numeric";
201 #endif
203 /* Default theme settings */
204 #define DEFAULT_WPSNAME "cabbiev2"
205 #define DEFAULT_SBSNAME "-"
206 #define DEFAULT_FMS_NAME DEFAULT_WPSNAME
208 #ifdef HAVE_LCD_BITMAP
210 #if LCD_HEIGHT <= 64
211 #define DEFAULT_FONTNAME "08-Rockfont"
212 #elif LCD_HEIGHT <= 80
213 #define DEFAULT_FONTNAME "11-Sazanami-Mincho"
214 #elif LCD_HEIGHT <= 220
215 #define DEFAULT_FONTNAME "12-Adobe-Helvetica"
216 #elif LCD_HEIGHT <= 320
217 #define DEFAULT_FONTNAME "15-Adobe-Helvetica"
218 #elif LCD_HEIGHT <= 400
219 #define DEFAULT_FONTNAME "16-Adobe-Helvetica"
220 #elif LCD_HEIGHT <= 480 && !(CONFIG_PLATFORM & (PLATFORM_MAEMO|PLATFORM_PANDORA))
221 #define DEFAULT_FONTNAME "27-Adobe-Helvetica"
222 #else
223 #define DEFAULT_FONTNAME "35-Adobe-Helvetica"
224 #endif
226 #else
227 #define DEFAULT_FONTNAME ""
228 #endif
230 #ifdef HAVE_REMOTE_LCD
231 #if LCD_REMOTE_HEIGHT <= 64
232 #define DEFAULT_REMOTE_FONTNAME "08-Rockfont"
233 #else
234 #define DEFAULT_REMOTE_FONTNAME "-"
235 #endif
236 #endif /* HAVE_REMOTE_LCD */
238 #ifdef HAVE_LCD_COLOR
239 #define DEFAULT_ICONSET "tango_small"
240 #define DEFAULT_VIEWERS_ICONSET "tango_small_viewers"
241 #elif LCD_DEPTH >= 2
242 #define DEFAULT_ICONSET "tango_small_mono"
243 #define DEFAULT_VIEWERS_ICONSET "tango_small_viewers_mono"
244 #else /* monochrome */
245 #define DEFAULT_ICONSET ""
246 #define DEFAULT_VIEWERS_ICONSET ""
247 #endif
249 #define DEFAULT_THEME_FOREGROUND LCD_RGBPACK(0xce, 0xcf, 0xce)
250 #define DEFAULT_THEME_BACKGROUND LCD_RGBPACK(0x00, 0x00, 0x00)
251 #define DEFAULT_THEME_SELECTOR_START LCD_RGBPACK(0xff, 0xeb, 0x9c)
252 #define DEFAULT_THEME_SELECTOR_END LCD_RGBPACK(0xb5, 0x8e, 0x00)
253 #define DEFAULT_THEME_SELECTOR_TEXT LCD_RGBPACK(0x00, 0x00, 0x00)
255 #define DEFAULT_BACKDROP BACKDROP_DIR "/cabbiev2.bmp"
257 #ifdef HAVE_RECORDING
258 /* these should be in the config.h files */
259 #if CONFIG_CODEC == MAS3587F
260 # define DEFAULT_REC_MIC_GAIN 8
261 # define DEFAULT_REC_LEFT_GAIN 2
262 # define DEFAULT_REC_RIGHT_GAIN 2
263 #elif CONFIG_CODEC == SWCODEC
264 # ifdef HAVE_UDA1380
265 # define DEFAULT_REC_MIC_GAIN 16
266 # define DEFAULT_REC_LEFT_GAIN 0
267 # define DEFAULT_REC_RIGHT_GAIN 0
268 # elif defined(HAVE_TLV320)
269 # define DEFAULT_REC_MIC_GAIN 0
270 # define DEFAULT_REC_LEFT_GAIN 0
271 # define DEFAULT_REC_RIGHT_GAIN 0
272 # elif defined(HAVE_WM8975)
273 # define DEFAULT_REC_MIC_GAIN 16
274 # define DEFAULT_REC_LEFT_GAIN 0
275 # define DEFAULT_REC_RIGHT_GAIN 0
276 # elif defined(HAVE_WM8758)
277 # define DEFAULT_REC_MIC_GAIN 16
278 # define DEFAULT_REC_LEFT_GAIN 0
279 # define DEFAULT_REC_RIGHT_GAIN 0
280 # elif defined(HAVE_WM8731)
281 # define DEFAULT_REC_MIC_GAIN 16
282 # define DEFAULT_REC_LEFT_GAIN 0
283 # define DEFAULT_REC_RIGHT_GAIN 0
284 # endif
285 #endif
287 #endif /* HAVE_RECORDING */
289 static const char* formatter_unit_0_is_off(char *buffer, size_t buffer_size,
290 int val, const char *unit)
292 if (val == 0)
293 return str(LANG_OFF);
294 else
295 snprintf(buffer, buffer_size, "%d %s", val, unit);
296 return buffer;
299 static int32_t getlang_unit_0_is_off(int value, int unit)
301 if (value == 0)
302 return LANG_OFF;
303 else
304 return TALK_ID(value,unit);
307 static const char* formatter_unit_0_is_skip_track(char *buffer, size_t buffer_size,
308 int val, const char *unit)
310 (void)unit;
311 if (val == -1)
312 return str(LANG_SKIP_OUTRO);
313 else if (val == 0)
314 return str(LANG_SKIP_TRACK);
315 else if (val % 60 == 0)
316 snprintf(buffer, buffer_size, "%d min", val/60);
317 else
318 snprintf(buffer, buffer_size, "%d s", val);
319 return buffer;
322 static int32_t getlang_unit_0_is_skip_track(int value, int unit)
324 (void)unit;
325 if (value == -1)
326 return LANG_SKIP_OUTRO;
327 else if (value == 0)
328 return LANG_SKIP_TRACK;
329 else if (value % 60 == 0)
330 return TALK_ID(value/60, UNIT_MIN);
331 else
332 return TALK_ID(value, UNIT_SEC);
335 #ifdef HAVE_BACKLIGHT
336 #ifdef SIMULATOR
337 #define DEFAULT_BACKLIGHT_TIMEOUT 0
338 #else
339 #define DEFAULT_BACKLIGHT_TIMEOUT 15
340 #endif
341 static const char* backlight_formatter(char *buffer, size_t buffer_size,
342 int val, const char *unit)
344 if (val == -1)
345 return str(LANG_OFF);
346 else if (val == 0)
347 return str(LANG_ON);
348 else
349 snprintf(buffer, buffer_size, "%d %s", val, unit);
350 return buffer;
352 static int32_t backlight_getlang(int value, int unit)
354 if (value == -1)
355 return LANG_OFF;
356 else if (value == 0)
357 return LANG_ON;
358 else
359 return TALK_ID(value, unit);
361 #endif
363 #ifndef HAVE_WHEEL_ACCELERATION
364 static const char* scanaccel_formatter(char *buffer, size_t buffer_size,
365 int val, const char *unit)
367 (void)unit;
368 if (val == 0)
369 return str(LANG_OFF);
370 else
371 snprintf(buffer, buffer_size, "Speed up every %ds", val);
372 return buffer;
374 #endif
376 #if CONFIG_CODEC == SWCODEC
377 static void crossfeed_cross_set(int val)
379 (void)val;
380 dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain,
381 global_settings.crossfeed_hf_attenuation,
382 global_settings.crossfeed_hf_cutoff);
385 static void compressor_set(int val)
387 (void)val;
388 dsp_set_compressor();
391 static const char* db_format(char* buffer, size_t buffer_size, int value,
392 const char* unit)
394 int v = abs(value);
396 snprintf(buffer, buffer_size, "%s%d.%d %s", value < 0 ? "-" : "",
397 v / 10, v % 10, unit);
398 return buffer;
401 static int32_t get_dec_talkid(int value, int unit)
403 return TALK_ID_DECIMAL(value, 1, unit);
406 static int32_t get_precut_talkid(int value, int unit)
408 return TALK_ID_DECIMAL(-value, 1, unit);
411 #endif
412 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
413 static void set_mdb_enable(bool value)
415 sound_set_mdb_enable((int)value);
417 static void set_superbass(bool value)
419 sound_set_superbass((int)value);
421 #endif
423 #ifdef HAVE_QUICKSCREEN
424 static int find_setting_by_name(char*name)
426 int i = 0;
427 const struct settings_list *setting;
428 if (!strcmp(name, "-"))
429 return -1;
430 while (i<nb_settings)
432 setting = &settings[i];
433 if (setting->cfg_name && !strcmp(setting->cfg_name, name))
435 return i;
437 i++;
439 return -1;
441 static void qs_load_from_cfg(void* var, char*value)
443 *(int*)var = find_setting_by_name(value);
445 static char* qs_write_to_cfg(void* setting, char*buf, int buf_len)
447 int index = *(int*)setting;
448 if (index < 0 || index >= nb_settings - 1)
450 strlcpy(buf, "-", buf_len);
451 return buf;
453 const struct settings_list *var = &settings[index];
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 if (defaultval == NULL)
468 *(int*)setting = -1;
469 find_setting(defaultval, (int*)setting);
471 #endif
472 #ifdef HAVE_TOUCHSCREEN
474 #if defined(APPLICATION) \
475 || defined(ONDA_VX747) \
476 || defined(ONDA_VX767) \
477 || defined(ONDA_VX747P) \
478 || defined(ONDA_VX777)
480 #define DEFAULT_TOUCHSCREEN_MODE TOUCHSCREEN_POINT
481 #else
482 #define DEFAULT_TOUCHSCREEN_MODE TOUCHSCREEN_BUTTON
483 #endif
485 static void tsc_load_from_cfg(void* setting, char*value)
487 struct touchscreen_parameter *var = (struct touchscreen_parameter*) setting;
489 /* Replacement for sscanf(value, "%d ..., &var->A, ...); */
490 int vals[7], count = 0;
491 while(*value != 0 && count < 7)
493 if(isspace(*value))
494 value++;
495 else
497 vals[count++] = atoi(value);
498 while(!isspace(*value))
499 value++;
502 var->A = vals[0];
503 var->B = vals[1];
504 var->C = vals[2];
505 var->D = vals[3];
506 var->E = vals[4];
507 var->F = vals[5];
508 var->divider = vals[6];
511 static char* tsc_write_to_cfg(void* setting, char*buf, int buf_len)
513 const struct touchscreen_parameter *var = (const struct touchscreen_parameter*) setting;
514 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);
515 return buf;
517 static bool tsc_is_changed(void* setting, void* defaultval)
519 return memcmp(setting, defaultval, sizeof(struct touchscreen_parameter)) != 0;
521 static void tsc_set_default(void* setting, void* defaultval)
523 memcpy(setting, defaultval, sizeof(struct touchscreen_parameter));
525 #endif
526 #ifdef HAVE_HOTKEY
527 static const char* hotkey_formatter(char* buffer, size_t buffer_size, int value,
528 const char* unit)
530 (void)buffer;
531 (void)buffer_size;
532 (void)unit;
533 return str(get_hotkey_lang_id(value));
535 static int32_t hotkey_getlang(int value, int unit)
537 (void)unit;
538 return get_hotkey_lang_id(value);
540 #endif /* HAVE_HOTKEY */
541 const struct settings_list settings[] = {
542 /* sound settings */
543 SOUND_SETTING(F_NO_WRAP,volume, LANG_VOLUME, "volume", SOUND_VOLUME),
544 SOUND_SETTING(0, balance, LANG_BALANCE, "balance", SOUND_BALANCE),
545 /* Tone controls */
546 #ifdef AUDIOHW_HAVE_BASS
547 SOUND_SETTING(F_NO_WRAP,bass, LANG_BASS, "bass", SOUND_BASS),
548 #endif
549 #ifdef AUDIOHW_HAVE_TREBLE
550 SOUND_SETTING(F_NO_WRAP,treble, LANG_TREBLE, "treble", SOUND_TREBLE),
551 #endif
552 /* Hardware EQ tone controls */
553 #ifdef AUDIOHW_HAVE_EQ
554 /* Band gain is generic */
555 SOUND_SETTING(F_NO_WRAP, hw_eq_bands[AUDIOHW_EQ_BAND1].gain,
556 LANG_HW_EQ_GAIN, "tone band1 gain", SOUND_EQ_BAND1_GAIN),
557 #ifdef AUDIOHW_HAVE_EQ_BAND2
558 SOUND_SETTING(F_NO_WRAP, hw_eq_bands[AUDIOHW_EQ_BAND2].gain,
559 LANG_HW_EQ_GAIN, "tone band2 gain", SOUND_EQ_BAND2_GAIN),
560 #endif /* AUDIOHW_HAVE_EQ_BAND2 */
561 #ifdef AUDIOHW_HAVE_EQ_BAND3
562 SOUND_SETTING(F_NO_WRAP, hw_eq_bands[AUDIOHW_EQ_BAND3].gain,
563 LANG_HW_EQ_GAIN, "tone band3 gain", SOUND_EQ_BAND3_GAIN),
564 #endif /* AUDIOHW_HAVE_EQ_BAND3 */
565 #ifdef AUDIOHW_HAVE_EQ_BAND4
566 SOUND_SETTING(F_NO_WRAP, hw_eq_bands[AUDIOHW_EQ_BAND4].gain,
567 LANG_HW_EQ_GAIN, "tone band4 gain", SOUND_EQ_BAND4_GAIN),
568 #endif /* AUDIOHW_HAVE_EQ_BAND4 */
569 #ifdef AUDIOHW_HAVE_EQ_BAND5
570 SOUND_SETTING(F_NO_WRAP, hw_eq_bands[AUDIOHW_EQ_BAND5].gain,
571 LANG_HW_EQ_GAIN, "tone band5 gain", SOUND_EQ_BAND5_GAIN),
572 #endif /* AUDIOHW_HAVE_EQ_BAND5 */
573 #ifdef HAVE_WM8978
574 /* Frequencies vary with samplerate but at least the user has an idea
575 * about the bands and it will be correct with normal playback rates. */
576 /* Band 1 */
577 STRINGCHOICE_SETTING(F_SOUNDSETTING,
578 hw_eq_bands[AUDIOHW_EQ_BAND1].frequency,
579 LANG_HW_EQ_FREQUENCY, 0,"tone band1 frequency",
580 "80 Hz,105 Hz,135 Hz,175 Hz",
581 sound_set_hw_eq_band1_frequency, 4,
582 TALK_ID(80, UNIT_HERTZ), TALK_ID(105, UNIT_HERTZ),
583 TALK_ID(135, UNIT_HERTZ), TALK_ID(175, UNIT_HERTZ)),
584 /* Band 2 */
585 STRINGCHOICE_SETTING(F_SOUNDSETTING,
586 hw_eq_bands[AUDIOHW_EQ_BAND2].frequency,
587 LANG_HW_EQ_FREQUENCY, 0,"tone band2 frequency",
588 "230 Hz,300 Hz,385 Hz,500 Hz",
589 sound_set_hw_eq_band2_frequency, 4,
590 TALK_ID(230, UNIT_HERTZ), TALK_ID(300, UNIT_HERTZ),
591 TALK_ID(385, UNIT_HERTZ), TALK_ID(500, UNIT_HERTZ)),
592 CHOICE_SETTING(F_SOUNDSETTING, hw_eq_bands[AUDIOHW_EQ_BAND2].width,
593 LANG_HW_EQ_WIDTH, 0, "tone band2 width", "narrow,wide",
594 sound_set_hw_eq_band2_width, 2,
595 ID2P(LANG_HW_EQ_WIDTH_NARROW), ID2P(LANG_HW_EQ_WIDTH_WIDE)),
596 /* Band 3 */
597 STRINGCHOICE_SETTING(F_SOUNDSETTING,
598 hw_eq_bands[AUDIOHW_EQ_BAND3].frequency,
599 LANG_HW_EQ_FREQUENCY, 0, "tone band3 frequency",
600 "650 Hz,850 Hz,1.1 kHz,1.4 kHz",
601 sound_set_hw_eq_band3_frequency, 4,
602 TALK_ID(650, UNIT_HERTZ), TALK_ID(850, UNIT_HERTZ),
603 TALK_ID_DECIMAL(11, 1, UNIT_KHZ),
604 TALK_ID_DECIMAL(14, 1, UNIT_KHZ)),
605 CHOICE_SETTING(F_SOUNDSETTING,hw_eq_bands[AUDIOHW_EQ_BAND3].width,
606 LANG_HW_EQ_WIDTH, 0, "tone band3 width", "narrow,wide",
607 sound_set_hw_eq_band3_width, 2,
608 ID2P(LANG_HW_EQ_WIDTH_NARROW), ID2P(LANG_HW_EQ_WIDTH_WIDE)),
609 /* Band 4 */
610 STRINGCHOICE_SETTING(F_SOUNDSETTING,
611 hw_eq_bands[AUDIOHW_EQ_BAND4].frequency,
612 LANG_HW_EQ_FREQUENCY, 0, "tone band4 frequency",
613 "1.8 kHz,2.4 kHz,3.2 kHz,4.1 kHz",
614 sound_set_hw_eq_band4_frequency, 4,
615 TALK_ID_DECIMAL(18, 1, UNIT_KHZ),
616 TALK_ID_DECIMAL(24, 1, UNIT_KHZ),
617 TALK_ID_DECIMAL(32, 1, UNIT_KHZ),
618 TALK_ID_DECIMAL(41, 1, UNIT_KHZ)),
619 CHOICE_SETTING(F_SOUNDSETTING, hw_eq_bands[AUDIOHW_EQ_BAND4].width,
620 LANG_HW_EQ_WIDTH, 0, "tone band4 width", "narrow,wide",
621 sound_set_hw_eq_band4_width, 2,
622 ID2P(LANG_HW_EQ_WIDTH_NARROW), ID2P(LANG_HW_EQ_WIDTH_WIDE)),
623 /* Band 5 */
624 STRINGCHOICE_SETTING(F_SOUNDSETTING,
625 hw_eq_bands[AUDIOHW_EQ_BAND5].frequency,
626 LANG_HW_EQ_FREQUENCY, 0, "tone band5 frequency",
627 "5.3 kHz,6.9 kHz,9.0 kHz,11.7 kHz",
628 sound_set_hw_eq_band5_frequency, 4,
629 TALK_ID_DECIMAL(53, 1, UNIT_KHZ),
630 TALK_ID_DECIMAL(69, 1, UNIT_KHZ),
631 TALK_ID_DECIMAL(90, 1, UNIT_KHZ),
632 TALK_ID_DECIMAL(117, 1, UNIT_KHZ)),
633 #endif /* HAVE_WM8978 */
634 #endif /* AUDIOHW_HAVE_EQ */
635 /* 3-d enhancement effect */
636 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
637 SOUND_SETTING(0,loudness, LANG_LOUDNESS, "loudness", SOUND_LOUDNESS),
638 STRINGCHOICE_SETTING(F_SOUNDSETTING,avc,LANG_AUTOVOL,0,"auto volume",
639 "off,20ms,2,4,8,", sound_set_avc, 5,
640 LANG_OFF,TALK_ID(20, UNIT_MS),TALK_ID(2, UNIT_SEC),
641 TALK_ID(4, UNIT_SEC),TALK_ID(8, UNIT_SEC)),
642 OFFON_SETTING(F_SOUNDSETTING, superbass, LANG_SUPERBASS, false, "superbass",
643 set_superbass),
644 #endif
646 CHOICE_SETTING(F_SOUNDSETTING, channel_config, LANG_CHANNEL_CONFIGURATION,
647 0,"channels",
648 "stereo,mono,custom,mono left,mono right,karaoke",
649 sound_set_channels, 6,
650 ID2P(LANG_CHANNEL_STEREO), ID2P(LANG_CHANNEL_MONO),
651 ID2P(LANG_CHANNEL_CUSTOM), ID2P(LANG_CHANNEL_LEFT),
652 ID2P(LANG_CHANNEL_RIGHT), ID2P(LANG_CHANNEL_KARAOKE)),
653 SOUND_SETTING(F_SOUNDSETTING, stereo_width, LANG_STEREO_WIDTH,
654 "stereo_width", SOUND_STEREO_WIDTH),
655 #ifdef AUDIOHW_HAVE_DEPTH_3D
656 SOUND_SETTING(0,depth_3d, LANG_DEPTH_3D, "3-d enhancement",
657 SOUND_DEPTH_3D),
658 #endif
659 /* playback */
660 OFFON_SETTING(0, playlist_shuffle, LANG_SHUFFLE, false, "shuffle", NULL),
661 SYSTEM_SETTING(NVRAM(4), resume_index, -1),
662 SYSTEM_SETTING(NVRAM(4), resume_offset, -1),
663 CHOICE_SETTING(0, repeat_mode, LANG_REPEAT, REPEAT_OFF, "repeat",
664 "off,all,one,shuffle"
665 #ifdef AB_REPEAT_ENABLE
666 ",ab"
667 #endif
668 , NULL,
669 #ifdef AB_REPEAT_ENABLE
671 #else
673 #endif
674 ID2P(LANG_OFF), ID2P(LANG_ALL), ID2P(LANG_REPEAT_ONE),
675 ID2P(LANG_SHUFFLE)
676 #ifdef AB_REPEAT_ENABLE
677 ,ID2P(LANG_REPEAT_AB)
678 #endif
679 ), /* CHOICE_SETTING( repeat_mode ) */
680 /* LCD */
681 #ifdef HAVE_LCD_CONTRAST
682 /* its easier to leave this one un-macro()ed for the time being */
683 { F_T_INT|F_DEF_ISFUNC|F_INT_SETTING, &global_settings.contrast,
684 LANG_CONTRAST, FUNCTYPE(lcd_default_contrast), "contrast", NULL , {
685 .int_setting = (struct int_setting[]) {
686 { lcd_set_contrast, UNIT_INT, MIN_CONTRAST_SETTING,
687 MAX_CONTRAST_SETTING, 1, NULL, NULL }}}},
688 #endif
689 #ifdef HAVE_BACKLIGHT
690 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, backlight_timeout, LANG_BACKLIGHT,
691 DEFAULT_BACKLIGHT_TIMEOUT,
692 "backlight timeout", off_on, UNIT_SEC, backlight_formatter,
693 backlight_getlang, backlight_set_timeout, 20,
694 -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120),
695 #if CONFIG_CHARGING
696 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, backlight_timeout_plugged,
697 LANG_BACKLIGHT_ON_WHEN_CHARGING, 10,
698 "backlight timeout plugged", off_on, UNIT_SEC,
699 backlight_formatter, backlight_getlang,
700 backlight_set_timeout_plugged, 20,
701 -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120),
702 #endif
703 #endif /* HAVE_BACKLIGHT */
704 #ifdef HAVE_LCD_BITMAP
705 #ifdef HAVE_LCD_INVERT
706 BOOL_SETTING(0, invert, LANG_INVERT, false ,"invert", off_on,
707 LANG_INVERT_LCD_INVERSE, LANG_NORMAL, lcd_set_invert_display),
708 #endif
709 #ifdef HAVE_LCD_FLIP
710 OFFON_SETTING(0, flip_display, LANG_FLIP_DISPLAY, false, "flip display",
711 NULL),
712 #endif
713 /* display */
714 CHOICE_SETTING(F_TEMPVAR|F_THEMESETTING, cursor_style, LANG_INVERT_CURSOR,
715 #ifdef HAVE_LCD_COLOR
716 3, "selector type",
717 "pointer,bar (inverse),bar (color),bar (gradient)", NULL, 4,
718 ID2P(LANG_INVERT_CURSOR_POINTER),
719 ID2P(LANG_INVERT_CURSOR_BAR),
720 ID2P(LANG_INVERT_CURSOR_COLOR),
721 ID2P(LANG_INVERT_CURSOR_GRADIENT)),
722 #else
723 1, "selector type", "pointer,bar (inverse)", NULL, 2,
724 ID2P(LANG_INVERT_CURSOR_POINTER),
725 ID2P(LANG_INVERT_CURSOR_BAR)),
726 #endif
727 CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, statusbar,
728 LANG_STATUS_BAR, STATUSBAR_TOP, "statusbar","off,top,bottom",
729 NULL, 3, ID2P(LANG_OFF), ID2P(LANG_STATUSBAR_TOP),
730 ID2P(LANG_STATUSBAR_BOTTOM)),
731 #ifdef HAVE_REMOTE_LCD
732 CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, remote_statusbar,
733 LANG_REMOTE_STATUSBAR, STATUSBAR_TOP, "remote statusbar","off,top,bottom",
734 NULL, 3, ID2P(LANG_OFF), ID2P(LANG_STATUSBAR_TOP),
735 ID2P(LANG_STATUSBAR_BOTTOM)),
736 #endif
737 CHOICE_SETTING(F_THEMESETTING|F_TEMPVAR, scrollbar,
738 LANG_SCROLL_BAR, SCROLLBAR_LEFT, "scrollbar","off,left,right",
739 NULL, 3, ID2P(LANG_OFF), ID2P(LANG_LEFT), ID2P(LANG_RIGHT)),
740 INT_SETTING(F_THEMESETTING, scrollbar_width, LANG_SCROLLBAR_WIDTH, 6,
741 "scrollbar width",UNIT_INT, 3, MAX(LCD_WIDTH/10,25), 1,
742 NULL, NULL, NULL),
743 #if CONFIG_KEYPAD == RECORDER_PAD
744 OFFON_SETTING(F_THEMESETTING,buttonbar, LANG_BUTTON_BAR ,true,"buttonbar", NULL),
745 #endif
746 CHOICE_SETTING(F_THEMESETTING, volume_type, LANG_VOLUME_DISPLAY, 0,
747 "volume display", graphic_numeric, NULL, 2,
748 ID2P(LANG_DISPLAY_GRAPHIC),
749 ID2P(LANG_DISPLAY_NUMERIC)),
750 CHOICE_SETTING(F_THEMESETTING, battery_display, LANG_BATTERY_DISPLAY, 0,
751 "battery display", graphic_numeric, NULL, 2,
752 ID2P(LANG_DISPLAY_GRAPHIC), ID2P(LANG_DISPLAY_NUMERIC)),
753 #if CONFIG_RTC
754 CHOICE_SETTING(0, timeformat, LANG_TIMEFORMAT, 0,
755 "time format", "24hour,12hour", NULL, 2,
756 ID2P(LANG_24_HOUR_CLOCK), ID2P(LANG_12_HOUR_CLOCK)),
757 #endif
758 #endif /* HAVE_LCD_BITMAP */
759 OFFON_SETTING(0,show_icons, LANG_SHOW_ICONS ,true,"show icons", NULL),
760 /* system */
761 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, poweroff, LANG_POWEROFF_IDLE, 10,
762 "idle poweroff", "off", UNIT_MIN, formatter_unit_0_is_off,
763 getlang_unit_0_is_off, set_poweroff_timeout, 15,
764 0,1,2,3,4,5,6,7,8,9,10,15,30,45,60),
765 SYSTEM_SETTING(NVRAM(4), runtime, 0),
766 SYSTEM_SETTING(NVRAM(4), topruntime, 0),
767 INT_SETTING(F_BANFROMQS, max_files_in_playlist,
768 LANG_MAX_FILES_IN_PLAYLIST,
769 #if MEMORYSIZE > 1
770 10000,
771 #else
772 400,
773 #endif
774 "max files in playlist", UNIT_INT, 1000, 32000, 1000,
775 NULL, NULL, NULL),
776 INT_SETTING(F_BANFROMQS, max_files_in_dir, LANG_MAX_FILES_IN_DIR,
777 #if MEMORYSIZE > 1
778 1000,
779 #else
780 200,
781 #endif
782 "max files in dir", UNIT_INT, 50, 10000, 50,
783 NULL, NULL, NULL),
784 /* use this setting for user code even if there's no exchangable battery
785 * support enabled */
786 #ifdef BATTERY_CAPACITY_DEFAULT
787 /* define min/max/inc for this file if there's only one battery */
788 #ifndef BATTERY_CAPACITY_MIN
789 #define BATTERY_CAPACITY_MIN BATTERY_CAPACITY_DEFAULT
790 #define BATTERY_CAPACITY_MAX BATTERY_CAPACITY_DEFAULT
791 #define BATTERY_CAPACITY_INC 0
792 #endif
793 #if defined(IPOD_VIDEO) && !defined(SIMULATOR)
794 /* its easier to leave this one un-macro()ed for the time being */
795 { F_T_INT|F_DEF_ISFUNC|F_INT_SETTING, &global_settings.battery_capacity,
796 LANG_BATTERY_CAPACITY, FUNCTYPE(battery_default_capacity),
797 "battery capacity", NULL , {
798 .int_setting = (struct int_setting[]) {
799 { set_battery_capacity, UNIT_MAH, BATTERY_CAPACITY_MIN,
800 BATTERY_CAPACITY_MAX, BATTERY_CAPACITY_INC, NULL, NULL }}}},
801 #else /* IPOD_VIDEO */
802 INT_SETTING(0, battery_capacity, LANG_BATTERY_CAPACITY,
803 BATTERY_CAPACITY_DEFAULT, "battery capacity", UNIT_MAH,
804 BATTERY_CAPACITY_MIN, BATTERY_CAPACITY_MAX,
805 BATTERY_CAPACITY_INC, NULL, NULL, set_battery_capacity),
806 #endif /* IPOD_VIDEO */
807 #endif
808 #if CONFIG_CHARGING
809 OFFON_SETTING(NVRAM(1), car_adapter_mode,
810 LANG_CAR_ADAPTER_MODE, false, "car adapter mode", NULL),
811 #endif
812 #ifdef IPOD_ACCESSORY_PROTOCOL
813 CHOICE_SETTING(0, serial_bitrate, LANG_SERIAL_BITRATE, 0, "serial bitrate",
814 "auto,9600,19200,38400,57600", iap_bitrate_set, 5, ID2P(LANG_SERIAL_BITRATE_AUTO),
815 ID2P(LANG_SERIAL_BITRATE_9600),ID2P(LANG_SERIAL_BITRATE_19200),
816 ID2P(LANG_SERIAL_BITRATE_38400),ID2P(LANG_SERIAL_BITRATE_57600)),
817 #endif
818 #ifdef HAVE_ACCESSORY_SUPPLY
819 OFFON_SETTING(0, accessory_supply, LANG_ACCESSORY_SUPPLY,
820 true, "accessory power supply", accessory_supply_set),
821 #endif
822 #ifdef HAVE_LINEOUT_POWEROFF
823 OFFON_SETTING(0, lineout_active, LANG_LINEOUT_ONOFF,
824 true, "lineout", lineout_set),
825 #endif
826 /* tuner */
827 #if CONFIG_TUNER
828 OFFON_SETTING(0,fm_force_mono, LANG_FM_MONO_MODE,
829 false, "force fm mono", toggle_mono_mode),
830 SYSTEM_SETTING(NVRAM(4),last_frequency,0),
831 #endif
833 #if BATTERY_TYPES_COUNT > 1
834 CHOICE_SETTING(0, battery_type, LANG_BATTERY_TYPE, 0, "battery type",
835 "alkaline,nimh", NULL, 2, ID2P(LANG_BATTERY_TYPE_ALKALINE),
836 ID2P(LANG_BATTERY_TYPE_NIMH)),
837 #endif
838 #ifdef HAVE_REMOTE_LCD
839 /* remote lcd */
840 INT_SETTING(0, remote_contrast, LANG_CONTRAST,
841 DEFAULT_REMOTE_CONTRAST_SETTING, "remote contrast", UNIT_INT,
842 MIN_REMOTE_CONTRAST_SETTING, MAX_REMOTE_CONTRAST_SETTING, 1,
843 NULL, NULL, lcd_remote_set_contrast),
844 BOOL_SETTING(0, remote_invert, LANG_INVERT, false ,"remote invert", off_on,
845 LANG_INVERT_LCD_INVERSE, LANG_NORMAL,
846 lcd_remote_set_invert_display),
847 OFFON_SETTING(0,remote_flip_display, LANG_FLIP_DISPLAY,
848 false,"remote flip display", NULL),
849 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, remote_backlight_timeout,
850 LANG_BACKLIGHT, 5, "remote backlight timeout", off_on,
851 UNIT_SEC, backlight_formatter, backlight_getlang,
852 remote_backlight_set_timeout, 20,
853 -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120),
854 #if CONFIG_CHARGING
855 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, remote_backlight_timeout_plugged,
856 LANG_BACKLIGHT_ON_WHEN_CHARGING, 10,
857 "remote backlight timeout plugged", off_on, UNIT_SEC,
858 backlight_formatter, backlight_getlang,
859 remote_backlight_set_timeout_plugged, 20,
860 -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120),
861 #endif
862 #ifdef HAVE_REMOTE_LCD_TICKING
863 OFFON_SETTING(0, remote_reduce_ticking, LANG_REDUCE_TICKING,
864 false,"remote reduce ticking", NULL),
865 #endif
866 #endif
868 #ifdef HAVE_BACKLIGHT
869 OFFON_SETTING(0, bl_filter_first_keypress,
870 LANG_BACKLIGHT_FILTER_FIRST_KEYPRESS, false,
871 "backlight filters first keypress", NULL),
872 #ifdef HAVE_REMOTE_LCD
873 OFFON_SETTING(0, remote_bl_filter_first_keypress,
874 LANG_BACKLIGHT_FILTER_FIRST_KEYPRESS, false,
875 "backlight filters first remote keypress", NULL),
876 #endif
877 #endif /* HAVE_BACKLIGHT */
879 /** End of old RTC config block **/
881 #ifdef HAVE_BACKLIGHT
882 OFFON_SETTING(0, caption_backlight, LANG_CAPTION_BACKLIGHT,
883 false, "caption backlight", NULL),
884 #ifdef HAVE_REMOTE_LCD
885 OFFON_SETTING(0, remote_caption_backlight, LANG_CAPTION_BACKLIGHT,
886 false, "remote caption backlight", NULL),
887 #endif
888 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
889 INT_SETTING(F_NO_WRAP, brightness, LANG_BRIGHTNESS,
890 DEFAULT_BRIGHTNESS_SETTING, "brightness",UNIT_INT,
891 MIN_BRIGHTNESS_SETTING, MAX_BRIGHTNESS_SETTING, 1,
892 NULL, NULL, backlight_set_brightness),
893 #endif
894 /* backlight fading */
895 #if defined(HAVE_BACKLIGHT_FADING_INT_SETTING)
896 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, backlight_fade_in,
897 LANG_BACKLIGHT_FADE_IN, 300, "backlight fade in", "off",
898 UNIT_MS, formatter_unit_0_is_off, getlang_unit_0_is_off,
899 backlight_set_fade_in, 7, 0,100,200,300,500,1000,2000),
900 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, backlight_fade_out,
901 LANG_BACKLIGHT_FADE_OUT, 2000, "backlight fade out", "off",
902 UNIT_MS, formatter_unit_0_is_off, getlang_unit_0_is_off,
903 backlight_set_fade_out, 10,
904 0,100,200,300,500,1000,2000,3000,5000,10000),
905 #elif defined(HAVE_BACKLIGHT_FADING_BOOL_SETTING)
906 OFFON_SETTING(0, backlight_fade_in, LANG_BACKLIGHT_FADE_IN,
907 true, "backlight fade in", backlight_set_fade_in),
908 OFFON_SETTING(0, backlight_fade_out, LANG_BACKLIGHT_FADE_OUT,
909 true, "backlight fade out", backlight_set_fade_out),
910 #endif
911 #endif /* HAVE_BACKLIGHT */
912 INT_SETTING(F_PADTITLE, scroll_speed, LANG_SCROLL_SPEED, 9,"scroll speed",
913 UNIT_INT, 0, 15, 1, NULL, NULL, lcd_scroll_speed),
914 INT_SETTING(F_PADTITLE, scroll_delay, LANG_SCROLL_DELAY, 1000,
915 "scroll delay", UNIT_MS, 0, 2500, 100, NULL,
916 NULL, lcd_scroll_delay),
917 INT_SETTING(0, bidir_limit, LANG_BIDIR_SCROLL, 50, "bidir limit",
918 UNIT_PERCENT, 0, 200, 25, NULL, NULL, lcd_bidir_scroll),
919 #ifdef HAVE_REMOTE_LCD
920 INT_SETTING(0, remote_scroll_speed, LANG_SCROLL_SPEED, 9,
921 "remote scroll speed", UNIT_INT, 0,15, 1,
922 NULL, NULL, lcd_remote_scroll_speed),
923 INT_SETTING(0, remote_scroll_step, LANG_SCROLL_STEP, 6,
924 "remote scroll step", UNIT_PIXEL, 1, LCD_REMOTE_WIDTH, 1, NULL,
925 NULL, lcd_remote_scroll_step),
926 INT_SETTING(0, remote_scroll_delay, LANG_SCROLL_DELAY, 1000,
927 "remote scroll delay", UNIT_MS, 0, 2500, 100, NULL, NULL,
928 lcd_remote_scroll_delay),
929 INT_SETTING(0, remote_bidir_limit, LANG_BIDIR_SCROLL, 50,
930 "remote bidir limit", UNIT_PERCENT, 0, 200, 25, NULL, NULL,
931 lcd_remote_bidir_scroll),
932 #endif
933 #ifdef HAVE_LCD_BITMAP
934 OFFON_SETTING(0, offset_out_of_view, LANG_SCREEN_SCROLL_VIEW,
935 false, "Screen Scrolls Out Of View",
936 gui_list_screen_scroll_out_of_view),
937 INT_SETTING(F_PADTITLE, scroll_step, LANG_SCROLL_STEP, 6, "scroll step",
938 UNIT_PIXEL, 1, LCD_WIDTH, 1, NULL, NULL, lcd_scroll_step),
939 INT_SETTING(F_PADTITLE, screen_scroll_step, LANG_SCREEN_SCROLL_STEP, 16,
940 "screen scroll step", UNIT_PIXEL, 1, LCD_WIDTH, 1, NULL, NULL,
941 gui_list_screen_scroll_step),
942 #endif /* HAVE_LCD_BITMAP */
943 OFFON_SETTING(0,scroll_paginated,LANG_SCROLL_PAGINATED,
944 false,"scroll paginated",NULL),
945 #ifdef HAVE_LCD_COLOR
947 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.fg_color,-1,
948 INT(DEFAULT_THEME_FOREGROUND),"foreground color",NULL,UNUSED},
949 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.bg_color,-1,
950 INT(DEFAULT_THEME_BACKGROUND),"background color",NULL,UNUSED},
951 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lss_color,-1,
952 INT(DEFAULT_THEME_SELECTOR_START),"line selector start color",NULL,
953 UNUSED},
954 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lse_color,-1,
955 INT(DEFAULT_THEME_SELECTOR_END),"line selector end color",NULL,UNUSED},
956 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lst_color,-1,
957 INT(DEFAULT_THEME_SELECTOR_TEXT),"line selector text color",NULL,
958 UNUSED},
960 #endif
961 /* more playback */
962 OFFON_SETTING(0,play_selected,LANG_PLAY_SELECTED,true,"play selected",NULL),
963 OFFON_SETTING(0,party_mode,LANG_PARTY_MODE,false,"party mode",NULL),
964 OFFON_SETTING(0,fade_on_stop,LANG_FADE_ON_STOP,true,"volume fade",NULL),
965 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, ff_rewind_min_step,
966 LANG_FFRW_STEP, 1, "scan min step", NULL, UNIT_SEC,
967 NULL, NULL, NULL, 14, 1,2,3,4,5,6,8,10,15,20,25,30,45,60),
968 CHOICE_SETTING(0, ff_rewind_accel, LANG_FFRW_ACCEL, 2,
969 "seek acceleration", "very fast,fast,normal,slow,very slow", NULL, 5,
970 ID2P(LANG_VERY_FAST), ID2P(LANG_FAST), ID2P(LANG_NORMAL),
971 ID2P(LANG_SLOW) , ID2P(LANG_VERY_SLOW)),
972 #if (CONFIG_CODEC == SWCODEC) && defined(HAVE_DISK_STORAGE)
973 STRINGCHOICE_SETTING(0, buffer_margin, LANG_MP3BUFFER_MARGIN, 0,"antiskip",
974 "5s,15s,30s,1min,2min,3min,5min,10min", NULL, 8,
975 TALK_ID(5, UNIT_SEC), TALK_ID(15, UNIT_SEC),
976 TALK_ID(30, UNIT_SEC), TALK_ID(1, UNIT_MIN),
977 TALK_ID(2, UNIT_MIN), TALK_ID(3, UNIT_MIN),
978 TALK_ID(5, UNIT_MIN), TALK_ID(10, UNIT_MIN)),
979 #elif defined(HAVE_DISK_STORAGE)
980 INT_SETTING(0, buffer_margin, LANG_MP3BUFFER_MARGIN, 0, "antiskip",
981 UNIT_SEC, 0, 7, 1, NULL, NULL, audio_set_buffer_margin),
982 #endif
983 /* disk */
984 #ifdef HAVE_DISK_STORAGE
985 INT_SETTING(0, disk_spindown, LANG_SPINDOWN, 5, "disk spindown",
986 UNIT_SEC, 3, 254, 1, NULL, NULL, storage_spindown),
987 #endif /* HAVE_DISK_STORAGE */
988 /* browser */
989 TEXT_SETTING(0, start_directory, "start directory", "/", NULL, NULL),
990 CHOICE_SETTING(0, dirfilter, LANG_FILTER, SHOW_SUPPORTED, "show files",
991 "all,supported,music,playlists", NULL, 4, ID2P(LANG_ALL),
992 ID2P(LANG_FILTER_SUPPORTED), ID2P(LANG_FILTER_MUSIC),
993 ID2P(LANG_PLAYLISTS)),
994 /* file sorting */
995 OFFON_SETTING(0, sort_case, LANG_SORT_CASE, false, "sort case", NULL),
996 CHOICE_SETTING(0, sort_dir, LANG_SORT_DIR, 0 ,
997 "sort dirs", "alpha,oldest,newest", NULL, 3,
998 ID2P(LANG_SORT_ALPHA), ID2P(LANG_SORT_DATE),
999 ID2P(LANG_SORT_DATE_REVERSE)),
1000 CHOICE_SETTING(0, sort_file, LANG_SORT_FILE, 0 ,
1001 "sort files", "alpha,oldest,newest,type", NULL, 4,
1002 ID2P(LANG_SORT_ALPHA), ID2P(LANG_SORT_DATE),
1003 ID2P(LANG_SORT_DATE_REVERSE) , ID2P(LANG_SORT_TYPE)),
1004 CHOICE_SETTING(0, interpret_numbers, LANG_SORT_INTERPRET_NUMBERS, 1,
1005 "sort interpret number", "digits,numbers",NULL, 2,
1006 ID2P(LANG_SORT_INTERPRET_AS_DIGIT),
1007 ID2P(LANG_SORT_INTERPRET_AS_NUMBERS)),
1008 CHOICE_SETTING(0, show_filename_ext, LANG_SHOW_FILENAME_EXT, 3,
1009 "show filename exts", "off,on,unknown,view_all", NULL , 4 ,
1010 ID2P(LANG_OFF), ID2P(LANG_ON), ID2P(LANG_UNKNOWN_TYPES),
1011 ID2P(LANG_EXT_ONLY_VIEW_ALL)),
1012 OFFON_SETTING(0,browse_current,LANG_FOLLOW,false,"follow playlist",NULL),
1013 OFFON_SETTING(0,playlist_viewer_icons,LANG_SHOW_ICONS,true,
1014 "playlist viewer icons",NULL),
1015 OFFON_SETTING(0,playlist_viewer_indices,LANG_SHOW_INDICES,true,
1016 "playlist viewer indices",NULL),
1017 CHOICE_SETTING(0, playlist_viewer_track_display, LANG_TRACK_DISPLAY, 0,
1018 "playlist viewer track display","track name,full path",
1019 NULL, 2, ID2P(LANG_DISPLAY_TRACK_NAME_ONLY),
1020 ID2P(LANG_DISPLAY_FULL_PATH)),
1021 CHOICE_SETTING(0, recursive_dir_insert, LANG_RECURSE_DIRECTORY , RECURSE_ON,
1022 "recursive directory insert", off_on_ask, NULL , 3 ,
1023 ID2P(LANG_OFF), ID2P(LANG_ON), ID2P(LANG_ASK)),
1024 /* bookmarks */
1025 CHOICE_SETTING(0, autocreatebookmark, LANG_BOOKMARK_SETTINGS_AUTOCREATE,
1026 BOOKMARK_NO, "autocreate bookmarks",
1027 "off,on,ask,recent only - on,recent only - ask", NULL, 5,
1028 ID2P(LANG_SET_BOOL_NO), ID2P(LANG_SET_BOOL_YES),
1029 ID2P(LANG_ASK), ID2P(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_YES),
1030 ID2P(LANG_BOOKMARK_SETTINGS_RECENT_ONLY_ASK)),
1031 OFFON_SETTING(0, autoupdatebookmark, LANG_BOOKMARK_SETTINGS_AUTOUPDATE,
1032 false, "autoupdate bookmarks", NULL),
1033 CHOICE_SETTING(0, autoloadbookmark, LANG_BOOKMARK_SETTINGS_AUTOLOAD,
1034 BOOKMARK_NO, "autoload bookmarks", off_on_ask, NULL, 3,
1035 ID2P(LANG_SET_BOOL_NO), ID2P(LANG_SET_BOOL_YES),
1036 ID2P(LANG_ASK)),
1037 CHOICE_SETTING(0, usemrb, LANG_BOOKMARK_SETTINGS_MAINTAIN_RECENT_BOOKMARKS,
1038 BOOKMARK_NO, "use most-recent-bookmarks",
1039 "off,on,unique only", NULL, 3, ID2P(LANG_SET_BOOL_NO),
1040 ID2P(LANG_SET_BOOL_YES),
1041 ID2P(LANG_BOOKMARK_SETTINGS_UNIQUE_ONLY)),
1042 #ifdef HAVE_LCD_BITMAP
1043 /* peak meter */
1044 STRINGCHOICE_SETTING(0, peak_meter_clip_hold, LANG_PM_CLIP_HOLD, 16,
1045 "peak meter clip hold",
1046 "on,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,2min"
1047 ",3min,5min,10min,20min,45min,90min",
1048 peak_meter_set_clip_hold, 25, LANG_PM_ETERNAL,
1049 TALK_ID(1, UNIT_SEC), TALK_ID(2, UNIT_SEC),
1050 TALK_ID(3, UNIT_SEC), TALK_ID(4, UNIT_SEC),
1051 TALK_ID(5, UNIT_SEC), TALK_ID(6, UNIT_SEC),
1052 TALK_ID(7, UNIT_SEC), TALK_ID(8, UNIT_SEC),
1053 TALK_ID(9, UNIT_SEC), TALK_ID(10, UNIT_SEC),
1054 TALK_ID(15, UNIT_SEC), TALK_ID(20, UNIT_SEC),
1055 TALK_ID(25, UNIT_SEC), TALK_ID(30, UNIT_SEC),
1056 TALK_ID(45, UNIT_SEC), TALK_ID(60, UNIT_SEC),
1057 TALK_ID(90, UNIT_SEC), TALK_ID(2, UNIT_MIN),
1058 TALK_ID(3, UNIT_MIN), TALK_ID(5, UNIT_MIN),
1059 TALK_ID(10, UNIT_MIN), TALK_ID(20, UNIT_MIN),
1060 TALK_ID(45, UNIT_MIN), TALK_ID(90, UNIT_MIN)),
1061 STRINGCHOICE_SETTING(0, peak_meter_hold, LANG_PM_PEAK_HOLD, 3,
1062 "peak meter hold",
1063 "off,200ms,300ms,500ms,1,2,3,4,5,6,7,8,9,10,15,20,30,1min",
1064 NULL, 18, LANG_OFF, TALK_ID(200, UNIT_MS),
1065 TALK_ID(300, UNIT_MS), TALK_ID(500, UNIT_MS),
1066 TALK_ID(1, UNIT_SEC), TALK_ID(2, UNIT_SEC),
1067 TALK_ID(3, UNIT_SEC), TALK_ID(4, UNIT_SEC),
1068 TALK_ID(5, UNIT_SEC), TALK_ID(6, UNIT_SEC),
1069 TALK_ID(7, UNIT_SEC), TALK_ID(8, UNIT_SEC),
1070 TALK_ID(9, UNIT_SEC), TALK_ID(10, UNIT_SEC),
1071 TALK_ID(15, UNIT_SEC), TALK_ID(20, UNIT_SEC),
1072 TALK_ID(30, UNIT_SEC), TALK_ID(60, UNIT_SEC)),
1073 INT_SETTING(0, peak_meter_release, LANG_PM_RELEASE, 8, "peak meter release",
1074 UNIT_PM_TICK, 1, 0x7e, 1, NULL, NULL,NULL),
1075 OFFON_SETTING(0,peak_meter_dbfs,LANG_PM_DBFS,true,"peak meter dbfs",NULL),
1076 {F_T_INT, &global_settings.peak_meter_min, LANG_PM_MIN,INT(60),
1077 "peak meter min", NULL, UNUSED},
1078 {F_T_INT, &global_settings.peak_meter_max, LANG_PM_MAX,INT(0),
1079 "peak meter max", NULL, UNUSED},
1080 #ifdef HAVE_RECORDING
1081 OFFON_SETTING(0, peak_meter_clipcounter, LANG_PM_CLIPCOUNTER, false,
1082 "peak meter clipcounter", NULL),
1083 #endif /* HAVE_RECORDING */
1084 #endif /* HAVE_LCD_BITMAP */
1085 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
1086 SOUND_SETTING(F_SOUNDSETTING, mdb_strength, LANG_MDB_STRENGTH,
1087 "mdb strength", SOUND_MDB_STRENGTH),
1088 SOUND_SETTING(F_SOUNDSETTING, mdb_harmonics, LANG_MDB_HARMONICS,
1089 "mdb harmonics", SOUND_MDB_HARMONICS),
1090 SOUND_SETTING(F_SOUNDSETTING, mdb_center, LANG_MDB_CENTER,
1091 "mdb center", SOUND_MDB_CENTER),
1092 SOUND_SETTING(F_SOUNDSETTING, mdb_shape, LANG_MDB_SHAPE,
1093 "mdb shape", SOUND_MDB_SHAPE),
1094 OFFON_SETTING(F_SOUNDSETTING, mdb_enable, LANG_MDB_ENABLE,
1095 false, "mdb enable", set_mdb_enable),
1096 #endif
1097 #if CONFIG_CODEC == MAS3507D
1098 OFFON_SETTING(F_SOUNDSETTING, line_in,LANG_LINE_IN,false,"line in",NULL),
1099 #endif
1100 /* voice */
1101 OFFON_SETTING(F_TEMPVAR, talk_menu, LANG_VOICE_MENU, true, "talk menu", NULL),
1102 CHOICE_SETTING(0, talk_dir, LANG_VOICE_DIR, 0,
1103 "talk dir", off_number_spell, NULL, 3,
1104 ID2P(LANG_OFF), ID2P(LANG_VOICE_NUMBER),
1105 ID2P(LANG_VOICE_SPELL)),
1106 OFFON_SETTING(F_TEMPVAR, talk_dir_clip, LANG_VOICE_DIR_TALK, false,
1107 "talk dir clip", NULL),
1108 CHOICE_SETTING(0, talk_file, LANG_VOICE_FILE, 0,
1109 "talk file", off_number_spell, NULL, 3,
1110 ID2P(LANG_OFF), ID2P(LANG_VOICE_NUMBER),
1111 ID2P(LANG_VOICE_SPELL)),
1112 OFFON_SETTING(F_TEMPVAR, talk_file_clip, LANG_VOICE_FILE_TALK, false,
1113 "talk file clip", NULL),
1114 OFFON_SETTING(F_TEMPVAR, talk_filetype, LANG_VOICE_FILETYPE, false,
1115 "talk filetype", NULL),
1116 OFFON_SETTING(F_TEMPVAR, talk_battery_level, LANG_TALK_BATTERY_LEVEL, false,
1117 "Announce Battery Level", NULL),
1119 #ifdef HAVE_RECORDING
1120 /* recording */
1121 STRINGCHOICE_SETTING(F_RECSETTING, rec_timesplit, LANG_SPLIT_TIME, 0,
1122 "rec timesplit",
1123 "off,00:05,00:10,00:15,00:30,01:00,01:14,01:20,02:00,"
1124 "04:00,06:00,08:00,10:00,12:00,18:00,24:00",
1125 NULL, 16, LANG_OFF,
1126 TALK_ID(5, UNIT_MIN), TALK_ID(10, UNIT_MIN),
1127 TALK_ID(15, UNIT_MIN), TALK_ID(30, UNIT_MIN),
1128 TALK_ID(60, UNIT_MIN), TALK_ID(74, UNIT_MIN),
1129 TALK_ID(80, UNIT_MIN), TALK_ID(2, UNIT_HOUR),
1130 TALK_ID(4, UNIT_HOUR), TALK_ID(6, UNIT_HOUR),
1131 TALK_ID(8, UNIT_HOUR), TALK_ID(10, UNIT_HOUR),
1132 TALK_ID(12, UNIT_HOUR), TALK_ID(18, UNIT_HOUR),
1133 TALK_ID(20, UNIT_HOUR), TALK_ID(24, UNIT_HOUR)),
1134 STRINGCHOICE_SETTING(F_RECSETTING, rec_sizesplit, LANG_SPLIT_SIZE, 0,
1135 "rec sizesplit",
1136 "off,5MB,10MB,15MB,32MB,64MB,75MB,100MB,128MB,"
1137 "256MB,512MB,650MB,700MB,1GB,1.5GB,1.75GB",
1138 NULL, 16, LANG_OFF,
1139 TALK_ID(5, UNIT_MB), TALK_ID(10, UNIT_MB),
1140 TALK_ID(15, UNIT_MB), TALK_ID(32, UNIT_MB),
1141 TALK_ID(64, UNIT_MB), TALK_ID(75, UNIT_MB),
1142 TALK_ID(100, UNIT_MB), TALK_ID(128, UNIT_MB),
1143 TALK_ID(256, UNIT_MB), TALK_ID(512, UNIT_MB),
1144 TALK_ID(650, UNIT_MB), TALK_ID(700, UNIT_MB),
1145 TALK_ID(1024, UNIT_MB), TALK_ID(1536, UNIT_MB),
1146 TALK_ID(1792, UNIT_MB)),
1147 {F_T_INT|F_RECSETTING, &global_settings.rec_channels, LANG_CHANNELS, INT(0),
1148 "rec channels","stereo,mono",UNUSED},
1149 #if CONFIG_CODEC == SWCODEC
1150 {F_T_INT|F_RECSETTING, &global_settings.rec_mono_mode,
1151 LANG_RECORDING_MONO_MODE, INT(0), "rec mono mode","L+R,L,R",UNUSED},
1152 #endif
1153 CHOICE_SETTING(F_RECSETTING, rec_split_type, LANG_SPLIT_TYPE, 0,
1154 "rec split type", "Split,Stop,Shutdown", NULL, 3,
1155 ID2P(LANG_START_NEW_FILE), ID2P(LANG_STOP_RECORDING),ID2P(LANG_STOP_RECORDING_AND_SHUTDOWN)),
1156 CHOICE_SETTING(F_RECSETTING, rec_split_method, LANG_SPLIT_MEASURE, 0,
1157 "rec split method", "Time,Filesize", NULL, 2,
1158 ID2P(LANG_TIME), ID2P(LANG_FILESIZE)),
1159 {F_T_INT|F_RECSETTING, &global_settings.rec_source, LANG_RECORDING_SOURCE,
1160 INT(0), "rec source",
1161 &HAVE_MIC_REC_(",mic")
1162 HAVE_LINE_REC_(",line")
1163 HAVE_SPDIF_REC_(",spdif")
1164 HAVE_FMRADIO_REC_(",fmradio")[1],
1165 UNUSED},
1166 INT_SETTING(F_RECSETTING, rec_prerecord_time, LANG_RECORD_PRERECORD_TIME, 0,
1167 "prerecording time", UNIT_SEC, 0, 30, 1,
1168 formatter_unit_0_is_off, getlang_unit_0_is_off, NULL),
1170 TEXT_SETTING(F_RECSETTING, rec_directory, "rec path",
1171 REC_BASE_DIR, NULL, NULL),
1172 #ifdef HAVE_BACKLIGHT
1173 CHOICE_SETTING(F_RECSETTING, cliplight, LANG_CLIP_LIGHT, 0,
1174 "cliplight", "off,main,both,remote", NULL,
1175 #ifdef HAVE_REMOTE_LCD
1176 4, ID2P(LANG_OFF), ID2P(LANG_MAIN_UNIT),
1177 ID2P(LANG_REMOTE_MAIN), ID2P(LANG_REMOTE_UNIT)
1178 #else
1179 2, ID2P(LANG_OFF), ID2P(LANG_ON)
1180 #endif
1182 #endif
1183 #ifdef DEFAULT_REC_MIC_GAIN
1184 {F_T_INT|F_RECSETTING,&global_settings.rec_mic_gain,
1185 LANG_GAIN,INT(DEFAULT_REC_MIC_GAIN),
1186 "rec mic gain",NULL,UNUSED},
1187 #endif /* DEFAULT_REC_MIC_GAIN */
1188 #ifdef DEFAULT_REC_LEFT_GAIN
1189 {F_T_INT|F_RECSETTING,&global_settings.rec_left_gain,
1190 LANG_GAIN_LEFT,INT(DEFAULT_REC_LEFT_GAIN),
1191 "rec left gain",NULL,UNUSED},
1192 #endif /* DEFAULT_REC_LEFT_GAIN */
1193 #ifdef DEFAULT_REC_RIGHT_GAIN
1194 {F_T_INT|F_RECSETTING,&global_settings.rec_right_gain,LANG_GAIN_RIGHT,
1195 INT(DEFAULT_REC_RIGHT_GAIN),
1196 "rec right gain",NULL,UNUSED},
1197 #endif /* DEFAULT_REC_RIGHT_GAIN */
1198 #if CONFIG_CODEC == MAS3587F
1199 {F_T_INT|F_RECSETTING,&global_settings.rec_frequency,
1200 LANG_RECORDING_FREQUENCY, INT(0),
1201 "rec frequency","44,48,32,22,24,16", UNUSED},
1202 INT_SETTING(F_RECSETTING, rec_quality, LANG_RECORDING_QUALITY, 5,
1203 "rec quality", UNIT_INT, 0, 7, 1, NULL, NULL, NULL),
1204 OFFON_SETTING(F_RECSETTING, rec_editable, LANG_RECORDING_EDITABLE, false,
1205 "editable recordings", NULL),
1206 #endif /* CONFIG_CODEC == MAS3587F */
1207 #if CONFIG_CODEC == SWCODEC
1208 {F_T_INT|F_RECSETTING,&global_settings.rec_frequency,
1209 LANG_RECORDING_FREQUENCY,INT(REC_FREQ_DEFAULT),
1210 "rec frequency",REC_FREQ_CFG_VAL_LIST,UNUSED},
1211 {F_T_INT|F_RECSETTING,&global_settings.rec_format,
1212 LANG_RECORDING_FORMAT,INT(REC_FORMAT_DEFAULT),
1213 "rec format",REC_FORMAT_CFG_VAL_LIST,UNUSED},
1214 /** Encoder settings start - keep these together **/
1215 /* aiff_enc */
1216 /* (no settings yet) */
1217 /* mp3_enc */
1218 {F_T_INT|F_RECSETTING, &global_settings.mp3_enc_config.bitrate,-1,
1219 INT(MP3_ENC_BITRATE_CFG_DEFAULT),
1220 "mp3_enc bitrate",MP3_ENC_BITRATE_CFG_VALUE_LIST,UNUSED},
1221 /* wav_enc */
1222 /* (no settings yet) */
1223 /* wavpack_enc */
1224 /* (no settings yet) */
1225 /** Encoder settings end **/
1226 #endif /* CONFIG_CODEC == SWCODEC */
1227 /* values for the trigger */
1228 INT_SETTING(F_RECSETTING, rec_start_thres_db, LANG_RECORD_START_THRESHOLD, -35,
1229 "trigger start threshold dB", UNIT_DB, VOLUME_MIN/10, 0, 1, NULL, NULL, NULL),
1230 INT_SETTING(F_RECSETTING, rec_start_thres_linear, LANG_RECORD_START_THRESHOLD, 5,
1231 "trigger start threshold linear", UNIT_PERCENT, 0, 100, 1, NULL, NULL, NULL),
1232 INT_SETTING(F_RECSETTING, rec_stop_thres_db, LANG_RECORD_STOP_THRESHOLD, -45,
1233 "trigger stop threshold dB", UNIT_DB, VOLUME_MIN/10, 0, 1, NULL, NULL, NULL),
1234 INT_SETTING(F_RECSETTING, rec_stop_thres_linear, LANG_RECORD_STOP_THRESHOLD, 10,
1235 "trigger stop threshold linear", UNIT_PERCENT, 0, 100, 1, NULL, NULL, NULL),
1236 TABLE_SETTING(F_RECSETTING, rec_start_duration, LANG_MIN_DURATION, 0,
1237 "trigger start duration",
1238 "0s,1s,2s,5s,10s,15s,20s,25s,30s,1min,2min,5min,10min",
1239 UNIT_SEC, NULL, NULL, NULL, 13,
1240 0,1,2,5,10,15,20,25,30,60,120,300,600),
1241 TABLE_SETTING(F_RECSETTING, rec_stop_postrec, LANG_MIN_DURATION, 0,
1242 "trigger stop duration",
1243 "0s,1s,2s,5s,10s,15s,20s,25s,30s,1min,2min,5min,10min",
1244 UNIT_SEC, NULL, NULL, NULL, 13,
1245 0,1,2,5,10,15,20,25,30,60,120,300,600),
1246 TABLE_SETTING(F_RECSETTING, rec_stop_gap, LANG_RECORD_STOP_GAP, 1,
1247 "trigger min gap",
1248 "0s,1s,2s,5s,10s,15s,20s,25s,30s,1min,2min,5min,10min",
1249 UNIT_SEC, NULL, NULL, NULL, 13,
1250 0,1,2,5,10,15,20,25,30,60,120,300,600),
1251 CHOICE_SETTING(F_RECSETTING, rec_trigger_mode, LANG_RECORD_TRIGGER, TRIG_MODE_OFF,
1252 "trigger mode","off,once,repeat", NULL ,3,
1253 ID2P(LANG_OFF), ID2P(LANG_RECORD_TRIG_NOREARM), ID2P(LANG_REPEAT)),
1254 CHOICE_SETTING(F_RECSETTING, rec_trigger_type, LANG_RECORD_TRIGGER_TYPE, TRIG_TYPE_STOP,
1255 "trigger type","stop,pause,nf stp", NULL ,3,
1256 ID2P(LANG_RECORD_TRIGGER_STOP), ID2P(LANG_PAUSE), ID2P(LANG_RECORD_TRIGGER_NEWFILESTP)),
1257 #endif /* HAVE_RECORDING */
1259 #ifdef HAVE_HISTOGRAM
1260 /* TO DO: additional restictions of following REP items? */
1261 TABLE_SETTING(F_RECSETTING, histogram_interval, LANG_HISTOGRAM_INTERVAL, 0,
1262 "histogram interval","0s,1s,2s,4s",
1263 UNIT_SEC, NULL, NULL, NULL, 4, 0,1,2,4),
1264 #endif /* HAVE_HISTOGRAM */
1266 #ifdef HAVE_SPDIF_POWER
1267 OFFON_SETTING(F_SOUNDSETTING, spdif_enable, LANG_SPDIF_ENABLE, false,
1268 "spdif enable", spdif_power_enable),
1269 #endif
1270 CHOICE_SETTING(0, next_folder, LANG_NEXT_FOLDER, FOLDER_ADVANCE_OFF,
1271 "folder navigation", "off,on,random",NULL ,3,
1272 ID2P(LANG_SET_BOOL_NO), ID2P(LANG_SET_BOOL_YES),
1273 ID2P(LANG_RANDOM)),
1275 #ifdef HAVE_TAGCACHE
1276 #if CONFIG_CODEC == SWCODEC
1277 BOOL_SETTING(0, autoresume_enable, LANG_AUTORESUME, false,
1278 "autoresume enable", off_on,
1279 LANG_SET_BOOL_YES, LANG_SET_BOOL_NO, NULL),
1280 CHOICE_SETTING(0, autoresume_automatic, LANG_AUTORESUME_AUTOMATIC,
1281 AUTORESUME_NEXTTRACK_NEVER,
1282 "autoresume next track", "never,all,custom",
1283 NULL, 3,
1284 ID2P(LANG_SET_BOOL_NO),
1285 ID2P(LANG_ALWAYS),
1286 ID2P(LANG_AUTORESUME_CUSTOM)),
1287 TEXT_SETTING(0, autoresume_paths, "autoresume next track paths",
1288 "/podcast:/podcasts", NULL, NULL),
1289 #endif
1291 OFFON_SETTING(0, runtimedb, LANG_RUNTIMEDB_ACTIVE, false,
1292 "gather runtime data", NULL),
1293 #endif
1295 #if CONFIG_CODEC == SWCODEC
1296 /* replay gain */
1297 CHOICE_SETTING(F_SOUNDSETTING, replaygain_type, LANG_REPLAYGAIN_MODE,
1298 REPLAYGAIN_SHUFFLE, "replaygain type",
1299 "track,album,track shuffle,off", NULL, 4, ID2P(LANG_TRACK_GAIN),
1300 ID2P(LANG_ALBUM_GAIN), ID2P(LANG_SHUFFLE_GAIN), ID2P(LANG_OFF)),
1301 OFFON_SETTING(F_SOUNDSETTING, replaygain_noclip, LANG_REPLAYGAIN_NOCLIP,
1302 false, "replaygain noclip", NULL),
1303 INT_SETTING_NOWRAP(F_SOUNDSETTING, replaygain_preamp,
1304 LANG_REPLAYGAIN_PREAMP, 0, "replaygain preamp",
1305 UNIT_DB, -120, 120, 5, db_format, get_dec_talkid, NULL),
1307 CHOICE_SETTING(0, beep, LANG_BEEP, 0, "beep", "off,weak,moderate,strong",
1308 NULL, 4, ID2P(LANG_OFF), ID2P(LANG_WEAK),
1309 ID2P(LANG_MODERATE), ID2P(LANG_STRONG)),
1311 #ifdef HAVE_CROSSFADE
1312 /* crossfade */
1313 CHOICE_SETTING(F_SOUNDSETTING, crossfade, LANG_CROSSFADE_ENABLE, 0,
1314 "crossfade",
1315 "off,auto track change,man track skip,shuffle,shuffle or man track skip,always",
1316 NULL, 6, ID2P(LANG_OFF), ID2P(LANG_AUTOTRACKSKIP),
1317 ID2P(LANG_MANTRACKSKIP), ID2P(LANG_SHUFFLE),
1318 ID2P(LANG_SHUFFLE_TRACKSKIP), ID2P(LANG_ALWAYS)),
1319 INT_SETTING(F_SOUNDSETTING, crossfade_fade_in_delay,
1320 LANG_CROSSFADE_FADE_IN_DELAY, 0,
1321 "crossfade fade in delay", UNIT_SEC, 0, 7, 1, NULL, NULL, NULL),
1322 INT_SETTING(F_SOUNDSETTING, crossfade_fade_out_delay,
1323 LANG_CROSSFADE_FADE_OUT_DELAY, 0,
1324 "crossfade fade out delay", UNIT_SEC, 0, 7, 1, NULL, NULL,NULL),
1325 INT_SETTING(F_SOUNDSETTING, crossfade_fade_in_duration,
1326 LANG_CROSSFADE_FADE_IN_DURATION, 2,
1327 "crossfade fade in duration", UNIT_SEC, 0, 15, 1, NULL, NULL,
1328 NULL),
1329 INT_SETTING(F_SOUNDSETTING, crossfade_fade_out_duration,
1330 LANG_CROSSFADE_FADE_OUT_DURATION, 2,
1331 "crossfade fade out duration", UNIT_SEC, 0, 15, 1, NULL, NULL,
1332 NULL),
1333 CHOICE_SETTING(F_SOUNDSETTING, crossfade_fade_out_mixmode,
1334 LANG_CROSSFADE_FADE_OUT_MODE, 0,
1335 "crossfade fade out mode", "crossfade,mix", NULL, 2,
1336 ID2P(LANG_CROSSFADE), ID2P(LANG_MIX)),
1337 #endif
1339 /* crossfeed */
1340 OFFON_SETTING(F_SOUNDSETTING, crossfeed, LANG_CROSSFEED, false,
1341 "crossfeed", dsp_set_crossfeed),
1342 INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_direct_gain,
1343 LANG_CROSSFEED_DIRECT_GAIN, -15,
1344 "crossfeed direct gain", UNIT_DB, -60, 0, 5,
1345 db_format, get_dec_talkid,dsp_set_crossfeed_direct_gain),
1346 INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_cross_gain,
1347 LANG_CROSSFEED_CROSS_GAIN, -60,
1348 "crossfeed cross gain", UNIT_DB, -120, -30, 5,
1349 db_format, get_dec_talkid, crossfeed_cross_set),
1350 INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_hf_attenuation,
1351 LANG_CROSSFEED_HF_ATTENUATION, -160,
1352 "crossfeed hf attenuation", UNIT_DB, -240, -60, 5,
1353 db_format, get_dec_talkid, crossfeed_cross_set),
1354 INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_hf_cutoff,
1355 LANG_CROSSFEED_HF_CUTOFF, 700,
1356 "crossfeed hf cutoff", UNIT_HERTZ, 500, 2000, 100,
1357 NULL, NULL, crossfeed_cross_set),
1359 /* equalizer */
1360 OFFON_SETTING(F_EQSETTING, eq_enabled, LANG_EQUALIZER_ENABLED, false,
1361 "eq enabled", NULL),
1362 INT_SETTING_NOWRAP(F_EQSETTING, eq_precut, LANG_EQUALIZER_PRECUT, 0,
1363 "eq precut", UNIT_DB, 0, 240, 5, eq_precut_format,
1364 get_precut_talkid, dsp_set_eq_precut),
1365 /* 0..32768 Hz */
1366 INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_cutoff, LANG_EQUALIZER_BAND_CUTOFF,
1367 60, "eq band 0 cutoff", UNIT_HERTZ, EQ_CUTOFF_MIN,
1368 EQ_CUTOFF_MAX, EQ_CUTOFF_STEP, NULL, NULL, NULL),
1369 INT_SETTING_NOWRAP(F_EQSETTING, eq_band1_cutoff, LANG_EQUALIZER_BAND_CENTER,
1370 200, "eq band 1 cutoff", UNIT_HERTZ, EQ_CUTOFF_MIN,
1371 EQ_CUTOFF_MAX, EQ_CUTOFF_STEP, NULL, NULL, NULL),
1372 INT_SETTING_NOWRAP(F_EQSETTING, eq_band2_cutoff, LANG_EQUALIZER_BAND_CENTER,
1373 800, "eq band 2 cutoff", UNIT_HERTZ, EQ_CUTOFF_MIN,
1374 EQ_CUTOFF_MAX, EQ_CUTOFF_STEP, NULL, NULL, NULL),
1375 INT_SETTING_NOWRAP(F_EQSETTING, eq_band3_cutoff, LANG_EQUALIZER_BAND_CENTER,
1376 4000, "eq band 3 cutoff", UNIT_HERTZ, EQ_CUTOFF_MIN,
1377 EQ_CUTOFF_MAX, EQ_CUTOFF_STEP, NULL, NULL, NULL),
1378 INT_SETTING_NOWRAP(F_EQSETTING, eq_band4_cutoff, LANG_EQUALIZER_BAND_CUTOFF,
1379 12000, "eq band 4 cutoff", UNIT_HERTZ, EQ_CUTOFF_MIN,
1380 EQ_CUTOFF_MAX, EQ_CUTOFF_STEP, NULL, NULL, NULL),
1381 /* 0..64 (or 0.0 to 6.4) */
1382 INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_q, LANG_EQUALIZER_BAND_Q, 7,
1383 "eq band 0 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
1384 eq_q_format, get_dec_talkid, NULL),
1385 INT_SETTING_NOWRAP(F_EQSETTING, eq_band1_q, LANG_EQUALIZER_BAND_Q, 10,
1386 "eq band 1 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
1387 eq_q_format, get_dec_talkid, NULL),
1388 INT_SETTING_NOWRAP(F_EQSETTING, eq_band2_q, LANG_EQUALIZER_BAND_Q, 10,
1389 "eq band 2 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
1390 eq_q_format, get_dec_talkid, NULL),
1391 INT_SETTING_NOWRAP(F_EQSETTING, eq_band3_q, LANG_EQUALIZER_BAND_Q, 10,
1392 "eq band 3 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
1393 eq_q_format, get_dec_talkid, NULL),
1394 INT_SETTING_NOWRAP(F_EQSETTING, eq_band4_q, LANG_EQUALIZER_BAND_Q, 7,
1395 "eq band 4 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
1396 eq_q_format, get_dec_talkid, NULL),
1397 /* -240..240 (or -24db to +24db) */
1398 INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_gain, LANG_GAIN, 0,
1399 "eq band 0 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
1400 EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
1401 INT_SETTING_NOWRAP(F_EQSETTING, eq_band1_gain, LANG_GAIN, 0,
1402 "eq band 1 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
1403 EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
1404 INT_SETTING_NOWRAP(F_EQSETTING, eq_band2_gain, LANG_GAIN, 0,
1405 "eq band 2 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
1406 EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
1407 INT_SETTING_NOWRAP(F_EQSETTING, eq_band3_gain, LANG_GAIN, 0,
1408 "eq band 3 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
1409 EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
1410 INT_SETTING_NOWRAP(F_EQSETTING, eq_band4_gain, LANG_GAIN, 0,
1411 "eq band 4 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
1412 EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
1414 /* dithering */
1415 OFFON_SETTING(F_SOUNDSETTING, dithering_enabled, LANG_DITHERING, false,
1416 "dithering enabled", dsp_dither_enable),
1418 #ifdef HAVE_PITCHSCREEN
1419 /* timestretch */
1420 OFFON_SETTING(F_SOUNDSETTING, timestretch_enabled, LANG_TIMESTRETCH, false,
1421 "timestretch enabled", dsp_timestretch_enable),
1422 #endif
1424 /* compressor */
1425 INT_SETTING_NOWRAP(F_SOUNDSETTING, compressor_threshold,
1426 LANG_COMPRESSOR_THRESHOLD, 0,
1427 "compressor threshold", UNIT_DB, 0, -24,
1428 -3, formatter_unit_0_is_off, getlang_unit_0_is_off, compressor_set),
1429 CHOICE_SETTING(F_SOUNDSETTING|F_NO_WRAP, compressor_makeup_gain,
1430 LANG_COMPRESSOR_GAIN, 1, "compressor makeup gain",
1431 "off,auto", compressor_set, 2,
1432 ID2P(LANG_OFF), ID2P(LANG_AUTO)),
1433 CHOICE_SETTING(F_SOUNDSETTING|F_NO_WRAP, compressor_ratio,
1434 LANG_COMPRESSOR_RATIO, 1, "compressor ratio",
1435 "2:1,4:1,6:1,10:1,limit", compressor_set, 5,
1436 ID2P(LANG_COMPRESSOR_RATIO_2), ID2P(LANG_COMPRESSOR_RATIO_4),
1437 ID2P(LANG_COMPRESSOR_RATIO_6), ID2P(LANG_COMPRESSOR_RATIO_10),
1438 ID2P(LANG_COMPRESSOR_RATIO_LIMIT)),
1439 CHOICE_SETTING(F_SOUNDSETTING|F_NO_WRAP, compressor_knee,
1440 LANG_COMPRESSOR_KNEE, 1, "compressor knee",
1441 "hard knee,soft knee", compressor_set, 2,
1442 ID2P(LANG_COMPRESSOR_HARD_KNEE), ID2P(LANG_COMPRESSOR_SOFT_KNEE)),
1443 INT_SETTING_NOWRAP(F_SOUNDSETTING, compressor_release_time,
1444 LANG_COMPRESSOR_RELEASE, 500,
1445 "compressor release time", UNIT_MS, 100, 1000,
1446 100, NULL, NULL, compressor_set),
1447 #endif
1448 #ifdef AUDIOHW_HAVE_BASS_CUTOFF
1449 SOUND_SETTING(F_NO_WRAP, bass_cutoff, LANG_BASS_CUTOFF,
1450 "bass cutoff", SOUND_BASS_CUTOFF),
1451 #endif
1452 #ifdef AUDIOHW_HAVE_TREBLE_CUTOFF
1453 SOUND_SETTING(F_NO_WRAP, treble_cutoff, LANG_TREBLE_CUTOFF,
1454 "treble cutoff", SOUND_TREBLE_CUTOFF),
1455 #endif
1456 #ifdef HAVE_DIRCACHE
1457 /*enable dircache for all targets > 2MB of RAM by default*/
1458 OFFON_SETTING(F_BANFROMQS,dircache,LANG_DIRCACHE_ENABLE,true,"dircache",NULL),
1459 SYSTEM_SETTING(NVRAM(4),dircache_size,0),
1460 #endif
1462 #ifdef HAVE_TAGCACHE
1463 #ifdef HAVE_TC_RAMCACHE
1464 OFFON_SETTING(F_BANFROMQS,tagcache_ram,LANG_TAGCACHE_RAM,false,"tagcache_ram",NULL),
1465 #endif
1466 OFFON_SETTING(F_BANFROMQS, tagcache_autoupdate, LANG_TAGCACHE_AUTOUPDATE, false,
1467 "tagcache_autoupdate", NULL),
1468 #endif
1469 CHOICE_SETTING(0, default_codepage, LANG_DEFAULT_CODEPAGE, 0,
1470 "default codepage",
1471 #ifdef HAVE_LCD_BITMAP
1472 /* The order must match with that in unicode.c */
1473 "iso8859-1,iso8859-7,iso8859-8,cp1251,iso8859-11,cp1256,"
1474 "iso8859-9,iso8859-2,cp1250,sjis,gb2312,ksx1001,big5,utf-8",
1475 set_codepage, 14,
1476 ID2P(LANG_CODEPAGE_LATIN1), ID2P(LANG_CODEPAGE_GREEK),
1477 ID2P(LANG_CODEPAGE_HEBREW), ID2P(LANG_CODEPAGE_CYRILLIC),
1478 ID2P(LANG_CODEPAGE_THAI), ID2P(LANG_CODEPAGE_ARABIC),
1479 ID2P(LANG_CODEPAGE_TURKISH),
1480 ID2P(LANG_CODEPAGE_LATIN_EXTENDED),
1481 ID2P(LANG_CODEPAGE_CENTRAL_EUROPEAN),
1482 ID2P(LANG_CODEPAGE_JAPANESE),
1483 ID2P(LANG_CODEPAGE_SIMPLIFIED), ID2P(LANG_CODEPAGE_KOREAN),
1484 ID2P(LANG_CODEPAGE_TRADITIONAL), ID2P(LANG_CODEPAGE_UTF8)),
1485 #else /* !HAVE_LCD_BITMAP */
1486 /* The order must match with that in unicode.c */
1487 "iso8859-1,iso8859-7,cp1251,iso8859-9,iso8859-2,cp1250,utf-8",
1488 set_codepage, 7,
1489 ID2P(LANG_CODEPAGE_LATIN1), ID2P(LANG_CODEPAGE_GREEK),
1490 ID2P(LANG_CODEPAGE_CYRILLIC), ID2P(LANG_CODEPAGE_TURKISH),
1491 ID2P(LANG_CODEPAGE_LATIN_EXTENDED),
1492 ID2P(LANG_CODEPAGE_CENTRAL_EUROPEAN),
1493 ID2P(LANG_CODEPAGE_UTF8)),
1494 #endif
1495 OFFON_SETTING(0, warnon_erase_dynplaylist, LANG_WARN_ERASEDYNPLAYLIST_MENU,
1496 true, "warn when erasing dynamic playlist",NULL),
1498 #ifdef HAVE_BACKLIGHT
1499 #ifdef HAS_BUTTON_HOLD
1500 CHOICE_SETTING(0, backlight_on_button_hold, LANG_BACKLIGHT_ON_BUTTON_HOLD,
1501 1, "backlight on button hold", "normal,off,on",
1502 backlight_set_on_button_hold, 3,
1503 ID2P(LANG_NORMAL), ID2P(LANG_OFF), ID2P(LANG_ON)),
1504 #endif
1506 #ifdef HAVE_LCD_SLEEP_SETTING
1507 STRINGCHOICE_SETTING(0, lcd_sleep_after_backlight_off,
1508 LANG_LCD_SLEEP_AFTER_BACKLIGHT_OFF, 3,
1509 "lcd sleep after backlight off",
1510 "always,never,5,10,15,20,30,45,60,90",
1511 lcd_set_sleep_after_backlight_off, 10,
1512 LANG_ALWAYS, LANG_NEVER, TALK_ID(5, UNIT_SEC),
1513 TALK_ID(10, UNIT_SEC), TALK_ID(15, UNIT_SEC),
1514 TALK_ID(20, UNIT_SEC), TALK_ID(30, UNIT_SEC),
1515 TALK_ID(45, UNIT_SEC),TALK_ID(60, UNIT_SEC),
1516 TALK_ID(90, UNIT_SEC)),
1517 #endif /* HAVE_LCD_SLEEP_SETTING */
1518 #endif /* HAVE_BACKLIGHT */
1520 OFFON_SETTING(0, hold_lr_for_scroll_in_list, -1, true,
1521 "hold_lr_for_scroll_in_list",NULL),
1522 #ifdef HAVE_LCD_BITMAP
1523 CHOICE_SETTING(0, show_path_in_browser, LANG_SHOW_PATH, SHOW_PATH_CURRENT,
1524 "show path in browser", "off,current directory,full path",
1525 NULL, 3, ID2P(LANG_OFF), ID2P(LANG_SHOW_PATH_CURRENT),
1526 ID2P(LANG_DISPLAY_FULL_PATH)),
1527 #endif
1529 #ifdef HAVE_AGC
1530 {F_T_INT,&global_settings.rec_agc_preset_mic,LANG_RECORDING_AGC_PRESET,
1531 INT(1),"agc mic preset",NULL,UNUSED},
1532 {F_T_INT,&global_settings.rec_agc_preset_line,LANG_RECORDING_AGC_PRESET,
1533 INT(1),"agc line preset",NULL,UNUSED},
1534 {F_T_INT,&global_settings.rec_agc_maxgain_mic,-1,INT(104),
1535 "agc maximum mic gain",NULL,UNUSED},
1536 {F_T_INT,&global_settings.rec_agc_maxgain_line,-1,INT(96),
1537 "agc maximum line gain",NULL,UNUSED},
1538 {F_T_INT,&global_settings.rec_agc_cliptime,LANG_RECORDING_AGC_CLIPTIME,
1539 INT(1),"agc cliptime","0.2s,0.4s,0.6s,0.8,1s",UNUSED},
1540 #endif
1542 #ifdef HAVE_REMOTE_LCD
1543 #ifdef HAS_REMOTE_BUTTON_HOLD
1544 CHOICE_SETTING(0, remote_backlight_on_button_hold,
1545 LANG_BACKLIGHT_ON_BUTTON_HOLD, 0,
1546 "remote backlight on button hold",
1547 "normal,off,on", remote_backlight_set_on_button_hold, 3,
1548 ID2P(LANG_NORMAL), ID2P(LANG_OFF), ID2P(LANG_ON)),
1549 #endif
1550 #endif
1551 #ifdef HAVE_HEADPHONE_DETECTION
1552 CHOICE_SETTING(0, unplug_mode, LANG_HEADPHONE_UNPLUG, 0,
1553 "pause on headphone unplug", "off,pause,pause and resume",
1554 NULL, 3, ID2P(LANG_OFF), ID2P(LANG_PAUSE),
1555 ID2P(LANG_HEADPHONE_UNPLUG_RESUME)),
1556 OFFON_SETTING(0, unplug_autoresume,
1557 LANG_HEADPHONE_UNPLUG_DISABLE_AUTORESUME, false,
1558 "disable autoresume if phones not present",NULL),
1559 #endif
1560 INT_SETTING(0, pause_rewind, LANG_PAUSE_REWIND, 0,
1561 "rewind duration on pause", UNIT_SEC, 0, 15, 1, NULL, NULL,
1562 NULL),
1563 #if CONFIG_TUNER
1564 CHOICE_SETTING(0, fm_region, LANG_FM_REGION, 0,
1565 "fm_region", "eu,us,jp,kr,it,wo", set_radio_region, 6,
1566 ID2P(LANG_FM_EUROPE), ID2P(LANG_FM_US),
1567 ID2P(LANG_FM_JAPAN), ID2P(LANG_FM_KOREA),
1568 ID2P(LANG_FM_ITALY), ID2P(LANG_FM_OTHER)),
1569 #endif
1571 OFFON_SETTING(F_BANFROMQS, audioscrobbler, LANG_AUDIOSCROBBLER, false,
1572 "Last.fm Logging", NULL),
1573 #if CONFIG_TUNER
1574 TEXT_SETTING(0, fmr_file, "fmr", "-",
1575 FMPRESET_PATH "/", ".fmr"),
1576 TEXT_SETTING(F_THEMESETTING,fms_file, "fms",
1577 DEFAULT_FMS_NAME, SBS_DIR "/", ".fms"),
1578 #ifdef HAVE_REMOTE_LCD
1579 TEXT_SETTING(F_THEMESETTING,rfms_file, "rfms",
1580 DEFAULT_FMS_NAME, SBS_DIR "/", ".rfms"),
1581 #endif
1582 #endif /* CONFIG_TUNER */
1583 #ifdef HAVE_LCD_BITMAP
1584 TEXT_SETTING(F_THEMESETTING, font_file, "font",
1585 DEFAULT_FONTNAME, FONT_DIR "/", ".fnt"),
1586 #endif
1587 #ifdef HAVE_REMOTE_LCD
1588 TEXT_SETTING(F_THEMESETTING, remote_font_file, "remote font",
1589 DEFAULT_REMOTE_FONTNAME, FONT_DIR "/", ".fnt"),
1590 #endif
1591 TEXT_SETTING(F_THEMESETTING,wps_file, "wps",
1592 DEFAULT_WPSNAME, WPS_DIR "/", ".wps"),
1593 #ifdef HAVE_LCD_BITMAP
1594 TEXT_SETTING(F_THEMESETTING,sbs_file, "sbs",
1595 DEFAULT_SBSNAME, SBS_DIR "/", ".sbs"),
1596 #endif
1597 #ifdef HAVE_REMOTE_LCD
1598 TEXT_SETTING(F_THEMESETTING,rwps_file,"rwps",
1599 DEFAULT_WPSNAME, WPS_DIR "/", ".rwps"),
1600 TEXT_SETTING(F_THEMESETTING,rsbs_file, "rsbs",
1601 DEFAULT_SBSNAME, SBS_DIR "/", ".rsbs"),
1602 #endif
1603 TEXT_SETTING(0,lang_file,"lang","",LANG_DIR "/",".lng"),
1604 #if LCD_DEPTH > 1
1605 TEXT_SETTING(F_THEMESETTING,backdrop_file,"backdrop",
1606 DEFAULT_BACKDROP, NULL, NULL),
1607 #endif
1608 #ifdef HAVE_LCD_BITMAP
1609 TEXT_SETTING(0,kbd_file,"kbd","-",ROCKBOX_DIR "/",".kbd"),
1610 #endif
1611 #ifdef HAVE_USB_CHARGING_ENABLE
1612 CHOICE_SETTING(0, usb_charging, LANG_USB_CHARGING, 1, "usb charging",
1613 "off,on,force", NULL, 3, ID2P(LANG_SET_BOOL_NO),
1614 ID2P(LANG_SET_BOOL_YES), ID2P(LANG_FORCE)),
1615 #endif
1616 OFFON_SETTING(F_BANFROMQS,cuesheet,LANG_CUESHEET_ENABLE,false,"cuesheet support",
1617 NULL),
1618 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, skip_length,
1619 LANG_SKIP_LENGTH, 0, "skip length",
1620 "outro,track,1s,2s,3s,5s,7s,10s,15s,20s,30s,45s,1min,90s,2min,3min,5min,10min,15min",
1621 UNIT_SEC, formatter_unit_0_is_skip_track,
1622 getlang_unit_0_is_skip_track, NULL,
1623 19, -1,0,1,2,3,5,7,10,15,20,30,45,60,90,120,180,300,600,900),
1624 CHOICE_SETTING(0, start_in_screen, LANG_START_SCREEN, 1,
1625 "start in screen", "previous,root,files,"
1626 #ifdef HAVE_TAGCACHE
1627 #define START_DB_COUNT 1
1628 "db,"
1629 #else
1630 #define START_DB_COUNT 0
1631 #endif
1632 "wps,menu,"
1633 #ifdef HAVE_RECORDING
1634 #define START_REC_COUNT 1
1635 "recording,"
1636 #else
1637 #define START_REC_COUNT 0
1638 #endif
1639 #if CONFIG_TUNER
1640 #define START_TUNER_COUNT 1
1641 "radio,"
1642 #else
1643 #define START_TUNER_COUNT 0
1644 #endif
1645 "bookmarks"
1646 #ifdef HAVE_PICTUREFLOW_INTEGRATION
1647 #define START_PF_COUNT 1
1648 ",pictureflow"
1649 #else
1650 #define START_PF_COUNT 0
1651 #endif
1652 , NULL,
1653 (6 + START_DB_COUNT + START_REC_COUNT + START_TUNER_COUNT + START_PF_COUNT),
1654 ID2P(LANG_PREVIOUS_SCREEN), ID2P(LANG_MAIN_MENU),
1655 ID2P(LANG_DIR_BROWSER),
1656 #ifdef HAVE_TAGCACHE
1657 ID2P(LANG_TAGCACHE),
1658 #endif
1659 ID2P(LANG_RESUME_PLAYBACK), ID2P(LANG_SETTINGS),
1660 #ifdef HAVE_RECORDING
1661 ID2P(LANG_RECORDING),
1662 #endif
1663 #if CONFIG_TUNER
1664 ID2P(LANG_FM_RADIO),
1665 #endif
1666 ID2P(LANG_BOOKMARK_MENU_RECENT_BOOKMARKS)
1667 #ifdef HAVE_PICTUREFLOW_INTEGRATION
1668 ,ID2P(LANG_ONPLAY_PICTUREFLOW)
1669 #endif
1671 SYSTEM_SETTING(NVRAM(1),last_screen,-1),
1672 #if defined(HAVE_RTC_ALARM) && \
1673 (defined(HAVE_RECORDING) || CONFIG_TUNER)
1674 {F_T_INT, &global_settings.alarm_wake_up_screen, LANG_ALARM_WAKEUP_SCREEN,
1675 INT(ALARM_START_WPS), "alarm wakeup screen", ALARM_SETTING_TEXT,UNUSED},
1676 #endif /* HAVE_RTC_ALARM */
1678 /* Customizable icons */
1679 #ifdef HAVE_LCD_BITMAP
1680 TEXT_SETTING(F_THEMESETTING, icon_file, "iconset", DEFAULT_ICONSET,
1681 ICON_DIR "/", ".bmp"),
1682 TEXT_SETTING(F_THEMESETTING, viewers_icon_file, "viewers iconset",
1683 DEFAULT_VIEWERS_ICONSET,
1684 ICON_DIR "/", ".bmp"),
1685 #endif
1686 #ifdef HAVE_REMOTE_LCD
1687 TEXT_SETTING(F_THEMESETTING, remote_icon_file, "remote iconset", "-",
1688 ICON_DIR "/", ".bmp"),
1689 TEXT_SETTING(F_THEMESETTING, remote_viewers_icon_file,
1690 "remote viewers iconset", "-",
1691 ICON_DIR "/", ".bmp"),
1692 #endif /* HAVE_REMOTE_LCD */
1693 #ifdef HAVE_LCD_COLOR
1694 TEXT_SETTING(F_THEMESETTING, colors_file, "filetype colours", "-",
1695 THEME_DIR "/", ".colours"),
1696 #endif
1697 #ifdef HAVE_BUTTON_LIGHT
1698 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, buttonlight_timeout,
1699 LANG_BUTTONLIGHT_TIMEOUT, 5, "button light timeout", off_on,
1700 UNIT_SEC, backlight_formatter, backlight_getlang,
1701 buttonlight_set_timeout, 20,
1702 -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120),
1703 #endif
1704 #ifdef HAVE_BUTTONLIGHT_BRIGHTNESS
1705 INT_SETTING(F_NO_WRAP, buttonlight_brightness, LANG_BUTTONLIGHT_BRIGHTNESS,
1706 DEFAULT_BRIGHTNESS_SETTING,
1707 "button light brightness",UNIT_INT, MIN_BRIGHTNESS_SETTING,
1708 MAX_BRIGHTNESS_SETTING, 1, NULL, NULL,
1709 buttonlight_set_brightness),
1710 #endif
1711 #ifndef HAVE_WHEEL_ACCELERATION
1712 INT_SETTING(0, list_accel_start_delay, LANG_LISTACCEL_START_DELAY,
1713 2, "list_accel_start_delay", UNIT_SEC, 0, 10, 1,
1714 formatter_unit_0_is_off, getlang_unit_0_is_off, NULL),
1715 INT_SETTING(0, list_accel_wait, LANG_LISTACCEL_ACCEL_SPEED,
1716 3, "list_accel_wait", UNIT_SEC, 1, 10, 1,
1717 scanaccel_formatter, getlang_unit_0_is_off, NULL),
1718 #endif /* HAVE_WHEEL_ACCELERATION */
1719 #if CONFIG_CODEC == SWCODEC
1720 /* keyclick */
1721 CHOICE_SETTING(0, keyclick, LANG_KEYCLICK, 0,
1722 "keyclick", "off,weak,moderate,strong", NULL, 4,
1723 ID2P(LANG_OFF), ID2P(LANG_WEAK), ID2P(LANG_MODERATE),
1724 ID2P(LANG_STRONG)),
1725 OFFON_SETTING(0, keyclick_repeats, LANG_KEYCLICK_REPEATS, false,
1726 "keyclick repeats", NULL),
1727 #endif /* CONFIG_CODEC == SWCODEC */
1728 TEXT_SETTING(0, playlist_catalog_dir, "playlist catalog directory",
1729 PLAYLIST_CATALOG_DEFAULT_DIR, NULL, NULL),
1730 #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
1731 CHOICE_SETTING(0, touchpad_sensitivity, LANG_TOUCHPAD_SENSITIVITY, 0,
1732 "touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2,
1733 ID2P(LANG_NORMAL), ID2P(LANG_HIGH)),
1734 #endif
1735 #ifdef HAVE_QUICKSCREEN
1736 CUSTOM_SETTING(0, qs_items[QUICKSCREEN_TOP], LANG_TOP_QS_ITEM,
1737 NULL, "qs top",
1738 qs_load_from_cfg, qs_write_to_cfg,
1739 qs_is_changed, qs_set_default),
1740 CUSTOM_SETTING(0, qs_items[QUICKSCREEN_LEFT], LANG_LEFT_QS_ITEM,
1741 &global_settings.playlist_shuffle, "qs left",
1742 qs_load_from_cfg, qs_write_to_cfg,
1743 qs_is_changed, qs_set_default),
1744 CUSTOM_SETTING(0, qs_items[QUICKSCREEN_RIGHT], LANG_RIGHT_QS_ITEM,
1745 &global_settings.repeat_mode, "qs right",
1746 qs_load_from_cfg, qs_write_to_cfg,
1747 qs_is_changed, qs_set_default),
1748 CUSTOM_SETTING(0, qs_items[QUICKSCREEN_BOTTOM], LANG_BOTTOM_QS_ITEM,
1749 NULL, "qs bottom",
1750 qs_load_from_cfg, qs_write_to_cfg,
1751 qs_is_changed, qs_set_default),
1752 #endif
1753 #ifdef HAVE_SPEAKER
1754 OFFON_SETTING(0, speaker_enabled, LANG_ENABLE_SPEAKER, false, "speaker",
1755 audiohw_enable_speaker),
1756 #endif
1757 #ifdef HAVE_TOUCHSCREEN
1758 CHOICE_SETTING(0, touch_mode, LANG_TOUCHSCREEN_MODE, DEFAULT_TOUCHSCREEN_MODE,
1759 "touchscreen mode", "point,grid", NULL, 2,
1760 ID2P(LANG_TOUCHSCREEN_POINT), ID2P(LANG_TOUCHSCREEN_GRID)),
1761 CUSTOM_SETTING(0, ts_calibration_data, -1,
1762 &default_calibration_parameters, "touchscreen calibration",
1763 tsc_load_from_cfg, tsc_write_to_cfg,
1764 tsc_is_changed, tsc_set_default),
1765 #endif
1766 OFFON_SETTING(0, prevent_skip, LANG_PREVENT_SKIPPING, false, "prevent track skip", NULL),
1768 #ifdef HAVE_PITCHSCREEN
1769 OFFON_SETTING(0, pitch_mode_semitone, LANG_SEMITONE, false,
1770 "Semitone pitch change", NULL),
1771 #if CONFIG_CODEC == SWCODEC
1772 OFFON_SETTING(0, pitch_mode_timestretch, LANG_TIMESTRETCH, false,
1773 "Timestretch mode", NULL),
1774 #endif
1775 #endif
1777 #ifdef USB_ENABLE_HID
1778 OFFON_SETTING(0, usb_hid, LANG_USB_HID, true, "usb hid", usb_set_hid),
1779 CHOICE_SETTING(0, usb_keypad_mode, LANG_USB_KEYPAD_MODE, 0,
1780 "usb keypad mode", "multimedia,presentation,browser"
1781 #ifdef HAVE_USB_HID_MOUSE
1782 ",mouse"
1783 #endif
1784 , NULL,
1785 #ifdef HAVE_USB_HID_MOUSE
1787 #else
1789 #endif
1790 ID2P(LANG_MULTIMEDIA_MODE), ID2P(LANG_PRESENTATION_MODE),
1791 ID2P(LANG_BROWSER_MODE)
1792 #ifdef HAVE_USB_HID_MOUSE
1793 , ID2P(LANG_MOUSE_MODE)
1794 #endif
1795 ), /* CHOICE_SETTING( usb_keypad_mode ) */
1796 #endif
1798 #if defined(USB_ENABLE_STORAGE) && defined(HAVE_MULTIDRIVE)
1799 OFFON_SETTING(0, usb_skip_first_drive, LANG_USB_SKIP_FIRST_DRIVE, false, "usb skip first drive", usb_set_skip_first_drive),
1800 #endif
1802 /* Customizable list */
1803 #ifdef HAVE_LCD_BITMAP
1804 VIEWPORT_SETTING(ui_vp_config, "ui viewport"),
1805 #ifdef HAVE_REMOTE_LCD
1806 VIEWPORT_SETTING(remote_ui_vp_config, "remote ui viewport"),
1807 #endif
1808 #endif
1810 #ifdef HAVE_MORSE_INPUT
1811 OFFON_SETTING(0, morse_input, LANG_MORSE_INPUT, false, "morse input", NULL),
1812 #endif
1814 #ifdef HAVE_HOTKEY
1815 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, hotkey_wps,
1816 LANG_HOTKEY_WPS, HOTKEY_VIEW_PLAYLIST, "hotkey wps",
1817 "off,view playlist,show track info,pitchscreen,open with,delete"
1818 #ifdef HAVE_PICTUREFLOW_INTEGRATION
1819 ",pictureflow"
1820 #endif
1821 ,UNIT_INT, hotkey_formatter, hotkey_getlang, NULL,
1822 #ifdef HAVE_PICTUREFLOW_INTEGRATION
1824 #else
1826 #endif
1827 HOTKEY_OFF,
1828 HOTKEY_VIEW_PLAYLIST, HOTKEY_SHOW_TRACK_INFO, HOTKEY_PITCHSCREEN,
1829 HOTKEY_OPEN_WITH, HOTKEY_DELETE
1830 #ifdef HAVE_PICTUREFLOW_INTEGRATION
1831 , HOTKEY_PICTUREFLOW
1832 #endif
1834 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, hotkey_tree,
1835 LANG_HOTKEY_FILE_BROWSER, HOTKEY_OFF, "hotkey tree",
1836 "off,open with,delete,insert,insert shuffled",
1837 UNIT_INT, hotkey_formatter, hotkey_getlang, NULL, 5, HOTKEY_OFF,
1838 HOTKEY_OPEN_WITH, HOTKEY_DELETE, HOTKEY_INSERT, HOTKEY_INSERT_SHUFFLED),
1839 #endif
1841 #if CONFIG_CODEC == SWCODEC
1842 INT_SETTING(0, resume_rewind, LANG_RESUME_REWIND, 0,
1843 "resume rewind", UNIT_SEC, 0, 60, 5,
1844 NULL, NULL, NULL),
1845 #endif
1848 const int nb_settings = sizeof(settings)/sizeof(*settings);
1850 const struct settings_list* get_settings_list(int*count)
1852 *count = nb_settings;
1853 return settings;