22 |
22 |
23 #ifdef BUILD_WIN32 |
23 #ifdef BUILD_WIN32 |
24 # include <QSettings> |
24 # include <QSettings> |
25 #else |
25 #else |
26 # include <qsysteminfo.h> |
26 # include <qsysteminfo.h> |
|
27 # include <XQSettingsManager> |
27 using namespace QtMobility; |
28 using namespace QtMobility; |
28 #endif // WIN32_BUILD |
29 #endif // WIN32_BUILD |
29 |
30 |
30 // User includes |
31 // User includes |
31 #include "radiouiengine.h" |
32 #include "radiouiengine.h" |
32 #include "radiouiengine_p.h" |
33 #include "radiouiengine_p.h" |
33 #include "radiologger.h" |
34 #include "radiologger.h" |
34 #include "radioenginewrapper.h" |
35 #include "radioenginewrapper.h" |
35 #include "radiostationmodel.h" |
36 #include "radiostationmodel.h" |
36 #include "radiohistorymodel.h" |
37 #include "radiohistorymodel.h" |
|
38 #include "radiocarouselmodel.h" |
|
39 #include "radiohistoryitem.h" |
37 #include "radiosettings.h" |
40 #include "radiosettings.h" |
38 #include "radiostationfiltermodel.h" |
41 #include "radiostationfiltermodel.h" |
39 #include "radioscannerengine.h" |
42 #include "radioscannerengine.h" |
40 #ifdef BUILD_WIN32 |
|
41 # include "radiomonitorservice_win32.h" |
|
42 #else |
|
43 # include "radiomonitorservice.h" |
|
44 #endif |
|
45 |
43 |
46 // Constants |
44 // Constants |
47 const QString KPathFormatter = "%1:%2%3"; |
45 const QString KPathFormatter = "%1:%2%3"; |
48 const QString KApplicationDir = "\\sys\\bin\\"; |
46 const QString KApplicationDir = "\\sys\\bin\\"; |
49 const QString KSongRecognitionApp = "Shazam_0x200265B3.exe"; |
47 const QString KSongRecognitionApp = "Shazam_0x200265B3.exe"; |
50 const QString KSongRecognitionAppParams = "-listen"; |
48 const QString KSongRecognitionAppParams = "-listen"; |
51 |
49 |
|
50 const uint DEFAULT_MIN_FREQUENCY = 87500000; |
|
51 const uint RADIO_CENREP_UID = 0x101FF976; |
|
52 const uint RADIO_CENREP_FREQUENCY_KEY = 0x00000107; |
|
53 |
52 struct GenreStruct |
54 struct GenreStruct |
53 { |
55 { |
54 int mGenreCode; |
56 int mGenreCode; |
55 const char* mInCarousel; |
57 const char* mInCarousel; |
56 const char* mInStationsList; |
58 const char* mInStationsList; |
57 const char* mInHomeScreen; |
59 const char* mInHomeScreen; |
58 }; |
60 }; |
59 |
61 |
60 const GenreStruct EuropeanGenres[] = |
62 const GenreStruct EuropeanGenres[] = |
61 { |
63 { |
62 { GenreEurope::RdsNone, "", "", "" } |
64 { GenreEurope::RdsNone, "", "", "" } |
63 ,{ GenreEurope::RdsNews, "txt_rad_info_news", "txt_rad_dblist_l1_mhz_val_news", "txt_rad_info_news_hs" } |
65 ,{ GenreEurope::RdsNews, "txt_rad_info_news", "txt_rad_dblist_l1_mhz_val_news", "txt_rad_info_news_hs" } |
64 ,{ GenreEurope::RdsCurrentAffairs, "txt_rad_info_current_affairs", "txt_rad_dblist_l1_mhz_val_current_affairs", "txt_rad_info_current_affairs_hs" } |
66 ,{ GenreEurope::RdsCurrentAffairs, "txt_rad_info_current_affairs", "txt_rad_dblist_l1_mhz_val_current_affairs", "txt_rad_info_current_affairs_hs" } |
65 ,{ GenreEurope::RdsInformation, "txt_rad_info_information", "txt_rad_dblist_l1_mhz_val_information", "txt_rad_info_information_hs" } |
67 ,{ GenreEurope::RdsInformation, "txt_rad_info_information", "txt_rad_dblist_l1_mhz_val_information", "txt_rad_info_information_hs" } |
66 ,{ GenreEurope::RdsSport, "txt_rad_info_sport", "txt_rad_dblist_l1_mhz_val_sport", "txt_rad_info_sport_hs" } |
68 ,{ GenreEurope::RdsSport, "txt_rad_info_sport", "txt_rad_dblist_l1_mhz_val_sport", "txt_rad_info_sport_hs" } |
89 ,{ GenreEurope::RdsOldiesMusic, "txt_rad_info_oldies_music", "txt_rad_dblist_l1_mhz_val_oldies_music", "txt_rad_info_oldies_music_hs" } |
91 ,{ GenreEurope::RdsOldiesMusic, "txt_rad_info_oldies_music", "txt_rad_dblist_l1_mhz_val_oldies_music", "txt_rad_info_oldies_music_hs" } |
90 ,{ GenreEurope::RdsFolkMusic, "txt_rad_info_folk_music", "txt_rad_dblist_l1_mhz_val_folk_music", "txt_rad_info_folk_music_hs" } |
92 ,{ GenreEurope::RdsFolkMusic, "txt_rad_info_folk_music", "txt_rad_dblist_l1_mhz_val_folk_music", "txt_rad_info_folk_music_hs" } |
91 ,{ GenreEurope::RdsDocumentary, "txt_rad_info_documentary", "txt_rad_dblist_l1_mhz_val_documentary", "txt_rad_info_documentary_hs" } |
93 ,{ GenreEurope::RdsDocumentary, "txt_rad_info_documentary", "txt_rad_dblist_l1_mhz_val_documentary", "txt_rad_info_documentary_hs" } |
92 ,{ GenreEurope::RdsAlarmTest, "txt_rad_info_alarm_test", "txt_rad_dblist_l1_mhz_val_alarm_test", "txt_rad_info_alarm_test_hs" } |
94 ,{ GenreEurope::RdsAlarmTest, "txt_rad_info_alarm_test", "txt_rad_dblist_l1_mhz_val_alarm_test", "txt_rad_info_alarm_test_hs" } |
93 ,{ GenreEurope::RdsAlarm, "txt_rad_info_alarm", "txt_rad_dblist_l1_mhz_val_alarm", "txt_rad_info_alarm_hs" } |
95 ,{ GenreEurope::RdsAlarm, "txt_rad_info_alarm", "txt_rad_dblist_l1_mhz_val_alarm", "txt_rad_info_alarm_hs" } |
94 }; |
96 }; |
95 const int EuropeanGenresCount = sizeof( EuropeanGenres ) / sizeof ( EuropeanGenres[0] ); |
97 const int EuropeanGenresCount = sizeof( EuropeanGenres ) / sizeof ( EuropeanGenres[0] ); |
96 |
98 |
97 const GenreStruct AmericanGenres[] = |
99 const GenreStruct AmericanGenres[] = |
98 { |
100 { |
99 { GenreAmerica::RbdsNone, "", "", "" } |
101 { GenreAmerica::RbdsNone, "", "", "" } |
100 ,{ GenreAmerica::RbdsNews, "txt_rad_info_news", "txt_rad_dblist_l1_mhz_val_news", "txt_rad_info_news_hs" } |
102 ,{ GenreAmerica::RbdsNews, "txt_rad_info_news", "txt_rad_dblist_l1_mhz_val_news", "txt_rad_info_news_hs" } |
101 ,{ GenreAmerica::RbdsInformation, "txt_rad_info_information", "txt_rad_dblist_l1_mhz_val_information", "txt_rad_info_information_hs" } |
103 ,{ GenreAmerica::RbdsInformation, "txt_rad_info_information", "txt_rad_dblist_l1_mhz_val_information", "txt_rad_info_information_hs" } |
102 ,{ GenreAmerica::RbdsSports, "txt_rad_info_sport", "txt_rad_dblist_l1_mhz_val_sport", "txt_rad_info_sport_hs" } |
104 ,{ GenreAmerica::RbdsSports, "txt_rad_info_sport", "txt_rad_dblist_l1_mhz_val_sport", "txt_rad_info_sport_hs" } |
103 ,{ GenreAmerica::RbdsTalk, "txt_rad_info_talk", "txt_rad_dblist_l1_mhz_val_talk", "txt_rad_info_talk_hs" } |
105 ,{ GenreAmerica::RbdsTalk, "txt_rad_info_talk", "txt_rad_dblist_l1_mhz_val_talk", "txt_rad_info_talk_hs" } |
126 ,{ GenreAmerica::RbdsUnassigned4, "", "", "" } |
128 ,{ GenreAmerica::RbdsUnassigned4, "", "", "" } |
127 ,{ GenreAmerica::RbdsUnassigned5, "", "", "" } |
129 ,{ GenreAmerica::RbdsUnassigned5, "", "", "" } |
128 ,{ GenreAmerica::RbdsWeather, "txt_rad_info_weather", "txt_rad_dblist_l1_mhz_val_weather", "txt_rad_info_weather_hs" }//TODO: Check |
130 ,{ GenreAmerica::RbdsWeather, "txt_rad_info_weather", "txt_rad_dblist_l1_mhz_val_weather", "txt_rad_info_weather_hs" }//TODO: Check |
129 ,{ GenreAmerica::RbdsEmergencyTest, "txt_rad_info_alarm_test", "txt_rad_dblist_l1_mhz_val_alarm_test", "txt_rad_info_alarm_test_hs" }//TODO: Check |
131 ,{ GenreAmerica::RbdsEmergencyTest, "txt_rad_info_alarm_test", "txt_rad_dblist_l1_mhz_val_alarm_test", "txt_rad_info_alarm_test_hs" }//TODO: Check |
130 ,{ GenreAmerica::RbdsEmergency, "txt_rad_info_alarm", "txt_rad_dblist_l1_mhz_val_alarm", "txt_rad_info_alarm_hs" }//TODO: Check |
132 ,{ GenreAmerica::RbdsEmergency, "txt_rad_info_alarm", "txt_rad_dblist_l1_mhz_val_alarm", "txt_rad_info_alarm_hs" }//TODO: Check |
131 }; |
133 }; |
132 const int AmericanGenresCount = sizeof( AmericanGenres ) / sizeof ( AmericanGenres[0] ); |
134 const int AmericanGenresCount = sizeof( AmericanGenres ) / sizeof ( AmericanGenres[0] ); |
133 |
135 |
134 /*! |
136 /*! |
135 * |
137 * |
136 */ |
138 */ |
152 } |
154 } |
153 |
155 |
154 /*! |
156 /*! |
155 * |
157 * |
156 */ |
158 */ |
|
159 uint RadioUiEngine::lastTunedFrequency() |
|
160 { |
|
161 uint frequency = DEFAULT_MIN_FREQUENCY; |
|
162 |
|
163 #ifdef BUILD_WIN32 |
|
164 QScopedPointer<QSettings> settings( new QSettings( "Nokia", "QtFmRadio" ) ); |
|
165 frequency = settings->value( "CurrentFreq", DEFAULT_MIN_FREQUENCY ).toUInt(); |
|
166 if ( frequency == 0 ) { |
|
167 frequency = DEFAULT_MIN_FREQUENCY; |
|
168 } |
|
169 #else |
|
170 QScopedPointer<XQSettingsManager> settings( new XQSettingsManager() ); |
|
171 XQSettingsKey key( XQSettingsKey::TargetCentralRepository, RADIO_CENREP_UID, RADIO_CENREP_FREQUENCY_KEY ); |
|
172 frequency = settings->readItemValue( key, XQSettingsManager::TypeInt ).toUInt(); |
|
173 #endif |
|
174 |
|
175 return frequency; |
|
176 } |
|
177 |
|
178 /*! |
|
179 * |
|
180 */ |
157 RadioUiEngine::RadioUiEngine( QObject* parent ) : |
181 RadioUiEngine::RadioUiEngine( QObject* parent ) : |
158 QObject( parent ), |
182 QObject( parent ), |
159 d_ptr( new RadioUiEnginePrivate( this ) ) |
183 d_ptr( new RadioUiEnginePrivate( this ) ) |
160 { |
184 { |
161 } |
185 } |
208 * Returns the history model |
241 * Returns the history model |
209 */ |
242 */ |
210 RadioHistoryModel& RadioUiEngine::historyModel() |
243 RadioHistoryModel& RadioUiEngine::historyModel() |
211 { |
244 { |
212 Q_D( RadioUiEngine ); |
245 Q_D( RadioUiEngine ); |
213 if ( !d->mHistoryModel ) { |
|
214 d->mHistoryModel = new RadioHistoryModel( *this ); |
|
215 } |
|
216 |
|
217 return *d->mHistoryModel; |
246 return *d->mHistoryModel; |
218 } |
247 } |
219 |
248 |
220 /*! |
249 /*! |
221 * Returns the stations list |
250 * Creates a new filter model |
222 */ |
251 */ |
223 RadioStationFilterModel* RadioUiEngine::createNewFilterModel( QObject* parent ) |
252 RadioStationFilterModel* RadioUiEngine::createNewFilterModel( QObject* parent ) |
224 { |
253 { |
225 return new RadioStationFilterModel( *this, parent ); |
254 return new RadioStationFilterModel( *this, parent ); |
226 } |
255 } |
227 |
256 |
228 /*! |
257 /*! |
229 * |
258 * Creates a new carousel model |
230 */ |
259 */ |
231 RadioScannerEngine* RadioUiEngine::createScannerEngine() |
260 RadioCarouselModel* RadioUiEngine::carouselModel() |
232 { |
261 { |
233 Q_D( RadioUiEngine ); |
262 Q_D( RadioUiEngine ); |
234 if ( d->mScannerEngine.isNull() ) { |
263 if ( !d->mCarouselModel ) { |
|
264 d->mCarouselModel.reset( new RadioCarouselModel( *this, *d->mStationModel ) ); |
|
265 } |
|
266 |
|
267 return d->mCarouselModel.data(); |
|
268 } |
|
269 |
|
270 /*! |
|
271 * |
|
272 */ |
|
273 RadioScannerEngine* RadioUiEngine::scannerEngine() |
|
274 { |
|
275 Q_D( RadioUiEngine ); |
|
276 if ( !d->mScannerEngine ) { |
235 d->mScannerEngine = new RadioScannerEngine( *d ); |
277 d->mScannerEngine = new RadioScannerEngine( *d ); |
236 } |
278 } |
237 return d->mScannerEngine; |
279 return d->mScannerEngine; |
238 } |
280 } |
239 |
281 |
240 /*! |
282 /*! |
241 * Returns the stations list |
|
242 */ |
|
243 RadioMonitorService& RadioUiEngine::monitor() |
|
244 { |
|
245 Q_D( const RadioUiEngine ); |
|
246 return *d->mMonitorService; |
|
247 } |
|
248 |
|
249 /*! |
|
250 * |
283 * |
251 */ |
284 */ |
252 bool RadioUiEngine::isRadioOn() const |
285 bool RadioUiEngine::isRadioOn() const |
253 { |
286 { |
254 Q_D( const RadioUiEngine ); |
287 Q_D( const RadioUiEngine ); |
407 Q_D( RadioUiEngine ); |
452 Q_D( RadioUiEngine ); |
408 d->mHistoryModel->addItem( artist, title, station ); |
453 d->mHistoryModel->addItem( artist, title, station ); |
409 } |
454 } |
410 |
455 |
411 /*! |
456 /*! |
|
457 * |
|
458 */ |
|
459 uint RadioUiEngine::skipStation( StationSkip::Mode mode, uint startFrequency ) |
|
460 { |
|
461 Q_D( RadioUiEngine ); |
|
462 return d->skip( mode, startFrequency ); |
|
463 } |
|
464 |
|
465 /*! |
|
466 * |
|
467 */ |
|
468 void RadioUiEngine::openMusicStore( const RadioHistoryItem& item, MusicStore store ) |
|
469 { |
|
470 Q_UNUSED( item ); |
|
471 Q_UNUSED( store ); |
|
472 //TODO: Integrate to music store |
|
473 } |
|
474 |
|
475 /*! |
412 * Public slot |
476 * Public slot |
413 * Tunes to the given frequency |
477 * Tunes to the given frequency |
414 */ |
478 */ |
415 void RadioUiEngine::tuneFrequency( uint frequency, const int sender ) |
479 void RadioUiEngine::tuneFrequency( uint frequency, const int reason ) |
416 { |
480 { |
417 Q_D( RadioUiEngine ); |
481 Q_D( RadioUiEngine ); |
418 if ( frequency != d->mStationModel->currentStation().frequency() && d->mEngineWrapper->isFrequencyValid( frequency ) ) { |
482 if ( frequency != d->mStationModel->currentStation().frequency() && d->mEngineWrapper->isFrequencyValid( frequency ) ) { |
419 LOG_FORMAT( "RadioUiEngine::tuneFrequency, frequency: %d", frequency ); |
483 LOG_FORMAT( "RadioUiEngine::tuneFrequency, frequency: %d", frequency ); |
420 d->cancelSeeking(); |
484 d->cancelSeeking(); |
421 d->mEngineWrapper->tuneFrequency( frequency, sender ); |
485 d->mEngineWrapper->tuneFrequency( frequency, reason ); |
422 } |
486 } |
423 } |
487 } |
424 |
488 |
425 /*! |
489 /*! |
426 * Public slot |
490 * Public slot |
427 * Tunes to the given frequency after a delay |
491 * Tunes to the given frequency after a delay |
428 */ |
492 */ |
429 void RadioUiEngine::tuneWithDelay( uint frequency, const int sender ) |
493 void RadioUiEngine::tuneWithDelay( uint frequency, const int reason ) |
430 { |
494 { |
431 Q_D( RadioUiEngine ); |
495 Q_D( RadioUiEngine ); |
432 if ( frequency != d->mStationModel->currentStation().frequency() && d->mEngineWrapper->isFrequencyValid( frequency ) ) { |
496 if ( frequency != d->mStationModel->currentStation().frequency() && d->mEngineWrapper->isFrequencyValid( frequency ) ) { |
433 LOG_FORMAT( "RadioEngineWrapperPrivate::tuneWithDelay, frequency: %d", frequency ); |
497 LOG_FORMAT( "RadioEngineWrapperPrivate::tuneWithDelay, frequency: %d", frequency ); |
434 d->cancelSeeking(); |
498 d->cancelSeeking(); |
435 d->mEngineWrapper->tuneWithDelay( frequency, sender ); |
499 d->mEngineWrapper->tuneWithDelay( frequency, reason ); |
436 } |
500 } |
437 } |
501 } |
438 |
502 |
439 /*! |
503 /*! |
440 * Public slot |
504 * Public slot |
486 |
552 |
487 /*! |
553 /*! |
488 * Public slot |
554 * Public slot |
489 * |
555 * |
490 */ |
556 */ |
491 void RadioUiEngine::skipPrevious() |
557 void RadioUiEngine::seekStation( int seekDirection ) |
492 { |
|
493 Q_D( RadioUiEngine ); |
|
494 d->skip( RadioUiEnginePrivate::Previous ); |
|
495 } |
|
496 |
|
497 /*! |
|
498 * Public slot |
|
499 * |
|
500 */ |
|
501 void RadioUiEngine::skipNext() |
|
502 { |
|
503 Q_D( RadioUiEngine ); |
|
504 d->skip( RadioUiEnginePrivate::Next ); |
|
505 } |
|
506 |
|
507 /*! |
|
508 * Public slot |
|
509 * |
|
510 */ |
|
511 void RadioUiEngine::seekUp() |
|
512 { |
558 { |
513 if ( isAntennaAttached() ) { |
559 if ( isAntennaAttached() ) { |
514 Q_D( RadioUiEngine ); |
560 Q_D( RadioUiEngine ); |
515 emitSeekingStarted( Seeking::Up ); |
561 Seeking::Direction direction = static_cast<Seeking::Direction>( seekDirection ); |
516 d->mEngineWrapper->startSeeking( Seeking::Up, TuneReason::Seek ); |
562 emitSeekingStarted( direction ); |
517 } |
563 d->mEngineWrapper->startSeeking( direction, TuneReason::Seek ); |
518 } |
|
519 |
|
520 /*! |
|
521 * Public slot |
|
522 * |
|
523 */ |
|
524 void RadioUiEngine::seekDown() |
|
525 { |
|
526 if ( isAntennaAttached() ) { |
|
527 Q_D( RadioUiEngine ); |
|
528 emitSeekingStarted( Seeking::Down ); |
|
529 d->mEngineWrapper->startSeeking( Seeking::Down, TuneReason::Seek ); |
|
530 } |
564 } |
531 } |
565 } |
532 |
566 |
533 /*! |
567 /*! |
534 * Public slot |
568 * Public slot |