messagingappbase/msgeditor/mediacontrolsrc/MsgAudioControl.cpp
changeset 0 72b543305e3a
child 25 fa1df4b99609
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/msgeditor/mediacontrolsrc/MsgAudioControl.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,368 @@
+/*
+* 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 <AudioPreference.h>
+#include <DRMCommon.h>
+#include <mmf/common/mmcaf.h>                      // TMMSource
+
+#include <MsgEditorCommon.h>
+
+#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 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