summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2010-05-12 10:38:00 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2010-05-12 10:38:00 +0000
commit1bd072c92d5f6d4a9a26d738a421f5a05048bb29 (patch)
tree11bf71c80cd995dad20b4316f201a63f78111383 /apps
parentf9736c0b63d90d3cda7e2c77d1cae20939ae328f (diff)
downloadrockbox-1bd072c92d5f6d4a9a26d738a421f5a05048bb29.tar.gz
rockbox-1bd072c92d5f6d4a9a26d738a421f5a05048bb29.tar.bz2
rockbox-1bd072c92d5f6d4a9a26d738a421f5a05048bb29.zip
FS#10853 - Skin support in the radio screen! Check CustomWPS for the new tags
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25964 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/features.txt3
-rw-r--r--apps/filetree.c18
-rw-r--r--apps/filetypes.c4
-rw-r--r--apps/filetypes.h2
-rw-r--r--apps/gui/skin_engine/skin_display.c161
-rw-r--r--apps/gui/skin_engine/skin_engine.h12
-rw-r--r--apps/gui/skin_engine/skin_parser.c31
-rw-r--r--apps/gui/skin_engine/skin_tokens.c129
-rw-r--r--apps/gui/skin_engine/skin_tokens.h28
-rw-r--r--apps/gui/skin_engine/wps_debug.c1
-rw-r--r--apps/gui/skin_engine/wps_internals.h5
-rw-r--r--apps/gui/theme_settings.c10
-rw-r--r--apps/gui/wps.c71
-rw-r--r--apps/lang/arabic.lang7
-rw-r--r--apps/lang/bulgarian.lang7
-rw-r--r--apps/lang/catala.lang6
-rw-r--r--apps/lang/chinese-simp.lang7
-rw-r--r--apps/lang/chinese-trad.lang7
-rw-r--r--apps/lang/czech.lang7
-rw-r--r--apps/lang/dansk.lang7
-rw-r--r--apps/lang/deutsch.lang7
-rw-r--r--apps/lang/eesti.lang10
-rw-r--r--apps/lang/english.lang75
-rw-r--r--apps/lang/espanol.lang7
-rw-r--r--apps/lang/esperanto.lang10
-rw-r--r--apps/lang/finnish.lang7
-rw-r--r--apps/lang/francais.lang7
-rw-r--r--apps/lang/galego.lang10
-rw-r--r--apps/lang/greek.lang7
-rw-r--r--apps/lang/hebrew.lang7
-rw-r--r--apps/lang/islenska.lang10
-rw-r--r--apps/lang/italiano.lang7
-rw-r--r--apps/lang/japanese.lang7
-rw-r--r--apps/lang/korean.lang7
-rw-r--r--apps/lang/lietuviu.lang7
-rw-r--r--apps/lang/magyar.lang7
-rw-r--r--apps/lang/nederlands.lang7
-rw-r--r--apps/lang/norsk-nynorsk.lang6
-rw-r--r--apps/lang/norsk.lang9
-rw-r--r--apps/lang/polski.lang7
-rw-r--r--apps/lang/portugues-brasileiro.lang7
-rw-r--r--apps/lang/portugues.lang7
-rw-r--r--apps/lang/romaneste.lang7
-rw-r--r--apps/lang/russian.lang7
-rw-r--r--apps/lang/slovak.lang7
-rw-r--r--apps/lang/srpski.lang7
-rw-r--r--apps/lang/svenska.lang7
-rw-r--r--apps/lang/tagalog.lang7
-rw-r--r--apps/lang/thai.lang7
-rw-r--r--apps/lang/turkce.lang7
-rw-r--r--apps/lang/ukrainian.lang13
-rw-r--r--apps/lang/wallisertitsch.lang10
-rw-r--r--apps/lang/walon.lang7
-rw-r--r--apps/menus/theme_menu.c22
-rw-r--r--apps/playback.c2
-rw-r--r--apps/recorder/radio.c303
-rw-r--r--apps/recorder/radio.h13
-rw-r--r--apps/settings.h6
-rw-r--r--apps/settings_list.c7
59 files changed, 724 insertions, 473 deletions
diff --git a/apps/features.txt b/apps/features.txt
index 0bfe695aeb..21867b077d 100644
--- a/apps/features.txt
+++ b/apps/features.txt
@@ -128,6 +128,9 @@ quickscreen
#if CONFIG_TUNER != 0
radio
+#ifdef HAVE_REMOTE_LCD
+radio_remote
+#endif
#endif
#if (CONFIG_KEYPAD == RECORDER_PAD)
diff --git a/apps/filetree.c b/apps/filetree.c
index 9ff48dc451..1faf4c987e 100644
--- a/apps/filetree.c
+++ b/apps/filetree.c
@@ -331,10 +331,16 @@ int ft_load(struct tree_context* c, const char* tempdir)
#ifdef HAVE_LCD_BITMAP
(*c->dirfilter == SHOW_FONT && (dptr->attr & FILE_ATTR_MASK) != FILE_ATTR_FONT) ||
(*c->dirfilter == SHOW_SBS && (dptr->attr & FILE_ATTR_MASK) != FILE_ATTR_SBS) ||
+#if CONFIG_TUNER
+ (*c->dirfilter == SHOW_FMS && (dptr->attr & FILE_ATTR_MASK) != FILE_ATTR_FMS) ||
+#endif
#endif
#ifdef HAVE_REMOTE_LCD
(*c->dirfilter == SHOW_RWPS && (dptr->attr & FILE_ATTR_MASK) != FILE_ATTR_RWPS) ||
(*c->dirfilter == SHOW_RSBS && (dptr->attr & FILE_ATTR_MASK) != FILE_ATTR_RSBS) ||
+#if CONFIG_TUNER
+ (*c->dirfilter == SHOW_RFMS && (dptr->attr & FILE_ATTR_MASK) != FILE_ATTR_RFMS) ||
+#endif
#endif
#if CONFIG_TUNER
(*c->dirfilter == SHOW_FMR && (dptr->attr & FILE_ATTR_MASK) != FILE_ATTR_FMR) ||
@@ -504,6 +510,18 @@ int ft_enter(struct tree_context* c)
}
break;
+ case FILE_ATTR_FMS:
+ splash(0, ID2P(LANG_WAIT));
+ set_file(buf, (char *)global_settings.fms_file, MAX_FILENAME);
+ settings_apply_skins();
+ break;
+#ifdef HAVE_REMOTE_LCD
+ case FILE_ATTR_RFMS:
+ splash(0, ID2P(LANG_WAIT));
+ set_file(buf, (char *)global_settings.rfms_file, MAX_FILENAME);
+ settings_apply_skins();
+ break;
+#endif
#endif
#ifdef HAVE_LCD_BITMAP
diff --git a/apps/filetypes.c b/apps/filetypes.c
index 3c8f4b9a39..1449f168e6 100644
--- a/apps/filetypes.c
+++ b/apps/filetypes.c
@@ -115,6 +115,7 @@ static const struct filetype inbuilt_filetypes[] = {
#endif
#if CONFIG_TUNER
{ "fmr", FILE_ATTR_FMR, Icon_Preset, LANG_FMR },
+ { "fms", FILE_ATTR_FMS, Icon_Wps, VOICE_EXT_FMS },
#endif
{ "lng", FILE_ATTR_LNG, Icon_Language, LANG_LANGUAGE },
{ "rock",FILE_ATTR_ROCK,Icon_Plugin, VOICE_EXT_ROCK },
@@ -130,6 +131,9 @@ static const struct filetype inbuilt_filetypes[] = {
#endif
#ifdef HAVE_REMOTE_LCD
{ "rsbs", FILE_ATTR_RSBS, Icon_Wps, VOICE_EXT_RSBS },
+#if CONFIG_TUNER
+ { "rfms", FILE_ATTR_RFMS, Icon_Wps, VOICE_EXT_RFMS },
+#endif
#endif
#ifdef BOOTFILE_EXT
{ BOOTFILE_EXT, FILE_ATTR_MOD, Icon_Firmware, VOICE_EXT_AJZ },
diff --git a/apps/filetypes.h b/apps/filetypes.h
index 0b4fb7b812..a957f1631f 100644
--- a/apps/filetypes.h
+++ b/apps/filetypes.h
@@ -44,6 +44,8 @@
#define FILE_ATTR_SBS 0x0F00 /* statusbar file */
#define FILE_ATTR_RSBS 0x1000 /* remote statusbar file */
#define FILE_ATTR_LUA 0x1100 /* Lua rockbox plugin */
+#define FILE_ATTR_FMS 0x1200 /* FM screen skin file */
+#define FILE_ATTR_RFMS 0x1300 /* FM screen skin file */
#define FILE_ATTR_MASK 0xFF00 /* which bits tree.c uses for file types */
struct filetype {
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index 9b42a7c18b..8d4e5b58f4 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -31,6 +31,7 @@
#ifdef DEBUG
#include "debug.h"
#endif
+#include "action.h"
#include "abrepeat.h"
#include "lang.h"
#include "language.h"
@@ -57,6 +58,9 @@
#endif
#include "backdrop.h"
#include "viewport.h"
+#include "radio.h"
+#include "tuner.h"
+#include "root_menu.h"
#include "wps_internals.h"
@@ -78,7 +82,7 @@ bool skin_update(struct gui_wps *gwps, unsigned int update_type)
struct mp3entry *id3 = gwps->state->id3;
bool cuesheet_update = (id3 != NULL ? cuesheet_subtrack_changed(id3) : false);
gwps->sync_data->do_full_update |= cuesheet_update;
-
+
retval = skin_redraw(gwps, gwps->sync_data->do_full_update ?
WPS_REFRESH_ALL : update_type);
return retval;
@@ -157,6 +161,14 @@ static void draw_progressbar(struct gui_wps *gwps,
length = id3->length;
elapsed = id3->elapsed + state->ff_rewind_count;
}
+#if CONFIG_TUNER
+ else if (in_radio_screen())
+ {
+ int min = fm_region_data[global_settings.fm_region].freq_min;
+ elapsed = radio_current_frequency() - min;
+ length = fm_region_data[global_settings.fm_region].freq_max - min;
+ }
+#endif
else
{
length = 1;
@@ -191,8 +203,8 @@ static void draw_playlist_viewer_list(struct gui_wps *gwps,
struct wps_state *state = gwps->state;
int lines = viewport_get_nb_lines(viewer->vp);
int line_height = font_get(viewer->vp->font)->height;
- int cur_playlist_pos = playlist_get_display_index();
- int start_item = MAX(0, cur_playlist_pos + viewer->start_offset);
+ int cur_pos, count;
+ int start_item;
int i;
struct wps_token token;
int x, length, alignment = WPS_TOKEN_ALIGN_LEFT;
@@ -200,39 +212,65 @@ static void draw_playlist_viewer_list(struct gui_wps *gwps,
struct mp3entry *pid3;
char buf[MAX_PATH*2], tempbuf[MAX_PATH];
const char *filename;
+ bool ismusic = true;
+#if CONFIG_TUNER
+ if (current_screen() == GO_TO_FM)
+ {
+ cur_pos = radio_current_preset();
+ count = radio_preset_count();
+ ismusic = false;
+ }
+ else
+#endif
+ {
+ cur_pos = playlist_get_display_index();
+ count = playlist_amount()+1;
+ }
+ start_item = MAX(0, cur_pos + viewer->start_offset);
gwps->display->set_viewport(viewer->vp);
- for(i=start_item; (i-start_item)<lines && i<=playlist_amount(); i++)
+ for(i=start_item; (i-start_item)<lines && i<count; i++)
{
- filename = playlist_peek(i-cur_playlist_pos);
- if (i == cur_playlist_pos)
- {
- pid3 = state->id3;
- }
- else if (i == cur_playlist_pos+1)
+ int line;
+#if CONFIG_TUNER
+ if (current_screen() == GO_TO_FM)
{
- pid3 = state->nid3;
+ pid3 = NULL;
+ line = TRACK_HAS_INFO;
+ filename = "";
}
-#if CONFIG_CODEC == SWCODEC
- else if (i>cur_playlist_pos)
+ else
+#endif
{
-#ifdef HAVE_TC_RAMCACHE
- if (tagcache_fill_tags(&viewer->tempid3, filename))
+ filename = playlist_peek(i-cur_pos);
+ if (i == cur_pos)
{
- pid3 = &viewer->tempid3;
+ pid3 = state->id3;
}
- else
+ else if (i == cur_pos+1)
+ {
+ pid3 = state->nid3;
+ }
+#if CONFIG_CODEC == SWCODEC
+ else if (i>cur_pos)
+ {
+#ifdef HAVE_TC_RAMCACHE
+ if (tagcache_fill_tags(&viewer->tempid3, filename))
+ {
+ pid3 = &viewer->tempid3;
+ }
+ else
#endif
- if (!audio_peek_track(&pid3, i-cur_playlist_pos))
- pid3 = NULL;
- }
+ if (!audio_peek_track(&pid3, i-cur_pos))
+ pid3 = NULL;
+ }
#endif
- else
- {
- pid3 = NULL;
+ else
+ {
+ pid3 = NULL;
+ }
+ line = pid3 ? TRACK_HAS_INFO : TRACK_HAS_NO_INFO;
}
-
- int line = pid3 ? TRACK_HAS_INFO : TRACK_HAS_NO_INFO;
int j = 0, cur_string = 0;
unsigned int line_len = 0;
buf[0] = '\0';
@@ -243,12 +281,18 @@ static void draw_playlist_viewer_list(struct gui_wps *gwps,
token.value.i = 0;
token.next = false;
out = get_id3_token(&token, pid3, tempbuf, sizeof(tempbuf), -1, NULL);
+#if CONFIG_TUNER
+ if (!out)
+ out = get_radio_token(&token, i-cur_pos,
+ tempbuf, sizeof(tempbuf), -1, NULL);
+#endif
if (out)
{
line_len = strlcat(buf, out, sizeof(buf));
j++;
continue;
}
+
switch (viewer->lines[line].tokens[j])
{
case WPS_TOKEN_ALIGN_CENTER:
@@ -1303,3 +1347,70 @@ static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode)
return true;
}
+
+bool skin_has_sbs(enum screen_type screen, struct wps_data *data)
+{
+ (void)screen;
+ bool draw = false;
+#ifdef HAVE_LCD_BITMAP
+ if (data->wps_sb_tag)
+ draw = data->show_sb_on_wps;
+ else if (statusbar_position(screen) != STATUSBAR_OFF)
+ draw = true;
+#endif
+ return draw;
+}
+
+/* do the button loop as often as required for the peak meters to update
+ * with a good refresh rate.
+ * gwps is really gwps[NB_SCREENS]! don't wrap this if FOR_NB_SCREENS()
+ */
+int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout)
+{
+#ifdef HAVE_LCD_BITMAP
+ int i;
+ int button = ACTION_NONE;
+ /* when the peak meter is enabled we want to have a
+ few extra updates to make it look smooth. On the
+ other hand we don't want to waste energy if it
+ isn't displayed */
+ bool pm=false;
+ FOR_NB_SCREENS(i)
+ {
+ if(gwps[i].data->peak_meter_enabled)
+ pm = true;
+ }
+
+ if (pm) {
+ long next_refresh = current_tick;
+ long next_big_refresh = current_tick + timeout;
+ button = BUTTON_NONE;
+ while (TIME_BEFORE(current_tick, next_big_refresh)) {
+ button = get_action(context,TIMEOUT_NOBLOCK);
+ if (button != ACTION_NONE) {
+ break;
+ }
+ peak_meter_peek();
+ sleep(0); /* Sleep until end of current tick. */
+
+ if (TIME_AFTER(current_tick, next_refresh)) {
+ FOR_NB_SCREENS(i)
+ {
+ if(gwps[i].data->peak_meter_enabled)
+ skin_update(&gwps[i], WPS_REFRESH_PEAK_METER);
+ next_refresh += HZ / PEAK_METER_FPS;
+ }
+ }
+ }
+
+ }
+
+ /* The peak meter is disabled
+ -> no additional screen updates needed */
+ else
+#endif
+ {
+ button = get_action(context, timeout);
+ }
+ return button;
+}
diff --git a/apps/gui/skin_engine/skin_engine.h b/apps/gui/skin_engine/skin_engine.h
index 90f38c9920..380b854d24 100644
--- a/apps/gui/skin_engine/skin_engine.h
+++ b/apps/gui/skin_engine/skin_engine.h
@@ -30,6 +30,9 @@
enum skinnable_screens {
CUSTOM_STATUSBAR,
WPS,
+#if CONFIG_TUNER
+ FM_SCREEN,
+#endif
SKINNABLE_SCREENS_COUNT
@@ -53,9 +56,18 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data,
/* call this in statusbar toggle handlers if needed */
void skin_statusbar_changed(struct gui_wps*);
+bool skin_has_sbs(enum screen_type screen, struct wps_data *data);
+
/* load a backdrop into the skin buffer.
* reuse buffers if the file is already loaded */
char* skin_backdrop_load(char* backdrop, char *bmpdir, enum screen_type screen);
void skin_backdrop_init(void);
+
+
+/* do the button loop as often as required for the peak meters to update
+ * with a good refresh rate.
+ * gwps is really gwps[NB_SCREENS]! don't wrap this in FOR_NB_SCREENS()
+ */
+int skin_wait_for_action(struct gui_wps *gwps, int context, int timeout);
#endif
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 78ec26eaf9..93df300335 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -52,6 +52,7 @@
#include "skin_engine.h"
#include "settings.h"
#include "settings_list.h"
+#include "radio.h"
#include "skin_fonts.h"
#ifdef HAVE_LCD_BITMAP
@@ -348,6 +349,25 @@ static const struct wps_tag all_tags[] = {
{ WPS_TOKEN_CROSSFADE, "xf", WPS_REFRESH_DYNAMIC, NULL },
#endif
+ { WPS_TOKEN_HAVE_TUNER, "tp", WPS_REFRESH_STATIC, NULL },
+#if CONFIG_TUNER /* Re-uses the 't' and 'T' prefixes, be careful about doubleups */
+ { WPS_TOKEN_TUNER_TUNED, "tt", WPS_REFRESH_DYNAMIC, NULL },
+ { WPS_TOKEN_TUNER_SCANMODE, "tm", WPS_REFRESH_DYNAMIC, NULL },
+ { WPS_TOKEN_TUNER_STEREO, "ts", WPS_REFRESH_DYNAMIC, NULL },
+ { WPS_TOKEN_TUNER_MINFREQ, "ta", WPS_REFRESH_STATIC, NULL },
+ { WPS_TOKEN_TUNER_MAXFREQ, "tb", WPS_REFRESH_STATIC, NULL },
+ { WPS_TOKEN_TUNER_CURFREQ, "tf", WPS_REFRESH_DYNAMIC, NULL },
+ { WPS_TOKEN_PRESET_ID, "Ti", WPS_REFRESH_STATIC, NULL },
+ { WPS_TOKEN_PRESET_NAME, "Tn", WPS_REFRESH_STATIC, NULL },
+ { WPS_TOKEN_PRESET_FREQ, "Tf", WPS_REFRESH_STATIC, NULL },
+ { WPS_TOKEN_PRESET_COUNT, "Tc", WPS_REFRESH_STATIC, NULL },
+ { WPS_TOKEN_HAVE_RDS, "tx", WPS_REFRESH_STATIC, NULL },
+#ifdef HAVE_RDS_CAPS
+ { WPS_TOKEN_RDS_NAME, "ty", WPS_REFRESH_DYNAMIC, NULL },
+ { WPS_TOKEN_RDS_TEXT, "tz", WPS_REFRESH_DYNAMIC, NULL },
+#endif
+#endif /* CONFIG_TUNER */
+
{ WPS_NO_TOKEN, "s", WPS_REFRESH_SCROLL, NULL },
{ WPS_TOKEN_SUBLINE_TIMEOUT, "t", 0, parse_timeout },
@@ -398,10 +418,14 @@ static const struct wps_tag all_tags[] = {
/* Recording Tokens */
{ WPS_TOKEN_HAVE_RECORDING, "Rp", WPS_REFRESH_STATIC, NULL },
#ifdef HAVE_RECORDING
+ { WPS_TOKEN_IS_RECORDING, "Rr", WPS_REFRESH_DYNAMIC, NULL },
{ WPS_TOKEN_REC_FREQ, "Rf", WPS_REFRESH_DYNAMIC, NULL },
{ WPS_TOKEN_REC_ENCODER, "Re", WPS_REFRESH_DYNAMIC, NULL },
{ WPS_TOKEN_REC_BITRATE, "Rb", WPS_REFRESH_DYNAMIC, NULL },
{ WPS_TOKEN_REC_MONO, "Rm", WPS_REFRESH_DYNAMIC, NULL },
+ { WPS_TOKEN_REC_SECONDS, "Rs", WPS_REFRESH_DYNAMIC, NULL },
+ { WPS_TOKEN_REC_MINUTES, "Rn", WPS_REFRESH_DYNAMIC, NULL },
+ { WPS_TOKEN_REC_HOURS, "Rh", WPS_REFRESH_DYNAMIC, NULL },
#endif
{ WPS_TOKEN_UNKNOWN, "", 0, NULL }
/* the array MUST end with an empty string (first char is \0) */
@@ -1723,6 +1747,13 @@ static int check_feature_tag(const char *wps_bufptr, const int type)
#else
return find_false_branch(wps_bufptr);
#endif
+ case WPS_TOKEN_HAVE_TUNER:
+#if CONFIG_TUNER
+ if (radio_hardware_present())
+ return 0;
+#endif
+ return find_false_branch(wps_bufptr);
+
default: /* not a tag we care about, just don't skip */
return 0;
}
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
index 20206f0114..4acf7ea840 100644
--- a/apps/gui/skin_engine/skin_tokens.c
+++ b/apps/gui/skin_engine/skin_tokens.c
@@ -61,6 +61,8 @@
#endif
#include "language.h"
#include "usb.h"
+#include "radio.h"
+#include "tuner.h"
extern struct wps_state wps_state;
@@ -339,6 +341,89 @@ const char *get_id3_token(struct wps_token *token, struct mp3entry *id3,
return buf;
}
+#if CONFIG_TUNER
+/* Tokens which are really only used by the radio screen go in here */
+const char *get_radio_token(struct wps_token *token, int preset_offset,
+ char *buf, int buf_size, int limit, int *intval)
+{
+ (void)limit;
+ switch (token->type)
+ {
+ /* Radio/tuner tokens */
+ case WPS_TOKEN_TUNER_TUNED:
+ if (tuner_get(RADIO_TUNED))
+ return "t";
+ return NULL;
+ case WPS_TOKEN_TUNER_SCANMODE:
+ if (radio_scan_mode())
+ return "s";
+ return NULL;
+ case WPS_TOKEN_TUNER_STEREO:
+ if (radio_is_stereo())
+ return "s";
+ return NULL;
+ case WPS_TOKEN_TUNER_MINFREQ: /* changes based on "region" */
+ {
+ int freq = fm_region_data[global_settings.fm_region].freq_min / 10000;
+ snprintf(buf, buf_size, "%d.%02d", freq/100, freq%100);
+ return buf;
+ }
+ case WPS_TOKEN_TUNER_MAXFREQ: /* changes based on "region" */
+ {
+ int freq = fm_region_data[global_settings.fm_region].freq_max / 10000;
+ snprintf(buf, buf_size, "%d.%02d", freq/100, freq%100);
+ return buf;
+ }
+ case WPS_TOKEN_TUNER_CURFREQ:
+ {
+ int freq = radio_current_frequency() / 10000;
+ snprintf(buf, buf_size, "%d.%02d", freq/100, freq%100);
+ return buf;
+ }
+ case WPS_TOKEN_PRESET_ID:
+ snprintf(buf, buf_size, "%d", radio_current_preset() + 1 + preset_offset);
+ return buf;
+ case WPS_TOKEN_PRESET_NAME:
+ case WPS_TOKEN_PRESET_FREQ:
+ {
+ int preset = radio_current_preset() + preset_offset;
+ if (radio_preset_count() == 0 || preset == -1)
+ return NULL;
+ /* make sure its in the valid range */
+ while (preset < 0)
+ preset += radio_preset_count();
+ preset %= radio_preset_count();
+ if (token->type == WPS_TOKEN_PRESET_NAME)
+ {
+ snprintf(buf, buf_size, "%s", radio_get_preset(preset)->name);
+ }
+ else
+ {
+ int freq = radio_get_preset(preset)->frequency / 10000;
+ snprintf(buf, buf_size, "%d.%02d", freq/100, freq%100);
+ }
+ return buf;
+ }
+ case WPS_TOKEN_PRESET_COUNT:
+ snprintf(buf, buf_size, "%d", radio_preset_count());
+ if (intval)
+ *intval = radio_preset_count();
+ return buf;
+ case WPS_TOKEN_HAVE_RDS:
+#ifdef HAVE_RDS_CAP
+ return "rds";
+ case WPS_TOKEN_RDS_NAME:
+ return tuner_get_rds_info(RADIO_RDS_NAME);
+ case WPS_TOKEN_RDS_TEXT:
+ return tuner_get_rds_info(RADIO_RDS_TEXT);
+#else
+ return NULL; /* end of the WPS_TOKEN_HAVE_RDS case */
+#endif /* HAVE_RDS_CAP */
+ }
+ return NULL;
+}
+#endif
+
/* Return the tags value as text. buf should be used as temp storage if needed.
intval is used with conditionals/enums: when this function is called,
@@ -396,6 +481,11 @@ const char *get_token_value(struct gui_wps *gwps,
out_text = get_id3_token(token, id3, buf, buf_size, limit, intval);
if (out_text)
return out_text;
+#if CONFIG_TUNER
+ out_text = get_radio_token(token, 0, buf, buf_size, limit, intval);
+ if (out_text)
+ return out_text;
+#endif
switch (token->type)
{
@@ -971,6 +1061,9 @@ const char *get_token_value(struct gui_wps *gwps,
* The string's emptyness discards the setting's
* prefix and suffix */
*intval = ((char*)s->setting)[0]?1:2;
+ /* if there is a prefix we should ignore it here */
+ if (s->filename_setting->prefix)
+ return (char*)s->setting;
break;
default:
/* This shouldn't happen ... but you never know */
@@ -988,6 +1081,12 @@ const char *get_token_value(struct gui_wps *gwps,
cfg_to_string(token->value.i,buf,buf_size);
return buf;
}
+ case WPS_TOKEN_HAVE_TUNER:
+#if CONFIG_TUNER
+ if (radio_hardware_present())
+ return "r";
+#endif
+ return NULL;
/* Recording tokens */
case WPS_TOKEN_HAVE_RECORDING:
#ifdef HAVE_RECORDING
@@ -997,6 +1096,10 @@ const char *get_token_value(struct gui_wps *gwps,
#endif
#ifdef HAVE_RECORDING
+ case WPS_TOKEN_IS_RECORDING:
+ if (audio_status() == AUDIO_STATUS_RECORD)
+ return "r";
+ return NULL;
case WPS_TOKEN_REC_FREQ: /* order from REC_FREQ_CFG_VAL_LIST */
{
#if CONFIG_CODEC == SWCODEC
@@ -1179,8 +1282,34 @@ const char *get_token_value(struct gui_wps *gwps,
if (!global_settings.rec_channels)
return "m";
return NULL;
+
+ case WPS_TOKEN_REC_SECONDS:
+ {
+ int time = (audio_recorded_time() / HZ) % 60;
+ if (intval)
+ *intval = time;
+ snprintf(buf, buf_size, "%02d", time);
+ return buf;
+ }
+ case WPS_TOKEN_REC_MINUTES:
+ {
+ int time = (audio_recorded_time() / HZ) / 60;
+ if (intval)
+ *intval = time;
+ snprintf(buf, buf_size, "%02d", time);
+ return buf;
+ }
+ case WPS_TOKEN_REC_HOURS:
+ {
+ int time = (audio_recorded_time() / HZ) / 3600;
+ if (intval)
+ *intval = time;
+ snprintf(buf, buf_size, "%02d", time);
+ return buf;
+ }
#endif /* HAVE_RECORDING */
+
case WPS_TOKEN_CURRENT_SCREEN:
{
int curr_screen = current_screen();
diff --git a/apps/gui/skin_engine/skin_tokens.h b/apps/gui/skin_engine/skin_tokens.h
index aefae40af9..f25b123d9d 100644
--- a/apps/gui/skin_engine/skin_tokens.h
+++ b/apps/gui/skin_engine/skin_tokens.h
@@ -219,10 +219,38 @@ enum wps_token_type {
/* Recording Tokens */
TOKEN_MARKER_RECORDING,
WPS_TOKEN_HAVE_RECORDING,
+ WPS_TOKEN_IS_RECORDING,
WPS_TOKEN_REC_FREQ,
WPS_TOKEN_REC_ENCODER,
WPS_TOKEN_REC_BITRATE, /* SWCODEC: MP3 bitrate, HWCODEC: MP3 "quality" */
WPS_TOKEN_REC_MONO,
+ WPS_TOKEN_REC_SECONDS,
+ WPS_TOKEN_REC_MINUTES,
+ WPS_TOKEN_REC_HOURS,
+
+
+ /* Radio Tokens */
+ TOKEN_MARKER_TUNER,
+ WPS_TOKEN_HAVE_TUNER,
+#if CONFIG_TUNER
+ WPS_TOKEN_TUNER_TUNED,
+ WPS_TOKEN_TUNER_SCANMODE,
+ WPS_TOKEN_TUNER_STEREO,
+ WPS_TOKEN_TUNER_MINFREQ, /* changes based on "region" */
+ WPS_TOKEN_TUNER_MAXFREQ, /* changes based on "region" */
+ WPS_TOKEN_TUNER_CURFREQ,
+ WPS_TOKEN_PRESET_ID, /* "id" of this preset.. really the array element number */
+ WPS_TOKEN_PRESET_NAME,
+ WPS_TOKEN_PRESET_FREQ,
+ WPS_TOKEN_PRESET_COUNT,
+ /* RDS tokens */
+ WPS_TOKEN_HAVE_RDS,
+#ifdef HAVE_RDS_CAP
+ WPS_TOKEN_RDS_NAME,
+ WPS_TOKEN_RDS_TEXT,
+#endif
+#endif /* CONFIG_TUNER */
+
TOKEN_MARKER_END, /* this needs to be the last value in this enum */
};
diff --git a/apps/gui/skin_engine/wps_debug.c b/apps/gui/skin_engine/wps_debug.c
index 4186e306e3..a1ebb837d0 100644
--- a/apps/gui/skin_engine/wps_debug.c
+++ b/apps/gui/skin_engine/wps_debug.c
@@ -60,6 +60,7 @@ struct debug_token_table tokens[] = {
{ X(TOKEN_MARKER_PLAYLIST) },
{ X(TOKEN_MARKER_MISC) },
{ X(TOKEN_MARKER_RECORDING) },
+ { X(TOKEN_MARKER_TUNER) },
{ X(TOKEN_MARKER_END) },
};
#undef X
diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h
index 211d9a13ee..945932a125 100644
--- a/apps/gui/skin_engine/wps_internals.h
+++ b/apps/gui/skin_engine/wps_internals.h
@@ -371,7 +371,10 @@ const char *get_token_value(struct gui_wps *gwps,
const char *get_id3_token(struct wps_token *token, struct mp3entry *id3,
char *buf, int buf_size, int limit, int *intval);
-
+#if CONFIG_TUNER
+const char *get_radio_token(struct wps_token *token, int preset_offset,
+ char *buf, int buf_size, int limit, int *intval);
+#endif
struct gui_img* find_image(char label, struct wps_data *data);
struct skin_viewport* find_viewport(char label, struct wps_data *data);
diff --git a/apps/gui/theme_settings.c b/apps/gui/theme_settings.c
index 086dff5385..9690193a88 100644
--- a/apps/gui/theme_settings.c
+++ b/apps/gui/theme_settings.c
@@ -30,6 +30,7 @@
#include "settings.h"
#include "wps.h"
#include "file.h"
+#include "radio.h"
#include "skin_engine/skin_engine.h"
#include "skin_engine/skin_fonts.h"
#include "statusbar-skinned.h"
@@ -52,9 +53,15 @@ static const struct skin_load_setting skins[] = {
{ global_settings.sbs_file, "sbs", sb_skin_data_load},
#endif
{ global_settings.wps_file, "wps", wps_data_load},
+#if CONFIG_TUNER
+ { global_settings.fms_file, "fms", fms_data_load},
+#endif
#ifdef HAVE_REMOTE_LCD
{ global_settings.rsbs_file, "rsbs", sb_skin_data_load},
{ global_settings.rwps_file, "rwps", wps_data_load},
+#if CONFIG_TUNER
+ { global_settings.rfms_file, "rfms", fms_data_load},
+#endif
#endif
};
@@ -69,6 +76,9 @@ void settings_apply_skins(void)
skin_backdrop_init();
skin_font_init();
#endif
+#if CONFIG_TUNER
+ fms_skin_init();
+#endif
for (i=0; i<ARRAYLEN(skins); i++)
{
#ifdef HAVE_REMOTE_LCD
diff --git a/apps/gui/wps.c b/apps/gui/wps.c
index 4eda866d27..090276d3fe 100644
--- a/apps/gui/wps.c
+++ b/apps/gui/wps.c
@@ -571,15 +571,7 @@ static void gwps_leave_wps(void)
#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
gui_wps[i].display->backdrop_show(sb_get_backdrop(i));
#endif
-
-#ifdef HAVE_LCD_BITMAP
- bool draw = false;
- if (gui_wps[i].data->wps_sb_tag)
- draw = gui_wps[i].data->show_sb_on_wps;
- else if (statusbar_position(i) != STATUSBAR_OFF)
- draw = true;
-#endif
- viewportmanager_theme_undo(i, draw);
+ viewportmanager_theme_undo(i, skin_has_sbs(i, gui_wps[i].data));
}
@@ -600,15 +592,8 @@ static void gwps_enter_wps(void)
{
struct gui_wps *gwps = &gui_wps[i];
struct screen *display = gwps->display;
-#ifdef HAVE_LCD_BITMAP
- bool draw = false;
- if (gui_wps[i].data->wps_sb_tag)
- draw = gui_wps[i].data->show_sb_on_wps;
- else if (statusbar_position(i) != STATUSBAR_OFF)
- draw = true;
-#endif
display->stop_scroll();
- viewportmanager_theme_enable(i, draw, NULL);
+ viewportmanager_theme_enable(i, skin_has_sbs(i, gui_wps[i].data), NULL);
/* Update the values in the first (default) viewport - in case the user
has modified the statusbar or colour settings */
@@ -801,56 +786,8 @@ long gui_wps_show(void)
#endif
}
}
-#ifdef HAVE_LCD_BITMAP
- /* when the peak meter is enabled we want to have a
- few extra updates to make it look smooth. On the
- other hand we don't want to waste energy if it
- isn't displayed */
- bool pm=false;
- FOR_NB_SCREENS(i)
- {
- if(gui_wps[i].data->peak_meter_enabled)
- pm = true;
- }
-
- if (pm) {
- long next_refresh = current_tick;
- long next_big_refresh = current_tick + HZ / 5;
- button = BUTTON_NONE;
- while (TIME_BEFORE(current_tick, next_big_refresh)) {
- button = get_action(CONTEXT_WPS|ALLOW_SOFTLOCK,TIMEOUT_NOBLOCK);
- /* check for restore to not let the peakmeter delay the
- * initial draw of the wps, don't delay handling of button
- * presses either */
- if (button != ACTION_NONE || restore) {
- break;
- }
- peak_meter_peek();
- sleep(0); /* Sleep until end of current tick. */
-
- if (TIME_AFTER(current_tick, next_refresh)) {
- FOR_NB_SCREENS(i)
- {
- if(gui_wps[i].data->peak_meter_enabled)
- skin_update(&gui_wps[i], WPS_REFRESH_PEAK_METER);
- next_refresh += HZ / PEAK_METER_FPS;
- }
- }
- }
-
- }
-
- /* The peak meter is disabled
- -> no additional screen updates needed */
- else
-#endif
- { /* 1 is the minimum timeout which lets other threads run.
- * audio thread (apprently) needs to run before displaying the wps
- * or bad things happen with regards to cuesheet
- * (probably a race condition, on sh at least) */
- button = get_action(CONTEXT_WPS|ALLOW_SOFTLOCK,
- restore ? 1 : HZ/5);
- }
+ button = skin_wait_for_action(gui_wps, CONTEXT_WPS|ALLOW_SOFTLOCK,
+ restore ? 1 : HZ/5);
/* Exit if audio has stopped playing. This happens e.g. at end of
playlist or if using the sleep timer. */
diff --git a/apps/lang/arabic.lang b/apps/lang/arabic.lang
index 09c79abb55..70d6b0a5bd 100644
--- a/apps/lang/arabic.lang
+++ b/apps/lang/arabic.lang
@@ -4189,19 +4189,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "المحطة: %d.%02d ميجاهرتز"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/bulgarian.lang b/apps/lang/bulgarian.lang
index 570738df30..838c67cbee 100644
--- a/apps/lang/bulgarian.lang
+++ b/apps/lang/bulgarian.lang
@@ -2774,19 +2774,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Станция: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/catala.lang b/apps/lang/catala.lang
index eabd8ad8d3..7249131d46 100644
--- a/apps/lang/catala.lang
+++ b/apps/lang/catala.lang
@@ -5139,15 +5139,13 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Emisora: %d.%dMHz"
</dest>
<voice>
*: none
diff --git a/apps/lang/chinese-simp.lang b/apps/lang/chinese-simp.lang
index a8b85c30e2..29b12611af 100644
--- a/apps/lang/chinese-simp.lang
+++ b/apps/lang/chinese-simp.lang
@@ -6991,19 +6991,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "频道:%d.%02dMHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/chinese-trad.lang b/apps/lang/chinese-trad.lang
index 11107ac532..1ce81a4817 100644
--- a/apps/lang/chinese-trad.lang
+++ b/apps/lang/chinese-trad.lang
@@ -7001,19 +7001,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "電台: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/czech.lang b/apps/lang/czech.lang
index 4f7253eecd..1104b3d278 100644
--- a/apps/lang/czech.lang
+++ b/apps/lang/czech.lang
@@ -5179,19 +5179,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Stanice: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/dansk.lang b/apps/lang/dansk.lang
index 212b0ad06b..452b5570d5 100644
--- a/apps/lang/dansk.lang
+++ b/apps/lang/dansk.lang
@@ -6203,19 +6203,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Station: %d,%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/deutsch.lang b/apps/lang/deutsch.lang
index aebe615858..6052ed5a8d 100644
--- a/apps/lang/deutsch.lang
+++ b/apps/lang/deutsch.lang
@@ -5179,19 +5179,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Sender: %d,%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/eesti.lang b/apps/lang/eesti.lang
index 9501f07ed4..ba2be660c5 100644
--- a/apps/lang/eesti.lang
+++ b/apps/lang/eesti.lang
@@ -7446,16 +7446,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
- *: "Station: %d.%dMHz"
+ *: none
</source>
<dest>
- *: "Station: %d.%dMHz"
+ *: none
</dest>
<voice>
- *: ""
+ *: none
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 8303586551..c079a4affd 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -5251,19 +5251,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Station: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
@@ -13530,3 +13527,71 @@
swcodec: "Rewind before resume"
</voice>
</phrase>
+<phrase>
+ id: LANG_REMOTE_FMRADIO
+ desc: in the main menu
+ user: core
+ <source>
+ *:none
+ radio_remote: "Remote FM Radio"
+ </source>
+ <dest>
+ *:none
+ radio_remote: "Remote FM Radio"
+ </dest>
+ <voice>
+ *:none
+ radio_remote: "Remote FM Radio"
+ </voice>
+</phrase>
+<phrase>
+ id: VOICE_EXT_FMS
+ desc: spoken only, for file extension
+ user: core
+ <source>
+ *: none
+ radio: ""
+ </source>
+ <dest>
+ *: none
+ radio: ""
+ </dest>
+ <voice>
+ *: none
+ radio: "radio screen skin"
+ </voice>
+</phrase>
+<phrase>
+ id: VOICE_EXT_RFMS
+ desc: spoken only, for file extension
+ user: core
+ <source>
+ *: none
+ radio_remote: ""
+ </source>
+ <dest>
+ *: none
+ radio_remote: ""
+ </dest>
+ <voice>
+ *: none
+ radio_remote: "remote radio screen skin"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FM_STATION_HEADER
+ desc: in radio screen
+ user: core
+ <source>
+ *: none
+ radio: "Station:"
+ </source>
+ <dest>
+ *: none
+ radio: "Station:"
+ </dest>
+ <voice>
+ *: none
+ radio: ""
+ </voice>
+</phrase>
diff --git a/apps/lang/espanol.lang b/apps/lang/espanol.lang
index 7f67d73dc7..4970fc8e00 100644
--- a/apps/lang/espanol.lang
+++ b/apps/lang/espanol.lang
@@ -5117,19 +5117,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Emisora: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/esperanto.lang b/apps/lang/esperanto.lang
index 3a6b265a13..0b7c25237b 100644
--- a/apps/lang/esperanto.lang
+++ b/apps/lang/esperanto.lang
@@ -6990,16 +6990,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
- *: "Station: %d.%02d MHz"
+ *: none
</source>
<dest>
- *: "Stacio: %d.%02d MHz"
+ *: none
</dest>
<voice>
- *: ""
+ *: none
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/finnish.lang b/apps/lang/finnish.lang
index 4fa702a94c..e3be852af7 100644
--- a/apps/lang/finnish.lang
+++ b/apps/lang/finnish.lang
@@ -6992,19 +6992,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Asema: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/francais.lang b/apps/lang/francais.lang
index f7a0072520..5beba661d8 100644
--- a/apps/lang/francais.lang
+++ b/apps/lang/francais.lang
@@ -5205,19 +5205,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Station : %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/galego.lang b/apps/lang/galego.lang
index dfc95d6435..d9018b0054 100644
--- a/apps/lang/galego.lang
+++ b/apps/lang/galego.lang
@@ -5950,16 +5950,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
- *: "Station: %d.%02d MHz"
+ *: none
</source>
<dest>
- *: "Estación: %d.%02d MHz"
+ *: none
</dest>
<voice>
- *: ""
+ *: none
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/greek.lang b/apps/lang/greek.lang
index 4fd4f4b67f..a9c2b1db8d 100644
--- a/apps/lang/greek.lang
+++ b/apps/lang/greek.lang
@@ -5145,19 +5145,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Σταθμός: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/hebrew.lang b/apps/lang/hebrew.lang
index 0230f7f774..ad98927762 100644
--- a/apps/lang/hebrew.lang
+++ b/apps/lang/hebrew.lang
@@ -5183,19 +5183,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "%d.%02d MHZ :תחנה"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/islenska.lang b/apps/lang/islenska.lang
index 055ad7ac94..007a1b7778 100644
--- a/apps/lang/islenska.lang
+++ b/apps/lang/islenska.lang
@@ -6203,16 +6203,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
- *: "Station: %d.%02d MHz"
+ *: none
</source>
<dest>
- *: "Stöð: %d.%02d MHz"
+ *: none
</dest>
<voice>
- *: ""
+ *: none
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/italiano.lang b/apps/lang/italiano.lang
index 65f4e577a7..8e2bca9836 100644
--- a/apps/lang/italiano.lang
+++ b/apps/lang/italiano.lang
@@ -5176,19 +5176,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Stazione: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/japanese.lang b/apps/lang/japanese.lang
index 7ca1cfbef9..a856303e81 100644
--- a/apps/lang/japanese.lang
+++ b/apps/lang/japanese.lang
@@ -5181,19 +5181,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "局: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/korean.lang b/apps/lang/korean.lang
index 9c0d9223c0..690cb106c8 100644
--- a/apps/lang/korean.lang
+++ b/apps/lang/korean.lang
@@ -6997,19 +6997,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "방송국: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/lietuviu.lang b/apps/lang/lietuviu.lang
index 6b5eb6b00c..30db27406c 100644
--- a/apps/lang/lietuviu.lang
+++ b/apps/lang/lietuviu.lang
@@ -5233,19 +5233,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Stotis: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/magyar.lang b/apps/lang/magyar.lang
index c1db73160a..207f239e33 100644
--- a/apps/lang/magyar.lang
+++ b/apps/lang/magyar.lang
@@ -5151,19 +5151,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Adó: %d,%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/nederlands.lang b/apps/lang/nederlands.lang
index 196fa6bf3a..498603151f 100644
--- a/apps/lang/nederlands.lang
+++ b/apps/lang/nederlands.lang
@@ -6992,19 +6992,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Zender: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: "Zender: %d.%02d MHz"
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/norsk-nynorsk.lang b/apps/lang/norsk-nynorsk.lang
index c5668df003..0a8de159aa 100644
--- a/apps/lang/norsk-nynorsk.lang
+++ b/apps/lang/norsk-nynorsk.lang
@@ -6898,15 +6898,13 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Stasjon: %d.%02d MHz"
</dest>
<voice>
*: none
diff --git a/apps/lang/norsk.lang b/apps/lang/norsk.lang
index 73046d1c12..7389b4a475 100644
--- a/apps/lang/norsk.lang
+++ b/apps/lang/norsk.lang
@@ -6205,19 +6205,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
- *: none
- radio: "Stasjon: %d.%02d MHz"
+ *: none
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/polski.lang b/apps/lang/polski.lang
index 78b9d2489e..ccea0a95a4 100644
--- a/apps/lang/polski.lang
+++ b/apps/lang/polski.lang
@@ -5185,19 +5185,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Stacja: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/portugues-brasileiro.lang b/apps/lang/portugues-brasileiro.lang
index 93aaf054c4..aaa7bf997c 100644
--- a/apps/lang/portugues-brasileiro.lang
+++ b/apps/lang/portugues-brasileiro.lang
@@ -5171,19 +5171,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Emissora: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/portugues.lang b/apps/lang/portugues.lang
index 55d52250c0..2f76e4881f 100644
--- a/apps/lang/portugues.lang
+++ b/apps/lang/portugues.lang
@@ -6619,19 +6619,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Estação: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/romaneste.lang b/apps/lang/romaneste.lang
index 03fad8fbaf..8b2128d415 100644
--- a/apps/lang/romaneste.lang
+++ b/apps/lang/romaneste.lang
@@ -3088,19 +3088,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Statie: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/russian.lang b/apps/lang/russian.lang
index 38a3e6fb14..e762842d33 100644
--- a/apps/lang/russian.lang
+++ b/apps/lang/russian.lang
@@ -6461,19 +6461,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Станция: %d.%02d МГц"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/slovak.lang b/apps/lang/slovak.lang
index e2c17f405e..276624170e 100644
--- a/apps/lang/slovak.lang
+++ b/apps/lang/slovak.lang
@@ -5175,19 +5175,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Stanica: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/srpski.lang b/apps/lang/srpski.lang
index 7e06811465..9196347c80 100644
--- a/apps/lang/srpski.lang
+++ b/apps/lang/srpski.lang
@@ -5158,19 +5158,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Станица: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/svenska.lang b/apps/lang/svenska.lang
index da446b311e..7730275b2a 100644
--- a/apps/lang/svenska.lang
+++ b/apps/lang/svenska.lang
@@ -5181,19 +5181,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Kanal: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/tagalog.lang b/apps/lang/tagalog.lang
index a04351c36f..e76a1badbc 100644
--- a/apps/lang/tagalog.lang
+++ b/apps/lang/tagalog.lang
@@ -5157,19 +5157,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Station: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/thai.lang b/apps/lang/thai.lang
index 3de64926d6..16da7d1408 100644
--- a/apps/lang/thai.lang
+++ b/apps/lang/thai.lang
@@ -5139,19 +5139,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "สถานี: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/turkce.lang b/apps/lang/turkce.lang
index 53d581dbed..e8f68212a8 100644
--- a/apps/lang/turkce.lang
+++ b/apps/lang/turkce.lang
@@ -4977,19 +4977,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Station: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/ukrainian.lang b/apps/lang/ukrainian.lang
index 94758af4af..8e2397505d 100644
--- a/apps/lang/ukrainian.lang
+++ b/apps/lang/ukrainian.lang
@@ -5168,19 +5168,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
- *: none
- radio: "Station: %d.%02d MHz"
+ *: none
</source>
<dest>
- *: none
- radio: "Станцiя: %d.%02d MHz"
+ *: none
</dest>
<voice>
- *: none
- radio: ""
+ *: none
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/wallisertitsch.lang b/apps/lang/wallisertitsch.lang
index 98bc291127..33e5feb363 100644
--- a/apps/lang/wallisertitsch.lang
+++ b/apps/lang/wallisertitsch.lang
@@ -5363,16 +5363,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
- *: "Station: %d.%02d MHz"
+ *: none
</source>
<dest>
- *: "Sender: %d.%02d MHz"
+ *: none
</dest>
<voice>
- *: ""
+ *: none
</voice>
</phrase>
<phrase>
diff --git a/apps/lang/walon.lang b/apps/lang/walon.lang
index b7e2aa9235..72d01dac85 100644
--- a/apps/lang/walon.lang
+++ b/apps/lang/walon.lang
@@ -5179,19 +5179,16 @@
</phrase>
<phrase>
id: LANG_FM_STATION
- desc: in radio screen
- user: core
+ desc: deprecated
+ user:
<source>
*: none
- radio: "Station: %d.%02d MHz"
</source>
<dest>
*: none
- radio: "Posse: %d.%02d MHz"
</dest>
<voice>
*: none
- radio: ""
</voice>
</phrase>
<phrase>
diff --git a/apps/menus/theme_menu.c b/apps/menus/theme_menu.c
index 4427e4aeca..aacce89e74 100644
--- a/apps/menus/theme_menu.c
+++ b/apps/menus/theme_menu.c
@@ -224,11 +224,17 @@ MAKE_MENU(bars_menu, ID2P(LANG_BARS_MENU), 0, Icon_NOICON,
#ifdef HAVE_LCD_BITMAP
static struct browse_folder_info fonts = {FONT_DIR, SHOW_FONT};
static struct browse_folder_info sbs = {SBS_DIR, SHOW_SBS};
+#if CONFIG_TUNER
+static struct browse_folder_info fms = {WPS_DIR, SHOW_FMS};
+#endif
#endif
static struct browse_folder_info wps = {WPS_DIR, SHOW_WPS};
#ifdef HAVE_REMOTE_LCD
static struct browse_folder_info rwps = {WPS_DIR, SHOW_RWPS};
static struct browse_folder_info rsbs = {SBS_DIR, SHOW_RSBS};
+#if CONFIG_TUNER
+static struct browse_folder_info rfms = {WPS_DIR, SHOW_RFMS};
+#endif
#endif
static struct browse_folder_info themes = {THEME_DIR, SHOW_CFG};
@@ -247,6 +253,11 @@ MENUITEM_FUNCTION(browse_fonts, MENU_FUNC_USEPARAM,
MENUITEM_FUNCTION(browse_sbs, MENU_FUNC_USEPARAM,
ID2P(LANG_BASE_SKIN),
browse_folder, (void*)&sbs, NULL, Icon_Wps);
+#if CONFIG_TUNER
+MENUITEM_FUNCTION(browse_fms, MENU_FUNC_USEPARAM,
+ ID2P(LANG_FM_RADIO),
+ browse_folder, (void*)&fms, NULL, Icon_Wps);
+#endif
#endif
MENUITEM_FUNCTION(browse_wps, MENU_FUNC_USEPARAM,
ID2P(LANG_WHILE_PLAYING),
@@ -258,6 +269,11 @@ MENUITEM_FUNCTION(browse_rwps, MENU_FUNC_USEPARAM,
MENUITEM_FUNCTION(browse_rsbs, MENU_FUNC_USEPARAM,
ID2P(LANG_REMOTE_BASE_SKIN),
browse_folder, (void*)&rsbs, NULL, Icon_Wps);
+#if CONFIG_TUNER
+MENUITEM_FUNCTION(browse_rfms, MENU_FUNC_USEPARAM,
+ ID2P(LANG_REMOTE_FMRADIO),
+ browse_folder, (void*)&rfms, NULL, Icon_Wps);
+#endif
#endif
MENUITEM_SETTING(show_icons, &global_settings.show_icons, NULL);
@@ -278,6 +294,12 @@ MAKE_MENU(theme_menu, ID2P(LANG_THEME_MENU),
#ifdef HAVE_REMOTE_LCD
&browse_rwps,
#endif
+#if CONFIG_TUNER
+ &browse_fms,
+#ifdef HAVE_REMOTE_LCD
+ &browse_rfms,
+#endif
+#endif
#ifdef HAVE_LCD_BITMAP
&browse_sbs,
#endif
diff --git a/apps/playback.c b/apps/playback.c
index ebe4932ae0..390dd19846 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -138,7 +138,7 @@ static struct mp3entry unbuffered_id3; /* the id3 for the first unbuffered track
static struct cuesheet *curr_cue = NULL;
-#define MAX_MULTIPLE_AA 2
+#define MAX_MULTIPLE_AA SKINNABLE_SCREENS_COUNT
#ifdef HAVE_ALBUMART
static struct albumart_slot {
diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c
index 5841664742..e8a1154797 100644
--- a/apps/recorder/radio.c
+++ b/apps/recorder/radio.c
@@ -51,6 +51,7 @@
#ifdef IPOD_ACCESSORY_PROTOCOL
#include "iap.h"
#endif
+#include "appevents.h"
#include "talk.h"
#include "tuner.h"
#include "power.h"
@@ -66,9 +67,8 @@
#include "menus/exported_menus.h"
#include "root_menu.h"
#include "viewport.h"
-#ifdef HAVE_QUICKSCREEN
-#include "quickscreen.h"
-#endif
+#include "skin_engine/skin_engine.h"
+#include "statusbar-skinned.h"
#if CONFIG_TUNER
@@ -100,20 +100,32 @@
#elif CONFIG_KEYPAD == ONDIO_PAD
#define FM_RECORD_DBLPRE
#define FM_RECORD
-#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || (CONFIG_KEYPAD == SANSA_C200_PAD) \
- || (CONFIG_KEYPAD == SANSA_FUZE_PAD)
+#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || (CONFIG_KEYPAD == SANSA_C200_PAD)
+#define FM_MENU
#define FM_PRESET
+#define FM_STOP
#define FM_MODE
+#define FM_EXIT
+#define FM_PLAY
#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
#define FM_PRESET
#define FM_MODE
#elif (CONFIG_KEYPAD == COWON_D2_PAD)
+#define FM_MENU
#define FM_PRESET
+#define FM_STOP
+#define FM_MODE
+#define FM_EXIT
+#define FM_PLAY
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
(CONFIG_KEYPAD == IPOD_1G2G_PAD)
+#define FM_MENU
+#define FM_STOP
+#define FM_EXIT
+#define FM_PLAY
#define FM_MODE
#endif
@@ -148,6 +160,32 @@ static int clear_preset_list(void);
static int scan_presets(void *viewports);
static void radio_off(void);
+bool radio_scan_mode(void)
+{
+ return radio_mode == RADIO_SCAN_MODE;
+}
+
+bool radio_is_stereo(void)
+{
+ return tuner_get(RADIO_STEREO) && !global_settings.fm_force_mono;
+}
+int radio_current_frequency(void)
+{
+ return curr_freq;
+}
+
+int radio_current_preset(void)
+{
+ return curr_preset;
+}
+int radio_preset_count(void)
+{
+ return num_presets;
+}
+const struct fmstation *radio_get_preset(int preset)
+{
+ return &presets[preset];
+}
/* Function to manipulate all yesno dialogues.
This function needs the output text as an argument. */
static bool yesno_pop(const char* text)
@@ -460,30 +498,90 @@ static void talk_preset(int preset, bool fallback, bool enqueue)
}
}
-static void fms_restore(struct viewport vp[NB_SCREENS])
+/* Skin stuff */
+extern struct wps_state wps_state; /* from wps.c */
+static struct gui_wps fms_skin[NB_SCREENS] = {{ .data = NULL }};
+static struct wps_data fms_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }};
+static struct wps_sync_data fms_skin_sync_data = { .do_full_update = false };
+
+
+void fms_data_load(enum screen_type screen, const char *buf, bool isfile)
+{
+ struct wps_data *data = fms_skin[screen].data;
+ int success;
+ success = buf && skin_data_load(screen, data, buf, isfile);
+
+ if (!success ) /* load the default */
+ {
+ const char default_fms[] = "%Sx|Station:| %tf\n"
+ "%?ts<%Sx|Stereo||%Sx|Mono|>\n"
+ "%?tm<%Sx|Mode:| %Sx|Scan||%Sx|Preset|: %Ti. %?Tn<%Tn|%Tf>>\n"
+ "%pb\n"
+#if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR)
+ "%?Rr<%Sx|Time:| %Rh:%Rn:%Rs|"
+ "%?St|prerecording time|<%Sx|Prerecord Time| %Rs|%pm>>\n"
+#endif
+ ;
+ skin_data_load(screen, data, default_fms, false);
+ }
+}
+enum fms_exiting {
+ FMS_EXIT,
+ FMS_ENTER
+};
+void fms_fix_displays(enum fms_exiting toggle_state)
+{
+ int i;
+ FOR_NB_SCREENS(i)
+ {
+ if (toggle_state == FMS_ENTER)
+ {
+ viewportmanager_theme_enable(i, skin_has_sbs(i, fms_skin[i].data), NULL);
+#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
+ screens[i].backdrop_show(fms_skin[i].data->backdrop);
+#endif
+ screens[i].clear_display();
+ /* force statusbar/skin update since we just cleared the whole screen */
+ send_event(GUI_EVENT_ACTIONUPDATE, (void*)1);
+ }
+ else
+ {
+ screens[i].stop_scroll();
+#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
+ screens[i].backdrop_show(sb_get_backdrop(i));
+#endif
+ viewportmanager_theme_undo(i, skin_has_sbs(i, fms_skin[i].data));
+ }
+ }
+}
+
+
+void fms_skin_init(void)
{
- struct screen *display;
int i;
FOR_NB_SCREENS(i)
{
- display = &screens[i];
- display->set_viewport(&vp[i]);
- display->clear_viewport();
- display->update_viewport();
+#ifdef HAVE_ALBUMART
+ fms_skin_data[i].albumart = NULL;
+ fms_skin_data[i].playback_aa_slot = -1;
+#endif
+ fms_skin[i].data = &fms_skin_data[i];
+ fms_skin[i].display = &screens[i];
+ /* Currently no seperate wps_state needed/possible
+ so use the only available ( "global" ) one */
+ fms_skin[i].state = &wps_state;
+ fms_skin[i].sync_data = &fms_skin_sync_data;
}
}
int radio_screen(void)
{
- char buf[MAX_PATH];
bool done = false;
int ret_val = GO_TO_ROOT;
int button;
int i;
bool stereo = false, last_stereo = false;
- int fh;
- int top_of_screen = 0;
- bool update_screen = true;
+ bool update_screen = true, restore = true;
bool screen_freeze = false;
bool keep_playing = false;
bool talk = false;
@@ -502,33 +600,10 @@ int radio_screen(void)
#ifndef HAVE_NOISY_IDLE_MODE
int button_timeout = current_tick + (2*HZ);
#endif
- struct viewport vp[NB_SCREENS];
-#ifdef HAVE_BUTTONBAR
- struct gui_buttonbar buttonbar;
- gui_buttonbar_init(&buttonbar);
- gui_buttonbar_set_display(&buttonbar, &(screens[SCREEN_MAIN]) );
-#endif
/* change status to "in screen" */
in_screen = true;
- /* always display status bar in radio screen for now */
- FOR_NB_SCREENS(i)
- {
- viewport_set_defaults(&vp[i], i);
-#ifdef HAVE_BUTTONBAR
- if (global_settings.buttonbar)
- vp[i].height -= BUTTONBAR_HEIGHT;
-#endif
- }
- fms_restore(vp);
-
- fh = font_get(FONT_UI)->height;
-
- /* Adjust for font size, trying to center the information vertically */
- if(fh < 10)
- top_of_screen = 1;
-
if(num_presets <= 0)
{
radio_load_presets(global_settings.fmr_file);
@@ -571,17 +646,12 @@ int radio_screen(void)
#endif
if(num_presets < 1 && yesno_pop(ID2P(LANG_FM_FIRST_AUTOSCAN)))
- scan_presets(vp);
+ scan_presets(NULL);
curr_preset = find_preset(curr_freq);
if(curr_preset != -1)
radio_mode = RADIO_PRESET_MODE;
-#ifdef HAVE_BUTTONBAR
- gui_buttonbar_set(&buttonbar, str(LANG_BUTTONBAR_MENU),
- str(LANG_PRESET), str(LANG_FM_BUTTONBAR_RECORD));
-#endif
-
#ifndef HAVE_NOISY_IDLE_MODE
cpu_idle_mode(true);
#endif
@@ -608,15 +678,8 @@ int radio_screen(void)
cancel_cpu_boost();
}
-#if CONFIG_CODEC != SWCODEC
- /* TODO: Can we timeout at HZ when recording since peaks aren't
- displayed? This should quiet recordings too. */
- button = get_action(CONTEXT_FM,
- update_screen ? TIMEOUT_NOBLOCK : HZ / PEAK_METER_FPS);
-#else
- button = get_action(CONTEXT_FM,
- update_screen ? TIMEOUT_NOBLOCK : HZ);
-#endif
+ button = skin_wait_for_action(fms_skin, CONTEXT_FM,
+ update_screen ? TIMEOUT_NOBLOCK : HZ);
#ifndef HAVE_NOISY_IDLE_MODE
if (button != ACTION_NONE)
@@ -763,19 +826,11 @@ int radio_screen(void)
break;
case ACTION_FM_MENU:
- FOR_NB_SCREENS(i)
- {
- screens[i].scroll_stop(&vp[i]);
- }
+ fms_fix_displays(FMS_EXIT);
radio_menu();
curr_preset = find_preset(curr_freq);
- fms_restore(vp);
-#ifdef HAVE_BUTTONBAR
- gui_buttonbar_set(&buttonbar, str(LANG_BUTTONBAR_MENU),
- str(LANG_PRESET),
- str(LANG_FM_BUTTONBAR_RECORD));
-#endif
update_screen = true;
+ restore = true;
break;
#ifdef FM_PRESET
@@ -784,37 +839,15 @@ int radio_screen(void)
{
splash(HZ, ID2P(LANG_FM_NO_PRESETS));
update_screen = true;
- fms_restore(vp);
-
break;
}
- FOR_NB_SCREENS(i)
- screens[i].scroll_stop(&vp[i]);
+ fms_fix_displays(FMS_EXIT);
handle_radio_presets();
- fms_restore(vp);
-#ifdef HAVE_BUTTONBAR
- gui_buttonbar_set(&buttonbar,
- str(LANG_BUTTONBAR_MENU),
- str(LANG_PRESET),
- str(LANG_FM_BUTTONBAR_RECORD));
-#endif
update_screen = true;
+ restore = true;
break;
#endif /* FM_PRESET */
-#ifdef HAVE_QUICKSCREEN
- case ACTION_FM_QUICKSCREEN:
- {
- if (quick_screen_quick(button))
- {
- done = true;
- break;
- }
- fms_restore(vp);
- update_screen = true;
- }
- break;
-#endif
#ifdef FM_FREEZE
case ACTION_FM_FREEZE:
if(!screen_freeze)
@@ -923,17 +956,6 @@ int radio_screen(void)
{
/* Only display the peak meter when not recording */
#if CONFIG_CODEC != SWCODEC
- if(!audio_status())
- {
- FOR_NB_SCREENS(i)
- {
- screens[i].set_viewport(&vp[i]);
- peak_meter_screen(&screens[i],0, fh*(top_of_screen + 4),fh);
- screens[i].update_rect(0, fh*(top_of_screen + 4),
- screens[i].getwidth(), fh);
- }
- }
-
if(TIME_AFTER(current_tick, timeout))
{
timeout = current_tick + HZ;
@@ -957,85 +979,20 @@ int radio_screen(void)
#if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR)
seconds = audio_recorded_time() / HZ;
- if (update_screen || seconds > last_seconds)
+ if (update_screen || seconds > last_seconds || restore)
{
last_seconds = seconds;
#else
- if (update_screen)
+ if (update_screen || restore)
{
#endif
- int freq;
-
- FOR_NB_SCREENS(i)
- {
- screens[i].set_viewport(&vp[i]);
- }
-
- snprintf(buf, 128, curr_preset >= 0 ? "%d. %s" : " ",
- curr_preset + 1, presets[curr_preset].name);
-
- FOR_NB_SCREENS(i)
- screens[i].puts_scroll(0, top_of_screen, buf);
-
- freq = curr_freq / 10000;
- snprintf(buf, 128, str(LANG_FM_STATION),
- freq / 100, freq % 100);
- FOR_NB_SCREENS(i)
- screens[i].puts_scroll(0, top_of_screen + 1, buf);
-
- FOR_NB_SCREENS(i)
- screens[i].puts_scroll(0, top_of_screen + 2,
- stereo ? str(LANG_CHANNEL_STEREO) :
- str(LANG_CHANNEL_MONO));
-
- snprintf(buf, 128, "%s %s", str(LANG_MODE),
- radio_mode ? str(LANG_PRESET) :
- str(LANG_RADIO_SCAN_MODE));
- FOR_NB_SCREENS(i)
- screens[i].puts_scroll(0, top_of_screen + 3, buf);
-#ifndef SIMULATOR
-#ifdef HAVE_RDS_CAP
- snprintf(buf, 128, "%s",tuner_get_rds_info(RADIO_RDS_NAME));
- FOR_NB_SCREENS(i)
- screens[i].puts_scroll(0, top_of_screen + 4, buf);
-
- snprintf(buf, 128, "%s",tuner_get_rds_info(RADIO_RDS_TEXT));
- FOR_NB_SCREENS(i)
- screens[i].puts_scroll(0, top_of_screen + 5, buf);
-#endif
-#endif /* SIMULATOR */
-
-#if CONFIG_CODEC != SWCODEC
- if(audio_status() == AUDIO_STATUS_RECORD)
- {
- hours = seconds / 3600;
- minutes = (seconds - (hours * 3600)) / 60;
- snprintf(buf, 32, "%s %02d:%02d:%02d",
- str(LANG_RECORDING_TIME),
- hours, minutes, seconds%60);
- FOR_NB_SCREENS(i)
- screens[i].puts_scroll(0, top_of_screen + 4, buf);
- }
- else
- {
- if(rec_options.rec_prerecord_time)
- {
- snprintf(buf, 32, "%s %02d",
- str(LANG_RECORD_PRERECORD), seconds%60);
- FOR_NB_SCREENS(i)
- screens[i].puts_scroll(0, top_of_screen + 4, buf);
- }
- }
-#endif /* CONFIG_CODEC != SWCODEC */
-
+ if (restore)
+ fms_fix_displays(FMS_ENTER);
FOR_NB_SCREENS(i)
- screens[i].update_viewport();
-#ifdef HAVE_BUTTONBAR
- gui_buttonbar_draw(&buttonbar);
-#endif
+ skin_update(&fms_skin[i], WPS_REFRESH_ALL);
+ restore = false;
}
}
-
update_screen = false;
if (global_settings.talk_file && talk
@@ -1073,7 +1030,6 @@ int radio_screen(void)
if(audio_status() & AUDIO_STATUS_ERROR)
{
splash(0, str(LANG_DISK_FULL));
- fms_restore(vp);
audio_error_clear();
while(1)
@@ -1116,11 +1072,7 @@ int radio_screen(void)
#ifndef HAVE_NOISY_IDLE_MODE
cpu_idle_mode(false);
#endif
- FOR_NB_SCREENS(i)
- {
- screens[i].scroll_stop(&vp[i]);
- screens[i].set_viewport(NULL);
- }
+ fms_fix_displays(FMS_EXIT);
in_screen = false;
#if CONFIG_CODEC != SWCODEC
return have_recorded;
@@ -1471,7 +1423,6 @@ static int handle_radio_presets(void)
result = 2;
}
}
- gui_synclist_scroll_stop(&lists);
return result - 1;
}
diff --git a/apps/recorder/radio.h b/apps/recorder/radio.h
index 129d1dda09..415de6f652 100644
--- a/apps/recorder/radio.h
+++ b/apps/recorder/radio.h
@@ -24,6 +24,7 @@
#ifndef FMRADIO_H
#include "fmradio.h"
#endif
+#include "screen_access.h"
#if CONFIG_TUNER
void radio_load_presets(char *filename);
@@ -34,6 +35,18 @@ void radio_pause(void);
void radio_stop(void);
bool radio_hardware_present(void);
bool in_radio_screen(void);
+
+bool radio_scan_mode(void); /* true for scan mode, false for preset mode */
+bool radio_is_stereo(void);
+int radio_current_frequency(void);
+int radio_current_preset(void);
+int radio_preset_count(void);
+const struct fmstation *radio_get_preset(int preset);
+
+/* skin functions */
+void fms_data_load(enum screen_type screen, const char *buf, bool isfile);
+void fms_skin_init(void);
+
/* callbacks for the radio settings */
void set_radio_region(int region);
void toggle_mono_mode(bool mono);
diff --git a/apps/settings.h b/apps/settings.h
index cfef6162a8..2fdff9918a 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -146,7 +146,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_SBS, SHOW_RSBS, SHOW_FMR, SHOW_CFG,
+ SHOW_WPS, SHOW_RWPS, SHOW_FMS, SHOW_RFMS, SHOW_SBS, SHOW_RSBS, SHOW_FMR, SHOW_CFG,
SHOW_LNG, SHOW_MOD, SHOW_FONT, SHOW_PLUGINS};
/* file and dir sort options */
@@ -498,7 +498,11 @@ struct user_settings
int fm_region;
bool fm_force_mono; /* Forces Mono mode if true */
unsigned char fmr_file[MAX_FILENAME+1]; /* last fmr preset */
+ unsigned char fms_file[MAX_FILENAME+1]; /* last fms */
+#ifdef HAVE_REMOTE_LCD
+ unsigned char rfms_file[MAX_FILENAME+1]; /* last remote-fms */
#endif
+#endif /* CONFIG_TUNER */
/* misc options */
#ifndef HAVE_WHEEL_ACCELERATION
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 61853f8276..1bc783219f 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -203,6 +203,7 @@ static const char graphic_numeric[] = "graphic,numeric";
/* Default theme settings */
#define DEFAULT_WPSNAME "cabbiev2"
#define DEFAULT_SBSNAME "-"
+#define DEFAULT_FMS_NAME DEFAULT_WPSNAME
#ifdef HAVE_LCD_BITMAP
@@ -1456,7 +1457,13 @@ const struct settings_list settings[] = {
#if CONFIG_TUNER
TEXT_SETTING(0, fmr_file, "fmr", "-",
FMPRESET_PATH "/", ".fmr"),
+ TEXT_SETTING(F_THEMESETTING,fms_file, "fms",
+ DEFAULT_FMS_NAME, SBS_DIR "/", ".fms"),
+#ifdef HAVE_REMOTE_LCD
+ TEXT_SETTING(F_THEMESETTING,rfms_file, "rfms",
+ DEFAULT_FMS_NAME, SBS_DIR "/", ".rfms"),
#endif
+#endif /* CONFIG_TUNER */
#ifdef HAVE_LCD_BITMAP
TEXT_SETTING(F_THEMESETTING, font_file, "font",
DEFAULT_FONTNAME, FONT_DIR "/", ".fnt"),