summaryrefslogtreecommitdiff
path: root/apps/recorder/radio.c
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/recorder/radio.c
parentf9736c0b63d90d3cda7e2c77d1cae20939ae328f (diff)
downloadrockbox-1bd072c92d5f6d4a9a26d738a421f5a05048bb29.tar.gz
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/recorder/radio.c')
-rw-r--r--apps/recorder/radio.c303
1 files changed, 127 insertions, 176 deletions
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 @@
51#ifdef IPOD_ACCESSORY_PROTOCOL 51#ifdef IPOD_ACCESSORY_PROTOCOL
52#include "iap.h" 52#include "iap.h"
53#endif 53#endif
54#include "appevents.h"
54#include "talk.h" 55#include "talk.h"
55#include "tuner.h" 56#include "tuner.h"
56#include "power.h" 57#include "power.h"
@@ -66,9 +67,8 @@
66#include "menus/exported_menus.h" 67#include "menus/exported_menus.h"
67#include "root_menu.h" 68#include "root_menu.h"
68#include "viewport.h" 69#include "viewport.h"
69#ifdef HAVE_QUICKSCREEN 70#include "skin_engine/skin_engine.h"
70#include "quickscreen.h" 71#include "statusbar-skinned.h"
71#endif
72 72
73#if CONFIG_TUNER 73#if CONFIG_TUNER
74 74
@@ -100,20 +100,32 @@
100#elif CONFIG_KEYPAD == ONDIO_PAD 100#elif CONFIG_KEYPAD == ONDIO_PAD
101#define FM_RECORD_DBLPRE 101#define FM_RECORD_DBLPRE
102#define FM_RECORD 102#define FM_RECORD
103#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || (CONFIG_KEYPAD == SANSA_C200_PAD) \ 103#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || (CONFIG_KEYPAD == SANSA_C200_PAD)
104 || (CONFIG_KEYPAD == SANSA_FUZE_PAD) 104#define FM_MENU
105#define FM_PRESET 105#define FM_PRESET
106#define FM_STOP
106#define FM_MODE 107#define FM_MODE
108#define FM_EXIT
109#define FM_PLAY
107 110
108#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD) 111#elif (CONFIG_KEYPAD == GIGABEAT_S_PAD)
109#define FM_PRESET 112#define FM_PRESET
110#define FM_MODE 113#define FM_MODE
111 114
112#elif (CONFIG_KEYPAD == COWON_D2_PAD) 115#elif (CONFIG_KEYPAD == COWON_D2_PAD)
116#define FM_MENU
113#define FM_PRESET 117#define FM_PRESET
118#define FM_STOP
119#define FM_MODE
120#define FM_EXIT
121#define FM_PLAY
114 122
115#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 123#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
116 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 124 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
125#define FM_MENU
126#define FM_STOP
127#define FM_EXIT
128#define FM_PLAY
117#define FM_MODE 129#define FM_MODE
118 130
119#endif 131#endif
@@ -148,6 +160,32 @@ static int clear_preset_list(void);
148static int scan_presets(void *viewports); 160static int scan_presets(void *viewports);
149static void radio_off(void); 161static void radio_off(void);
150 162
163bool radio_scan_mode(void)
164{
165 return radio_mode == RADIO_SCAN_MODE;
166}
167
168bool radio_is_stereo(void)
169{
170 return tuner_get(RADIO_STEREO) && !global_settings.fm_force_mono;
171}
172int radio_current_frequency(void)
173{
174 return curr_freq;
175}
176
177int radio_current_preset(void)
178{
179 return curr_preset;
180}
181int radio_preset_count(void)
182{
183 return num_presets;
184}
185const struct fmstation *radio_get_preset(int preset)
186{
187 return &presets[preset];
188}
151/* Function to manipulate all yesno dialogues. 189/* Function to manipulate all yesno dialogues.
152 This function needs the output text as an argument. */ 190 This function needs the output text as an argument. */
153static bool yesno_pop(const char* text) 191static bool yesno_pop(const char* text)
@@ -460,30 +498,90 @@ static void talk_preset(int preset, bool fallback, bool enqueue)
460 } 498 }
461} 499}
462 500
463static void fms_restore(struct viewport vp[NB_SCREENS]) 501/* Skin stuff */
502extern struct wps_state wps_state; /* from wps.c */
503static struct gui_wps fms_skin[NB_SCREENS] = {{ .data = NULL }};
504static struct wps_data fms_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }};
505static struct wps_sync_data fms_skin_sync_data = { .do_full_update = false };
506
507
508void fms_data_load(enum screen_type screen, const char *buf, bool isfile)
509{
510 struct wps_data *data = fms_skin[screen].data;
511 int success;
512 success = buf && skin_data_load(screen, data, buf, isfile);
513
514 if (!success ) /* load the default */
515 {
516 const char default_fms[] = "%Sx|Station:| %tf\n"
517 "%?ts<%Sx|Stereo||%Sx|Mono|>\n"
518 "%?tm<%Sx|Mode:| %Sx|Scan||%Sx|Preset|: %Ti. %?Tn<%Tn|%Tf>>\n"
519 "%pb\n"
520#if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR)
521 "%?Rr<%Sx|Time:| %Rh:%Rn:%Rs|"
522 "%?St|prerecording time|<%Sx|Prerecord Time| %Rs|%pm>>\n"
523#endif
524 ;
525 skin_data_load(screen, data, default_fms, false);
526 }
527}
528enum fms_exiting {
529 FMS_EXIT,
530 FMS_ENTER
531};
532void fms_fix_displays(enum fms_exiting toggle_state)
533{
534 int i;
535 FOR_NB_SCREENS(i)
536 {
537 if (toggle_state == FMS_ENTER)
538 {
539 viewportmanager_theme_enable(i, skin_has_sbs(i, fms_skin[i].data), NULL);
540#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
541 screens[i].backdrop_show(fms_skin[i].data->backdrop);
542#endif
543 screens[i].clear_display();
544 /* force statusbar/skin update since we just cleared the whole screen */
545 send_event(GUI_EVENT_ACTIONUPDATE, (void*)1);
546 }
547 else
548 {
549 screens[i].stop_scroll();
550#if LCD_DEPTH > 1 || defined(HAVE_REMOTE_LCD) && LCD_REMOTE_DEPTH > 1
551 screens[i].backdrop_show(sb_get_backdrop(i));
552#endif
553 viewportmanager_theme_undo(i, skin_has_sbs(i, fms_skin[i].data));
554 }
555 }
556}
557
558
559void fms_skin_init(void)
464{ 560{
465 struct screen *display;
466 int i; 561 int i;
467 FOR_NB_SCREENS(i) 562 FOR_NB_SCREENS(i)
468 { 563 {
469 display = &screens[i]; 564#ifdef HAVE_ALBUMART
470 display->set_viewport(&vp[i]); 565 fms_skin_data[i].albumart = NULL;
471 display->clear_viewport(); 566 fms_skin_data[i].playback_aa_slot = -1;
472 display->update_viewport(); 567#endif
568 fms_skin[i].data = &fms_skin_data[i];
569 fms_skin[i].display = &screens[i];
570 /* Currently no seperate wps_state needed/possible
571 so use the only available ( "global" ) one */
572 fms_skin[i].state = &wps_state;
573 fms_skin[i].sync_data = &fms_skin_sync_data;
473 } 574 }
474} 575}
475 576
476int radio_screen(void) 577int radio_screen(void)
477{ 578{
478 char buf[MAX_PATH];
479 bool done = false; 579 bool done = false;
480 int ret_val = GO_TO_ROOT; 580 int ret_val = GO_TO_ROOT;
481 int button; 581 int button;
482 int i; 582 int i;
483 bool stereo = false, last_stereo = false; 583 bool stereo = false, last_stereo = false;
484 int fh; 584 bool update_screen = true, restore = true;
485 int top_of_screen = 0;
486 bool update_screen = true;
487 bool screen_freeze = false; 585 bool screen_freeze = false;
488 bool keep_playing = false; 586 bool keep_playing = false;
489 bool talk = false; 587 bool talk = false;
@@ -502,33 +600,10 @@ int radio_screen(void)
502#ifndef HAVE_NOISY_IDLE_MODE 600#ifndef HAVE_NOISY_IDLE_MODE
503 int button_timeout = current_tick + (2*HZ); 601 int button_timeout = current_tick + (2*HZ);
504#endif 602#endif
505 struct viewport vp[NB_SCREENS];
506#ifdef HAVE_BUTTONBAR
507 struct gui_buttonbar buttonbar;
508 gui_buttonbar_init(&buttonbar);
509 gui_buttonbar_set_display(&buttonbar, &(screens[SCREEN_MAIN]) );
510#endif
511 603
512 /* change status to "in screen" */ 604 /* change status to "in screen" */
513 in_screen = true; 605 in_screen = true;
514 606
515 /* always display status bar in radio screen for now */
516 FOR_NB_SCREENS(i)
517 {
518 viewport_set_defaults(&vp[i], i);
519#ifdef HAVE_BUTTONBAR
520 if (global_settings.buttonbar)
521 vp[i].height -= BUTTONBAR_HEIGHT;
522#endif
523 }
524 fms_restore(vp);
525
526 fh = font_get(FONT_UI)->height;
527
528 /* Adjust for font size, trying to center the information vertically */
529 if(fh < 10)
530 top_of_screen = 1;
531
532 if(num_presets <= 0) 607 if(num_presets <= 0)
533 { 608 {
534 radio_load_presets(global_settings.fmr_file); 609 radio_load_presets(global_settings.fmr_file);
@@ -571,17 +646,12 @@ int radio_screen(void)
571#endif 646#endif
572 647
573 if(num_presets < 1 && yesno_pop(ID2P(LANG_FM_FIRST_AUTOSCAN))) 648 if(num_presets < 1 && yesno_pop(ID2P(LANG_FM_FIRST_AUTOSCAN)))
574 scan_presets(vp); 649 scan_presets(NULL);
575 650
576 curr_preset = find_preset(curr_freq); 651 curr_preset = find_preset(curr_freq);
577 if(curr_preset != -1) 652 if(curr_preset != -1)
578 radio_mode = RADIO_PRESET_MODE; 653 radio_mode = RADIO_PRESET_MODE;
579 654
580#ifdef HAVE_BUTTONBAR
581 gui_buttonbar_set(&buttonbar, str(LANG_BUTTONBAR_MENU),
582 str(LANG_PRESET), str(LANG_FM_BUTTONBAR_RECORD));
583#endif
584
585#ifndef HAVE_NOISY_IDLE_MODE 655#ifndef HAVE_NOISY_IDLE_MODE
586 cpu_idle_mode(true); 656 cpu_idle_mode(true);
587#endif 657#endif
@@ -608,15 +678,8 @@ int radio_screen(void)
608 cancel_cpu_boost(); 678 cancel_cpu_boost();
609 } 679 }
610 680
611#if CONFIG_CODEC != SWCODEC 681 button = skin_wait_for_action(fms_skin, CONTEXT_FM,
612 /* TODO: Can we timeout at HZ when recording since peaks aren't 682 update_screen ? TIMEOUT_NOBLOCK : HZ);
613 displayed? This should quiet recordings too. */
614 button = get_action(CONTEXT_FM,
615 update_screen ? TIMEOUT_NOBLOCK : HZ / PEAK_METER_FPS);
616#else
617 button = get_action(CONTEXT_FM,
618 update_screen ? TIMEOUT_NOBLOCK : HZ);
619#endif
620 683
621#ifndef HAVE_NOISY_IDLE_MODE 684#ifndef HAVE_NOISY_IDLE_MODE
622 if (button != ACTION_NONE) 685 if (button != ACTION_NONE)
@@ -763,19 +826,11 @@ int radio_screen(void)
763 break; 826 break;
764 827
765 case ACTION_FM_MENU: 828 case ACTION_FM_MENU:
766 FOR_NB_SCREENS(i) 829 fms_fix_displays(FMS_EXIT);
767 {
768 screens[i].scroll_stop(&vp[i]);
769 }
770 radio_menu(); 830 radio_menu();
771 curr_preset = find_preset(curr_freq); 831 curr_preset = find_preset(curr_freq);
772 fms_restore(vp);
773#ifdef HAVE_BUTTONBAR
774 gui_buttonbar_set(&buttonbar, str(LANG_BUTTONBAR_MENU),
775 str(LANG_PRESET),
776 str(LANG_FM_BUTTONBAR_RECORD));
777#endif
778 update_screen = true; 832 update_screen = true;
833 restore = true;
779 break; 834 break;
780 835
781#ifdef FM_PRESET 836#ifdef FM_PRESET
@@ -784,37 +839,15 @@ int radio_screen(void)
784 { 839 {
785 splash(HZ, ID2P(LANG_FM_NO_PRESETS)); 840 splash(HZ, ID2P(LANG_FM_NO_PRESETS));
786 update_screen = true; 841 update_screen = true;
787 fms_restore(vp);
788
789 break; 842 break;
790 } 843 }
791 FOR_NB_SCREENS(i) 844 fms_fix_displays(FMS_EXIT);
792 screens[i].scroll_stop(&vp[i]);
793 handle_radio_presets(); 845 handle_radio_presets();
794 fms_restore(vp);
795#ifdef HAVE_BUTTONBAR
796 gui_buttonbar_set(&buttonbar,
797 str(LANG_BUTTONBAR_MENU),
798 str(LANG_PRESET),
799 str(LANG_FM_BUTTONBAR_RECORD));
800#endif
801 update_screen = true; 846 update_screen = true;
847 restore = true;
802 break; 848 break;
803#endif /* FM_PRESET */ 849#endif /* FM_PRESET */
804 850
805#ifdef HAVE_QUICKSCREEN
806 case ACTION_FM_QUICKSCREEN:
807 {
808 if (quick_screen_quick(button))
809 {
810 done = true;
811 break;
812 }
813 fms_restore(vp);
814 update_screen = true;
815 }
816 break;
817#endif
818#ifdef FM_FREEZE 851#ifdef FM_FREEZE
819 case ACTION_FM_FREEZE: 852 case ACTION_FM_FREEZE:
820 if(!screen_freeze) 853 if(!screen_freeze)
@@ -923,17 +956,6 @@ int radio_screen(void)
923 { 956 {
924 /* Only display the peak meter when not recording */ 957 /* Only display the peak meter when not recording */
925#if CONFIG_CODEC != SWCODEC 958#if CONFIG_CODEC != SWCODEC
926 if(!audio_status())
927 {
928 FOR_NB_SCREENS(i)
929 {
930 screens[i].set_viewport(&vp[i]);
931 peak_meter_screen(&screens[i],0, fh*(top_of_screen + 4),fh);
932 screens[i].update_rect(0, fh*(top_of_screen + 4),
933 screens[i].getwidth(), fh);
934 }
935 }
936
937 if(TIME_AFTER(current_tick, timeout)) 959 if(TIME_AFTER(current_tick, timeout))
938 { 960 {
939 timeout = current_tick + HZ; 961 timeout = current_tick + HZ;
@@ -957,85 +979,20 @@ int radio_screen(void)
957 979
958#if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR) 980#if CONFIG_CODEC != SWCODEC && !defined(SIMULATOR)
959 seconds = audio_recorded_time() / HZ; 981 seconds = audio_recorded_time() / HZ;
960 if (update_screen || seconds > last_seconds) 982 if (update_screen || seconds > last_seconds || restore)
961 { 983 {
962 last_seconds = seconds; 984 last_seconds = seconds;
963#else 985#else
964 if (update_screen) 986 if (update_screen || restore)
965 { 987 {
966#endif 988#endif
967 int freq; 989 if (restore)
968 990 fms_fix_displays(FMS_ENTER);
969 FOR_NB_SCREENS(i)
970 {
971 screens[i].set_viewport(&vp[i]);
972 }
973
974 snprintf(buf, 128, curr_preset >= 0 ? "%d. %s" : " ",
975 curr_preset + 1, presets[curr_preset].name);
976
977 FOR_NB_SCREENS(i)
978 screens[i].puts_scroll(0, top_of_screen, buf);
979
980 freq = curr_freq / 10000;
981 snprintf(buf, 128, str(LANG_FM_STATION),
982 freq / 100, freq % 100);
983 FOR_NB_SCREENS(i)
984 screens[i].puts_scroll(0, top_of_screen + 1, buf);
985
986 FOR_NB_SCREENS(i)
987 screens[i].puts_scroll(0, top_of_screen + 2,
988 stereo ? str(LANG_CHANNEL_STEREO) :
989 str(LANG_CHANNEL_MONO));
990
991 snprintf(buf, 128, "%s %s", str(LANG_MODE),
992 radio_mode ? str(LANG_PRESET) :
993 str(LANG_RADIO_SCAN_MODE));
994 FOR_NB_SCREENS(i)
995 screens[i].puts_scroll(0, top_of_screen + 3, buf);
996#ifndef SIMULATOR
997#ifdef HAVE_RDS_CAP
998 snprintf(buf, 128, "%s",tuner_get_rds_info(RADIO_RDS_NAME));
999 FOR_NB_SCREENS(i)
1000 screens[i].puts_scroll(0, top_of_screen + 4, buf);
1001
1002 snprintf(buf, 128, "%s",tuner_get_rds_info(RADIO_RDS_TEXT));
1003 FOR_NB_SCREENS(i)
1004 screens[i].puts_scroll(0, top_of_screen + 5, buf);
1005#endif
1006#endif /* SIMULATOR */
1007
1008#if CONFIG_CODEC != SWCODEC
1009 if(audio_status() == AUDIO_STATUS_RECORD)
1010 {
1011 hours = seconds / 3600;
1012 minutes = (seconds - (hours * 3600)) / 60;
1013 snprintf(buf, 32, "%s %02d:%02d:%02d",
1014 str(LANG_RECORDING_TIME),
1015 hours, minutes, seconds%60);
1016 FOR_NB_SCREENS(i)
1017 screens[i].puts_scroll(0, top_of_screen + 4, buf);
1018 }
1019 else
1020 {
1021 if(rec_options.rec_prerecord_time)
1022 {
1023 snprintf(buf, 32, "%s %02d",
1024 str(LANG_RECORD_PRERECORD), seconds%60);
1025 FOR_NB_SCREENS(i)
1026 screens[i].puts_scroll(0, top_of_screen + 4, buf);
1027 }
1028 }
1029#endif /* CONFIG_CODEC != SWCODEC */
1030
1031 FOR_NB_SCREENS(i) 991 FOR_NB_SCREENS(i)
1032 screens[i].update_viewport(); 992 skin_update(&fms_skin[i], WPS_REFRESH_ALL);
1033#ifdef HAVE_BUTTONBAR 993 restore = false;
1034 gui_buttonbar_draw(&buttonbar);
1035#endif
1036 } 994 }
1037 } 995 }
1038
1039 update_screen = false; 996 update_screen = false;
1040 997
1041 if (global_settings.talk_file && talk 998 if (global_settings.talk_file && talk
@@ -1073,7 +1030,6 @@ int radio_screen(void)
1073 if(audio_status() & AUDIO_STATUS_ERROR) 1030 if(audio_status() & AUDIO_STATUS_ERROR)
1074 { 1031 {
1075 splash(0, str(LANG_DISK_FULL)); 1032 splash(0, str(LANG_DISK_FULL));
1076 fms_restore(vp);
1077 audio_error_clear(); 1033 audio_error_clear();
1078 1034
1079 while(1) 1035 while(1)
@@ -1116,11 +1072,7 @@ int radio_screen(void)
1116#ifndef HAVE_NOISY_IDLE_MODE 1072#ifndef HAVE_NOISY_IDLE_MODE
1117 cpu_idle_mode(false); 1073 cpu_idle_mode(false);
1118#endif 1074#endif
1119 FOR_NB_SCREENS(i) 1075 fms_fix_displays(FMS_EXIT);
1120 {
1121 screens[i].scroll_stop(&vp[i]);
1122 screens[i].set_viewport(NULL);
1123 }
1124 in_screen = false; 1076 in_screen = false;
1125#if CONFIG_CODEC != SWCODEC 1077#if CONFIG_CODEC != SWCODEC
1126 return have_recorded; 1078 return have_recorded;
@@ -1471,7 +1423,6 @@ static int handle_radio_presets(void)
1471 result = 2; 1423 result = 2;
1472 } 1424 }
1473 } 1425 }
1474 gui_synclist_scroll_stop(&lists);
1475 return result - 1; 1426 return result - 1;
1476} 1427}
1477 1428