diff -r ebe688cedc25 -r 7fdbb852d323 messagingappbase/msgeditor/mediacontrolsrc/MsgAudioControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/msgeditor/mediacontrolsrc/MsgAudioControl.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,373 @@ +/* +* Copyright (c) 2005 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: +* MsgEditor Audio media control - a Message Editor Base control. +* +*/ + + + +// INCLUDE FILES +#include "MsgAudioControl.h" + +#include +#include +#include // TMMSource + +#include + +#include "MsgFrameControl.h" // for FrameControl + +#include "MsgMediaControlLogging.h" + +// ========================================================== + +// EXTERNAL DATA STRUCTURES + +// EXTERNAL FUNCTION PROTOTYPES + +// CONSTANTS + +// MACROS + +// LOCAL CONSTANTS AND MACROS + +// MODULE DATA STRUCTURES + +// LOCAL FUNCTION PROTOTYPES + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CMsgAudioControl::CMsgAudioControl +// +// Constructor. +// --------------------------------------------------------- +// +CMsgAudioControl::CMsgAudioControl( MMsgBaseControlObserver& aBaseControlObserver, + TMdaPriority aPriority, + TMdaPriorityPreference aPreference ) : + CMsgMediaControl( aBaseControlObserver, EMsgComponentIdAudio, EMsgAudioControl ), + iPriority( aPriority ), + iPreference( aPreference ) + { + } + +// --------------------------------------------------------- +// CMsgAudioControl::ConstructL +// +// +// --------------------------------------------------------- +// +void CMsgAudioControl::ConstructL( CMsgEditorView& aParent, MMsgAsyncControlObserver* aObserver ) + { + BaseConstructL( aParent, aObserver ); + + SetRect( MsgEditorCommons::MsgDataPane() ); + } + + +// --------------------------------------------------------- +// CMsgAudioControl::NewL +// +// Two-phased constructor. +// --------------------------------------------------------- +// +EXPORT_C CMsgAudioControl* CMsgAudioControl::NewL( CMsgEditorView& aParent, + MMsgAsyncControlObserver* aObserver, + TMdaPriority aPriority, + TMdaPriorityPreference aPreference ) + { + CMsgAudioControl* self = new( ELeave ) CMsgAudioControl( aParent, aPriority, aPreference ); + + CleanupStack::PushL( self ); + self->ConstructL( aParent, aObserver ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------- +// CMsgAudioControl::~CMsgAudioControl +// +// Destructor +// --------------------------------------------------------- +// +CMsgAudioControl::~CMsgAudioControl() + { + delete iAudioPlayer; + + iAudioFile.Close(); + } + +// --------------------------------------------------------- +// CMsgAudioControl::SetAndGetSizeL +// +// Calculates and sets the size of the control and returns new size as +// reference aSize. +// --------------------------------------------------------- +// +void CMsgAudioControl::SetAndGetSizeL( TSize& aSize ) + { + // No need to change width + // Frame size is always larger than icon size + aSize.iHeight = iFrame->FrameSize().iHeight; + aSize.iHeight = iBaseLine * + ( ( aSize.iHeight + iBaseLine - 1 ) / iBaseLine ); + + SetSize( aSize ); + } + +// --------------------------------------------------------- +// CMsgAudioControl::Reset +// +// Empties the control. +// --------------------------------------------------------- +// +void CMsgAudioControl::Reset() + { + Close(); + + CMsgMediaControl::Reset(); + } + +// --------------------------------------------------------- +// CMsgAudioControl::SizeChanged +// +// Called when size is changed. +// --------------------------------------------------------- +// +void CMsgAudioControl::SizeChanged() + { + CMsgMediaControl::SizeChanged(); + + SetPosition( Rect().iTl ); + } + + +// --------------------------------------------------------- +// CMsgAudioControl::LoadL +// --------------------------------------------------------- +// +void CMsgAudioControl::LoadL( RFile& aFileHandle ) + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgAudioControl::LoadL()" ); + + iAudioFile.Close(); + User::LeaveIfError( iAudioFile.Duplicate( aFileHandle ) ); + + if ( !iAudioPlayer ) + { + iAudioPlayer = CMdaAudioPlayerUtility::NewL( *this, + iPriority, + iPreference ); + } + else + { + iAudioPlayer->Close(); + } + + TMMFileHandleSource mmSource( iAudioFile, iUniqueContentId ); + iAudioPlayer->OpenFileL( mmSource ); + + SetState( EMsgAsyncControlStateOpening ); + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgAudioControl::LoadL()" ); + } + +// --------------------------------------------------------- +// CMsgAudioControl::Cancel +// --------------------------------------------------------- +// +void CMsgAudioControl::Cancel() + { + if ( iState == EMsgAsyncControlStateOpening ) + { + iAudioPlayer->Close(); + SetState( EMsgAsyncControlStateIdle ); + } + } + +// --------------------------------------------------------- +// CMsgAudioControl::Play +// --------------------------------------------------------- +// +void CMsgAudioControl::PlayL() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgAudioControl::PlayL()" ); + + if ( iAudioPlayer ) + { + iAudioPlayer->Play(); + SetState( EMsgAsyncControlStatePlaying ); + } + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgAudioControl::PlayL()" ); + } + +// --------------------------------------------------------- +// CMsgAudioControl::Close +// --------------------------------------------------------- +// +void CMsgAudioControl::Close() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgAudioControl::Close()" ); + + if ( iAudioPlayer ) + { + iAudioPlayer->Close(); + delete iAudioPlayer; + iAudioPlayer = NULL; + } + + iAudioFile.Close(); + + SetState( EMsgAsyncControlStateIdle ); + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgAudioControl::Close()" ); + } + +// --------------------------------------------------------- +// CMsgAudioControl::Stop +// --------------------------------------------------------- +// +void CMsgAudioControl::Stop() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgAudioControl::Stop()" ); + + if ( iAudioPlayer ) + { + iAudioPlayer->Stop(); + SetState( EMsgAsyncControlStateStopped ); + } + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgAudioControl::Stop()" ); + } + +// --------------------------------------------------------- +// CMsgAudioControl::PauseL +// --------------------------------------------------------- +// +void CMsgAudioControl::PauseL() + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgAudioControl::PauseL()" ); + + if ( iAudioPlayer ) + { + User::LeaveIfError( iAudioPlayer->Pause() ); + SetState( EMsgAsyncControlStatePaused ); + } + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgAudioControl::PauseL()" ); + } + +// ========================================================= +// Callbacks from CMdaAudioPlayerUtility +// ========================================================= + +// --------------------------------------------------------- +// CMsgAudioControl::MapcInitComplete +// --------------------------------------------------------- +// +void CMsgAudioControl::MapcInitComplete( TInt aError, + const TTimeIntervalMicroSeconds& /*aDuration*/ ) + { + // Close the handle now + iAudioFile.Close(); + + // Needed so that audio controller won't consume DRM rights automatically. + MMMFDRMCustomCommand* customCommand = iAudioPlayer->GetDRMCustomCommand(); + if ( customCommand ) + { + customCommand->DisableAutomaticIntent( ETrue ); + } + + HandleCallback( aError, EFalse, EMsgAsyncControlStateReady ); + } + +// --------------------------------------------------------- +// CMsgAudioControl::MapcPlayComplete +// --------------------------------------------------------- +// +void CMsgAudioControl::MapcPlayComplete( TInt aError ) + { + HandleCallback( aError, ETrue , EMsgAsyncControlStateStopped ); + } + + +// --------------------------------------------------------- +// CMsgAudioControl::HandleCallback +// --------------------------------------------------------- +// +void CMsgAudioControl::HandleCallback( TInt aError, + TBool aDefaultStop, + TMsgAsyncControlState aNewState ) + { + MSGMEDIACONTROLLOGGER_ENTERFN( "MsgAudioControl::HandleCallback()" ); + MSGMEDIACONTROLLOGGER_WRITEF_ERROR_STATE( _L("CMsgAudioControl::HandleCallbackL: **aError: %d, CurrentState: %S"),aError, iState); + MSGMEDIACONTROLLOGGER_WRITEF_ERROR_STATE( _L("CMsgAudioControl::HandleCallbackL: **aError: %d, aNewState: %S"),aError, aNewState); + + iError = aError; + + // To simulate drm error, use e.g. -30100 + switch ( aError ) + { + case KErrNone: + { + SetState( aNewState ); + break; + } + case DRMCommon::EGeneralError: + case DRMCommon::EUnknownMIME: + case DRMCommon::EVersionNotSupported: + case DRMCommon::ESessionError: + // const TInt KErrCANoRights =-17452: + case DRMCommon::ENoRights: + case DRMCommon::ERightsDBCorrupted: + case DRMCommon::EUnsupported: + case DRMCommon::EInvalidRights: + // const TInt KErrCANoPermission =-17451: + case DRMCommon::ERightsExpired: + { + SetState( EMsgAsyncControlStateNoRights ); + break; + } + case KErrInUse: // To handle if head phone is removed from the jack while playing audio. + { + Stop(); + break; + } + case KErrNoMemory: + case KErrNotSupported: + case KErrCorrupt: + { + // These errors are always "fatal". + aDefaultStop = EFalse; + // Fall-through... + } + default: + { + if ( aDefaultStop ) + { + Stop(); + } + + SetState( EMsgAsyncControlStateCorrupt ); + } + } + + MSGMEDIACONTROLLOGGER_LEAVEFN( "MsgAudioControl::HandleCallback()" ); + } + +// End of File