diff -r 000000000000 -r 71ca22bcf22a mmserv/radioutility/radioserver/Server/Src/RadioServerFMTuner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/radioutility/radioserver/Server/Src/RadioServerFMTuner.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,601 @@ +/* +* Copyright (c) 2002-2004 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: This class implements an interface to FM tuner. +* +*/ + + + +// INCLUDE FILES +#include "RadioServerFmTuner.h" +#include "RadioDebug.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::CRadioServerFMTuner +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CRadioServerFMTuner::CRadioServerFMTuner( + MRadioServerFMTunerObserver& aObserver ) + : CActive(EPriorityStandard), + iObserver(aObserver), + iFmTunerQue(_FOFF( TRadioFmTunerData, iLink )), + iFmTunerData(NULL) + { + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::ConstructL() + { + RADIO_RDEBUG(_L("[RADIO-SVR] CRadioServerFMTuner::ConstructL()")); + CActiveScheduler::Add(this); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CRadioServerFMTuner* CRadioServerFMTuner::NewL( + MRadioServerFMTunerObserver& aObserver ) + { + CRadioServerFMTuner* self = new( ELeave ) CRadioServerFMTuner(aObserver); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// Destructor +CRadioServerFMTuner::~CRadioServerFMTuner() + { + RADIO_RDEBUG(_L("[RADIO-SVR] CRadioServerFMTuner::~CRadioServerFMTuner()")); + if ( IsActive() ) + { + Cancel(); + } + + while ( !iFmTunerQue.IsEmpty() ) + { + iFmTunerData = iFmTunerQue.First(); + iFmTunerQue.Remove(*iFmTunerData); + delete iFmTunerData; + } + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::TunerOnComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::TunerOnComplete( + TFMRadioTunerError aError ) + { + CompleteNotification(ETunerEventTunerOn, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::TunerOffComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::TunerOffComplete( + TFMRadioTunerError aError ) + { + CompleteNotification(ETunerEventTunerOff, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::SetFrequencyRangeComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::SetFrequencyRangeComplete( + TFMRadioTunerError aError ) + { + CompleteNotification(ETunerEventSetFrequencyRange, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::SetFrequencyComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::SetFrequencyComplete( + TFMRadioTunerError aError ) + { + CompleteNotification(ETunerEventSetFrequency, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::StationSeekComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::StationSeekComplete( + TFMRadioTunerError aError, + TInt aFrequency ) + { + iFrequency = aFrequency; + CompleteNotification(ETunerEventStationSeek, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::AudioModeComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::AudioModeComplete( + TFMRadioTunerError aError, + TFMRadioAudioMode aMode ) + { + iMode = aMode; + CompleteNotification(ETunerEventAudioMode, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::SetAudioModeComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::SetAudioModeComplete( + TFMRadioTunerError aError ) + { + CompleteNotification(ETunerEventSetAudioMode, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::MaxSignalStrengthComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::MaxSignalStrengthComplete( + TFMRadioTunerError aError, + TInt aStrength ) + { + iStrength = aStrength; + CompleteNotification(ETunerEventMaxSignalStrength, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::SignalStrengthComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::SignalStrengthComplete( + TFMRadioTunerError aError, + TInt aStrength ) + { + iStrength = aStrength; + CompleteNotification(ETunerEventSignalStrength, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::SquelchComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::SquelchComplete( + TFMRadioTunerError aError, + TBool aEnabled ) + { + iEnabled = aEnabled; + CompleteNotification(ETunerEventSquelch, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::SetSquelchComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::SetSquelchComplete( + TFMRadioTunerError aError ) + { + CompleteNotification(ETunerEventSetSquelch, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::BufferFilled +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::BufferFilled( + TDes8& /*aBuffer*/ ) + { + // Not supported + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RadioEventAntennaStatusChange +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RadioEventAntennaStatusChange( + TBool aAttached ) + { + iAttached = aAttached; + CompleteNotification(ETunerEventAntennaStatusChange); + } + +#ifdef RD_FM_RADIO_ENHANCEMENTS + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RadioEventTunerControlChange +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RadioEventTunerControlChange( + TInt aError ) + { + CompleteNotification(ETunerEventTunerControlChange, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::StationSeekByPTYComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::StationSeekByPTYComplete( + TInt aError, + TInt aFrequency ) + { + iFrequency = aFrequency; + CompleteNotification(ETunerEventStationSeekByPTY, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::StationSeekByTAComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::StationSeekByTAComplete( + TInt aError, + TInt aFrequency ) + { + iFrequency = aFrequency; + CompleteNotification(ETunerEventStationSeekByTA, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::StationSeekByTPComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::StationSeekByTPComplete( + TInt aError, + TInt aFrequency ) + { + iFrequency = aFrequency; + CompleteNotification(ETunerEventStationSeekByTP, aError); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::GetFreqByPTYComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::GetFreqByPTYComplete( + TInt /*aError*/, + RArray& /*aFreqList*/ ) + { + // Not supported + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::GetFreqByTAComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::GetFreqByTAComplete( + TInt /*aError*/, + RArray& /*aFreqList*/ ) + { + // Not supported + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::GetPSByPTYComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::GetPSByPTYComplete( + TInt /*aError*/, + RArray& /*aPsList*/ ) + { + // Not supported + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::GetPSByTAComplete +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::GetPSByTAComplete( + TInt /*aError*/, + RArray& /*aPsList*/ ) + { + // Not supported + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RdsDataPI +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RdsDataPI( + TInt aPi ) + { + iObserver.RdsDataPI(aPi); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RdsDataPTY +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RdsDataPTY( + TRdsProgrammeType aPty ) + { + iObserver.RdsDataPTY(aPty); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RdsDataPS +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RdsDataPS( + TRdsPSName& aPs ) + { + iObserver.RdsDataPS(aPs); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RdsDataRT +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RdsDataRT( + TRdsRadioText& aRt, + RArray& aRTplusTags ) + { + iObserver.RdsDataRT(aRt, aRTplusTags); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RdsDataCT +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RdsDataCT( + TDateTime& aCt ) + { + iObserver.RdsDataCT(aCt); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RdsDataTA +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RdsDataTA( + TBool aTaOn ) + { + iObserver.RdsDataTA(aTaOn); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RdsSearchBeginAF +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RdsSearchBeginAF() + { + iObserver.RdsSearchBeginAF(); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RdsSearchEndAF +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RdsSearchEndAF( + TInt aError, + TInt aFrequency ) + { + iObserver.RdsSearchEndAF(aError, aFrequency); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RdsStationChangeTA +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RdsStationChangeTA( + TInt /*aFrequency*/ ) + { + // Not supported + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RdsEventSignalChange +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RdsEventSignalChange( + TBool aSignal ) + { + iObserver.RdsEventSignalChange(aSignal); + } + +#endif //RD_FM_RADIO_ENHANCEMENTS + + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::DoCancel +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::DoCancel() + { + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::RunL +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::RunL() + { + RADIO_RDEBUG_INT2(_L("[RADIO-SVR] CRadioServerFMTuner::RunL(): Err[%d] Event[%d]"), iFmTunerData->iError, iFmTunerData->iEvent); + TInt error = MapTunerError(iFmTunerData->iError); + switch ( iFmTunerData->iEvent ) + { + case ETunerEventTunerOn: + iObserver.TunerOnComplete(error); + break; + case ETunerEventTunerOff: + iObserver.TunerOffComplete(error); + break; + case ETunerEventSetFrequencyRange: + iObserver.SetFrequencyRangeComplete(error); + break; + case ETunerEventSetFrequency: + iObserver.SetFrequencyComplete(error); + break; + case ETunerEventStationSeek: + iObserver.StationSeekComplete(error, iFrequency); + break; + case ETunerEventAudioMode: + if ( iMode == EFMRadioAudioStereo ) + { + iObserver.AudioModeComplete(error, ETrue); + } + else + { + iObserver.AudioModeComplete(error, EFalse); + } + break; + case ETunerEventSetAudioMode: + iObserver.SetAudioModeComplete(error); + break; + case ETunerEventMaxSignalStrength: + iObserver.MaxSignalStrengthComplete(error, iStrength); + break; + case ETunerEventSignalStrength: + iObserver.SignalStrengthComplete(error, iStrength); + break; + case ETunerEventSquelch: + iObserver.SquelchComplete(error, iEnabled); + break; + case ETunerEventSetSquelch: + iObserver.SetSquelchComplete(error); + break; + case ETunerEventAntennaStatusChange: + iObserver.RadioEventAntennaStatusChange(iAttached); + break; + case ETunerEventTunerControlChange: + iObserver.RadioEventTunerControlChange(error); + break; + case ETunerEventStationSeekByPTY: + iObserver.StationSeekByPTYComplete(error, iFrequency); + break; + case ETunerEventStationSeekByTA: + iObserver.StationSeekByTAComplete(error, iFrequency); + break; + case ETunerEventStationSeekByTP: + iObserver.StationSeekByTPComplete(error, iFrequency); + break; + default: + RADIO_RDEBUG(_L("[RADIO-SVR] CRadioServerFMTuner::RunL(): ERROR case default !!!")); + break; + } + ProcessNextItemInQueue(); + } + +// ----------------------------------------------------------------------------- +// CRadioServerFMTuner::CompleteNotification +// This method completes the request status and sets the object active +// to provide asynchronous behavior. +// ----------------------------------------------------------------------------- +// +void CRadioServerFMTuner::CompleteNotification( + TTunerEvent aEvent, + TFMRadioTunerError aError ) + { + TRadioFmTunerData* data = NULL; + TRAPD(err, data = new (ELeave) TRadioFmTunerData); + if ( err != KErrNone ) + { + RADIO_RDEBUG_INT(_L("[RADIO-SVR] CRadioServerFMTuner::CompleteNotification(): Err[%d]"), err); + return; + } + data->iEvent = aEvent; + data->iError = aError; + if ( iFmTunerData ) + { + // Outstanding request exits; add it to the queue + iFmTunerQue.AddLast(*data); + } + else + { + // Set the current outstanding request + iFmTunerData = data; + TRequestStatus* stat = &iStatus; + User::RequestComplete(stat, KErrNone); + SetActive(); + } + } + +// ---------------------------------------------------- +// CRadioServer::ProcessNextItemInQueue +// ---------------------------------------------------- +// +void CRadioServerFMTuner::ProcessNextItemInQueue() + { + delete iFmTunerData; + iFmTunerData = NULL; + if ( !iFmTunerQue.IsEmpty() ) + { + // there is at least one element in the linked list + TRadioFmTunerData* data; + data = iFmTunerQue.First(); + iFmTunerQue.Remove(*data); + iFmTunerData = data; + TRequestStatus* stat = &iStatus; + User::RequestComplete(stat, KErrNone); + SetActive(); + } + } + +// ---------------------------------------------------- +// CRadioServerFMTuner::MapTunerError +// ---------------------------------------------------- +// +TInt CRadioServerFMTuner::MapTunerError( + TFMRadioTunerError aError ) + { + TInt err; + switch ( aError ) + { + case KFMRadioErrHardwareFaulty: + case KRdsErrHardwareFaulty: + err = KRadioServErrHardwareFaulty; + break; + case KFMRadioErrTuning: + err = KRadioServErrTuning; + break; + case KFMRadioErrFrequencyOutOfBandRange: + err = KRadioServErrFrequencyOutOfBandRange; + break; + case KFMRadioErrFrequencyNotValid: + err = KRadioServErrFrequencyNotValid; + break; + case KFMRadioErrNotPermittedInCurrentState: + case KRdsErrNotPermittedInCurrentState: + err = KRadioServErrNotPermittedInCurrentState; + break; + case KFMRadioErrDuplicateRequest: + case KRdsErrDuplicateRequest: + err = KRadioServErrDuplicateRequest; + break; + case KFMRadioErrAntennaNotConnected: + err = KRadioServErrAntennaNotConnected; + break; + case KFMRadioErrFmTransmitterActive: + err = KRadioServErrFmTransmitterActive; + break; + default: + err = aError; + break; + } + RADIO_RDEBUG_INT2(_L("[RADIO-SVR] CRadioServerFMTuner::MapTunerError() [%d-%d]"), aError, err); + return err; + } + +// End of File