summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/filetree.c35
-rw-r--r--apps/lang/english.lang44
-rw-r--r--apps/recorder/icons.c1
-rw-r--r--apps/recorder/icons.h1
-rw-r--r--apps/recorder/radio.c369
-rw-r--r--apps/recorder/radio.h6
-rw-r--r--apps/settings.c40
-rw-r--r--apps/settings.h5
-rw-r--r--apps/tree.c3
-rw-r--r--apps/tree.h1
10 files changed, 419 insertions, 86 deletions
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;
@@ -278,6 +282,9 @@ int ft_load(struct tree_context* c, const char* tempdir)
#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) ||
(*c->dirfilter == SHOW_MOD && (dptr->attr & TREE_ATTR_MASK) != TREE_ATTR_MOD) ||
@@ -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++;
- else
- curr_preset--;
- }
- else if (num_presets > 1)
- {
- if (direction > 0)
- curr_preset = 0;
+
+ if(direction > 0)
+ if(curr_preset == num_presets - 1)
+ 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
@@ -106,6 +106,9 @@ const struct filetype filetypes[] = {
#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 },
#ifdef HAVE_LCD_BITMAP
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*);