diff options
author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2006-10-05 12:40:13 +0000 |
---|---|---|
committer | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2006-10-05 12:40:13 +0000 |
commit | e66b2ec45071f810f84991d3035ef21b6ecdb509 (patch) | |
tree | ebf3ec7bef00d6806d63facd53b9a7a540f561cd /apps/recorder | |
parent | 0640a050d5fc19efc58e6cd08b23165b4ab9116c (diff) | |
download | rockbox-e66b2ec45071f810f84991d3035ef21b6ecdb509.tar.gz rockbox-e66b2ec45071f810f84991d3035ef21b6ecdb509.zip |
Implement region setting for the fm tuner. The region setting affects deemphasis, band limits and step size. Fixes FS#5929, FS#5928.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11133 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/recorder')
-rw-r--r-- | apps/recorder/radio.c | 114 | ||||
-rw-r--r-- | apps/recorder/radio.h | 12 |
2 files changed, 100 insertions, 26 deletions
diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c index 4afe0b2204..e7a5912235 100644 --- a/apps/recorder/radio.c +++ b/apps/recorder/radio.c | |||
@@ -85,13 +85,31 @@ | |||
85 | #define FM_RECORD | 85 | #define FM_RECORD |
86 | #endif | 86 | #endif |
87 | 87 | ||
88 | #define MAX_FREQ (108000000) | ||
89 | #define MIN_FREQ (87500000) | ||
90 | #define FREQ_STEP 100000 | ||
91 | |||
92 | #define RADIO_SCAN_MODE 0 | 88 | #define RADIO_SCAN_MODE 0 |
93 | #define RADIO_PRESET_MODE 1 | 89 | #define RADIO_PRESET_MODE 1 |
94 | 90 | ||
91 | #if (CONFIG_TUNER & TEA5767) | ||
92 | #define DEEMPH_50 0, | ||
93 | #define DEEMPH_75 1, | ||
94 | #define BAND_LIM_EU 0 | ||
95 | #define BAND_LIM_JP 1 | ||
96 | #else | ||
97 | #define DEEMPH_50 | ||
98 | #define DEEMPH_75 | ||
99 | #define BAND_LIM_EU | ||
100 | #define BAND_LIM_JP | ||
101 | #endif | ||
102 | static struct fm_region_setting fm_region[] = { | ||
103 | /* Europe */ | ||
104 | { LANG_FM_EUROPE, 87500000, 108000000, 50000, DEEMPH_50 BAND_LIM_EU }, | ||
105 | /* US / Canada */ | ||
106 | { LANG_FM_US, 87900000, 107900000, 200000, DEEMPH_75 BAND_LIM_EU }, | ||
107 | /* Japan */ | ||
108 | { LANG_FM_JAPAN, 76000000, 90000000, 100000, DEEMPH_50 BAND_LIM_JP }, | ||
109 | /* Korea */ | ||
110 | { LANG_FM_KOREA, 87500000, 108000000, 100000, DEEMPH_50 BAND_LIM_EU }, | ||
111 | }; | ||
112 | |||
95 | static int curr_preset = -1; | 113 | static int curr_preset = -1; |
96 | static int curr_freq; | 114 | static int curr_freq; |
97 | static int radio_mode = RADIO_SCAN_MODE; | 115 | static int radio_mode = RADIO_SCAN_MODE; |
@@ -194,7 +212,9 @@ void radio_start(void) | |||
194 | if(radio_status == FMRADIO_OFF) | 212 | if(radio_status == FMRADIO_OFF) |
195 | radio_power(true); | 213 | radio_power(true); |
196 | 214 | ||
197 | curr_freq = global_settings.last_frequency * FREQ_STEP + MIN_FREQ; | 215 | curr_freq = global_settings.last_frequency |
216 | * fm_region[global_settings.fm_region].freq_step | ||
217 | + fm_region[global_settings.fm_region].freq_min; | ||
198 | 218 | ||
199 | radio_set(RADIO_SLEEP, 0); /* wake up the tuner */ | 219 | radio_set(RADIO_SLEEP, 0); /* wake up the tuner */ |
200 | radio_set(RADIO_FREQUENCY, curr_freq); | 220 | radio_set(RADIO_FREQUENCY, curr_freq); |
@@ -285,7 +305,7 @@ static int find_closest_preset(int freq) | |||
285 | { | 305 | { |
286 | int i; | 306 | int i; |
287 | int diff; | 307 | int diff; |
288 | int min_diff = MAX_FREQ; | 308 | int min_diff = fm_region[global_settings.fm_region].freq_min; |
289 | int preset = -1; | 309 | int preset = -1; |
290 | 310 | ||
291 | for(i = 0;i < MAX_PRESETS;i++) | 311 | for(i = 0;i < MAX_PRESETS;i++) |
@@ -307,7 +327,9 @@ static int find_closest_preset(int freq) | |||
307 | 327 | ||
308 | static void remember_frequency(void) | 328 | static void remember_frequency(void) |
309 | { | 329 | { |
310 | global_settings.last_frequency = (curr_freq - MIN_FREQ) / FREQ_STEP; | 330 | global_settings.last_frequency = (curr_freq |
331 | - fm_region[global_settings.fm_region].freq_min) | ||
332 | / fm_region[global_settings.fm_region].freq_step; | ||
311 | settings_save(); | 333 | settings_save(); |
312 | } | 334 | } |
313 | 335 | ||
@@ -450,11 +472,12 @@ bool radio_screen(void) | |||
450 | { | 472 | { |
451 | if(search_dir) | 473 | if(search_dir) |
452 | { | 474 | { |
453 | curr_freq += search_dir * FREQ_STEP; | 475 | curr_freq += search_dir |
454 | if(curr_freq < MIN_FREQ) | 476 | * fm_region[global_settings.fm_region].freq_step; |
455 | curr_freq = MAX_FREQ; | 477 | if(curr_freq < fm_region[global_settings.fm_region].freq_min) |
456 | if(curr_freq > MAX_FREQ) | 478 | curr_freq = fm_region[global_settings.fm_region].freq_max; |
457 | curr_freq = MIN_FREQ; | 479 | if(curr_freq > fm_region[global_settings.fm_region].freq_max) |
480 | curr_freq = fm_region[global_settings.fm_region].freq_min; | ||
458 | 481 | ||
459 | /* Tune in and delay */ | 482 | /* Tune in and delay */ |
460 | radio_set(RADIO_FREQUENCY, curr_freq); | 483 | radio_set(RADIO_FREQUENCY, curr_freq); |
@@ -573,9 +596,11 @@ bool radio_screen(void) | |||
573 | case ACTION_STD_PREV: | 596 | case ACTION_STD_PREV: |
574 | if(radio_mode == RADIO_SCAN_MODE) | 597 | if(radio_mode == RADIO_SCAN_MODE) |
575 | { | 598 | { |
576 | curr_freq -= FREQ_STEP; | 599 | curr_freq |
577 | if(curr_freq < MIN_FREQ) | 600 | -= fm_region[global_settings.fm_region].freq_step; |
578 | curr_freq = MAX_FREQ; | 601 | if(curr_freq < fm_region[global_settings.fm_region].freq_min) |
602 | curr_freq | ||
603 | = fm_region[global_settings.fm_region].freq_max; | ||
579 | radio_set(RADIO_FREQUENCY, curr_freq); | 604 | radio_set(RADIO_FREQUENCY, curr_freq); |
580 | curr_preset = find_preset(curr_freq); | 605 | curr_preset = find_preset(curr_freq); |
581 | remember_frequency(); | 606 | remember_frequency(); |
@@ -589,9 +614,11 @@ bool radio_screen(void) | |||
589 | case ACTION_STD_NEXT: | 614 | case ACTION_STD_NEXT: |
590 | if(radio_mode == RADIO_SCAN_MODE) | 615 | if(radio_mode == RADIO_SCAN_MODE) |
591 | { | 616 | { |
592 | curr_freq += FREQ_STEP; | 617 | curr_freq |
593 | if(curr_freq > MAX_FREQ) | 618 | += fm_region[global_settings.fm_region].freq_step; |
594 | curr_freq = MIN_FREQ; | 619 | if(curr_freq > fm_region[global_settings.fm_region].freq_max) |
620 | curr_freq | ||
621 | = fm_region[global_settings.fm_region].freq_min; | ||
595 | radio_set(RADIO_FREQUENCY, curr_freq); | 622 | radio_set(RADIO_FREQUENCY, curr_freq); |
596 | curr_preset = find_preset(curr_freq); | 623 | curr_preset = find_preset(curr_freq); |
597 | remember_frequency(); | 624 | remember_frequency(); |
@@ -821,8 +848,8 @@ bool radio_screen(void) | |||
821 | FOR_NB_SCREENS(i) | 848 | FOR_NB_SCREENS(i) |
822 | screens[i].puts_scroll(0, top_of_screen, buf); | 849 | screens[i].puts_scroll(0, top_of_screen, buf); |
823 | 850 | ||
824 | freq = curr_freq / 100000; | 851 | freq = curr_freq / 10000; |
825 | snprintf(buf, 128, str(LANG_FM_STATION), freq / 10, freq % 10); | 852 | snprintf(buf, 128, str(LANG_FM_STATION), freq / 100, freq % 100); |
826 | FOR_NB_SCREENS(i) | 853 | FOR_NB_SCREENS(i) |
827 | screens[i].puts_scroll(0, top_of_screen + 1, buf); | 854 | screens[i].puts_scroll(0, top_of_screen + 1, buf); |
828 | 855 | ||
@@ -1316,6 +1343,39 @@ static bool toggle_mono_mode(void) | |||
1316 | return false; | 1343 | return false; |
1317 | } | 1344 | } |
1318 | 1345 | ||
1346 | char region_menu_string[32]; | ||
1347 | static void create_region_menu(void) | ||
1348 | { | ||
1349 | snprintf(region_menu_string, sizeof(region_menu_string), | ||
1350 | "%s: %s", str(LANG_FM_REGION), | ||
1351 | str(fm_region[global_settings.fm_region].lang)); | ||
1352 | } | ||
1353 | |||
1354 | static bool toggle_region_mode(void) | ||
1355 | { | ||
1356 | global_settings.fm_region++; | ||
1357 | if(global_settings.fm_region >= | ||
1358 | (int)(sizeof(fm_region) / sizeof(struct fm_region_setting))) | ||
1359 | global_settings.fm_region = 0; | ||
1360 | #if (CONFIG_TUNER & TEA5767) | ||
1361 | radio_set(RADIO_SET_DEEMPHASIS, | ||
1362 | fm_region[global_settings.fm_region].deemphasis); | ||
1363 | radio_set(RADIO_SET_BAND, fm_region[global_settings.fm_region].band); | ||
1364 | #endif | ||
1365 | /* make sure the current frequency is in the region range */ | ||
1366 | curr_freq -= (curr_freq - fm_region[global_settings.fm_region].freq_min) | ||
1367 | % fm_region[global_settings.fm_region].freq_step; | ||
1368 | if(curr_freq < fm_region[global_settings.fm_region].freq_min) | ||
1369 | curr_freq = fm_region[global_settings.fm_region].freq_min; | ||
1370 | if(curr_freq > fm_region[global_settings.fm_region].freq_max) | ||
1371 | curr_freq = fm_region[global_settings.fm_region].freq_max; | ||
1372 | radio_set(RADIO_FREQUENCY, curr_freq); | ||
1373 | |||
1374 | settings_save(); | ||
1375 | create_region_menu(); | ||
1376 | return false; | ||
1377 | } | ||
1378 | |||
1319 | #ifndef FM_MODE | 1379 | #ifndef FM_MODE |
1320 | char radiomode_menu_string[32]; | 1380 | char radiomode_menu_string[32]; |
1321 | 1381 | ||
@@ -1346,17 +1406,17 @@ static bool scan_presets(void) | |||
1346 | 1406 | ||
1347 | if(do_scan) | 1407 | if(do_scan) |
1348 | { | 1408 | { |
1349 | curr_freq = MIN_FREQ; | 1409 | curr_freq = fm_region[global_settings.fm_region].freq_min; |
1350 | num_presets = 0; | 1410 | num_presets = 0; |
1351 | memset(presets, 0, sizeof(presets)); | 1411 | memset(presets, 0, sizeof(presets)); |
1352 | while(curr_freq <= MAX_FREQ) | 1412 | while(curr_freq <= fm_region[global_settings.fm_region].freq_max) |
1353 | { | 1413 | { |
1354 | if (num_presets >= MAX_PRESETS) | 1414 | if (num_presets >= MAX_PRESETS) |
1355 | break; | 1415 | break; |
1356 | 1416 | ||
1357 | freq = curr_freq /100000; | 1417 | freq = curr_freq / 10000; |
1358 | snprintf(buf, MAX_FMPRESET_LEN, str(LANG_FM_SCANNING), | 1418 | snprintf(buf, MAX_FMPRESET_LEN, str(LANG_FM_SCANNING), |
1359 | freq/10, freq % 10); | 1419 | freq/100, freq % 100); |
1360 | gui_syncsplash(0, true, buf); | 1420 | gui_syncsplash(0, true, buf); |
1361 | 1421 | ||
1362 | /* Tune in and delay */ | 1422 | /* Tune in and delay */ |
@@ -1373,13 +1433,13 @@ static bool scan_presets(void) | |||
1373 | /* add preset */ | 1433 | /* add preset */ |
1374 | if(tuned){ | 1434 | if(tuned){ |
1375 | snprintf(buf, MAX_FMPRESET_LEN, | 1435 | snprintf(buf, MAX_FMPRESET_LEN, |
1376 | str(LANG_FM_DEFAULT_PRESET_NAME),freq/10, freq % 10); | 1436 | str(LANG_FM_DEFAULT_PRESET_NAME),freq/100, freq % 100); |
1377 | strcpy(presets[num_presets].name,buf); | 1437 | strcpy(presets[num_presets].name,buf); |
1378 | presets[num_presets].frequency = curr_freq; | 1438 | presets[num_presets].frequency = curr_freq; |
1379 | num_presets++; | 1439 | num_presets++; |
1380 | } | 1440 | } |
1381 | 1441 | ||
1382 | curr_freq += FREQ_STEP; | 1442 | curr_freq += fm_region[global_settings.fm_region].freq_step; |
1383 | 1443 | ||
1384 | } | 1444 | } |
1385 | 1445 | ||
@@ -1504,6 +1564,7 @@ bool radio_menu(void) | |||
1504 | #ifndef FM_MODE | 1564 | #ifndef FM_MODE |
1505 | { radiomode_menu_string , toggle_radio_mode }, | 1565 | { radiomode_menu_string , toggle_radio_mode }, |
1506 | #endif | 1566 | #endif |
1567 | { region_menu_string , toggle_region_mode }, | ||
1507 | { ID2P(LANG_SOUND_SETTINGS) , sound_menu }, | 1568 | { ID2P(LANG_SOUND_SETTINGS) , sound_menu }, |
1508 | #ifndef SIMULATOR | 1569 | #ifndef SIMULATOR |
1509 | #if defined(HAVE_FMRADIO_IN) || CONFIG_CODEC != SWCODEC | 1570 | #if defined(HAVE_FMRADIO_IN) || CONFIG_CODEC != SWCODEC |
@@ -1515,6 +1576,7 @@ bool radio_menu(void) | |||
1515 | }; | 1576 | }; |
1516 | 1577 | ||
1517 | create_monomode_menu(); | 1578 | create_monomode_menu(); |
1579 | create_region_menu(); | ||
1518 | #ifndef FM_MODE | 1580 | #ifndef FM_MODE |
1519 | create_radiomode_menu(); | 1581 | create_radiomode_menu(); |
1520 | #endif | 1582 | #endif |
diff --git a/apps/recorder/radio.h b/apps/recorder/radio.h index fdf446dc0a..439061e579 100644 --- a/apps/recorder/radio.h +++ b/apps/recorder/radio.h | |||
@@ -42,6 +42,18 @@ struct fmstation | |||
42 | char name[MAX_FMPRESET_LEN+1]; | 42 | char name[MAX_FMPRESET_LEN+1]; |
43 | }; | 43 | }; |
44 | 44 | ||
45 | struct fm_region_setting | ||
46 | { | ||
47 | int lang; | ||
48 | int freq_min; | ||
49 | int freq_max; | ||
50 | int freq_step; | ||
51 | #if (CONFIG_TUNER & TEA5767) | ||
52 | int deemphasis; /* 0: 50us, 1: 75us */ | ||
53 | int band; /* 0: europe, 1: japan (BL in TEA spec)*/ | ||
54 | #endif | ||
55 | }; | ||
56 | |||
45 | #endif | 57 | #endif |
46 | 58 | ||
47 | #endif | 59 | #endif |