17 |
17 |
18 // System includes |
18 // System includes |
19 #include <QScopedPointer> |
19 #include <QScopedPointer> |
20 #include <QProcess> |
20 #include <QProcess> |
21 #include <QFile> |
21 #include <QFile> |
|
22 #include <QTimer> |
|
23 #include <QDesktopServices> |
|
24 #include <QUrl> |
22 |
25 |
23 #ifdef BUILD_WIN32 |
26 #ifdef BUILD_WIN32 |
24 # include <QSettings> |
27 # include <QSettings> |
25 #else |
28 #else |
26 # include <qsysteminfo.h> |
|
27 # include <XQSettingsManager> |
29 # include <XQSettingsManager> |
28 using namespace QtMobility; |
|
29 #endif // WIN32_BUILD |
30 #endif // WIN32_BUILD |
30 |
31 |
31 // User includes |
32 // User includes |
32 #include "radiouiengine.h" |
33 #include "radiouiengine.h" |
33 #include "radiouiengine_p.h" |
34 #include "radiouiengine_p.h" |
34 #include "radiologger.h" |
|
35 #include "radioenginewrapper.h" |
35 #include "radioenginewrapper.h" |
36 #include "radiostationmodel.h" |
36 #include "radiostationmodel.h" |
37 #include "radiohistorymodel.h" |
37 #include "radiohistorymodel.h" |
38 #include "radiocarouselmodel.h" |
|
39 #include "radiohistoryitem.h" |
38 #include "radiohistoryitem.h" |
40 #include "radiosettings.h" |
39 #include "radiosettings.h" |
41 #include "radiostationfiltermodel.h" |
|
42 #include "radioscannerengine.h" |
40 #include "radioscannerengine.h" |
|
41 #include "radiogenrelocalizer.h" |
|
42 #include "radiologger.h" |
43 |
43 |
44 // Constants |
44 // Constants |
45 const QString KPathFormatter = "%1:%2%3"; |
45 const uint RADIO_CENREP_UID = 0x2002FF52; |
46 const QString KApplicationDir = "\\sys\\bin\\"; |
46 const uint RADIO_CENREP_FREQUENCY_KEY = 0x207; |
47 const QString KSongRecognitionApp = "Shazam_0x200265B3.exe"; |
47 const uint RADIO_CENREP_HEADSET_VOLUME = 0x200; |
48 const QString KSongRecognitionAppParams = "-listen"; |
48 |
49 |
49 const QLatin1String OVI_STORE_URL( "http://www.music.nokia.co.uk/Touch/Search.aspx?artistsearch=#artist#&titlesearch=#title#" ); |
50 const uint DEFAULT_MIN_FREQUENCY = 87500000; |
50 const QLatin1String OTHER_STORE_URL( "http://www.amazon.com/gp/search/ref=sr_adv_m_digital/?search-alias=digital-music&field-author=#artist#&field-title=#title#" ); |
51 const uint RADIO_CENREP_UID = 0x101FF976; |
51 const QLatin1String OTHER_STORE_ARTIST_TAG( "#artist#" ); |
52 const uint RADIO_CENREP_FREQUENCY_KEY = 0x00000107; |
52 const QLatin1String OTHER_STORE_TITLE_TAG( "#title#" ); |
53 |
53 const char WHITESPACE = ' '; |
54 struct GenreStruct |
54 const char WHITESPACE_REPLACEMENT = '+'; |
55 { |
55 |
56 int mGenreCode; |
56 // Constants used when launching radio server |
57 const char* mInCarousel; |
57 const QLatin1String RADIO_SERVER_NAME( "radioserver.exe" ); |
58 const char* mInStationsList; |
58 const QLatin1String RADIO_RANGE_USEURO( "useuro" ); |
59 const char* mInHomeScreen; |
59 const QLatin1String RADIO_RANGE_JAPAN( "japan" ); |
60 }; |
60 |
61 |
61 // ====== STATIC FUNCTIONS ======== |
62 const GenreStruct EuropeanGenres[] = |
62 |
63 { |
63 /*! |
64 { GenreEurope::RdsNone, "", "", "" } |
64 * Gets the last tuned frequency from central repository |
65 ,{ GenreEurope::RdsNews, "txt_rad_info_news", "txt_rad_dblist_l1_mhz_val_news", "txt_rad_info_news_hs" } |
65 */ |
66 ,{ GenreEurope::RdsCurrentAffairs, "txt_rad_info_current_affairs", "txt_rad_dblist_l1_mhz_val_current_affairs", "txt_rad_info_current_affairs_hs" } |
66 uint RadioUiEngine::lastTunedFrequency( uint defaultFrequency ) |
67 ,{ GenreEurope::RdsInformation, "txt_rad_info_information", "txt_rad_dblist_l1_mhz_val_information", "txt_rad_info_information_hs" } |
67 { |
68 ,{ GenreEurope::RdsSport, "txt_rad_info_sport", "txt_rad_dblist_l1_mhz_val_sport", "txt_rad_info_sport_hs" } |
68 uint frequency = defaultFrequency; |
69 ,{ GenreEurope::RdsEducation, "txt_rad_info_education", "txt_rad_dblist_l1_mhz_val_education", "txt_rad_info_education_hs" } |
|
70 ,{ GenreEurope::RdsDrama, "txt_rad_info_drama", "txt_rad_dblist_l1_mhz_val_drama", "txt_rad_info_drama_hs" } |
|
71 ,{ GenreEurope::RdsCulture, "txt_rad_info_culture", "txt_rad_dblist_l1_mhz_val_culture", "txt_rad_info_culture_hs" } |
|
72 ,{ GenreEurope::RdsScience, "txt_rad_info_science", "txt_rad_dblist_l1_mhz_val_science", "txt_rad_info_science_hs" } |
|
73 ,{ GenreEurope::RdsVariedSpeech, "txt_rad_info_varied", "txt_rad_dblist_l1_mhz_val_varied", "txt_rad_info_varied_hs" } |
|
74 ,{ GenreEurope::RdsPopMusic, "txt_rad_info_pop_music", "txt_rad_dblist_l1_mhz_val_pop_music", "txt_rad_info_pop_music_hs" } |
|
75 ,{ GenreEurope::RdsRockMusic, "txt_rad_info_rock_music", "txt_rad_dblist_l1_mhz_val_rock_music", "txt_rad_info_rock_music_hs" } |
|
76 ,{ GenreEurope::RdsEasyListening, "txt_rad_info_easy_listening", "txt_rad_dblist_l1_mhz_val_easy_listening", "txt_rad_info_easy_listening_hs" } |
|
77 ,{ GenreEurope::RdsLightClassical, "txt_rad_info_light_classical", "txt_rad_dblist_l1_mhz_val_light_classical", "txt_rad_info_light_classical_hs" } |
|
78 ,{ GenreEurope::RdsSeriousClassical, "txt_rad_info_serious_classical", "txt_rad_dblist_l1_mhz_val_serious_classical", "txt_rad_info_serious_classical_hs" } |
|
79 ,{ GenreEurope::RdsOtherMusic, "txt_rad_info_other_music", "txt_rad_dblist_l1_mhz_val_other_music", "txt_rad_info_other_music_hs" } |
|
80 ,{ GenreEurope::RdsWeather, "txt_rad_info_weather", "txt_rad_dblist_l1_mhz_val_weather", "txt_rad_info_weather_hs" } |
|
81 ,{ GenreEurope::RdsFinance, "txt_rad_info_finance", "txt_rad_dblist_l1_mhz_val_finance", "txt_rad_info_finance_hs" } |
|
82 ,{ GenreEurope::RdsChildrensProgrammes, "txt_rad_info_childrens_programmes", "txt_rad_dblist_l1_mhz_val_childrens_programmes", "txt_rad_info_childrens_programmes_hs" } |
|
83 ,{ GenreEurope::RdsSocialAffairs, "txt_rad_info_social_affairs", "txt_rad_dblist_l1_mhz_val_social_affairs", "txt_rad_info_social_affairs_hs" } |
|
84 ,{ GenreEurope::RdsReligion, "txt_rad_info_religion", "txt_rad_dblist_l1_mhz_val_religion", "txt_rad_info_religion_hs" } |
|
85 ,{ GenreEurope::RdsPhoneIn, "txt_rad_info_phone_in", "txt_rad_dblist_l1_mhz_val_phone_in", "txt_rad_info_phone_in_hs" } |
|
86 ,{ GenreEurope::RdsTravel, "txt_rad_info_travel", "txt_rad_dblist_l1_mhz_val_travel", "txt_rad_info_travel_hs" } |
|
87 ,{ GenreEurope::RdsLeisure, "txt_rad_info_leisure", "txt_rad_dblist_l1_mhz_val_leisure", "txt_rad_info_leisure_hs" } |
|
88 ,{ GenreEurope::RdsJazzMusic, "txt_rad_info_jazz_music", "txt_rad_dblist_l1_mhz_val_jazz_music", "txt_rad_info_jazz_music_hs" } |
|
89 ,{ GenreEurope::RdsCountryMusic, "txt_rad_info_country_music", "txt_rad_dblist_l1_mhz_val_country_music", "txt_rad_info_country_music_hs" } |
|
90 ,{ GenreEurope::RdsNationalMusic, "txt_rad_info_national_music", "txt_rad_dblist_l1_mhz_val_national_music", "txt_rad_info_national_music_hs" } |
|
91 ,{ GenreEurope::RdsOldiesMusic, "txt_rad_info_oldies_music", "txt_rad_dblist_l1_mhz_val_oldies_music", "txt_rad_info_oldies_music_hs" } |
|
92 ,{ GenreEurope::RdsFolkMusic, "txt_rad_info_folk_music", "txt_rad_dblist_l1_mhz_val_folk_music", "txt_rad_info_folk_music_hs" } |
|
93 ,{ GenreEurope::RdsDocumentary, "txt_rad_info_documentary", "txt_rad_dblist_l1_mhz_val_documentary", "txt_rad_info_documentary_hs" } |
|
94 ,{ GenreEurope::RdsAlarmTest, "txt_rad_info_alarm_test", "txt_rad_dblist_l1_mhz_val_alarm_test", "txt_rad_info_alarm_test_hs" } |
|
95 ,{ GenreEurope::RdsAlarm, "txt_rad_info_alarm", "txt_rad_dblist_l1_mhz_val_alarm", "txt_rad_info_alarm_hs" } |
|
96 }; |
|
97 const int EuropeanGenresCount = sizeof( EuropeanGenres ) / sizeof ( EuropeanGenres[0] ); |
|
98 |
|
99 const GenreStruct AmericanGenres[] = |
|
100 { |
|
101 { GenreAmerica::RbdsNone, "", "", "" } |
|
102 ,{ GenreAmerica::RbdsNews, "txt_rad_info_news", "txt_rad_dblist_l1_mhz_val_news", "txt_rad_info_news_hs" } |
|
103 ,{ GenreAmerica::RbdsInformation, "txt_rad_info_information", "txt_rad_dblist_l1_mhz_val_information", "txt_rad_info_information_hs" } |
|
104 ,{ GenreAmerica::RbdsSports, "txt_rad_info_sport", "txt_rad_dblist_l1_mhz_val_sport", "txt_rad_info_sport_hs" } |
|
105 ,{ GenreAmerica::RbdsTalk, "txt_rad_info_talk", "txt_rad_dblist_l1_mhz_val_talk", "txt_rad_info_talk_hs" } |
|
106 ,{ GenreAmerica::RbdsRock, "txt_rad_info_rock_music", "txt_rad_dblist_l1_mhz_val_rock_music", "txt_rad_info_rock_music_hs" } //TODO: Check |
|
107 ,{ GenreAmerica::RbdsClassicRock, "txt_rad_info_classic_rock", "txt_rad_dblist_l1_mhz_val_classic_rock", "txt_rad_info_classic_rock_hs" } |
|
108 ,{ GenreAmerica::RbdsAdultHits, "txt_rad_info_adult_hits", "txt_rad_dblist_l1_mhz_val_adult_hits", "txt_rad_info_adult_hits_hs" } |
|
109 ,{ GenreAmerica::RbdsSoftRock, "txt_rad_info_soft_rock", "txt_rad_dblist_l1_mhz_val_soft_rock", "txt_rad_info_soft_rock_hs" } |
|
110 ,{ GenreAmerica::RbdsTop40, "txt_rad_info_top_40", "txt_rad_dblist_l1_mhz_val_top_40", "txt_rad_info_top_40_hs" } |
|
111 ,{ GenreAmerica::RbdsCountry, "txt_rad_info_country_music", "txt_rad_dblist_l1_mhz_val_country_music", "txt_rad_info_country_music_hs" } //TODO: Check |
|
112 ,{ GenreAmerica::RbdsOldies, "txt_rad_info_oldies_music", "txt_rad_dblist_l1_mhz_val_oldies_music", "txt_rad_info_oldies_music_hs" } //TODO: Check |
|
113 ,{ GenreAmerica::RbdsSoft, "txt_rad_info_soft", "txt_rad_dblist_l1_mhz_val_soft", "txt_rad_info_soft_hs" } |
|
114 ,{ GenreAmerica::RbdsNostalgia, "txt_rad_info_nostalgia", "txt_rad_dblist_l1_mhz_val_nostalgia", "txt_rad_info_nostalgia_hs" } |
|
115 ,{ GenreAmerica::RbdsJazz, "txt_rad_info_jazz_music", "txt_rad_dblist_l1_mhz_val_jazz_music", "txt_rad_info_jazz_music_hs" } //TODO: Check |
|
116 ,{ GenreAmerica::RbdsClassical, "txt_rad_info_classical", "txt_rad_dblist_l1_mhz_val_classical", "txt_rad_info_classical_hs" } |
|
117 ,{ GenreAmerica::RbdsRhythmAndBlues, "txt_rad_info_rhythm_and_blues", "txt_rad_dblist_l1_mhz_val_rhythm_and_blues", "txt_rad_info_rhythm_and_blues_hs" } |
|
118 ,{ GenreAmerica::RbdsSoftRhythmAndBlues, "txt_rad_info_soft_rhythm_and_blues", "txt_rad_dblist_l1_mhz_val_soft_rhythm_and_blues", "txt_rad_info_soft_rhythm_and_blues_hs" } |
|
119 ,{ GenreAmerica::RbdsLanguage, "txt_rad_info_language", "txt_rad_dblist_l1_mhz_val_language", "txt_rad_info_language_hs" } |
|
120 ,{ GenreAmerica::RbdsReligiousMusic, "txt_rad_info_religious_music", "txt_rad_dblist_l1_mhz_val_religious_music", "txt_rad_info_religious_music_hs" } |
|
121 ,{ GenreAmerica::RbdsReligiousTalk, "txt_rad_info_religious_talk", "txt_rad_dblist_l1_mhz_val_religious_talk", "txt_rad_info_religious_talk_hs" } |
|
122 ,{ GenreAmerica::RbdsPersonality, "txt_rad_info_personality", "txt_rad_dblist_l1_mhz_val_personality", "txt_rad_info_personality_hs" } |
|
123 ,{ GenreAmerica::RbdsPublic, "txt_rad_info_public", "txt_rad_dblist_l1_mhz_val_public", "txt_rad_info_public_hs" } |
|
124 ,{ GenreAmerica::RbdsCollege, "txt_rad_info_college", "txt_rad_dblist_l1_mhz_val_college", "txt_rad_info_college_hs" } |
|
125 ,{ GenreAmerica::RbdsUnassigned1, "", "", "" } |
|
126 ,{ GenreAmerica::RbdsUnassigned2, "", "", "" } |
|
127 ,{ GenreAmerica::RbdsUnassigned3, "", "", "" } |
|
128 ,{ GenreAmerica::RbdsUnassigned4, "", "", "" } |
|
129 ,{ GenreAmerica::RbdsUnassigned5, "", "", "" } |
|
130 ,{ GenreAmerica::RbdsWeather, "txt_rad_info_weather", "txt_rad_dblist_l1_mhz_val_weather", "txt_rad_info_weather_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 |
|
132 ,{ GenreAmerica::RbdsEmergency, "txt_rad_info_alarm", "txt_rad_dblist_l1_mhz_val_alarm", "txt_rad_info_alarm_hs" }//TODO: Check |
|
133 }; |
|
134 const int AmericanGenresCount = sizeof( AmericanGenres ) / sizeof ( AmericanGenres[0] ); |
|
135 |
|
136 /*! |
|
137 * |
|
138 */ |
|
139 bool RadioUiEngine::isOfflineProfile() |
|
140 { |
|
141 bool offline = false; |
|
142 |
|
143 #ifdef BUILD_WIN32 |
|
144 QScopedPointer<QSettings> settings( new QSettings( "Nokia", "QtFmRadio" ) ); |
|
145 offline = settings->value( "Offline", false ).toBool(); |
|
146 #else |
|
147 QSystemDeviceInfo deviceInfo; |
|
148 if ( deviceInfo.currentProfile() == QSystemDeviceInfo::OfflineProfile ) { |
|
149 offline = true; |
|
150 } |
|
151 #endif |
|
152 |
|
153 return offline; |
|
154 } |
|
155 |
|
156 /*! |
|
157 * |
|
158 */ |
|
159 uint RadioUiEngine::lastTunedFrequency() |
|
160 { |
|
161 uint frequency = DEFAULT_MIN_FREQUENCY; |
|
162 |
69 |
163 #ifdef BUILD_WIN32 |
70 #ifdef BUILD_WIN32 |
164 QScopedPointer<QSettings> settings( new QSettings( "Nokia", "QtFmRadio" ) ); |
71 QScopedPointer<QSettings> settings( new QSettings( "Nokia", "QtFmRadio" ) ); |
165 frequency = settings->value( "CurrentFreq", DEFAULT_MIN_FREQUENCY ).toUInt(); |
72 frequency = settings->value( "CurrentFreq", DEFAULT_MIN_FREQUENCY ).toUInt(); |
166 if ( frequency == 0 ) { |
73 if ( frequency == 0 ) { |
167 frequency = DEFAULT_MIN_FREQUENCY; |
74 frequency = defaultFrequency; |
168 } |
75 } |
169 #else |
76 #else |
170 QScopedPointer<XQSettingsManager> settings( new XQSettingsManager() ); |
77 QScopedPointer<XQSettingsManager> settings( new XQSettingsManager() ); |
171 XQSettingsKey key( XQSettingsKey::TargetCentralRepository, RADIO_CENREP_UID, RADIO_CENREP_FREQUENCY_KEY ); |
78 XQSettingsKey key( XQSettingsKey::TargetCentralRepository, RADIO_CENREP_UID, RADIO_CENREP_FREQUENCY_KEY ); |
172 frequency = settings->readItemValue( key, XQSettingsManager::TypeInt ).toUInt(); |
79 frequency = settings->readItemValue( key, XQSettingsManager::TypeInt ).toUInt(); |
|
80 if ( frequency == 0 ) { |
|
81 frequency = defaultFrequency; |
|
82 } |
173 #endif |
83 #endif |
174 |
84 |
175 return frequency; |
85 return frequency; |
176 } |
86 } |
|
87 |
|
88 /*! |
|
89 * Gets the last used volume level |
|
90 */ |
|
91 int RadioUiEngine::lastVolume() |
|
92 { |
|
93 int volume = DEFAULT_VOLUME_LEVEL; |
|
94 |
|
95 #ifndef BUILD_WIN32 |
|
96 QScopedPointer<XQSettingsManager> settings( new XQSettingsManager() ); |
|
97 XQSettingsKey key( XQSettingsKey::TargetCentralRepository, RADIO_CENREP_UID, RADIO_CENREP_HEADSET_VOLUME ); |
|
98 volume = settings->readItemValue( key, XQSettingsManager::TypeInt ).toInt(); |
|
99 if ( volume == 0 ) { |
|
100 volume = DEFAULT_VOLUME_LEVEL; |
|
101 } |
|
102 #endif |
|
103 |
|
104 return volume; |
|
105 } |
|
106 |
|
107 /*! |
|
108 * Launches the radio server process |
|
109 */ |
|
110 void RadioUiEngine::launchRadioServer() |
|
111 { |
|
112 QStringList args; |
|
113 args << RADIO_RANGE_USEURO; //TODO: Determine current region |
|
114 args << QString::number( lastTunedFrequency( 0 ) ); |
|
115 args << QString::number( lastVolume() ); |
|
116 |
|
117 QProcess serverProcess; |
|
118 bool success = serverProcess.startDetached( RADIO_SERVER_NAME, args ); |
|
119 LOG_ASSERT( success, LOG( "Failed to start radio server!" ) ); |
|
120 } |
|
121 |
|
122 // ====== MEMBER FUNCTIONS ======== |
177 |
123 |
178 /*! |
124 /*! |
179 * |
125 * |
180 */ |
126 */ |
181 RadioUiEngine::RadioUiEngine( QObject* parent ) : |
127 RadioUiEngine::RadioUiEngine( QObject* parent ) : |