diff --git a/apps/filetree.c b/apps/filetree.c index 08a33cd7b4..1a4d5ae432 100644 --- a/apps/filetree.c +++ b/apps/filetree.c @@ -45,6 +45,10 @@ #include "keyboard.h" #endif +#ifdef CONFIG_TUNER +#include "radio.h" +#endif + #ifndef SIMULATOR static int boot_size = 0; static int boot_cluster; @@ -277,6 +281,9 @@ int ft_load(struct tree_context* c, const char* tempdir) (*c->dirfilter == SHOW_WPS && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_WPS) || #ifdef HAVE_REMOTE_LCD (*c->dirfilter == SHOW_RWPS && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_RWPS) || +#endif +#ifdef CONFIG_TUNER + (*c->dirfilter == SHOW_FMR && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_FMR) || #endif (*c->dirfilter == SHOW_CFG && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_CFG) || (*c->dirfilter == SHOW_LNG && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_LNG) || @@ -418,6 +425,34 @@ int ft_enter(struct tree_context* c) } break; +#ifdef CONFIG_TUNER + /* fmr preset file */ + case TREE_ATTR_FMR: + + /* Preset inside the default folder. */ + if(!strncasecmp(FMPRESET_PATH, buf, strlen(FMPRESET_PATH))) + { + set_file(buf, global_settings.fmr_file, MAX_FILENAME); + radio_load_presets(global_settings.fmr_file); + if(get_radio_status() != FMRADIO_PLAYING && + get_radio_status() != FMRADIO_PAUSED) + radio_screen(); + } + /* + * Preset outside default folder, we can choose such only + * if we are out of the radio screen, so the check for the + * radio status isn't neccessary + */ + else + { + radio_load_presets(buf); + radio_screen(); + } + + break; +#endif + + /* wps config file */ case TREE_ATTR_WPS: wps_data_load(gui_wps[0].data, buf, true); diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 0a3a684146..58411fdba7 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -3677,3 +3677,47 @@ desc: possible answers to resume question eng: "(PLAY/STOP)" voice: "" new: + +id: LANG_FM_NO_PRESETS +desc: error when preset list is empty +eng: "No presets" +voice: "No presets" +new: + +id: LANG_FM_PRESET_LOAD +desc: load preset list in fm radio +eng: "Load Preset List" +voice: "Load Preset List" +new: + +id: LANG_FM_PRESET_SAVE +desc: Save preset list in fm radio +eng: "Save Preset List" +voice: "Save Preset List" +new: + +id: LANG_FM_PRESET_CLEAR +desc: clear preset list in fm radio +eng: "Clear Preset List" +voice: "Clear Preset List" +new: + +id: LANG_FMR +desc: Used when you need to say Preset List, also voiced +eng: "Preset List" +voice: "Preset List" +new: + +id: LANG_FM_FIRST_AUTOSCAN +desc: When you run the radio without an fmr file in settings +eng: "No Settings found, AutoScan?" +voice: "No Settings found, AutoScan?" +new: + +id: LANG_FM_SAVE_CHANGES +desc: When you try to exit radio to confirm save +eng: "Save Changes?" +voice: "Save Changes?" +new: + + diff --git a/apps/recorder/icons.c b/apps/recorder/icons.c index 4b6df725f9..bbb117e568 100644 --- a/apps/recorder/icons.c +++ b/apps/recorder/icons.c @@ -47,6 +47,7 @@ const unsigned char bitmap_icons_6x8[][6] = { 0x4e, 0x51, 0x51, 0x40, 0x55, 0x55 }, /* Config file */ { 0x0a, 0x0a, 0x5f, 0x4e, 0x24, 0x18 }, /* Plugin file */ { 0xff, 0x81, 0xaf, 0xaa, 0x8c, 0xf8 }, /* Bookmark file */ + { 0x5f, 0x45, 0x5b, 0x40, 0x55, 0x55 }, /* Preset file */ { 0x77, 0x55, 0x55, 0x55, 0x55, 0x77 }, /* Queued Item */ { 0x3e, 0x41, 0x3e, 0x1c, 0x1c, 0x08 }, /* Moving Item */ { 0x7f, 0x7f, 0x1c, 0x3e, 0x77, 0x63 }, /* Keyboard file */ diff --git a/apps/recorder/icons.h b/apps/recorder/icons.h index 15747edeeb..d29b549245 100644 --- a/apps/recorder/icons.h +++ b/apps/recorder/icons.h @@ -54,6 +54,7 @@ enum icons_6x8 { Icon_Config, Icon_Plugin, Icon_Bookmark, + Icon_Preset, Icon_Queued, Icon_Moving, Icon_Keyboard, diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c index 7cdfd51e6d..3fef9507c1 100644 --- a/apps/recorder/radio.c +++ b/apps/recorder/radio.c @@ -58,6 +58,8 @@ #include "yesno.h" #include "buttonbar.h" #include "power.h" +#include "tree.h" +#include "dir.h" #ifdef CONFIG_TUNER @@ -130,19 +132,24 @@ static int radio_mode = RADIO_SCAN_MODE; static int radio_status = FMRADIO_OFF; #define MAX_PRESETS 64 -static bool presets_loaded = false; +static bool presets_loaded = false, presets_changed = false; static struct fmstation presets[MAX_PRESETS]; -static const char default_filename[] = "/.rockbox/fm-presets-default.fmr"; +static char filepreset[MAX_PATH]; /* preset filename variable */ static int preset_menu; /* The menu index of the preset list */ static struct menu_item preset_menu_items[MAX_PRESETS]; -static int num_presets; /* The number of presets in the preset list */ +static int num_presets = 0; /* The number of presets in the preset list */ -void radio_load_presets(void); +void radio_save_presets(void); bool handle_radio_presets(void); bool radio_menu(void); bool radio_add_preset(void); +bool save_preset_list(void); +bool load_preset_list(void); +bool clear_preset_list(void); + +static bool scan_presets(void); #ifdef SIMULATOR void radio_set(int setting, int value); @@ -160,6 +167,19 @@ int (*radio_get)(int setting); #endif #endif +/* Function to manipulate all yesno dialogues. + This function needs the output text as an argument. */ +bool yesno_pop(char* text) +{ + int i; + char *lines[]={text}; + struct text_message message={lines, 1}; + bool ret = (gui_syncyesno_run(&message,NULL,NULL)== YESNO_YES); + FOR_NB_SCREENS(i) + gui_textarea_clear(&screens[i]); + return ret; +} + void radio_init(void) { #ifndef SIMULATOR @@ -185,7 +205,7 @@ int get_radio_status(void) } void radio_stop(void) -{ +{ radio_set(RADIO_MUTE, 1); radio_set(RADIO_SLEEP, 1); /* low power mode, if available */ radio_status = FMRADIO_OFF; @@ -208,6 +228,8 @@ bool radio_hardware_present(void) static int find_preset(int freq) { int i; + if(num_presets < 1) + return -1; for(i = 0;i < MAX_PRESETS;i++) { if(freq == presets[i].frequency) @@ -253,31 +275,27 @@ void next_preset(int direction) { if (num_presets < 1) return; - curr_preset = find_preset(curr_freq); + if(curr_preset == -1) curr_preset = find_closest_preset(curr_freq); - else if ((curr_preset < (num_presets-1) && direction > 0) || - ((curr_preset > 0) && direction < 0)) - { - if (direction > 0) - curr_preset++; + + if(direction > 0) + if(curr_preset == num_presets - 1) + curr_preset = 0; else - curr_preset--; - } - else if (num_presets > 1) - { - if (direction > 0) - curr_preset = 0; - else - curr_preset = num_presets - 1; - } + curr_preset++; else - return; + if(curr_preset == 0) + curr_preset = num_presets - 1; + else + curr_preset--; + curr_freq = presets[curr_preset].frequency; radio_set(RADIO_FREQUENCY, curr_freq); remember_frequency(); } + bool radio_screen(void) { char buf[MAX_PATH]; @@ -313,11 +331,12 @@ bool radio_screen(void) #endif /* always display status bar in radio screen for now */ global_settings.statusbar = true; - FOR_NB_SCREENS(i){ + FOR_NB_SCREENS(i) + { gui_textarea_clear(&screens[i]); screen_set_xmargin(&screens[i],0); } - + gui_syncstatusbar_draw(&statusbars,true); fh = font_get(FONT_UI)->height; @@ -326,21 +345,30 @@ bool radio_screen(void) if(fh < 10) top_of_screen = 1; - radio_load_presets(); - + if(!num_presets) + { + memset(presets, 0, sizeof(presets)); + radio_load_presets(global_settings.fmr_file); + } + #ifndef SIMULATOR #if CONFIG_CODEC != SWCODEC if(rec_create_directory() > 0) have_recorded = true; #endif - - audio_stop(); + if(radio_status == FMRADIO_PLAYING_OUT) + radio_status = FMRADIO_PLAYING; + else if(radio_status == FMRADIO_PAUSED_OUT) + radio_status = FMRADIO_PAUSED; + + if(radio_status == FMRADIO_OFF) + audio_stop(); + #if CONFIG_CODEC != SWCODEC audio_init_recording(); sound_settings_apply(); - /* Yes, we use the D/A for monitoring */ peak_meter_playback(true); @@ -373,7 +401,8 @@ bool radio_screen(void) curr_freq = global_settings.last_frequency * FREQ_STEP + MIN_FREQ; - if(radio_status != FMRADIO_PLAYING){ + if(radio_status == FMRADIO_OFF) + { radio_power(true); radio_set(RADIO_SLEEP, 0); /* wake up the tuner */ radio_set(RADIO_FREQUENCY, curr_freq); @@ -391,6 +420,9 @@ bool radio_screen(void) radio_set(RADIO_MUTE, 0); radio_status = FMRADIO_PLAYING; } + + if(num_presets == 0 && yesno_pop(str(LANG_FM_FIRST_AUTOSCAN))) + scan_presets(); curr_preset = find_preset(curr_freq); if(curr_preset != -1) @@ -402,7 +434,7 @@ bool radio_screen(void) #endif cpu_idle_mode(true); - + while(!done) { if(search_dir) @@ -463,6 +495,18 @@ bool radio_screen(void) #endif { done = true; + if(presets_changed) + { + if(yesno_pop(str(LANG_FM_SAVE_CHANGES))) + { + if(filepreset[0] == '\0') + save_preset_list(); + else + radio_save_presets(); + } + } + /* Clear the preset list on exit. */ + clear_preset_list(); } update_screen = true; break; @@ -517,6 +561,21 @@ bool radio_screen(void) #endif keep_playing = true; done = true; + + if(presets_changed) + { + if(yesno_pop(str(LANG_FM_SAVE_CHANGES))) + { + if(filepreset[0] == '\0') + save_preset_list(); + else + radio_save_presets(); + } + } + + /* Clear the preset list on exit. */ + clear_preset_list(); + break; #ifdef BUTTON_RC_REW @@ -563,6 +622,12 @@ bool radio_screen(void) case BUTTON_LEFT | BUTTON_REPEAT: if(radio_mode == RADIO_SCAN_MODE) search_dir = -1; + else + { + next_preset(-1); + update_screen = true; + } + break; #ifdef BUTTON_RC_FF @@ -571,6 +636,12 @@ bool radio_screen(void) case BUTTON_RIGHT | BUTTON_REPEAT: if(radio_mode == RADIO_SCAN_MODE) search_dir = 1; + else + { + next_preset(1); + update_screen = true; + } + break; #ifdef BUTTON_RC_VOL_UP @@ -671,16 +742,25 @@ bool radio_screen(void) ) break; #endif - if(num_presets < 1){ + if(num_presets < 1) + { gui_syncsplash(HZ, true, str(LANG_FM_NO_PRESETS)); update_screen = true; + FOR_NB_SCREENS(i) + { + gui_textarea_clear(&screens[i]); + screen_set_xmargin(&screens[i],0); + gui_textarea_update(&screens[i]); + } + break; } handle_radio_presets(); - curr_preset = find_preset(curr_freq); - FOR_NB_SCREENS(i){ + FOR_NB_SCREENS(i) + { gui_textarea_clear(&screens[i]); screen_set_xmargin(&screens[i],0); + gui_textarea_update(&screens[i]); } #ifdef HAS_BUTTONBAR gui_buttonbar_set(&buttonbar, @@ -729,10 +809,14 @@ bool radio_screen(void) ) { if(radio_mode == RADIO_SCAN_MODE) - radio_mode = RADIO_PRESET_MODE; + { + /* Force scan mode if there are no presets. */ + if(num_presets > 0) + radio_mode = RADIO_PRESET_MODE; + } else radio_mode = RADIO_SCAN_MODE; - update_screen = true; + update_screen = true; } break; #endif @@ -899,26 +983,34 @@ bool radio_screen(void) #endif sound_settings_apply(); - +#endif /* SIMULATOR */ if(keep_playing) { +/* Catch FMRADIO_PLAYING_OUT status for the sim. */ +#ifndef SIMULATOR #if CONFIG_CODEC != SWCODEC /* Enable the Left and right A/D Converter */ audio_set_recording_gain(sound_default(SOUND_LEFT_GAIN), sound_default(SOUND_RIGHT_GAIN), AUDIO_GAIN_LINEIN); mas_codec_writereg(6, 0x4000); #endif +#endif + if(radio_status == FMRADIO_PAUSED) + radio_status = FMRADIO_PAUSED_OUT; + else + radio_status = FMRADIO_PLAYING_OUT; + } else { radio_stop(); +#ifndef SIMULATOR /* SIMULATOR. Catch FMRADIO_OFF status for the sim. */ #if CONFIG_CODEC == SWCODEC pcm_rec_mux(0); /* Line In */ peak_meter_enabled = true; #endif +#endif /* SIMULATOR */ } - -#endif cpu_idle_mode(false); @@ -932,8 +1024,8 @@ void radio_save_presets(void) { int fd; int i; - - fd = creat(default_filename, O_WRONLY); + + fd = creat(filepreset, O_WRONLY); if(fd >= 0) { for(i = 0;i < num_presets;i++) @@ -941,14 +1033,18 @@ void radio_save_presets(void) fdprintf(fd, "%d:%s\n", presets[i].frequency, presets[i].name); } close(fd); + + if(!strncasecmp(FMPRESET_PATH, filepreset, strlen(FMPRESET_PATH))) + set_file(filepreset, global_settings.fmr_file, MAX_FILENAME); + presets_changed = false; } else { - gui_syncsplash(HZ*2, true, str(LANG_FM_PRESET_SAVE_FAILED)); - } + gui_syncsplash(HZ, true, str(LANG_FM_PRESET_SAVE_FAILED)); + } } -void radio_load_presets(void) +void radio_load_presets(char *filename) { int fd; int rc; @@ -958,38 +1054,58 @@ void radio_load_presets(void) bool done = false; int f; - if(!presets_loaded) - { - memset(presets, 0, sizeof(presets)); - num_presets = 0; + + memset(presets, 0, sizeof(presets)); + num_presets = 0; + +/* No Preset in configuration. */ + if(filename[0] == '\0') + { + filepreset[0] = '\0'; + return; + } +/* Temporary preset, loaded until player shuts down. */ + else if(filename[0] == '/') + strncpy(filepreset, filename, sizeof(filepreset)); +/* Preset from default directory. */ + else + snprintf(filepreset, sizeof(filepreset), "%s/%s.fmr", + FMPRESET_PATH, filename); - fd = open(default_filename, O_RDONLY); - if(fd >= 0) + fd = open(filepreset, O_RDONLY); + if(fd >= 0) + { + while(!done && num_presets < MAX_PRESETS) { - while(!done && num_presets < MAX_PRESETS) + rc = read_line(fd, buf, 128); + if(rc > 0) { - rc = read_line(fd, buf, 128); - if(rc > 0) + if(settings_parseline(buf, &freq, &name)) { - if(settings_parseline(buf, &freq, &name)) + f = atoi(freq); + if(f) /* For backwards compatibility */ { - f = atoi(freq); - if(f) /* For backwards compatibility */ - { - presets[num_presets].frequency = f; - strncpy(presets[num_presets].name, name, 27); - presets[num_presets].name[27] = 0; - num_presets++; - } + presets[num_presets].frequency = f; + strncpy(presets[num_presets].name, name, 27); + presets[num_presets].name[27] = 0; + num_presets++; } } - else - done = true; } - close(fd); + else + done = true; } + close(fd); } - presets_loaded = true; + else /* invalid file name? */ + filepreset[0] = '\0'; + + if(num_presets > 0) + presets_loaded = true; + else + presets_loaded = false; + + presets_changed = false; } static void rebuild_preset_menu(void) @@ -1022,12 +1138,14 @@ bool radio_add_preset(void) rebuild_preset_menu(); #endif num_presets++; - radio_save_presets(); + presets_changed = true; + if(num_presets > 0) + presets_loaded = true; } } else { - gui_syncsplash(HZ*2, true, str(LANG_FM_NO_FREE_PRESETS)); + gui_syncsplash(HZ, true, str(LANG_FM_NO_FREE_PRESETS)); } return true; } @@ -1063,7 +1181,7 @@ static bool radio_edit_preset(void) { buf[27] = 0; strcpy(presets[pos].name, buf); - radio_save_presets(); + presets_changed = true; } return true; } @@ -1081,11 +1199,64 @@ bool radio_delete_preset(void) /* We must still rebuild the menu table, since the item name pointers must be updated */ rebuild_preset_menu(); - radio_save_presets(); - + + /* Don't ask to save when all presets are deleted. */ + if(num_presets > 0) + presets_changed = true; + else + { + presets_changed = false; + /* The preset list will be cleared, switch to Scan Mode. */ + radio_mode = RADIO_SCAN_MODE; + presets_loaded = false; + } + return true; /* Make the menu return immediately */ } +bool load_preset_list(void) +{ + return !rockbox_browse(FMPRESET_PATH, SHOW_FMR); +} + +bool save_preset_list(void) +{ + if(num_presets != 0) + { + if(!opendir(FMPRESET_PATH)) /* Check if there is preset folder */ + mkdir(FMPRESET_PATH, 0); + + create_numbered_filename(filepreset, FMPRESET_PATH, "preset", ".fmr", 2); + + if (!kbd_input(filepreset, sizeof(filepreset))) + radio_save_presets(); + } + else + gui_syncsplash(HZ,true,str(LANG_FM_NO_PRESETS)); + + return true; +} + +bool clear_preset_list(void) +{ + int i; + + /* Clear all the preset entries */ + for(i = 0;i <= num_presets;i++){ + presets[i].name[0] = '\0'; + presets[i].frequency = 0; + } + + num_presets = 0; + presets_loaded = false; + /* The preset list will be cleared switch to Scan Mode. */ + radio_mode = RADIO_SCAN_MODE; + + presets_changed = false; /* Don't ask to save when clearing the list. */ + + return true; +} + /* little menu on what to do with a preset entry */ bool handle_radio_presets_menu(void) { @@ -1128,6 +1299,12 @@ int handle_radio_presets_cb(int key, int m) #ifdef FM_PRESET_ACTION case FM_PRESET_ACTION: #endif +#ifdef MENU_RC_ENTER + case MENU_RC_ENTER | BUTTON_REPEAT: +#endif +#ifdef MENU_RC_ENTER2 + case MENU_RC_ENTER2 | BUTTON_REPEAT: +#endif #ifdef MENU_ENTER2 case MENU_ENTER2 | BUTTON_REPEAT: #endif @@ -1142,17 +1319,31 @@ int handle_radio_presets_cb(int key, int m) key = BUTTON_NONE; break; } +#ifdef MENU_RC_ENTER + case MENU_RC_ENTER | BUTTON_REL: +#endif +#ifdef MENU_RC_ENTER2 + case MENU_RC_ENTER2 | BUTTON_REL: +#endif #ifdef MENU_ENTER2 case MENU_ENTER2 | BUTTON_REL: #endif case MENU_ENTER | BUTTON_REL: key = MENU_ENTER; /* fake enter for short press */ break; + +/* ignore down events */ +#ifdef MENU_RC_ENTER + case MENU_RC_ENTER: +#endif +#ifdef MENU_RC_ENTER2 + case MENU_RC_ENTER2: +#endif #ifdef MENU_ENTER2 case MENU_ENTER2: #endif - case MENU_ENTER: /* ignore down event */ + case MENU_ENTER: /* Ignore the release events */ #ifdef FM_PRESET_ADD case FM_PRESET_ADD | BUTTON_REL: @@ -1267,18 +1458,19 @@ static bool toggle_radio_mode(void) static bool scan_presets(void) { - bool tuned = false; + bool tuned = false, do_scan = true; char buf[27]; int freq, i; - char *lines[]={str(LANG_FM_CLEAR_PRESETS)}; - struct text_message message={lines, 1}; - - if(gui_syncyesno_run(&message,NULL,NULL)==YESNO_YES){ - FOR_NB_SCREENS(i) - gui_textarea_clear(&screens[i]); + + if(num_presets > 0) /* Do that to avoid 2 questions. */ + do_scan = yesno_pop(str(LANG_FM_CLEAR_PRESETS)); + + if(do_scan) + { curr_freq = MIN_FREQ; num_presets = 0; - while(curr_freq <= MAX_FREQ){ + while(curr_freq <= MAX_FREQ) + { if (num_presets >= MAX_PRESETS) break; @@ -1309,14 +1501,25 @@ static bool scan_presets(void) } - radio_save_presets(); + presets_changed = true; + + FOR_NB_SCREENS(i) + { + gui_textarea_clear(&screens[i]); + screen_set_xmargin(&screens[i],0); + gui_textarea_update(&screens[i]); + } - if(num_presets > 0 ){ + if(num_presets > 0 ) + { curr_freq = presets[0].frequency; radio_set(RADIO_FREQUENCY, curr_freq); remember_frequency(); radio_mode = RADIO_PRESET_MODE; + presets_loaded = true; } + else + presets_loaded = false; } return true; } @@ -1363,6 +1566,10 @@ bool radio_menu(void) #ifndef FM_PRESET_ADD { ID2P(LANG_FM_ADD_PRESET) , radio_add_preset }, #endif + { ID2P(LANG_FM_PRESET_LOAD) , load_preset_list }, + { ID2P(LANG_FM_PRESET_SAVE) , save_preset_list }, + { ID2P(LANG_FM_PRESET_CLEAR) , clear_preset_list }, + { monomode_menu_string , toggle_mono_mode }, #ifndef FM_MODE { radiomode_menu_string , toggle_radio_mode }, diff --git a/apps/recorder/radio.h b/apps/recorder/radio.h index b4f4da2f4f..4763d117f8 100644 --- a/apps/recorder/radio.h +++ b/apps/recorder/radio.h @@ -18,12 +18,16 @@ ****************************************************************************/ #ifndef RADIO_H #define RADIO_H +#define FMPRESET_PATH ROCKBOX_DIR "/fmpresets" #define FMRADIO_OFF 0 #define FMRADIO_PLAYING 1 -#define FMRADIO_PAUSED 2 +#define FMRADIO_PLAYING_OUT 2 +#define FMRADIO_PAUSED 3 +#define FMRADIO_PAUSED_OUT 4 #ifdef CONFIG_TUNER +void radio_load_presets(char *filename); void radio_init(void); bool radio_screen(void); void radio_stop(void); diff --git a/apps/settings.c b/apps/settings.c index 7d7b2295f5..cbd39335f1 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -77,6 +77,10 @@ #include "backdrop.h" #endif +#ifdef CONFIG_TUNER +#include "radio.h" +#endif + #if CONFIG_CODEC == MAS3507D void dac_line_in(bool enable); #endif @@ -150,6 +154,7 @@ modified unless the header & checksum test fails. Rest of config block, only saved to disk: 0x2C start of 2nd bit-table ... +0xA4 (char[20]) FMR Preset file 0xB8 (char[20]) WPS file 0xCC (char[20]) Lang file 0xE0 (char[20]) Font file @@ -912,6 +917,13 @@ int settings_save( void ) MAX_FILENAME); i+= MAX_FILENAME; #endif + +#ifdef CONFIG_TUNER + strncpy((char *)&config_block[i], (char *)global_settings.fmr_file, + MAX_FILENAME); + i+= MAX_FILENAME; +#endif + #ifdef HAVE_LCD_COLOR strncpy((char *)&config_block[i], (char *)global_settings.backdrop_file, MAX_FILENAME); @@ -1263,6 +1275,13 @@ void settings_load(int which) MAX_FILENAME); i+= MAX_FILENAME; #endif + +#ifdef CONFIG_TUNER + strncpy((char *)global_settings.fmr_file, (char *)&config_block[i], + MAX_FILENAME); + i+= MAX_FILENAME; +#endif + #ifdef HAVE_LCD_COLOR strncpy((char *)global_settings.backdrop_file, (char *)&config_block[i], MAX_FILENAME); @@ -1433,6 +1452,11 @@ bool settings_load_config(const char* file) talk_init(); /* use voice of same language */ } } +#ifdef CONFIG_TUNER + else if (!strcasecmp(name, "fmr")) { + set_file(value, global_settings.fmr_file, MAX_FILENAME); + } +#endif #ifdef HAVE_LCD_BITMAP else if (!strcasecmp(name, "font")) { if (font_load(value)) @@ -1580,9 +1604,9 @@ bool settings_save_config(void) } fdprintf(fd, "# .cfg file created by rockbox %s - " - "http://www.rockbox.org\r\n#\r\n" - "#\r\n# wps / language / font \r\n#\r\n", appsversion); - + "http://www.rockbox.org\r\n#\r\n#\r\n# wps / rwps / language" + " / font / fmpreset / backdrop \r\n#\r\n", appsversion); + if (global_settings.wps_file[0] != 0) fdprintf(fd, "wps: %s/%s.wps\r\n", WPS_DIR, global_settings.wps_file); @@ -1609,6 +1633,12 @@ bool settings_save_config(void) global_settings.backdrop_file); #endif +#ifdef CONFIG_TUNER + if (global_settings.fmr_file[0] != 0) + fdprintf(fd, "fmr: %s/%s.fmr\r\n", FMPRESET_PATH, + global_settings.fmr_file); +#endif + #ifdef HAVE_LCD_BITMAP if (global_settings.kbd_file[0] != 0) fdprintf(fd, "keyboard: %s/%s.kbd\r\n", ROCKBOX_DIR, @@ -1685,6 +1715,10 @@ void settings_reset(void) { global_settings.superbass = sound_default(SOUND_SUPERBASS); #endif global_settings.contrast = lcd_default_contrast(); + +#ifdef CONFIG_TUNER + global_settings.fmr_file[0] = '\0'; +#endif global_settings.wps_file[0] = '\0'; #ifdef HAVE_REMOTE_LCD global_settings.rwps_file[0] = '\0'; diff --git a/apps/settings.h b/apps/settings.h index 498c880319..1266fed1c4 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -291,6 +291,9 @@ struct user_settings int resume_seed; /* shuffle seed (-1=no resume shuffle 0=sorted >0=shuffled) */ +#ifdef CONFIG_TUNER + unsigned char fmr_file[MAX_FILENAME+1]; /* last fmr preset */ +#endif unsigned char font_file[MAX_FILENAME+1]; /* last font */ unsigned char wps_file[MAX_FILENAME+1]; /* last wps */ unsigned char lang_file[MAX_FILENAME+1]; /* last language */ @@ -571,7 +574,7 @@ enum * must be added after NUM_FILTER_MODES. */ enum { SHOW_ALL, SHOW_SUPPORTED, SHOW_MUSIC, SHOW_PLAYLIST, SHOW_ID3DB, NUM_FILTER_MODES, - SHOW_WPS, SHOW_RWPS, SHOW_CFG, SHOW_LNG, SHOW_MOD, SHOW_FONT, SHOW_PLUGINS}; + SHOW_WPS, SHOW_RWPS, SHOW_FMR, SHOW_CFG, SHOW_LNG, SHOW_MOD, SHOW_FONT, SHOW_PLUGINS}; /* recursive dir insert options */ enum { RECURSE_OFF, RECURSE_ON, RECURSE_ASK }; diff --git a/apps/tree.c b/apps/tree.c index 5fe94cb290..f492f8c8bd 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -105,6 +105,9 @@ const struct filetype filetypes[] = { #endif #ifdef HAVE_LCD_COLOR { "bmp", TREE_ATTR_BMP, Icon_Wps, VOICE_EXT_WPS }, +#endif +#ifdef CONFIG_TUNER + { "fmr", TREE_ATTR_FMR, Icon_Preset, LANG_FMR }, #endif { "lng", TREE_ATTR_LNG, Icon_Language, LANG_LANGUAGE }, { "rock",TREE_ATTR_ROCK,Icon_Plugin, VOICE_EXT_ROCK }, diff --git a/apps/tree.h b/apps/tree.h index c632ccdb52..ae97351dbb 100644 --- a/apps/tree.h +++ b/apps/tree.h @@ -243,6 +243,7 @@ struct tree_context { #define TREE_ATTR_RWPS 0x1000 /* remote-wps config file */ #define TREE_ATTR_BMP 0x1100 /* backdrop bmp file */ #define TREE_ATTR_KBD 0x1200 /* keyboard file */ +#define TREE_ATTR_FMR 0x1300 /* preset file */ #define TREE_ATTR_MASK 0xFF00 /* which bits tree.c uses for file types */ void tree_get_filetypes(const struct filetype**, int*);