A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd

Move cfg_vals from settings_list, expand settings_dumper

cfg_vals aren't needed for most settings

F_TABLE_SETTING, F_CHOICE_SETTING, F_BOOL_SETTING

can use cfg_vals but only a few custom settings use it otherwise
for these settings we define F_HAS_CFGVALS and use the setting union instead (as these all use UNUSED)

noticed that settings_dumper missed most cfg values so didn't show text setting values

saves ~300 bytes

Change-Id: Ie504c8cfe2a6cf471117c3afe5cf9a770a7f1784

+128 -79
+7 -4
apps/gui/option_select.c
··· 477 477 478 478 bool option_screen(const struct settings_list *setting, 479 479 struct viewport parent[NB_SCREENS], 480 - bool use_temp_var, unsigned char* option_title) 480 + bool use_temp_var, const unsigned char* option_title) 481 481 { 482 482 int action; 483 483 bool done = false; ··· 490 490 491 491 int var_type = setting->flags&F_T_MASK; 492 492 void (*function)(int) = NULL; 493 - char *title; 493 + const char *title = NULL; 494 494 if (var_type == F_T_INT || var_type == F_T_UINT) 495 495 { 496 496 variable = use_temp_var ? &temp_var: (int*)setting->setting; ··· 508 508 gui_synclist_init(&lists, value_setting_get_name_cb, 509 509 (void*)setting, false, 1, parent); 510 510 if (setting->lang_id == -1) 511 - title = (char*)setting->cfg_vals; 512 - else 511 + { 512 + title = setting_get_cfgvals(setting); 513 + } 514 + 515 + if (!title) 513 516 title = P2STR(option_title); 514 517 515 518 gui_synclist_set_title(&lists, title, Icon_Questionmark);
+1 -1
apps/gui/option_select.h
··· 32 32 33 33 bool option_screen(const struct settings_list *setting, 34 34 struct viewport parent[NB_SCREENS], 35 - bool use_temp_var, unsigned char* option_title); 35 + bool use_temp_var, const unsigned char* option_title); 36 36 37 37 #if defined(HAVE_QUICKSCREEN) || defined(HAVE_RECORDING) || defined(HAVE_TOUCHSCREEN) 38 38 void option_select_next_val(const struct settings_list *setting,
+1 -1
apps/gui/skin_engine/skin_parser.c
··· 1606 1606 break; 1607 1607 case F_T_INT: 1608 1608 case F_T_UINT: 1609 - if (setting->cfg_vals == NULL) 1609 + if (setting_get_cfgvals(s->setting) == NULL) 1610 1610 { 1611 1611 touchsetting->value.number = atoi(text); 1612 1612 }
+1 -1
apps/gui/skin_engine/skin_tokens.c
··· 1447 1447 * on 16 bits ... 1448 1448 * but this is pretty useless anyway */ 1449 1449 numeric_ret = *(int*)s->setting + 1; 1450 - else if (s->cfg_vals == NULL) 1450 + else if (setting_get_cfgvals(s->setting) == NULL) 1451 1451 /* %?St|name|<1st choice|2nd choice|...> */ 1452 1452 numeric_ret = (*(int*)s->setting-s->int_setting->min) 1453 1453 /s->int_setting->step + 1;
+1 -1
apps/plugin.h
··· 858 858 int (*settings_save)(void); 859 859 bool (*option_screen)(const struct settings_list *setting, 860 860 struct viewport parent[NB_SCREENS], 861 - bool use_temp_var, unsigned char* option_title); 861 + bool use_temp_var, const unsigned char* option_title); 862 862 bool (*set_option)(const char* string, const void* variable, 863 863 enum optiontype type, const struct opt_items* options, 864 864 int numoptions, void (*function)(int));
+25 -3
apps/plugins/settings_dumper.c
··· 42 42 setting_count++; 43 43 if (setting_count%10 == 0) 44 44 rb->fdprintf(fd, "\r\n"); 45 + text[0] = '\0'; 46 + 45 47 switch (setting->flags&F_T_MASK) 46 48 { 47 49 case F_T_CUSTOM: ··· 77 79 min, max, step); 78 80 } 79 81 else if (setting->flags&F_CHOICE_SETTING && 80 - (setting->cfg_vals == NULL)) 82 + (setting->choice_setting->cfg_vals == NULL)) 81 83 { 82 84 char temp[64]; 83 85 int i; ··· 89 91 rb->strcat(text, temp); 90 92 } 91 93 } 92 - else if (setting->cfg_vals != NULL) 94 + 95 + const char *cfgvals = NULL; 96 + if ((setting->flags & F_CHOICE_SETTING) == F_CHOICE_SETTING) 93 97 { 94 - rb->snprintf(text, sizeof(text), "%s", setting->cfg_vals); 98 + cfgvals = setting->choice_setting->cfg_vals; 99 + } 100 + else if ((setting->flags & F_BOOL_SETTING) == F_BOOL_SETTING) 101 + { 102 + cfgvals = setting->bool_setting->cfg_vals; 103 + } 104 + else if ((setting->flags & F_TABLE_SETTING) == F_TABLE_SETTING) 105 + { 106 + cfgvals = setting->table_setting->cfg_vals; 107 + } 108 + else if ((setting->flags & F_HAS_CFGVALS) == F_HAS_CFGVALS) 109 + { 110 + cfgvals = setting->cfg_vals; 111 + } 112 + 113 + if (cfgvals != NULL) 114 + { 115 + size_t len = rb->strlen(text); 116 + rb->snprintf(text + len, sizeof(text) - len, "[%s]", cfgvals); 95 117 } 96 118 break; /* F_T_*INT */ 97 119 case F_T_BOOL:
+22 -8
apps/settings.c
··· 234 234 close(fd); 235 235 } 236 236 237 + const char* setting_get_cfgvals(const struct settings_list *setting) 238 + { 239 + if ((setting->flags & F_TABLE_SETTING) == F_TABLE_SETTING) 240 + return setting->table_setting->cfg_vals; 241 + else if ((setting->flags & F_CHOICE_SETTING) == F_CHOICE_SETTING) 242 + return setting->choice_setting->cfg_vals; 243 + else if ((setting->flags & F_BOOL_SETTING) == F_BOOL_SETTING) 244 + { 245 + DEBUGF("Setting: %s \n", setting->cfg_name); 246 + return setting->bool_setting->cfg_vals; 247 + } 248 + else if ((setting->flags & F_HAS_CFGVALS) == F_HAS_CFGVALS) 249 + return setting->cfg_vals; 250 + return NULL; 251 + } 252 + 237 253 /** Reading from a config file **/ 238 254 /* 239 255 * load settings from disk or RTC RAM ··· 255 271 256 272 bool cfg_string_to_int(const struct settings_list *setting, int* out, const char* str) 257 273 { 258 - const char* ptr = setting->cfg_vals; 274 + const char* ptr = setting_get_cfgvals(setting); 259 275 size_t len = strlen(str); 260 276 int index = 0; 261 277 ··· 375 391 } 376 392 else 377 393 #endif 378 - if (setting->cfg_vals == NULL) 394 + if (setting_get_cfgvals(setting) == NULL) 379 395 { 380 396 *(int*)setting->setting = atoi(value); 381 397 logf("Val: %s\r\n",value); ··· 466 482 467 483 bool cfg_int_to_string(const struct settings_list *setting, int val, char* buf, int buf_len) 468 484 { 469 - const char* ptr = setting->cfg_vals; 485 + const char* ptr = setting_get_cfgvals(setting); 470 486 const int *values = NULL; 471 487 int index = 0; 472 488 ··· 520 536 } 521 537 else 522 538 #endif 523 - if (setting->cfg_vals == NULL) 539 + if (setting_get_cfgvals(setting) == NULL) 524 540 { 525 541 snprintf(buf, buf_len, "%d", *(int*)setting->setting); 526 542 } ··· 1249 1265 item.int_setting = &data; 1250 1266 item.flags = F_INT_SETTING|F_T_INT; 1251 1267 item.lang_id = -1; 1252 - item.cfg_vals = (char*)string; 1253 1268 item.setting = (void *)variable; 1254 - return option_screen(&item, NULL, false, NULL); 1269 + return option_screen(&item, NULL, false, string); 1255 1270 } 1256 1271 1257 1272 ··· 1288 1303 item.int_setting = &data; 1289 1304 item.flags = F_INT_SETTING|F_T_INT; 1290 1305 item.lang_id = -1; 1291 - item.cfg_vals = (char*)string; 1292 1306 item.setting = &temp; 1293 1307 if (type == RB_BOOL) 1294 1308 temp = *(bool*)variable? 1: 0; 1295 1309 else 1296 1310 temp = *(int*)variable; 1297 - if (!option_screen(&item, NULL, false, NULL)) 1311 + if (!option_screen(&item, NULL, false, string)) 1298 1312 { 1299 1313 if (type == RB_BOOL) 1300 1314
+1 -1
apps/settings.h
··· 316 316 bool set_option(const char* string, const void* variable, enum optiontype type, 317 317 const struct opt_items* options, int numoptions, void (*function)(int)); 318 318 319 - 319 + const char* setting_get_cfgvals(const struct settings_list *setting); 320 320 321 321 /** global_settings and global_status struct definitions **/ 322 322
+43 -46
apps/settings_list.c
··· 102 102 /* Use for int settings which use the set_sound() function to set them */ 103 103 #define SOUND_SETTING(flags,var,lang_id,name,setting) \ 104 104 {flags|F_T_INT|F_T_SOUND|F_SOUNDSETTING|F_ALLOW_ARBITRARY_VALS, &global_settings.var, \ 105 - lang_id, NODEFAULT,name,NULL, \ 105 + lang_id, NODEFAULT,name, \ 106 106 {.sound_setting=(struct sound_setting[]){{setting}}} } 107 107 108 108 /* Use for bool variables which don't use LANG_SET_BOOL_YES and LANG_SET_BOOL_NO ··· 114 114 */ 115 115 #define BOOL_SETTING(flags,var,lang_id,default,name,cfgvals,yes_id,no_id,cb)\ 116 116 {flags|F_BOOL_SETTING, &global_settings.var, \ 117 - lang_id, BOOL(default),name,cfgvals, \ 118 - {.bool_setting=(struct bool_setting[]){{cb,yes_id,no_id}}} } 117 + lang_id, BOOL(default),name, \ 118 + {.bool_setting=(struct bool_setting[]){{cb,yes_id,no_id,cfgvals}}} } 119 119 120 120 /* bool setting which does use LANG_YES and _NO and save as "off,on" */ 121 121 #define OFFON_SETTING(flags,var,lang_id,default,name,cb) \ ··· 126 126 (Use NVRAM() in the flags to save to the nvram (or nvram.bin file) */ 127 127 #define SYSTEM_SETTING(flags,var,default) \ 128 128 {flags|F_T_INT, &global_status.var,-1, INT(default), \ 129 - NULL, NULL, UNUSED} 129 + NULL, UNUSED} 130 130 131 131 /* setting which stores as a filename (or another string) in the .cfgvals 132 132 The string must be a char array (which all of our string settings are), ··· 137 137 */ 138 138 #define TEXT_SETTING(flags,var,name,default,prefix,suffix) \ 139 139 {flags|F_T_UCHARPTR, &global_settings.var,-1, \ 140 - CHARPTR(default),name,NULL, \ 140 + CHARPTR(default),name, \ 141 141 {.filename_setting= \ 142 142 (struct filename_setting[]){ \ 143 143 {prefix,suffix,sizeof(global_settings.var)}}} } 144 144 145 145 #define DIRECTORY_SETTING(flags,var,lang_id,name,default) \ 146 146 {flags|F_DIRNAME|F_T_UCHARPTR, &global_settings.var, lang_id, \ 147 - CHARPTR(default), name, NULL, \ 147 + CHARPTR(default), name, \ 148 148 {.filename_setting=(struct filename_setting[]){ \ 149 149 {NULL, NULL, sizeof(global_settings.var)}}}} 150 150 ··· 153 153 screen. These can either be literal strings, or ID2P(LANG_*) */ 154 154 #define CHOICE_SETTING(flags,var,lang_id,default,name,cfg_vals,cb,count,...) \ 155 155 {flags|F_CHOICE_SETTING|F_T_INT, &global_settings.var, lang_id, \ 156 - INT(default), name, cfg_vals, \ 156 + INT(default), name, \ 157 157 {.choice_setting = (struct choice_setting[]){ \ 158 - {cb, count, {.desc = (const unsigned char*[]) \ 158 + {cb, count, cfg_vals, {.desc = (const unsigned char*[]) \ 159 159 {__VA_ARGS__}}}}}} 160 160 161 161 /* Similar to above, except the strings to display are taken from cfg_vals, ··· 164 164 cb,count,...) \ 165 165 {flags|F_CHOICE_SETTING|F_T_INT|F_CHOICETALKS, \ 166 166 &global_settings.var, lang_id, \ 167 - INT(default), name, cfg_vals, \ 167 + INT(default), name, \ 168 168 {.choice_setting = (struct choice_setting[]){ \ 169 - {cb, count, {.talks = (const int[]){__VA_ARGS__}}}}}} 169 + {cb, count, cfg_vals, {.talks = (const int[]){__VA_ARGS__}}}}}} 170 170 171 171 /* for settings which use the set_int() setting screen. 172 172 unit is the UNIT_ define to display/talk. ··· 175 175 #define INT_SETTING(flags, var, lang_id, default, name, \ 176 176 unit, min, max, step, formatter, get_talk_id, cb) \ 177 177 {flags|F_INT_SETTING|F_T_INT, &global_settings.var, \ 178 - lang_id, INT(default), name, NULL, \ 178 + lang_id, INT(default), name, \ 179 179 {.int_setting = (struct int_setting[]){ \ 180 180 {cb, unit, step, min, max, formatter, get_talk_id}}}} 181 181 #define INT_SETTING_NOWRAP(flags, var, lang_id, default, name, \ 182 182 unit, min, max, step, formatter, get_talk_id, cb) \ 183 183 {flags|F_INT_SETTING|F_T_INT|F_NO_WRAP, &global_settings.var, \ 184 - lang_id, INT(default), name, NULL, \ 184 + lang_id, INT(default), name, \ 185 185 {.int_setting = (struct int_setting[]){ \ 186 186 {cb, unit, step, min, max, formatter, get_talk_id}}}} 187 187 188 188 #define TABLE_SETTING(flags, var, lang_id, default, name, cfg_vals, \ 189 189 unit, formatter, get_talk_id, cb, count, ...) \ 190 190 {flags|F_TABLE_SETTING|F_T_INT, &global_settings.var, \ 191 - lang_id, INT(default), name, cfg_vals, \ 191 + lang_id, INT(default), name, \ 192 192 {.table_setting = (struct table_setting[]) { \ 193 193 {cb, formatter, get_talk_id, unit, count, \ 194 - (const int[]){__VA_ARGS__}}}}} 194 + cfg_vals, (const int[]){__VA_ARGS__}}}}} 195 195 196 196 #define TABLE_SETTING_LIST(flags, var, lang_id, default, name, cfg_vals, \ 197 197 unit, formatter, get_talk_id, cb, count, list) \ 198 198 {flags|F_TABLE_SETTING|F_T_INT, &global_settings.var, \ 199 - lang_id, INT(default), name, cfg_vals, \ 199 + lang_id, INT(default), name, \ 200 200 {.table_setting = (struct table_setting[]) { \ 201 - {cb, formatter, get_talk_id, unit, count, list}}}} 201 + {cb, formatter, get_talk_id, unit, count, cfg_vals, list}}}} 202 202 203 203 #define CUSTOM_SETTING(flags, var, lang_id, default, name, \ 204 204 load_from_cfg, write_to_cfg, \ 205 205 is_change, set_default) \ 206 206 {flags|F_CUSTOM_SETTING|F_T_CUSTOM|F_BANFROMQS, \ 207 207 &global_settings.var, lang_id, \ 208 - {.custom = (void*)default}, name, NULL, \ 208 + {.custom = (void*)default}, name, \ 209 209 {.custom_setting = (struct custom_setting[]){ \ 210 210 {load_from_cfg, write_to_cfg, is_change, set_default}}}} 211 211 ··· 1097 1097 -1,0,1,2,3,4,5,7,9,11,13,16,20,25,30), 1098 1098 #ifdef HAVE_LCD_COLOR 1099 1099 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.list_separator_color,-1, 1100 - INT(DEFAULT_THEME_SEPARATOR),"list separator color",NULL,UNUSED}, 1100 + INT(DEFAULT_THEME_SEPARATOR),"list separator color",UNUSED}, 1101 1101 #endif 1102 1102 #endif 1103 1103 CHOICE_SETTING(F_THEMESETTING, volume_type, LANG_VOLUME_DISPLAY, 0, ··· 1345 1345 #ifdef HAVE_LCD_COLOR 1346 1346 1347 1347 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.fg_color,-1, 1348 - INT(DEFAULT_THEME_FOREGROUND),"foreground color",NULL,UNUSED}, 1348 + INT(DEFAULT_THEME_FOREGROUND),"foreground color",UNUSED}, 1349 1349 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.bg_color,-1, 1350 - INT(DEFAULT_THEME_BACKGROUND),"background color",NULL,UNUSED}, 1350 + INT(DEFAULT_THEME_BACKGROUND),"background color",UNUSED}, 1351 1351 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lss_color,-1, 1352 - INT(DEFAULT_THEME_SELECTOR_START),"line selector start color",NULL, 1353 - UNUSED}, 1352 + INT(DEFAULT_THEME_SELECTOR_START),"line selector start color",UNUSED}, 1354 1353 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lse_color,-1, 1355 - INT(DEFAULT_THEME_SELECTOR_END),"line selector end color",NULL,UNUSED}, 1354 + INT(DEFAULT_THEME_SELECTOR_END),"line selector end color",UNUSED}, 1356 1355 {F_T_INT|F_RGB|F_THEMESETTING ,&global_settings.lst_color,-1, 1357 - INT(DEFAULT_THEME_SELECTOR_TEXT),"line selector text color",NULL, 1358 - UNUSED}, 1356 + INT(DEFAULT_THEME_SELECTOR_TEXT),"line selector text color",UNUSED}, 1359 1357 1360 1358 #endif 1361 1359 /* more playback */ ··· 1463 1461 UNIT_PM_TICK, 1, 0x7e, 1, NULL, NULL,NULL), 1464 1462 OFFON_SETTING(0,peak_meter_dbfs,LANG_PM_DBFS,true,"peak meter dbfs",NULL), 1465 1463 {F_T_INT, &global_settings.peak_meter_min, LANG_PM_MIN,INT(60), 1466 - "peak meter min", NULL, UNUSED}, 1464 + "peak meter min", UNUSED}, 1467 1465 {F_T_INT, &global_settings.peak_meter_max, LANG_PM_MAX,INT(0), 1468 - "peak meter max", NULL, UNUSED}, 1466 + "peak meter max", UNUSED}, 1469 1467 #ifdef HAVE_RECORDING 1470 1468 OFFON_SETTING(0, peak_meter_clipcounter, LANG_PM_CLIPCOUNTER, false, 1471 1469 "peak meter clipcounter", NULL), ··· 1511 1509 TALK_ID(650, UNIT_MB), TALK_ID(700, UNIT_MB), 1512 1510 TALK_ID(1024, UNIT_MB), TALK_ID(1536, UNIT_MB), 1513 1511 TALK_ID(1792, UNIT_MB)), 1514 - {F_T_INT|F_RECSETTING, &global_settings.rec_channels, LANG_CHANNELS, INT(0), 1515 - "rec channels","stereo,mono",UNUSED}, 1516 - {F_T_INT|F_RECSETTING, &global_settings.rec_mono_mode, 1517 - LANG_RECORDING_MONO_MODE, INT(0), "rec mono mode","L+R,L,R",UNUSED}, 1512 + {F_T_INT|F_RECSETTING|F_HAS_CFGVALS, &global_settings.rec_channels, LANG_CHANNELS, INT(0), 1513 + "rec channels",{.cfg_vals="stereo,mono"}}, 1514 + {F_T_INT|F_RECSETTING|F_HAS_CFGVALS, &global_settings.rec_mono_mode, 1515 + LANG_RECORDING_MONO_MODE, INT(0), "rec mono mode",{.cfg_vals="L+R,L,R"}}, 1518 1516 CHOICE_SETTING(F_RECSETTING, rec_split_type, LANG_SPLIT_TYPE, 0, 1519 1517 "rec split type", "Split,Stop,Shutdown", NULL, 3, 1520 1518 ID2P(LANG_START_NEW_FILE), ID2P(LANG_STOP_RECORDING),ID2P(LANG_STOP_RECORDING_AND_SHUTDOWN)), 1521 1519 CHOICE_SETTING(F_RECSETTING, rec_split_method, LANG_SPLIT_MEASURE, 0, 1522 1520 "rec split method", "Time,Filesize", NULL, 2, 1523 1521 ID2P(LANG_TIME), ID2P(LANG_FILESIZE)), 1524 - {F_T_INT|F_RECSETTING, &global_settings.rec_source, LANG_RECORDING_SOURCE, 1522 + {F_T_INT|F_RECSETTING|F_HAS_CFGVALS, &global_settings.rec_source, LANG_RECORDING_SOURCE, 1525 1523 INT(0), "rec source", 1526 - &HAVE_MIC_REC_(",mic") 1524 + {.cfg_vals=&HAVE_MIC_REC_(",mic") 1527 1525 HAVE_LINE_REC_(",line") 1528 1526 HAVE_SPDIF_REC_(",spdif") 1529 - HAVE_FMRADIO_REC_(",fmradio")[1], 1530 - UNUSED}, 1527 + HAVE_FMRADIO_REC_(",fmradio")[1]}}, 1531 1528 INT_SETTING(F_TIME_SETTING | F_RECSETTING, rec_prerecord_time, 1532 1529 LANG_RECORD_PRERECORD_TIME, 0, 1533 1530 "prerecording time", UNIT_SEC, 0, 30, 1, ··· 1549 1546 #ifdef DEFAULT_REC_MIC_GAIN 1550 1547 {F_T_INT|F_RECSETTING,&global_settings.rec_mic_gain, 1551 1548 LANG_GAIN,INT(DEFAULT_REC_MIC_GAIN), 1552 - "rec mic gain",NULL,UNUSED}, 1549 + "rec mic gain",UNUSED}, 1553 1550 #endif /* DEFAULT_REC_MIC_GAIN */ 1554 1551 #ifdef DEFAULT_REC_LEFT_GAIN 1555 1552 {F_T_INT|F_RECSETTING,&global_settings.rec_left_gain, 1556 1553 LANG_GAIN_LEFT,INT(DEFAULT_REC_LEFT_GAIN), 1557 - "rec left gain",NULL,UNUSED}, 1554 + "rec left gain",UNUSED}, 1558 1555 #endif /* DEFAULT_REC_LEFT_GAIN */ 1559 1556 #ifdef DEFAULT_REC_RIGHT_GAIN 1560 1557 {F_T_INT|F_RECSETTING,&global_settings.rec_right_gain,LANG_GAIN_RIGHT, 1561 1558 INT(DEFAULT_REC_RIGHT_GAIN), 1562 - "rec right gain",NULL,UNUSED}, 1559 + "rec right gain",UNUSED}, 1563 1560 #endif /* DEFAULT_REC_RIGHT_GAIN */ 1564 - {F_T_INT|F_RECSETTING,&global_settings.rec_frequency, 1561 + {F_T_INT|F_RECSETTING|F_HAS_CFGVALS,&global_settings.rec_frequency, 1565 1562 LANG_FREQUENCY,INT(REC_FREQ_DEFAULT), 1566 - "rec frequency",REC_FREQ_CFG_VAL_LIST,UNUSED}, 1567 - {F_T_INT|F_RECSETTING,&global_settings.rec_format, 1563 + "rec frequency",{.cfg_vals=REC_FREQ_CFG_VAL_LIST}}, 1564 + {F_T_INT|F_RECSETTING|F_HAS_CFGVALS,&global_settings.rec_format, 1568 1565 LANG_FORMAT,INT(REC_FORMAT_DEFAULT), 1569 - "rec format",REC_FORMAT_CFG_VAL_LIST,UNUSED}, 1566 + "rec format",{.cfg_vals=REC_FORMAT_CFG_VAL_LIST}}, 1570 1567 /** Encoder settings start - keep these together **/ 1571 1568 /* aiff_enc */ 1572 1569 /* (no settings yet) */ 1573 1570 /* mp3_enc */ 1574 - {F_T_INT|F_RECSETTING, &global_settings.mp3_enc_config.bitrate,-1, 1571 + {F_T_INT|F_RECSETTING|F_HAS_CFGVALS, &global_settings.mp3_enc_config.bitrate,-1, 1575 1572 INT(MP3_ENC_BITRATE_CFG_DEFAULT), 1576 - "mp3_enc bitrate",MP3_ENC_BITRATE_CFG_VALUE_LIST,UNUSED}, 1573 + "mp3_enc bitrate",{.cfg_vals=MP3_ENC_BITRATE_CFG_VALUE_LIST}}, 1577 1574 /* wav_enc */ 1578 1575 /* (no settings yet) */ 1579 1576 /* wavpack_enc */ ··· 2050 2047 SYSTEM_SETTING(NVRAM(1),last_screen,-1), 2051 2048 #if defined(HAVE_RTC_ALARM) && \ 2052 2049 (defined(HAVE_RECORDING) || CONFIG_TUNER) 2053 - {F_T_INT, &global_settings.alarm_wake_up_screen, LANG_ALARM_WAKEUP_SCREEN, 2054 - INT(ALARM_START_WPS), "alarm wakeup screen", ALARM_SETTING_TEXT,UNUSED}, 2050 + {F_T_INT|F_HAS_CFGVALS, &global_settings.alarm_wake_up_screen, LANG_ALARM_WAKEUP_SCREEN, 2051 + INT(ALARM_START_WPS), "alarm wakeup screen", {.cfg_vals=ALARM_SETTING_TEXT}}, 2055 2052 #endif /* HAVE_RTC_ALARM */ 2056 2053 2057 2054 /* Customizable icons */
+26 -13
apps/settings_list.h
··· 56 56 void (*option_callback)(bool); 57 57 int lang_yes; 58 58 int lang_no; 59 + const char *cfg_vals; /* comma separated symbolic values for bool 60 + * or choice/table settings -- the i'th value 61 + * maps to the integer i */ 59 62 }; 60 63 #define F_BOOL_SETTING (F_T_BOOL|0x10) 61 64 #define F_RGB 0x20 ··· 82 85 struct choice_setting { 83 86 void (*option_callback)(int); 84 87 int count; 88 + const char *cfg_vals; /* comma separated symbolic values for bool 89 + * or choice/table settings -- the i'th value 90 + * maps to the integer i */ 85 91 union { 86 92 const unsigned char **desc; 87 93 const int *talks; ··· 90 96 #define F_CHOICE_SETTING 0x100 91 97 #define F_CHOICETALKS 0x200 /* uses .talks in the above struct for the talks */ 92 98 /* and cfg_vals for the strings to display */ 99 + 100 + #define F_TEMPVAR 0x400 /* used if the setting should be set using a temp var */ 101 + #define F_PADTITLE 0x800 /* pad the title with spaces to force it to scroll */ 102 + #define F_NO_WRAP 0x1000 /* used if the list should not wrap */ 93 103 94 104 struct table_setting { 95 105 void (*option_callback)(int); ··· 97 107 int32_t (*get_talk_id)(int, int); 98 108 int unit; 99 109 int count; 110 + const char *cfg_vals; /* comma separated symbolic values for bool 111 + * or choice/table settings -- the i'th value 112 + * maps to the integer i */ 100 113 const int * values; 101 114 }; 102 115 #define F_TABLE_SETTING 0x2000 103 116 #define F_ALLOW_ARBITRARY_VALS 0x4000 104 - 105 - /* these use the _isfunc_type type for the function */ 106 - /* typedef int (*_isfunc_type)(void); */ 107 - #define F_MIN_ISFUNC 0x100000 /* min(above) is function pointer to above type */ 108 - #define F_MAX_ISFUNC 0x200000 /* max(above) is function pointer to above type */ 109 - #define F_DEF_ISFUNC 0x400000 /* default_val is function pointer to above type */ 110 117 111 118 /* The next stuff is used when none of the other types work. 112 119 Should really only be used if the value you want to store in global_settings ··· 138 145 }; 139 146 140 147 #define F_TIME_SETTING 0x10000 /* int,table format hh:mm:ss.mss auto ranged */ 141 - #define F_THEMESETTING 0x0800000 148 + #define F_HAS_CFGVALS 0x20000 /* uses setting union to carry cfg_vals */ 149 + 150 + 151 + /* these use the _isfunc_type type for the function */ 152 + /* typedef int (*_isfunc_type)(void); */ 153 + #define F_MIN_ISFUNC 0x100000 /* min(above) is function pointer to above type */ 154 + #define F_MAX_ISFUNC 0x200000 /* max(above) is function pointer to above type */ 155 + #define F_DEF_ISFUNC 0x400000 /* default_val is function pointer to above type */ 156 + 157 + #define F_THEMESETTING 0x800000 142 158 #define F_RECSETTING 0x1000000 143 159 #define F_EQSETTING 0x2000000 144 160 #define F_SOUNDSETTING 0x4000000 ··· 151 167 - number of bytes for a NVRAM setting is changed 152 168 - a NVRAM setting is removed 153 169 */ 154 - #define F_TEMPVAR 0x0400 /* used if the setting should be set using a temp var */ 155 - #define F_PADTITLE 0x0800 /* pad the title with spaces to force it to scroll */ 156 - #define F_NO_WRAP 0x1000 /* used if the list should not wrap */ 157 170 158 171 #define F_CB_ON_SELECT_ONLY 0x10000000 /* option_callback only called if selected */ 159 172 #define F_CB_ONLY_IF_CHANGED 0x20000000 /* option_callback only called if setting changed */ ··· 168 181 int lang_id; /* -1 for none */ 169 182 union storage_type default_val; 170 183 const char *cfg_name; /* this settings name in the cfg file */ 171 - const char *cfg_vals; /* comma seperated symbolic values for bool 172 - * or choice/table settings -- the i'th value 173 - * maps to the integer i */ 184 + 174 185 union { 175 186 const void *RESERVED; /* to stop compile errors, will be removed */ 176 187 const struct sound_setting *sound_setting; /* use F_T_SOUND for this */ ··· 180 191 const struct choice_setting *choice_setting; /* F_CHOICE_SETTING */ 181 192 const struct table_setting *table_setting; /* F_TABLE_SETTING */ 182 193 const struct custom_setting *custom_setting; /* F_CUSTOM_SETTING */ 194 + const char *cfg_vals; /* comma separated symbolic values for custom settings 195 + * -- the i'th value maps to the integer i */ 183 196 }; 184 197 }; 185 198 const struct settings_list* get_settings_list(int*count);