diff -r a2b50a479edf -r 6df133bd92e1 radioapp/radiouiengine/src/radiouiengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/radioapp/radiouiengine/src/radiouiengine.cpp Fri Jun 04 10:21:36 2010 +0100 @@ -0,0 +1,646 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System includes +#include +#include +#include + +#ifdef BUILD_WIN32 +# include +#else +# include +# include +using namespace QtMobility; +#endif // WIN32_BUILD + +// User includes +#include "radiouiengine.h" +#include "radiouiengine_p.h" +#include "radiologger.h" +#include "radioenginewrapper.h" +#include "radiostationmodel.h" +#include "radiohistorymodel.h" +#include "radiocarouselmodel.h" +#include "radiohistoryitem.h" +#include "radiosettings.h" +#include "radiostationfiltermodel.h" +#include "radioscannerengine.h" + +// Constants +const QString KPathFormatter = "%1:%2%3"; +const QString KApplicationDir = "\\sys\\bin\\"; +const QString KSongRecognitionApp = "Shazam_0x200265B3.exe"; +const QString KSongRecognitionAppParams = "-listen"; + +const uint DEFAULT_MIN_FREQUENCY = 87500000; +const uint RADIO_CENREP_UID = 0x101FF976; +const uint RADIO_CENREP_FREQUENCY_KEY = 0x00000107; + +struct GenreStruct +{ + int mGenreCode; + const char* mInCarousel; + const char* mInStationsList; + const char* mInHomeScreen; +}; + +const GenreStruct EuropeanGenres[] = +{ + { GenreEurope::RdsNone, "", "", "" } + ,{ GenreEurope::RdsNews, "txt_rad_info_news", "txt_rad_dblist_l1_mhz_val_news", "txt_rad_info_news_hs" } + ,{ GenreEurope::RdsCurrentAffairs, "txt_rad_info_current_affairs", "txt_rad_dblist_l1_mhz_val_current_affairs", "txt_rad_info_current_affairs_hs" } + ,{ GenreEurope::RdsInformation, "txt_rad_info_information", "txt_rad_dblist_l1_mhz_val_information", "txt_rad_info_information_hs" } + ,{ GenreEurope::RdsSport, "txt_rad_info_sport", "txt_rad_dblist_l1_mhz_val_sport", "txt_rad_info_sport_hs" } + ,{ GenreEurope::RdsEducation, "txt_rad_info_education", "txt_rad_dblist_l1_mhz_val_education", "txt_rad_info_education_hs" } + ,{ GenreEurope::RdsDrama, "txt_rad_info_drama", "txt_rad_dblist_l1_mhz_val_drama", "txt_rad_info_drama_hs" } + ,{ GenreEurope::RdsCulture, "txt_rad_info_culture", "txt_rad_dblist_l1_mhz_val_culture", "txt_rad_info_culture_hs" } + ,{ GenreEurope::RdsScience, "txt_rad_info_science", "txt_rad_dblist_l1_mhz_val_science", "txt_rad_info_science_hs" } + ,{ GenreEurope::RdsVariedSpeech, "txt_rad_info_varied", "txt_rad_dblist_l1_mhz_val_varied", "txt_rad_info_varied_hs" } + ,{ GenreEurope::RdsPopMusic, "txt_rad_info_pop_music", "txt_rad_dblist_l1_mhz_val_pop_music", "txt_rad_info_pop_music_hs" } + ,{ GenreEurope::RdsRockMusic, "txt_rad_info_rock_music", "txt_rad_dblist_l1_mhz_val_rock_music", "txt_rad_info_rock_music_hs" } + ,{ GenreEurope::RdsEasyListening, "txt_rad_info_easy_listening", "txt_rad_dblist_l1_mhz_val_easy_listening", "txt_rad_info_easy_listening_hs" } + ,{ GenreEurope::RdsLightClassical, "txt_rad_info_light_classical", "txt_rad_dblist_l1_mhz_val_light_classical", "txt_rad_info_light_classical_hs" } + ,{ GenreEurope::RdsSeriousClassical, "txt_rad_info_serious_classical", "txt_rad_dblist_l1_mhz_val_serious_classical", "txt_rad_info_serious_classical_hs" } + ,{ GenreEurope::RdsOtherMusic, "txt_rad_info_other_music", "txt_rad_dblist_l1_mhz_val_other_music", "txt_rad_info_other_music_hs" } + ,{ GenreEurope::RdsWeather, "txt_rad_info_weather", "txt_rad_dblist_l1_mhz_val_weather", "txt_rad_info_weather_hs" } + ,{ GenreEurope::RdsFinance, "txt_rad_info_finance", "txt_rad_dblist_l1_mhz_val_finance", "txt_rad_info_finance_hs" } + ,{ GenreEurope::RdsChildrensProgrammes, "txt_rad_info_childrens_programmes", "txt_rad_dblist_l1_mhz_val_childrens_programmes", "txt_rad_info_childrens_programmes_hs" } + ,{ GenreEurope::RdsSocialAffairs, "txt_rad_info_social_affairs", "txt_rad_dblist_l1_mhz_val_social_affairs", "txt_rad_info_social_affairs_hs" } + ,{ GenreEurope::RdsReligion, "txt_rad_info_religion", "txt_rad_dblist_l1_mhz_val_religion", "txt_rad_info_religion_hs" } + ,{ GenreEurope::RdsPhoneIn, "txt_rad_info_phone_in", "txt_rad_dblist_l1_mhz_val_phone_in", "txt_rad_info_phone_in_hs" } + ,{ GenreEurope::RdsTravel, "txt_rad_info_travel", "txt_rad_dblist_l1_mhz_val_travel", "txt_rad_info_travel_hs" } + ,{ GenreEurope::RdsLeisure, "txt_rad_info_leisure", "txt_rad_dblist_l1_mhz_val_leisure", "txt_rad_info_leisure_hs" } + ,{ GenreEurope::RdsJazzMusic, "txt_rad_info_jazz_music", "txt_rad_dblist_l1_mhz_val_jazz_music", "txt_rad_info_jazz_music_hs" } + ,{ GenreEurope::RdsCountryMusic, "txt_rad_info_country_music", "txt_rad_dblist_l1_mhz_val_country_music", "txt_rad_info_country_music_hs" } + ,{ GenreEurope::RdsNationalMusic, "txt_rad_info_national_music", "txt_rad_dblist_l1_mhz_val_national_music", "txt_rad_info_national_music_hs" } + ,{ GenreEurope::RdsOldiesMusic, "txt_rad_info_oldies_music", "txt_rad_dblist_l1_mhz_val_oldies_music", "txt_rad_info_oldies_music_hs" } + ,{ GenreEurope::RdsFolkMusic, "txt_rad_info_folk_music", "txt_rad_dblist_l1_mhz_val_folk_music", "txt_rad_info_folk_music_hs" } + ,{ GenreEurope::RdsDocumentary, "txt_rad_info_documentary", "txt_rad_dblist_l1_mhz_val_documentary", "txt_rad_info_documentary_hs" } + ,{ GenreEurope::RdsAlarmTest, "txt_rad_info_alarm_test", "txt_rad_dblist_l1_mhz_val_alarm_test", "txt_rad_info_alarm_test_hs" } + ,{ GenreEurope::RdsAlarm, "txt_rad_info_alarm", "txt_rad_dblist_l1_mhz_val_alarm", "txt_rad_info_alarm_hs" } +}; +const int EuropeanGenresCount = sizeof( EuropeanGenres ) / sizeof ( EuropeanGenres[0] ); + +const GenreStruct AmericanGenres[] = +{ + { GenreAmerica::RbdsNone, "", "", "" } + ,{ GenreAmerica::RbdsNews, "txt_rad_info_news", "txt_rad_dblist_l1_mhz_val_news", "txt_rad_info_news_hs" } + ,{ GenreAmerica::RbdsInformation, "txt_rad_info_information", "txt_rad_dblist_l1_mhz_val_information", "txt_rad_info_information_hs" } + ,{ GenreAmerica::RbdsSports, "txt_rad_info_sport", "txt_rad_dblist_l1_mhz_val_sport", "txt_rad_info_sport_hs" } + ,{ GenreAmerica::RbdsTalk, "txt_rad_info_talk", "txt_rad_dblist_l1_mhz_val_talk", "txt_rad_info_talk_hs" } + ,{ GenreAmerica::RbdsRock, "txt_rad_info_rock_music", "txt_rad_dblist_l1_mhz_val_rock_music", "txt_rad_info_rock_music_hs" } //TODO: Check + ,{ GenreAmerica::RbdsClassicRock, "txt_rad_info_classic_rock", "txt_rad_dblist_l1_mhz_val_classic_rock", "txt_rad_info_classic_rock_hs" } + ,{ GenreAmerica::RbdsAdultHits, "txt_rad_info_adult_hits", "txt_rad_dblist_l1_mhz_val_adult_hits", "txt_rad_info_adult_hits_hs" } + ,{ GenreAmerica::RbdsSoftRock, "txt_rad_info_soft_rock", "txt_rad_dblist_l1_mhz_val_soft_rock", "txt_rad_info_soft_rock_hs" } + ,{ GenreAmerica::RbdsTop40, "txt_rad_info_top_40", "txt_rad_dblist_l1_mhz_val_top_40", "txt_rad_info_top_40_hs" } + ,{ GenreAmerica::RbdsCountry, "txt_rad_info_country_music", "txt_rad_dblist_l1_mhz_val_country_music", "txt_rad_info_country_music_hs" } //TODO: Check + ,{ GenreAmerica::RbdsOldies, "txt_rad_info_oldies_music", "txt_rad_dblist_l1_mhz_val_oldies_music", "txt_rad_info_oldies_music_hs" } //TODO: Check + ,{ GenreAmerica::RbdsSoft, "txt_rad_info_soft", "txt_rad_dblist_l1_mhz_val_soft", "txt_rad_info_soft_hs" } + ,{ GenreAmerica::RbdsNostalgia, "txt_rad_info_nostalgia", "txt_rad_dblist_l1_mhz_val_nostalgia", "txt_rad_info_nostalgia_hs" } + ,{ GenreAmerica::RbdsJazz, "txt_rad_info_jazz_music", "txt_rad_dblist_l1_mhz_val_jazz_music", "txt_rad_info_jazz_music_hs" } //TODO: Check + ,{ GenreAmerica::RbdsClassical, "txt_rad_info_classical", "txt_rad_dblist_l1_mhz_val_classical", "txt_rad_info_classical_hs" } + ,{ GenreAmerica::RbdsRhythmAndBlues, "txt_rad_info_rhythm_and_blues", "txt_rad_dblist_l1_mhz_val_rhythm_and_blues", "txt_rad_info_rhythm_and_blues_hs" } + ,{ 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" } + ,{ GenreAmerica::RbdsLanguage, "txt_rad_info_language", "txt_rad_dblist_l1_mhz_val_language", "txt_rad_info_language_hs" } + ,{ GenreAmerica::RbdsReligiousMusic, "txt_rad_info_religious_music", "txt_rad_dblist_l1_mhz_val_religious_music", "txt_rad_info_religious_music_hs" } + ,{ GenreAmerica::RbdsReligiousTalk, "txt_rad_info_religious_talk", "txt_rad_dblist_l1_mhz_val_religious_talk", "txt_rad_info_religious_talk_hs" } + ,{ GenreAmerica::RbdsPersonality, "txt_rad_info_personality", "txt_rad_dblist_l1_mhz_val_personality", "txt_rad_info_personality_hs" } + ,{ GenreAmerica::RbdsPublic, "txt_rad_info_public", "txt_rad_dblist_l1_mhz_val_public", "txt_rad_info_public_hs" } + ,{ GenreAmerica::RbdsCollege, "txt_rad_info_college", "txt_rad_dblist_l1_mhz_val_college", "txt_rad_info_college_hs" } + ,{ GenreAmerica::RbdsUnassigned1, "", "", "" } + ,{ GenreAmerica::RbdsUnassigned2, "", "", "" } + ,{ GenreAmerica::RbdsUnassigned3, "", "", "" } + ,{ GenreAmerica::RbdsUnassigned4, "", "", "" } + ,{ GenreAmerica::RbdsUnassigned5, "", "", "" } + ,{ GenreAmerica::RbdsWeather, "txt_rad_info_weather", "txt_rad_dblist_l1_mhz_val_weather", "txt_rad_info_weather_hs" }//TODO: Check + ,{ GenreAmerica::RbdsEmergencyTest, "txt_rad_info_alarm_test", "txt_rad_dblist_l1_mhz_val_alarm_test", "txt_rad_info_alarm_test_hs" }//TODO: Check + ,{ GenreAmerica::RbdsEmergency, "txt_rad_info_alarm", "txt_rad_dblist_l1_mhz_val_alarm", "txt_rad_info_alarm_hs" }//TODO: Check +}; +const int AmericanGenresCount = sizeof( AmericanGenres ) / sizeof ( AmericanGenres[0] ); + +/*! + * + */ +bool RadioUiEngine::isOfflineProfile() +{ + bool offline = false; + +#ifdef BUILD_WIN32 + QScopedPointer settings( new QSettings( "Nokia", "QtFmRadio" ) ); + offline = settings->value( "Offline", false ).toBool(); +#else + QSystemDeviceInfo deviceInfo; + if ( deviceInfo.currentProfile() == QSystemDeviceInfo::OfflineProfile ) { + offline = true; + } +#endif + + return offline; +} + +/*! + * + */ +uint RadioUiEngine::lastTunedFrequency() +{ + uint frequency = DEFAULT_MIN_FREQUENCY; + +#ifdef BUILD_WIN32 + QScopedPointer settings( new QSettings( "Nokia", "QtFmRadio" ) ); + frequency = settings->value( "CurrentFreq", DEFAULT_MIN_FREQUENCY ).toUInt(); + if ( frequency == 0 ) { + frequency = DEFAULT_MIN_FREQUENCY; + } +#else + QScopedPointer settings( new XQSettingsManager() ); + XQSettingsKey key( XQSettingsKey::TargetCentralRepository, RADIO_CENREP_UID, RADIO_CENREP_FREQUENCY_KEY ); + frequency = settings->readItemValue( key, XQSettingsManager::TypeInt ).toUInt(); +#endif + + return frequency; +} + +/*! + * + */ +RadioUiEngine::RadioUiEngine( QObject* parent ) : + QObject( parent ), + d_ptr( new RadioUiEnginePrivate( this ) ) +{ +} + +/*! + * + */ +RadioUiEngine::~RadioUiEngine() +{ + delete d_ptr; +} + +/*! + * + */ +bool RadioUiEngine::isInitialized() const +{ + Q_D( const RadioUiEngine ); + return !d->mEngineWrapper.isNull(); +} + +/*! + * + */ +bool RadioUiEngine::init() +{ + Q_D( RadioUiEngine ); + return d->init(); +} + +/*! + * + */ +bool RadioUiEngine::isFirstTimeStart() +{ + Q_D( RadioUiEngine ); + return d->mEngineWrapper->settings().isFirstTimeStart(); +} + +/*! + * Returns the settings handler owned by the engine + */ +RadioSettingsIf& RadioUiEngine::settings() +{ + Q_D( RadioUiEngine ); + return d->mEngineWrapper->settings(); +} + +/*! + * Returns the station model + */ +RadioStationModel& RadioUiEngine::stationModel() +{ + Q_D( RadioUiEngine ); + return *d->mStationModel; +} + +/*! + * Returns the history model + */ +RadioHistoryModel& RadioUiEngine::historyModel() +{ + Q_D( RadioUiEngine ); + return *d->mHistoryModel; +} + +/*! + * Creates a new filter model + */ +RadioStationFilterModel* RadioUiEngine::createNewFilterModel( QObject* parent ) +{ + return new RadioStationFilterModel( *this, parent ); +} + +/*! + * Creates a new carousel model + */ +RadioCarouselModel* RadioUiEngine::carouselModel() +{ + Q_D( RadioUiEngine ); + if ( !d->mCarouselModel ) { + d->mCarouselModel.reset( new RadioCarouselModel( *this, *d->mStationModel ) ); + } + + return d->mCarouselModel.data(); +} + +/*! + * + */ +RadioScannerEngine* RadioUiEngine::scannerEngine() +{ + Q_D( RadioUiEngine ); + if ( !d->mScannerEngine ) { + d->mScannerEngine = new RadioScannerEngine( *d ); + } + return d->mScannerEngine; +} + +/*! + * + */ +bool RadioUiEngine::isRadioOn() const +{ + Q_D( const RadioUiEngine ); + return d->mEngineWrapper->isRadioOn(); +} + +/*! + * + */ +bool RadioUiEngine::isScanning() const +{ + Q_D( const RadioUiEngine ); + if ( d->mScannerEngine ) { + return d->mScannerEngine->isScanning(); + } + return false; +} + +/*! + * + */ +bool RadioUiEngine::isMuted() const +{ + Q_D( const RadioUiEngine ); + return d->mEngineWrapper->isMuted(); +} + +/*! + * + */ +bool RadioUiEngine::isAntennaAttached() const +{ + Q_D( const RadioUiEngine ); + return d->mEngineWrapper->isAntennaAttached(); +} + +/*! + * + */ +bool RadioUiEngine::isUsingLoudspeaker() const +{ + Q_D( const RadioUiEngine ); + return d->mEngineWrapper->isUsingLoudspeaker(); +} + +/*! + * Returns the selected radio region + */ +RadioRegion::Region RadioUiEngine::region() const +{ + Q_D( const RadioUiEngine ); + return d->mEngineWrapper->region(); +} + +/*! + * Returns the currently tuned frequency + */ +uint RadioUiEngine::currentFrequency() const +{ + Q_D( const RadioUiEngine ); + return d->mEngineWrapper->currentFrequency(); +} + +/*! + * Returns the minimum frequency + */ +uint RadioUiEngine::minFrequency() const +{ + Q_D( const RadioUiEngine ); + return d->mEngineWrapper->minFrequency(); +} + +/*! + * Returns the maximum frequency + */ +uint RadioUiEngine::maxFrequency() const +{ + Q_D( const RadioUiEngine ); + return d->mEngineWrapper->maxFrequency(); +} + +/*! + * Returns the frequency step size from the selected region + */ +uint RadioUiEngine::frequencyStepSize() const +{ + Q_D( const RadioUiEngine ); + return d->mEngineWrapper->frequencyStepSize(); +} + +/*! + * Sets the mute status + */ +void RadioUiEngine::setMute( bool muted ) +{ + Q_D( RadioUiEngine ); + d->mEngineWrapper->setMute( muted ); +} + +/*! + * + */ +QList RadioUiEngine::stationsInRange( uint minFrequency, uint maxFrequency ) +{ + Q_D( RadioUiEngine ); + return d->mStationModel->stationsInRange( minFrequency, maxFrequency ); +} + +/*! + * + */ +QString RadioUiEngine::genreToString( int genre, GenreTarget::Target target ) +{ + RadioRegion::Region currentRegion = region(); + + const GenreStruct* genreArray = currentRegion == RadioRegion::America ? AmericanGenres : EuropeanGenres; + const int genreCount = currentRegion == RadioRegion::America ? AmericanGenresCount : EuropeanGenresCount; + + for( int i = 0; i < genreCount; ++i ) { + if ( genreArray[i].mGenreCode == genre ) { + if ( target == GenreTarget::Carousel ) { + return qtTrId( genreArray[i].mInCarousel ); + } else if ( target == GenreTarget::StationsList ) { + return qtTrId( genreArray[i].mInStationsList ); + } else if ( target == GenreTarget::HomeScreen ) { + return qtTrId( genreArray[i].mInHomeScreen ); + } + } + } + + return ""; +} + +/*! + * + */ +bool RadioUiEngine::isSongRecognitionAppAvailable() +{ + //TODO: Check if there is a better way to check if an application is available + bool available = false; + + // Check the Z: drive + QString fullPath = QString( KPathFormatter ).arg( "Z" ).arg( KApplicationDir ).arg( KSongRecognitionApp ); + available = QFile::exists( fullPath ); + + LOG_FORMAT( "Checking file: %s. found %d", GETSTRING( fullPath ), available ); + + if ( !available ) { + // Check the C: drive + fullPath = QString( KPathFormatter ).arg( "C" ).arg( KApplicationDir ).arg( KSongRecognitionApp ); + available = QFile::exists( fullPath ); + LOG_FORMAT( "Checking file: %s. found %d", GETSTRING( fullPath ), available ); + if ( !available ) { + // Check the E: drive + fullPath = QString( KPathFormatter ).arg( "E" ).arg( KApplicationDir ).arg( KSongRecognitionApp ); + available = QFile::exists( fullPath ); + LOG_FORMAT( "Checking file: %s. found %d", GETSTRING( fullPath ), available ); + } + } + return available; +} + +/*! + * + */ +void RadioUiEngine::addRecognizedSong( const QString& artist, const QString& title, const RadioStation& station ) +{ + Q_D( RadioUiEngine ); + d->mHistoryModel->addItem( artist, title, station ); +} + +/*! + * + */ +uint RadioUiEngine::skipStation( StationSkip::Mode mode, uint startFrequency ) +{ + Q_D( RadioUiEngine ); + return d->skip( mode, startFrequency ); +} + +/*! + * + */ +void RadioUiEngine::openMusicStore( const RadioHistoryItem& item, MusicStore store ) +{ + Q_UNUSED( item ); + Q_UNUSED( store ); + //TODO: Integrate to music store +} + +/*! + * Public slot + * Tunes to the given frequency + */ +void RadioUiEngine::tuneFrequency( uint frequency, const int reason ) +{ + Q_D( RadioUiEngine ); + if ( frequency != d->mStationModel->currentStation().frequency() && d->mEngineWrapper->isFrequencyValid( frequency ) ) { + LOG_FORMAT( "RadioUiEngine::tuneFrequency, frequency: %d", frequency ); + d->cancelSeeking(); + d->mEngineWrapper->tuneFrequency( frequency, reason ); + } +} + +/*! + * Public slot + * Tunes to the given frequency after a delay + */ +void RadioUiEngine::tuneWithDelay( uint frequency, const int reason ) +{ + Q_D( RadioUiEngine ); + if ( frequency != d->mStationModel->currentStation().frequency() && d->mEngineWrapper->isFrequencyValid( frequency ) ) { + LOG_FORMAT( "RadioEngineWrapperPrivate::tuneWithDelay, frequency: %d", frequency ); + d->cancelSeeking(); + d->mEngineWrapper->tuneWithDelay( frequency, reason ); + } +} + +/*! + * Public slot + * Tunes to the given preset + */ +void RadioUiEngine::tunePreset( int presetIndex ) +{ + Q_D( RadioUiEngine ); + if ( presetIndex != d->mStationModel->currentStation().presetIndex() ) { + RadioStation station; + if ( d->mStationModel->findPresetIndex( presetIndex, station ) != RadioStation::NotFound && + d->mEngineWrapper->isFrequencyValid( station.frequency() ) ) { + LOG_FORMAT( "RadioEngineWrapperPrivate::tunePreset, presetIndexPosition: %d", presetIndex ); + + d->mEngineWrapper->tuneFrequency( station.frequency(), TuneReason::Unspecified ); + } + } +} + +/*! + * Public slot + * volume update command slot for the engine + */ +void RadioUiEngine::setVolume( int volume ) +{ + Q_D( RadioUiEngine ); + d->mEngineWrapper->setVolume( volume ); +} + +/*! + * Public slot + * + */ +void RadioUiEngine::toggleMute() +{ + Q_D( RadioUiEngine ); + if ( !isScanning() ) { + d->mEngineWrapper->setMute( !d->mEngineWrapper->isMuted() ); + } +} + +/*! + * Public slot + * + */ +void RadioUiEngine::toggleAudioRoute() +{ + Q_D( RadioUiEngine ); + d->mEngineWrapper->toggleAudioRoute(); +} + +/*! + * Public slot + * + */ +void RadioUiEngine::seekStation( int seekDirection ) +{ + if ( isAntennaAttached() ) { + Q_D( RadioUiEngine ); + Seeking::Direction direction = static_cast( seekDirection ); + emitSeekingStarted( direction ); + d->mEngineWrapper->startSeeking( direction, TuneReason::Seek ); + } +} + +/*! + * Public slot + * + */ +void RadioUiEngine::launchSongRecognition() +{ + LOG_FORMAT("RadioUiEngine::launchSongRecognition() starting: %s", GETSTRING( KSongRecognitionApp ) ); + + QStringList arguments; + arguments << KSongRecognitionAppParams; + + bool started = QProcess::startDetached( KSongRecognitionApp, arguments ); + Q_UNUSED( started ); + LOG_ASSERT( started, LOG_FORMAT("RadioUiEngine::launchSongRecognition() failed to start %s", GETSTRING( KSongRecognitionApp ) ) ); +} + +/*! + * Function used by the private implementation to emit a tunedToFrequency signal + */ +void RadioUiEngine::emitTunedToFrequency( uint frequency, int commandSender ) +{ + emit tunedToFrequency( frequency, commandSender ); +} + +/*! + * Function used by the private implementation to emit a seekingStarted signal + */ +void RadioUiEngine::emitSeekingStarted( Seeking::Direction direction ) +{ + emit seekingStarted( direction ); +} + +/*! + * Function used by the private implementation to emit a radioStatusChanged signal + */ +void RadioUiEngine::emitRadioStatusChanged( bool radioIsOn ) +{ + emit radioStatusChanged( radioIsOn ); +} + +/*! + * Function used by the private implementation to emit a rdsAvailabilityChanged signal + */ +void RadioUiEngine::emitRdsAvailabilityChanged( bool available ) +{ + emit rdsAvailabilityChanged( available ); +} + +/*! + * Function used by the private implementation to emit a volumeChanged signal + */ +void RadioUiEngine::emitVolumeChanged( int volume ) +{ + emit volumeChanged( volume ); +} + +/*! + * Function used by the private implementation to emit a muteChanged signal + */ +void RadioUiEngine::emitMuteChanged( bool muted ) +{ + emit muteChanged( muted ); +} + +/*! + * Function used by the private implementation to emit a audioRouteChanged signal + */ +void RadioUiEngine::emitAudioRouteChanged( bool loudspeaker ) +{ + emit audioRouteChanged( loudspeaker ); +} + +/*! + * Function used by the private implementation to emit a antennaStatusChanged signal + */ +void RadioUiEngine::emitAntennaStatusChanged( bool connected ) +{ + emit antennaStatusChanged( connected ); +} +