radioapp/radioenginewrapper/src/radioenginewrapper_win32_p.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:15:02 +0300
branchRCL_3
changeset 19 cce62ebc198e
permissions -rw-r--r--
Revision: 201031 Kit: 201035

/*
* 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 <QTimer>
#include <QSettings>

// User includes
#include "radioenginewrapper_win32_p.h"
#include "radiosettings.h"
#include "radiosettings_p.h"
#include "radiologger.h"
#include "radio_global.h"
#include "radiostationhandlerif.h"
#include "radioenginewrapperobserver.h"
//#include "t_radiodataparser.h"

static RadioEngineWrapperPrivate* theInstance = 0;

const QString KKeyFrequency = "CurrentFreq";
const QString KKeyOffline = "Offline";

const uint KScanFrequencies[] = {
    87600000,
    88000000,
    89400000,
    96000000,
    97600000,
    100600000,
    101300000,
    102600000,
    103500000,
    104100000,
    105500000,
    107500000
};

const int KScanFrequencyCount = sizeof( KScanFrequencies ) / sizeof( KScanFrequencies[0] );

/*!
 *
 */
RadioEngineWrapperPrivate::RadioEngineWrapperPrivate( RadioEngineWrapper* wrapper,
                                                      RadioStationHandlerIf& stationHandler ) :
    q_ptr( wrapper ),
    mStationHandler( stationHandler ),
    mTuneTimer( new QTimer( this ) ),
    mTuneReason( 0 ),
    mUseLoudspeaker( false ),
    mAntennaAttached( true ),
    mFrequency( 0 ),
    mNextFrequency( 0 ),
    mVolume( 5 ),
    mMaxVolume( 10000 ),
    mFrequencyStepSize( 50000 ),
    mRegionId( RadioRegion::Default ),
    mMinFrequency( 87500000 ),
    mMaxFrequency( 108000000 ),
    mManualSeekMode( false )
{
    ::theInstance = this;
    mEngineSettings.reset( new QSettings( "Nokia", "QtFmRadio" ) );
    mFrequency = mEngineSettings->value( KKeyFrequency ).toUInt();
    if ( mFrequency == 0 ) {
        mFrequency = mMinFrequency;
    }

    Radio::connect( mTuneTimer, SIGNAL(timeout()), this, SLOT(frequencyEvent()) );
    mTuneTimer->setSingleShot( true );    
}

/*!
 *
 */
RadioEngineWrapperPrivate::~RadioEngineWrapperPrivate()
{
    // Destructor needs to be defined because some member variables that are forward declared
    // in the header are managed by QT's smart pointers and they require that the owning class
    // has a non-inlined destructor. Compiler generates an inlined destructor if it isn't defined.
}

/*!
 *
 */
RadioEngineWrapperPrivate* RadioEngineWrapperPrivate::instance()
{
    return ::theInstance;
}

/*!
 * Initializes the private implementation
 */
bool RadioEngineWrapperPrivate::init()
{
    mUseLoudspeaker = false;
    if ( !mUseLoudspeaker ) {
        RUN_NOTIFY_LOOP( mObservers, audioRouteChanged( false ) );
    }

    parseData();
    return true;
}

/*!
 * Returns the settings handler owned by the engine
 */
RadioSettingsIf& RadioEngineWrapperPrivate::settings()
{
    if ( !mSettings ) {
        mSettings.reset( new RadioSettings() );
//        mSettings->d_func()->init( &mEngineHandler->ApplicationSettings() );
    }
    return *mSettings;
}

/*!
 * Tunes to the given frequency
 */
void RadioEngineWrapperPrivate::setFrequency( uint frequency, const int reason )
{
    mNextFrequency = frequency;
    mTuneReason = reason;

    mTuneTimer->stop();
    if ( !mManualSeekMode ) {
        mTuneTimer->start( 500 );
    } else {
        frequencyEvent();
    }
}

/*!
 *
 */
ObserverList& RadioEngineWrapperPrivate::observers()
{
    return mObservers;
}

/*!
 *
 */
void RadioEngineWrapperPrivate::startSeeking( Seek::Direction direction, const int reason )
{
    mTuneReason = reason;
    mNextFrequency = 0;

    // Find the previous and next favorite from current frequency
    uint previous = 0;
    uint next = 0;
    for( int i = 0; i < KScanFrequencyCount; ++i ) {
        const uint testFreq = KScanFrequencies[i];
        if ( KScanFrequencies[i] > mFrequency ) {
            next = testFreq;
            break;
        }
        previous = testFreq;
    }


    if ( direction == Seek::Up ) {
        if ( next == 0 ) {
            next = KScanFrequencies[0];
        }
        mNextFrequency = next;
    } else {
        if ( previous == 0 ) {
            previous = KScanFrequencies[KScanFrequencyCount - 1];
        }
        mNextFrequency = previous;
    }

    mTuneTimer->start( 1000 );
}

/*!
 *
 */
void RadioEngineWrapperPrivate::cancelSeeking()
{
    mTuneTimer->stop();
    mNextFrequency = 0;
}

/*!
 *
 */
void RadioEngineWrapperPrivate::toggleAudioRoute()
{
    mUseLoudspeaker = !mUseLoudspeaker;
    RUN_NOTIFY_LOOP( mObservers, audioRouteChanged( mUseLoudspeaker ) );
}

/*!
 *
 */
QString RadioEngineWrapperPrivate::dataParsingError() const
{
    return mParsingError;
}

/*!
 *
 */
void RadioEngineWrapperPrivate::setHeadsetStatus( bool connected )
{
    mAntennaAttached = connected;
    RUN_NOTIFY_LOOP( mObservers, antennaStatusChanged( mAntennaAttached ) );
}

/*!
 *
 */
void RadioEngineWrapperPrivate::setVolume( int volume )
{
    mVolume = volume;
    RUN_NOTIFY_LOOP( mObservers, volumeChanged( mVolume ) );
}

/*!
 *
 */
void RadioEngineWrapperPrivate::addSong( const QString& artist, const QString& title )
{
    QString radioText = QString( "Now Playing: %1 - %2" ).arg( artist ).arg( title );
    mArtist = artist;
    mTitle = title;

    const uint frequency = mStationHandler.currentFrequency();
    mStationHandler.setCurrentRadioText( frequency, radioText );

    QTimer::singleShot( 500, this, SLOT(addSongTags()) );
}

/*!
 *
 */
void RadioEngineWrapperPrivate::clearSong()
{
    mStationHandler.setCurrentRadioText( mStationHandler.currentFrequency(), "" );
}

/*!
 *
 */
bool RadioEngineWrapperPrivate::isOffline() const
{
    return mEngineSettings->value( KKeyOffline, false ).toBool();
}

/*!
 *
 */
void RadioEngineWrapperPrivate::setOffline( bool offline )
{
    mEngineSettings->setValue( KKeyOffline, offline );
}

/*!
 * Private slot
 */
void RadioEngineWrapperPrivate::frequencyEvent()
{
    if ( mNextFrequency > 0 ) {
        mFrequency = mNextFrequency;
        mEngineSettings->setValue( KKeyFrequency, mFrequency );
    }

    if ( !mManualSeekMode ) {
        RUN_NOTIFY_LOOP( mObservers, tunedToFrequency( mNextFrequency, mTuneReason ) );
    }
}

/*!
 * Private slot
 */
void RadioEngineWrapperPrivate::addSongTags()
{
    const uint frequency = mStationHandler.currentFrequency();
    mStationHandler.setCurrentRadioTextPlus( frequency, RtPlus::Artist, mArtist );
    mStationHandler.setCurrentRadioTextPlus( frequency, RtPlus::Title, mTitle );
    mArtist = "";
    mTitle = "";
}

/*!
 *
 */
void RadioEngineWrapperPrivate::parseData()
{
    /*
    mDataParser.reset( new T_RadioDataParser() );
    bool ok = mDataParser->parse();
    if ( !ok ) {
        mParsingError = mDataParser->errorString();
    } else {
        if ( mDataParser->mEngineSettings.mMaxVolume > 0 ) {
            mMaxVolume = mDataParser->mEngineSettings.mMaxVolume;
        }

        if ( mDataParser->mEngineSettings.mFrequencyStepSize > 0 ) {
            mFrequencyStepSize = mDataParser->mEngineSettings.mFrequencyStepSize;
        }

        if ( mDataParser->mEngineSettings.mRegionId >= 0 ) {
            mRegionId = static_cast<RadioRegion::Region>( mDataParser->mEngineSettings.mRegionId );
        }

        if ( mDataParser->mEngineSettings.mMinFrequency > 0 ) {
            mMinFrequency = mDataParser->mEngineSettings.mMinFrequency;
        }

        if ( mDataParser->mEngineSettings.mMaxFrequency > 0 ) {
            mMaxFrequency = mDataParser->mEngineSettings.mMaxFrequency;
        }
    }
*/
}