diff options
author | Stéphane Doyon <s.doyon@videotron.ca> | 2007-11-07 02:14:28 +0000 |
---|---|---|
committer | Stéphane Doyon <s.doyon@videotron.ca> | 2007-11-07 02:14:28 +0000 |
commit | d65f9f15f96892754f482f42de793a427d4fb738 (patch) | |
tree | f290d9d0c138642df2ce188876e29e368fd6470e /apps/recorder | |
parent | 8024aad1f1606d42a40a6a0c88ddc2942f7f7afd (diff) | |
download | rockbox-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.c | 82 |
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. */ | ||
397 | static 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. */ | ||
408 | static 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 | |||
396 | int radio_screen(void) | 421 | int 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), | |||
1232 | char * presets_get_name(int selected_item, void * data, char *buffer) | 1283 | char * 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 | |||
1297 | static 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 | ||
1239 | static int handle_radio_presets(void) | 1304 | static 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 | } |