summaryrefslogtreecommitdiff
path: root/apps/recorder
diff options
context:
space:
mode:
Diffstat (limited to 'apps/recorder')
-rw-r--r--apps/recorder/radio.c144
-rw-r--r--apps/recorder/radio.h21
2 files changed, 55 insertions, 110 deletions
diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c
index 0633289826..c15f5196ec 100644
--- a/apps/recorder/radio.c
+++ b/apps/recorder/radio.c
@@ -102,18 +102,6 @@
102#define RADIO_SCAN_MODE 0 102#define RADIO_SCAN_MODE 0
103#define RADIO_PRESET_MODE 1 103#define RADIO_PRESET_MODE 1
104 104
105static const struct fm_region_setting fm_region[] = {
106 /* Note: Desriptive strings are just for display atm and are not compiled. */
107 [REGION_EUROPE] =
108 FM_REGION_ENTRY("Europe", 87500000, 108000000, 50000, 0, 0),
109 [REGION_US_CANADA] =
110 FM_REGION_ENTRY("US/Canada", 87900000, 107900000, 200000, 1, 0),
111 [REGION_JAPAN] =
112 FM_REGION_ENTRY("Japan", 76000000, 90000000, 100000, 0, 1),
113 [REGION_KOREA] =
114 FM_REGION_ENTRY("Korea", 87500000, 108000000, 100000, 0, 0),
115 };
116
117static int curr_preset = -1; 105static int curr_preset = -1;
118static int curr_freq; 106static int curr_freq;
119static int radio_mode = RADIO_SCAN_MODE; 107static int radio_mode = RADIO_SCAN_MODE;
@@ -176,66 +164,57 @@ bool in_radio_screen(void)
176#define FMRADIO_START_PAUSED 0x8000 164#define FMRADIO_START_PAUSED 0x8000
177void radio_start(void) 165void radio_start(void)
178{ 166{
179 const struct fm_region_setting *fmr; 167 const struct fm_region_data *fmr;
180 bool start_paused; 168 bool start_paused;
181#if CONFIG_TUNER != LV24020LP
182 int mute_timeout;
183#endif
184 169
185 if(radio_status == FMRADIO_PLAYING) 170 if(radio_status == FMRADIO_PLAYING)
186 return; 171 return;
187 172
188 fmr = &fm_region[global_settings.fm_region]; 173 fmr = &fm_region_data[global_settings.fm_region];
189 174
190 start_paused = radio_status & FMRADIO_START_PAUSED; 175 start_paused = radio_status & FMRADIO_START_PAUSED;
191 /* clear flag before any yielding */ 176 /* clear flag before any yielding */
192 radio_status &= ~FMRADIO_START_PAUSED; 177 radio_status &= ~FMRADIO_START_PAUSED;
193 178
194 if(radio_status == FMRADIO_OFF) 179 if(radio_status == FMRADIO_OFF)
195 radio_power(true); 180 tuner_power(true);
196 181
197 curr_freq = global_status.last_frequency 182 curr_freq = global_status.last_frequency
198 * fmr->freq_step + fmr->freq_min; 183 * fmr->freq_step + fmr->freq_min;
199 184
200 radio_set(RADIO_SLEEP, 0); /* wake up the tuner */ 185 tuner_set(RADIO_SLEEP, 0); /* wake up the tuner */
201#if (CONFIG_TUNER & LV24020LP)
202 radio_set(RADIO_REGION, global_settings.fm_region);
203 radio_set(RADIO_FORCE_MONO, global_settings.fm_force_mono);
204#endif
205 radio_set(RADIO_FREQUENCY, curr_freq);
206
207#if CONFIG_TUNER != LV24020LP
208 186
209 if(radio_status == FMRADIO_OFF) 187 if(radio_status == FMRADIO_OFF)
210 { 188 {
211#if (CONFIG_TUNER & S1A0903X01) 189#ifdef HAVE_RADIO_REGION
212 radio_set(RADIO_IF_MEASUREMENT, 0); 190 tuner_set(RADIO_REGION, global_settings.fm_region);
213 radio_set(RADIO_SENSITIVITY, 0);
214#endif
215 radio_set(RADIO_FORCE_MONO, global_settings.fm_force_mono);
216#if (CONFIG_TUNER & TEA5767)
217 radio_set(RADIO_SET_DEEMPHASIS, fmr->deemphasis);
218 radio_set(RADIO_SET_BAND, fmr->band);
219#endif 191#endif
220 mute_timeout = current_tick + 1*HZ; 192 tuner_set(RADIO_FORCE_MONO, global_settings.fm_force_mono);
221 }
222 else
223 {
224 /* paused */
225 mute_timeout = current_tick + 2*HZ;
226 } 193 }
227 194
228 while(!radio_get(RADIO_STEREO) && !radio_get(RADIO_TUNED)) 195 tuner_set(RADIO_FREQUENCY, curr_freq);
196
197#ifdef HAVE_RADIO_MUTE_TIMEOUT
229 { 198 {
230 if(TIME_AFTER(current_tick, mute_timeout)) 199 unsigned long mute_timeout = current_tick + HZ;
231 break; 200 if (radio_status != FMRADIO_OFF)
232 yield(); 201 {
202 /* paused */
203 mute_timeout += HZ;
204 }
205
206 while(!tuner_get(RADIO_STEREO) && !tuner_get(RADIO_TUNED))
207 {
208 if(TIME_AFTER(current_tick, mute_timeout))
209 break;
210 yield();
211 }
233 } 212 }
234#endif /* CONFIG_TUNER != LV24020LP */ 213#endif
235 214
236 /* keep radio from sounding initially */ 215 /* keep radio from sounding initially */
237 if(!start_paused) 216 if(!start_paused)
238 radio_set(RADIO_MUTE, 0); 217 tuner_set(RADIO_MUTE, 0);
239 218
240 radio_status = FMRADIO_PLAYING; 219 radio_status = FMRADIO_PLAYING;
241} /* radio_start */ 220} /* radio_start */
@@ -251,8 +230,8 @@ void radio_pause(void)
251 radio_start(); 230 radio_start();
252 } 231 }
253 232
254 radio_set(RADIO_MUTE, 1); 233 tuner_set(RADIO_MUTE, 1);
255 radio_set(RADIO_SLEEP, 1); 234 tuner_set(RADIO_SLEEP, 1);
256 235
257 radio_status = FMRADIO_PAUSED; 236 radio_status = FMRADIO_PAUSED;
258} /* radio_pause */ 237} /* radio_pause */
@@ -262,30 +241,22 @@ void radio_stop(void)
262 if(radio_status == FMRADIO_OFF) 241 if(radio_status == FMRADIO_OFF)
263 return; 242 return;
264 243
265 radio_set(RADIO_MUTE, 1); 244 tuner_set(RADIO_MUTE, 1);
266 radio_set(RADIO_SLEEP, 1); /* low power mode, if available */ 245 tuner_set(RADIO_SLEEP, 1); /* low power mode, if available */
267 radio_status = FMRADIO_OFF; 246 radio_status = FMRADIO_OFF;
268 radio_power(false); /* status update, power off if avail. */ 247 tuner_power(false); /* status update, power off if avail. */
269} /* radio_stop */ 248} /* radio_stop */
270 249
271bool radio_hardware_present(void) 250bool radio_hardware_present(void)
272{ 251{
273#ifdef HAVE_TUNER_PWR_CTRL 252 return tuner_get(RADIO_PRESENT);
274 bool ret;
275 bool fmstatus = radio_power(true); /* power it up */
276 ret = radio_get(RADIO_PRESENT);
277 radio_power(fmstatus); /* restore previous state */
278 return ret;
279#else
280 return radio_get(RADIO_PRESENT);
281#endif
282} 253}
283 254
284/* Keep freq on the grid for the current region */ 255/* Keep freq on the grid for the current region */
285static int snap_freq_to_grid(int freq) 256static int snap_freq_to_grid(int freq)
286{ 257{
287 const struct fm_region_setting * const fmr = 258 const struct fm_region_data * const fmr =
288 &fm_region[global_settings.fm_region]; 259 &fm_region_data[global_settings.fm_region];
289 260
290 /* Range clamp if out of range or just round to nearest */ 261 /* Range clamp if out of range or just round to nearest */
291 if (freq < fmr->freq_min) 262 if (freq < fmr->freq_min)
@@ -346,9 +317,8 @@ static int find_closest_preset(int freq, int direction)
346 317
347static void remember_frequency(void) 318static void remember_frequency(void)
348{ 319{
349 const struct fm_region_setting * const fmr = 320 const struct fm_region_data * const fmr =
350 &fm_region[global_settings.fm_region]; 321 &fm_region_data[global_settings.fm_region];
351
352 global_status.last_frequency = (curr_freq - fmr->freq_min) 322 global_status.last_frequency = (curr_freq - fmr->freq_min)
353 / fmr->freq_step; 323 / fmr->freq_step;
354 status_save(); 324 status_save();
@@ -367,15 +337,15 @@ static void next_preset(int direction)
367 /* Must stay on the current grid for the region */ 337 /* Must stay on the current grid for the region */
368 curr_freq = snap_freq_to_grid(presets[curr_preset].frequency); 338 curr_freq = snap_freq_to_grid(presets[curr_preset].frequency);
369 339
370 radio_set(RADIO_FREQUENCY, curr_freq); 340 tuner_set(RADIO_FREQUENCY, curr_freq);
371 remember_frequency(); 341 remember_frequency();
372} 342}
373 343
374/* Step to the next or previous frequency */ 344/* Step to the next or previous frequency */
375static int step_freq(int freq, int direction) 345static int step_freq(int freq, int direction)
376{ 346{
377 const struct fm_region_setting * const fmr = 347 const struct fm_region_data * const fmr =
378 &fm_region[global_settings.fm_region]; 348 &fm_region_data[global_settings.fm_region];
379 349
380 freq += direction*fmr->freq_step; 350 freq += direction*fmr->freq_step;
381 351
@@ -402,12 +372,12 @@ static void next_station(int direction)
402 curr_freq = step_freq(curr_freq, direction); 372 curr_freq = step_freq(curr_freq, direction);
403 373
404 if (radio_status == FMRADIO_PLAYING) 374 if (radio_status == FMRADIO_PLAYING)
405 radio_set(RADIO_MUTE, 1); 375 tuner_set(RADIO_MUTE, 1);
406 376
407 radio_set(RADIO_FREQUENCY, curr_freq); 377 tuner_set(RADIO_FREQUENCY, curr_freq);
408 378
409 if (radio_status == FMRADIO_PLAYING) 379 if (radio_status == FMRADIO_PLAYING)
410 radio_set(RADIO_MUTE, 0); 380 tuner_set(RADIO_MUTE, 0);
411 381
412 curr_preset = find_preset(curr_freq); 382 curr_preset = find_preset(curr_freq);
413 remember_frequency(); 383 remember_frequency();
@@ -417,7 +387,7 @@ static void next_station(int direction)
417static void end_search(void) 387static void end_search(void)
418{ 388{
419 if (search_dir != 0 && radio_status == FMRADIO_PLAYING) 389 if (search_dir != 0 && radio_status == FMRADIO_PLAYING)
420 radio_set(RADIO_MUTE, 0); 390 tuner_set(RADIO_MUTE, 0);
421 search_dir = 0; 391 search_dir = 0;
422} 392}
423 393
@@ -540,7 +510,7 @@ int radio_screen(void)
540 curr_freq = step_freq(curr_freq, search_dir); 510 curr_freq = step_freq(curr_freq, search_dir);
541 update_screen = true; 511 update_screen = true;
542 512
543 if(radio_set(RADIO_SCAN_FREQUENCY, curr_freq)) 513 if(tuner_set(RADIO_SCAN_FREQUENCY, curr_freq))
544 { 514 {
545 curr_preset = find_preset(curr_freq); 515 curr_preset = find_preset(curr_freq);
546 remember_frequency(); 516 remember_frequency();
@@ -671,7 +641,7 @@ int radio_screen(void)
671 else if (dir == 0) 641 else if (dir == 0)
672 { 642 {
673 /* Starting auto scan */ 643 /* Starting auto scan */
674 radio_set(RADIO_MUTE, 1); 644 tuner_set(RADIO_MUTE, 1);
675 update_screen = true; 645 update_screen = true;
676 } 646 }
677 break; 647 break;
@@ -847,7 +817,7 @@ int radio_screen(void)
847 /* keep "mono" from always being displayed when paused */ 817 /* keep "mono" from always being displayed when paused */
848 if (radio_status != FMRADIO_PAUSED) 818 if (radio_status != FMRADIO_PAUSED)
849 { 819 {
850 stereo = radio_get(RADIO_STEREO) && 820 stereo = tuner_get(RADIO_STEREO) &&
851 !global_settings.fm_force_mono; 821 !global_settings.fm_force_mono;
852 822
853 if(stereo != last_stereo) 823 if(stereo != last_stereo)
@@ -1329,21 +1299,12 @@ static int handle_radio_presets(void)
1329 1299
1330void toggle_mono_mode(bool mono) 1300void toggle_mono_mode(bool mono)
1331{ 1301{
1332 radio_set(RADIO_FORCE_MONO, mono); 1302 tuner_set(RADIO_FORCE_MONO, mono);
1333} 1303}
1334 1304
1335void set_radio_region(int region) 1305void set_radio_region(int region)
1336{ 1306{
1337#if (CONFIG_TUNER & LV24020LP) 1307 tuner_set(RADIO_REGION, region);
1338 radio_set(RADIO_REGION, global_settings.fm_region);
1339#endif
1340#if (CONFIG_TUNER & TEA5767)
1341 radio_set(RADIO_SET_DEEMPHASIS,
1342 fm_region[region].deemphasis);
1343 radio_set(RADIO_SET_BAND, fm_region[region].band);
1344#else
1345 (void)region;
1346#endif
1347 next_station(0); 1308 next_station(0);
1348 remember_frequency(); 1309 remember_frequency();
1349} 1310}
@@ -1381,15 +1342,16 @@ static int scan_presets(void)
1381 1342
1382 if(do_scan) 1343 if(do_scan)
1383 { 1344 {
1384 const struct fm_region_setting * const fmr = 1345 const struct fm_region_data * const fmr =
1385 &fm_region[global_settings.fm_region]; 1346 &fm_region_data[global_settings.fm_region];
1347
1386 char buf[MAX_FMPRESET_LEN + 1]; 1348 char buf[MAX_FMPRESET_LEN + 1];
1387 int i; 1349 int i;
1388 1350
1389 curr_freq = fmr->freq_min; 1351 curr_freq = fmr->freq_min;
1390 num_presets = 0; 1352 num_presets = 0;
1391 memset(presets, 0, sizeof(presets)); 1353 memset(presets, 0, sizeof(presets));
1392 radio_set(RADIO_MUTE, 1); 1354 tuner_set(RADIO_MUTE, 1);
1393 1355
1394 while(curr_freq <= fmr->freq_max) 1356 while(curr_freq <= fmr->freq_max)
1395 { 1357 {
@@ -1404,7 +1366,7 @@ static int scan_presets(void)
1404 snprintf(buf, MAX_FMPRESET_LEN, str(LANG_FM_SCANNING), freq, frac); 1366 snprintf(buf, MAX_FMPRESET_LEN, str(LANG_FM_SCANNING), freq, frac);
1405 gui_syncsplash(0, buf); 1367 gui_syncsplash(0, buf);
1406 1368
1407 if(radio_set(RADIO_SCAN_FREQUENCY, curr_freq)) 1369 if(tuner_set(RADIO_SCAN_FREQUENCY, curr_freq))
1408 { 1370 {
1409 /* add preset */ 1371 /* add preset */
1410 snprintf(buf, MAX_FMPRESET_LEN, 1372 snprintf(buf, MAX_FMPRESET_LEN,
@@ -1418,7 +1380,7 @@ static int scan_presets(void)
1418 } 1380 }
1419 1381
1420 if (radio_status == FMRADIO_PLAYING) 1382 if (radio_status == FMRADIO_PLAYING)
1421 radio_set(RADIO_MUTE, 0); 1383 tuner_set(RADIO_MUTE, 0);
1422 1384
1423 presets_changed = true; 1385 presets_changed = true;
1424 1386
diff --git a/apps/recorder/radio.h b/apps/recorder/radio.h
index f04c14d6d3..c456d3a6a3 100644
--- a/apps/recorder/radio.h
+++ b/apps/recorder/radio.h
@@ -44,23 +44,6 @@ struct fmstation
44 char name[MAX_FMPRESET_LEN+1]; 44 char name[MAX_FMPRESET_LEN+1];
45}; 45};
46 46
47struct fm_region_setting 47#endif /* CONFIG_TUNER */
48{
49 int freq_min;
50 int freq_max;
51 int freq_step;
52#if (CONFIG_TUNER & TEA5767)
53 char deemphasis; /* 0: 50us, 1: 75us */
54 char band; /* 0: europe, 1: japan (BL in TEA spec)*/
55 /* Note: "region" parameter is just for display atm and is not compiled. */
56 #define FM_REGION_ENTRY(region, fmin, fmax, fstep, deemph, band) \
57 { fmin, fmax, fstep, deemph, band }
58#else
59 #define FM_REGION_ENTRY(region, fmin, fmax, fstep, deemph, band) \
60 { fmin, fmax, fstep }
61#endif
62};
63 48
64#endif 49#endif /* RADIO_H */
65
66#endif