summaryrefslogtreecommitdiff
path: root/apps/recorder
diff options
context:
space:
mode:
authorStéphane Doyon <s.doyon@videotron.ca>2007-11-07 02:14:28 +0000
committerStéphane Doyon <s.doyon@videotron.ca>2007-11-07 02:14:28 +0000
commitd65f9f15f96892754f482f42de793a427d4fb738 (patch)
treef290d9d0c138642df2ce188876e29e368fd6470e /apps/recorder
parent8024aad1f1606d42a40a6a0c88ddc2942f7f7afd (diff)
downloadrockbox-d65f9f15f96892754f482f42de793a427d4fb738.tar.gz
rockbox-d65f9f15f96892754f482f42de793a427d4fb738.zip
More voice for the radio: accept FS#6331.
In the radio screen, speak the mode (preset or scan) when switching mode. When switching stations with the radio paused/muted, speak the current preset (number, frequency if preset is default, or spell, depending on talk_file setting). Also says the frequency if in scan mode. Change the default preset created by autoscan to be an empty string; change the preset menu callback to substitute the frequency when the preset name is empty. Add a voice callback for the preset menu. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15507 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/recorder')
-rw-r--r--apps/recorder/radio.c82
1 files changed, 74 insertions, 8 deletions
diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c
index 696732d2e9..a0cc10ce18 100644
--- a/apps/recorder/radio.c
+++ b/apps/recorder/radio.c
@@ -393,6 +393,31 @@ static void end_search(void)
393 search_dir = 0; 393 search_dir = 0;
394} 394}
395 395
396/* Speak a frequency. */
397static void talk_freq(int freq, bool enqueue)
398{
399 freq /= 10000;
400 talk_number(freq / 100, enqueue);
401 talk_id(LANG_POINT, true);
402 talk_number(freq % 100 / 10, true);
403 if (freq % 10)
404 talk_number(freq % 10, true);
405}
406
407/* Speak a preset by number or by spelling its name, depending on settings. */
408static void talk_preset(int preset, bool fallback, bool enqueue)
409{
410 if (global_settings.talk_file == 1) /* number */
411 talk_number(preset + 1, enqueue);
412 else
413 { /* spell */
414 if(presets[preset].name[0])
415 talk_spell(presets[preset].name, enqueue);
416 else if(fallback)
417 talk_freq(presets[preset].frequency, enqueue);
418 }
419}
420
396int radio_screen(void) 421int radio_screen(void)
397{ 422{
398 char buf[MAX_PATH]; 423 char buf[MAX_PATH];
@@ -407,6 +432,7 @@ int radio_screen(void)
407 bool screen_freeze = false; 432 bool screen_freeze = false;
408 bool keep_playing = false; 433 bool keep_playing = false;
409 bool statusbar = global_settings.statusbar; 434 bool statusbar = global_settings.statusbar;
435 bool talk = false;
410#ifdef FM_RECORD_DBLPRE 436#ifdef FM_RECORD_DBLPRE
411 int lastbutton = BUTTON_NONE; 437 int lastbutton = BUTTON_NONE;
412 unsigned long rec_lastclick = 0; 438 unsigned long rec_lastclick = 0;
@@ -517,6 +543,7 @@ int radio_screen(void)
517 curr_preset = find_preset(curr_freq); 543 curr_preset = find_preset(curr_freq);
518 remember_frequency(); 544 remember_frequency();
519 end_search(); 545 end_search();
546 talk = true;
520 } 547 }
521 548
522 trigger_cpu_boost(); 549 trigger_cpu_boost();
@@ -627,6 +654,7 @@ int radio_screen(void)
627 next_station(button == ACTION_STD_PREV ? -1 : 1); 654 next_station(button == ACTION_STD_PREV ? -1 : 1);
628 end_search(); 655 end_search();
629 update_screen = true; 656 update_screen = true;
657 talk = true;
630 break; 658 break;
631 659
632 case ACTION_STD_PREVREPEAT: 660 case ACTION_STD_PREVREPEAT:
@@ -639,6 +667,7 @@ int radio_screen(void)
639 next_preset(search_dir); 667 next_preset(search_dir);
640 end_search(); 668 end_search();
641 update_screen = true; 669 update_screen = true;
670 talk = true;
642 } 671 }
643 else if (dir == 0) 672 else if (dir == 0)
644 { 673 {
@@ -670,6 +699,8 @@ int radio_screen(void)
670 radio_start(); 699 radio_start();
671 700
672 update_screen = true; 701 update_screen = true;
702 talk = false;
703 talk_shutup();
673 break; 704 break;
674 705
675 case ACTION_FM_MENU: 706 case ACTION_FM_MENU:
@@ -761,6 +792,9 @@ int radio_screen(void)
761 else 792 else
762 radio_mode = RADIO_SCAN_MODE; 793 radio_mode = RADIO_SCAN_MODE;
763 update_screen = true; 794 update_screen = true;
795 cond_talk_ids_fq(radio_mode ?
796 LANG_PRESET : LANG_RADIO_SCAN_MODE);
797 talk = true;
764 break; 798 break;
765#endif /* FM_MODE */ 799#endif /* FM_MODE */
766 800
@@ -769,6 +803,7 @@ int radio_screen(void)
769 next_preset(1); 803 next_preset(1);
770 end_search(); 804 end_search();
771 update_screen = true; 805 update_screen = true;
806 talk = true;
772 break; 807 break;
773#endif 808#endif
774 809
@@ -777,6 +812,7 @@ int radio_screen(void)
777 next_preset(-1); 812 next_preset(-1);
778 end_search(); 813 end_search();
779 update_screen = true; 814 update_screen = true;
815 talk = true;
780 break; 816 break;
781#endif 817#endif
782 818
@@ -901,6 +937,21 @@ int radio_screen(void)
901 937
902 update_screen = false; 938 update_screen = false;
903 939
940 if (global_settings.talk_file && talk
941 && radio_status == FMRADIO_PAUSED)
942 {
943 talk = false;
944 bool enqueue = false;
945 if (radio_mode == RADIO_SCAN_MODE)
946 {
947 talk_freq(curr_freq, enqueue);
948 enqueue = true;
949 }
950 if (curr_preset >= 0)
951 talk_preset(curr_preset, radio_mode == RADIO_PRESET_MODE,
952 enqueue);
953 }
954
904#if CONFIG_CODEC != SWCODEC 955#if CONFIG_CODEC != SWCODEC
905 if(audio_status() & AUDIO_STATUS_ERROR) 956 if(audio_status() & AUDIO_STATUS_ERROR)
906 { 957 {
@@ -1232,8 +1283,22 @@ MAKE_MENU(handle_radio_preset_menu, ID2P(LANG_PRESET),
1232char * presets_get_name(int selected_item, void * data, char *buffer) 1283char * presets_get_name(int selected_item, void * data, char *buffer)
1233{ 1284{
1234 (void)data; 1285 (void)data;
1235 (void)buffer; 1286 struct fmstation *p = &presets[selected_item];
1236 return presets[selected_item].name; 1287 if(p->name[0])
1288 return p->name;
1289 int freq = p->frequency / 10000;
1290 int frac = freq % 100;
1291 freq /= 100;
1292 snprintf(buffer, MAX_PATH,
1293 str(LANG_FM_DEFAULT_PRESET_NAME), freq, frac);
1294 return buffer;
1295}
1296
1297static int presets_speak_name(int selected_item, void * data)
1298{
1299 (void)data;
1300 talk_preset(selected_item, true, false);
1301 return 0;
1237} 1302}
1238 1303
1239static int handle_radio_presets(void) 1304static int handle_radio_presets(void)
@@ -1259,16 +1324,18 @@ static int handle_radio_presets(void)
1259 gui_synclist_init(&lists, presets_get_name, NULL, false, 1); 1324 gui_synclist_init(&lists, presets_get_name, NULL, false, 1);
1260 gui_synclist_set_title(&lists, str(LANG_PRESET), NOICON); 1325 gui_synclist_set_title(&lists, str(LANG_PRESET), NOICON);
1261 gui_synclist_set_icon_callback(&lists, NULL); 1326 gui_synclist_set_icon_callback(&lists, NULL);
1327 if(global_settings.talk_file)
1328 gui_synclist_set_voice_callback(&lists, presets_speak_name);
1262 gui_synclist_set_nb_items(&lists, num_presets); 1329 gui_synclist_set_nb_items(&lists, num_presets);
1263 gui_synclist_select_item(&lists, curr_preset<0 ? 0 : curr_preset); 1330 gui_synclist_select_item(&lists, curr_preset<0 ? 0 : curr_preset);
1331 gui_synclist_speak_item(&lists);
1264 1332
1265 while (result == 0) 1333 while (result == 0)
1266 { 1334 {
1267 gui_synclist_draw(&lists); 1335 gui_synclist_draw(&lists);
1268 gui_syncstatusbar_draw(&statusbars, true); 1336 gui_syncstatusbar_draw(&statusbars, true);
1269 action = get_action(CONTEXT_STD, HZ); 1337 list_do_action(CONTEXT_STD, HZ,
1270 1338 &lists, &action, LIST_WRAP_UNLESS_HELD);
1271 gui_synclist_do_button(&lists, &action, LIST_WRAP_UNLESS_HELD);
1272 switch (action) 1339 switch (action)
1273 { 1340 {
1274 case ACTION_STD_MENU: 1341 case ACTION_STD_MENU:
@@ -1288,6 +1355,7 @@ static int handle_radio_presets(void)
1288 case ACTION_STD_CONTEXT: 1355 case ACTION_STD_CONTEXT:
1289 selected_preset = gui_synclist_get_sel_pos(&lists); 1356 selected_preset = gui_synclist_get_sel_pos(&lists);
1290 do_menu(&handle_radio_preset_menu, NULL); 1357 do_menu(&handle_radio_preset_menu, NULL);
1358 gui_synclist_speak_item(&lists);
1291 break; 1359 break;
1292 default: 1360 default:
1293 if(default_event_handler(action) == SYS_USB_CONNECTED) 1361 if(default_event_handler(action) == SYS_USB_CONNECTED)
@@ -1372,9 +1440,7 @@ static int scan_presets(void)
1372 if(tuner_set(RADIO_SCAN_FREQUENCY, curr_freq)) 1440 if(tuner_set(RADIO_SCAN_FREQUENCY, curr_freq))
1373 { 1441 {
1374 /* add preset */ 1442 /* add preset */
1375 snprintf(buf, MAX_FMPRESET_LEN, 1443 presets[num_presets].name[0] = '\0';
1376 str(LANG_FM_DEFAULT_PRESET_NAME), freq, frac);
1377 strcpy(presets[num_presets].name,buf);
1378 presets[num_presets].frequency = curr_freq; 1444 presets[num_presets].frequency = curr_freq;
1379 num_presets++; 1445 num_presets++;
1380 } 1446 }