diff -r 4e84c994a771 -r 82baf59ce8dd mpengine/src/mpmediakeyhandler_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpengine/src/mpmediakeyhandler_p.cpp Fri Apr 16 14:56:30 2010 +0300 @@ -0,0 +1,453 @@ +/* +* 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: Music Player media key handler - private implementation. +* +*/ + +#include "mpmediakeyhandler_p.h" +#include "mpmediakeyhandler.h" +#include "mpmediakeyremconresponse.h" +#include "mpcommondefs.h" + +//symbian header files +#include +#include + +//mpx header files +#include +#include +#include +#include + +const TInt KFirstTimerExpiryInterval( 1 ); // Expire immediately +const TInt KTimerExpiryInterval( 1000000/6 ); + +// --------------------------------------------------------------------------- +// MpMediaKeyHandlerPrivate() +// --------------------------------------------------------------------------- +// +MpMediaKeyHandlerPrivate::MpMediaKeyHandlerPrivate( MpMediaKeyHandler *wrapper ) + : q_ptr( wrapper ), + iInterfaceSelector(NULL), + iResponseHandler(NULL), + iTimer(NULL), + iPlaybackUtility(NULL), + iEnabled(ETrue) +{ +} + +// --------------------------------------------------------------------------- +// ~MpMediaKeyHandlerPrivate() +// --------------------------------------------------------------------------- +// +MpMediaKeyHandlerPrivate::~MpMediaKeyHandlerPrivate() +{ + if ( iPlaybackUtility ) { + //TRAP_IGNORE( iPlaybackUtility->RemoveObserverL( *this ) ); + iPlaybackUtility->Close(); + } + + delete iResponseHandler; + delete iInterfaceSelector; + + if ( iTimer ) { + iTimer->Cancel(); + delete iTimer; + } + +} + +// --------------------------------------------------------------------------- +// init +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::init() +{ + TRAPD(err, DoInitL()); + if ( err != KErrNone ) { + emit q_ptr->errorOccured(err); + } + +} + +// --------------------------------------------------------------------------- +// setEnabled +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::setEnabled( bool enable ) +{ + iEnabled = enable; +} + +// --------------------------------------------------------------------------- +// From MRemConCoreApiTargetObserver +// A command has been received. +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::MrccatoCommand( + TRemConCoreApiOperationId aOperationId, + TRemConCoreApiButtonAction aButtonAct ) +{ + MPX_DEBUG3( "MpMediaKeyHandlerPrivate::MrccatoCommand(aOperationId=%d, aButtonAct=%d)", + aOperationId, aButtonAct ); + + switch ( aOperationId ) { + case ERemConCoreApiPausePlayFunction: + if ( aButtonAct == ERemConCoreApiButtonClick ) { + SendCommand( EPbCmdPlayPause ); + } + break; + case ERemConCoreApiPlay: + if ( aButtonAct == ERemConCoreApiButtonClick + || aButtonAct == ERemConCoreApiButtonPress ) { + SendCommand( EPbCmdPlay ); + } + break; + case ERemConCoreApiStop: + if ( aButtonAct == ERemConCoreApiButtonClick + || aButtonAct == ERemConCoreApiButtonPress ) { + SendCommand( EPbCmdStop ); + } + break; + case ERemConCoreApiPause: + if ( aButtonAct == ERemConCoreApiButtonClick + || aButtonAct == ERemConCoreApiButtonPress ) { + SendCommand( EPbCmdPause ); + } + break; + case ERemConCoreApiRewind: + switch ( aButtonAct ) { + case ERemConCoreApiButtonPress: + SendCommand( EPbCmdStartSeekBackward ); + break; + case ERemConCoreApiButtonRelease: + SendCommand( EPbCmdStopSeeking ); + break; + default: + break; + } + break; + case ERemConCoreApiFastForward: + switch ( aButtonAct ) { + case ERemConCoreApiButtonPress: + SendCommand( EPbCmdStartSeekForward ); + break; + case ERemConCoreApiButtonRelease: + SendCommand( EPbCmdStopSeeking ); + break; + default: + break; + } + break; + case ERemConCoreApiBackward: + if ( aButtonAct == ERemConCoreApiButtonClick ) { + SendCommand( EPbCmdPrevious ); + } + break; + case ERemConCoreApiForward: + if ( aButtonAct == ERemConCoreApiButtonClick ) { + SendCommand( EPbCmdNext ); + } + break; + case ERemConCoreApiVolumeUp: + iTimer->Cancel(); + iIncreaseVol = ETrue; + switch ( aButtonAct ) { + case ERemConCoreApiButtonPress: + //Start Timer + iTimer->Start( + KFirstTimerExpiryInterval, + KTimerExpiryInterval, + TCallBack( TimerCallback, this ) ); + break; + case ERemConCoreApiButtonClick: + SendCommand( EPbCmdIncreaseVolume ); + break; + case ERemConCoreApiButtonRelease: + default: + break; + } + break; + case ERemConCoreApiVolumeDown: + iTimer->Cancel(); + iIncreaseVol = EFalse; + switch ( aButtonAct ) { + case ERemConCoreApiButtonPress: + //Start Timer + iTimer->Start( + KFirstTimerExpiryInterval, + KTimerExpiryInterval, + TCallBack( TimerCallback, this ) ); + break; + case ERemConCoreApiButtonClick: + SendCommand( EPbCmdDecreaseVolume ); + break; + case ERemConCoreApiButtonRelease: + default: + break; + } + break; + default: + break; + } + iResponseHandler->CompleteAnyKey( aOperationId ); + +} + +// --------------------------------------------------------------------------- +// From MRemConCoreApiTargetObserver +// A 'play' command has been received. +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::MrccatoPlay( + TRemConCoreApiPlaybackSpeed aSpeed, + TRemConCoreApiButtonAction aButtonAct ) +{ + MPX_DEBUG2( "MpMediaKeyHandlerPrivate::MrccatoPlay(aButtonAct=%d)", aButtonAct ); + Q_UNUSED(aSpeed); + + if ( ( aButtonAct == ERemConCoreApiButtonClick ) || + ( aButtonAct == ERemConCoreApiButtonPress ) ) + { + SendCommand( EPbCmdPlay ); + } + iResponseHandler->CompleteAnyKey( ERemConCoreApiPlay ); + +} + +// --------------------------------------------------------------------------- +// From MRemConCoreApiTargetObserver +// A 'tune function' command has been received. +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::MrccatoTuneFunction( + TBool aTwoPart, + TUint aMajorChannel, + TUint aMinorChannel, + TRemConCoreApiButtonAction aButtonAct ) +{ + Q_UNUSED(aTwoPart); + Q_UNUSED(aMajorChannel); + Q_UNUSED(aMinorChannel); + Q_UNUSED(aButtonAct); + + iResponseHandler->CompleteAnyKey( ERemConCoreApiTuneFunction ); + +} + +// --------------------------------------------------------------------------- +// From MRemConCoreApiTargetObserver +// A 'select disk function' has been received. +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::MrccatoSelectDiskFunction( + TUint aDisk, + TRemConCoreApiButtonAction aButtonAct ) +{ + Q_UNUSED(aDisk); + Q_UNUSED(aButtonAct); + + iResponseHandler->CompleteAnyKey( ERemConCoreApiSelectDiskFunction ); + +} + +// --------------------------------------------------------------------------- +// From MRemConCoreApiTargetObserver +// A 'select AV input function' has been received. +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::MrccatoSelectAvInputFunction( + TUint8 aAvInputSignalNumber, + TRemConCoreApiButtonAction aButtonAct ) +{ + Q_UNUSED(aAvInputSignalNumber); + Q_UNUSED(aButtonAct); + + iResponseHandler->CompleteAnyKey( ERemConCoreApiSelectAvInputFunction ); + +} + +// --------------------------------------------------------------------------- +// From MRemConCoreApiTargetObserver +// A 'select audio input function' has been received. +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::MrccatoSelectAudioInputFunction( + TUint8 aAudioInputSignalNumber, + TRemConCoreApiButtonAction aButtonAct ) +{ + Q_UNUSED(aAudioInputSignalNumber); + Q_UNUSED(aButtonAct); + + iResponseHandler->CompleteAnyKey( ERemConCoreApiSelectAudioInputFunction ); + +} + +// --------------------------------------------------------------------------- +// From MMPXPlaybackCallback +// Handle playback property. +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::HandlePropertyL( + TMPXPlaybackProperty aProperty, + TInt aValue, + TInt aError ) +{ + MPX_FUNC( "MpMediaKeyHandlerPrivate::DoHandlePropertyL" ); + MPX_DEBUG4( "MpMediaKeyHandlerPrivate::HandlePropertyL - Property(%d); Value(%d); Error(%d)", aProperty, aValue, aError ); + + if ( KErrNone == aError ) { + switch ( aProperty ) { + case EPbPropertyVolume: + q_ptr->emit volumeChanged(aValue); + break; + case EPbPropertyPosition: + case EPbPropertyMaxVolume: + case EPbPropertyMute: + default: + break; + } + } + +} + +// --------------------------------------------------------------------------- +// From MMPXPlaybackCallback +// HandleSubPlayerNamesL +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::HandleSubPlayerNamesL( + TUid aPlayer, + const MDesCArray* aSubPlayers, + TBool aComplete, + TInt aError ) +{ + MPX_FUNC( "MpMediaKeyHandlerPrivate::HandleSubPlayerNamesL" ); + Q_UNUSED(aPlayer); + Q_UNUSED(aSubPlayers); + Q_UNUSED(aComplete); + Q_UNUSED(aError); + +} + +// --------------------------------------------------------------------------- +// From MMPXPlaybackCallback +// Handle media properties. +// Notes: The client is responsible for delete the object of aMedia. +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::HandleMediaL( + const CMPXMedia& aMedia, + TInt aError ) +{ + MPX_FUNC( "MpMediaKeyHandlerPrivate::DoHandleMediaL" ); + Q_UNUSED(aMedia); + Q_UNUSED(aError); + +} + +// --------------------------------------------------------------------------- +// DoInitL() +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::DoInitL() +{ + // Register to remote control framework + iInterfaceSelector = CRemConInterfaceSelector::NewL(); + CRemConCoreApiTarget *coreTarget = CRemConCoreApiTarget::NewL( *iInterfaceSelector, *this ); + CleanupStack::PushL( coreTarget ); + iInterfaceSelector->OpenTargetL(); + iResponseHandler = MpMediaKeyRemConResponse::NewL( *coreTarget ); + CleanupStack::Pop(coreTarget); + + // Timer for implementing repeat + iTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + + // Get the playback utility instance from engine. + iPlaybackUtility = MMPXPlaybackUtility::UtilityL( TUid::Uid(MpCommon::KMusicPlayerUid) ); + //iPlaybackUtility->AddObserverL( *this ); + + iEnabled = ETrue; +} + +// --------------------------------------------------------------------------- +// Send command to playback utility. +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::SendCommand( TMPXPlaybackCommand aCommandId ) +{ + MPX_FUNC( "MpMediaKeyHandlerPrivate::SendCommand" ); + TRAP_IGNORE( DoSendCommandL( aCommandId ) ); + +} + +// --------------------------------------------------------------------------- +// Send command to playback utility. +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::DoSendCommandL( TMPXPlaybackCommand aCommandId ) +{ + MPX_FUNC( "MpMediaKeyHandlerPrivate::DoFilterAndSendCommandL" ); + + if ( iEnabled ) + { + TMPXPlaybackState playerState( iPlaybackUtility->StateL() ); + + switch ( aCommandId ) { + case EPbCmdIncreaseVolume: + if ( EPbStatePlaying == playerState ) { + iPlaybackUtility->CommandL( EPbCmdIncreaseVolume ); + } + break; + case EPbCmdDecreaseVolume: + if ( EPbStatePlaying == playerState ) { + iPlaybackUtility->CommandL( EPbCmdDecreaseVolume ); + } + break; + default: + break; + } + } + +} + +// --------------------------------------------------------------------------- +// Callback for timer +// --------------------------------------------------------------------------- +// +TInt MpMediaKeyHandlerPrivate::TimerCallback( TAny* aPtr ) +{ + + static_cast( aPtr )->HandleRepeatEvent(); + + + return KErrNone; +} + +// --------------------------------------------------------------------------- +// Handle repeat event +// --------------------------------------------------------------------------- +// +void MpMediaKeyHandlerPrivate::HandleRepeatEvent() +{ + + if ( iIncreaseVol ) { + SendCommand( EPbCmdIncreaseVolume ); + } + else { + SendCommand( EPbCmdDecreaseVolume ); + } + +} +