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)id3; - } - else if (i == cur_playlist_pos+1) - { - pid3 = state->nid3; - } -#if CONFIG_CODEC == SWCODEC - else if (i>cur_playlist_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; - } -#endif - else + int line; +#if CONFIG_TUNER + if (current_screen() == GO_TO_FM) { pid3 = NULL; + line = TRACK_HAS_INFO; + filename = ""; + } + else +#endif + { + filename = playlist_peek(i-cur_pos); + if (i == cur_pos) + { + pid3 = state->id3; + } + 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_pos)) + pid3 = NULL; + } +#endif + 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 }; @@ -68,6 +75,9 @@ void settings_apply_skins(void) #ifdef HAVE_LCD_BITMAP skin_backdrop_init(); skin_font_init(); +#endif +#if CONFIG_TUNER + fms_skin_init(); #endif for (i=0; i 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "المحطة: %d.%02d ميجاهرتز" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Станция: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Emisora: %d.%dMHz" *: 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "频道:%d.%02dMHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "電台: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Stanice: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Station: %d,%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Sender: %d,%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: - *: "Station: %d.%dMHz" + *: none - *: "Station: %d.%dMHz" + *: none - *: "" + *: none 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Station: %d.%02d MHz" *: none - radio: "" @@ -13530,3 +13527,71 @@ swcodec: "Rewind before resume" + + id: LANG_REMOTE_FMRADIO + desc: in the main menu + user: core + + *:none + radio_remote: "Remote FM Radio" + + + *:none + radio_remote: "Remote FM Radio" + + + *:none + radio_remote: "Remote FM Radio" + + + + id: VOICE_EXT_FMS + desc: spoken only, for file extension + user: core + + *: none + radio: "" + + + *: none + radio: "" + + + *: none + radio: "radio screen skin" + + + + id: VOICE_EXT_RFMS + desc: spoken only, for file extension + user: core + + *: none + radio_remote: "" + + + *: none + radio_remote: "" + + + *: none + radio_remote: "remote radio screen skin" + + + + id: LANG_FM_STATION_HEADER + desc: in radio screen + user: core + + *: none + radio: "Station:" + + + *: none + radio: "Station:" + + + *: none + radio: "" + + 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Emisora: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: - *: "Station: %d.%02d MHz" + *: none - *: "Stacio: %d.%02d MHz" + *: none - *: "" + *: none 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Asema: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Station : %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: - *: "Station: %d.%02d MHz" + *: none - *: "Estación: %d.%02d MHz" + *: none - *: "" + *: none 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Σταθμός: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "%d.%02d MHZ :תחנה" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: - *: "Station: %d.%02d MHz" + *: none - *: "Stöð: %d.%02d MHz" + *: none - *: "" + *: none 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Stazione: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "局: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "방송국: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Stotis: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Adó: %d,%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Zender: %d.%02d MHz" *: none - radio: "Zender: %d.%02d MHz" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Stasjon: %d.%02d MHz" *: 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" - *: none - radio: "Stasjon: %d.%02d MHz" + *: none *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Stacja: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Emissora: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Estação: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Statie: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Станция: %d.%02d МГц" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Stanica: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Станица: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Kanal: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Station: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "สถานี: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Station: %d.%02d MHz" *: none - radio: "" 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: - *: none - radio: "Station: %d.%02d MHz" + *: none - *: none - radio: "Станцiя: %d.%02d MHz" + *: none - *: none - radio: "" + *: none 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: - *: "Station: %d.%02d MHz" + *: none - *: "Sender: %d.%02d MHz" + *: none - *: "" + *: none 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 @@ id: LANG_FM_STATION - desc: in radio screen - user: core + desc: deprecated + user: *: none - radio: "Station: %d.%02d MHz" *: none - radio: "Posse: %d.%02d MHz" *: none - radio: "" 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) { - struct screen *display; int i; FOR_NB_SCREENS(i) { - display = &screens[i]; - display->set_viewport(&vp[i]); - display->clear_viewport(); - display->update_viewport(); + 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) +{ + int i; + FOR_NB_SCREENS(i) + { +#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; - + if (restore) + fms_fix_displays(FMS_ENTER); 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 */ - - 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"), diff --git a/tools/checkwps/checkwps.c b/tools/checkwps/checkwps.c index 6760d6215e..6c6c700cfd 100644 --- a/tools/checkwps/checkwps.c +++ b/tools/checkwps/checkwps.c @@ -207,6 +207,13 @@ void screen_clear_area(struct screen * display, int xstart, int ystart, } #endif +#if CONFIG_TUNER +bool radio_hardware_present(void) +{ + return true; +} +#endif + #ifdef HAVE_LCD_BITMAP static int loaded_fonts = 0; int font_load(struct font* pf, const char *path)