phoneuis/BubbleManager/Src/BMVideoController.cpp
changeset 0 5f000ab63145
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/BubbleManager/Src/BMVideoController.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,568 @@
+/*
+* Copyright (c) 2007 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:  Video player controller.
+*
+*/
+
+
+// INCLUDES
+#include    <AudioPreference.h>
+#include    "BMVideoController.h"
+#include    "BMVideoPlayer.h"
+#include    "BMBubbleVideoContainer.h"
+#include    "BMVideoPlaybackObserver.h"
+#include    "BMTrace.h"
+
+// ======== LOCAL FUNCTIONS ========
+static CBubbleVideoPlayer::TRingingType ConvertRingingType(
+    CBubbleManager::TBubbleVideoPlayMode aRingingMode );    
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::ConstructL()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CBubbleVideoController::CBubbleVideoController(
+    CBubbleManager& aBubbleManager ) :
+    CActive( CActive::EPriorityStandard ),
+    iBubbleManager( aBubbleManager )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CBubbleVideoController* CBubbleVideoController::NewL(
+    CBubbleManager& aBubbleManager )
+    {
+    CBubbleVideoController* self = new( ELeave ) CBubbleVideoController( 
+        aBubbleManager );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    
+    return self;    
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CBubbleVideoController::~CBubbleVideoController()
+    {
+    Cancel();
+    
+    if ( iPlayer )
+        {
+        iPlayer->StopPlaying();
+        }
+    
+    Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// Reset
+// ---------------------------------------------------------------------------
+//    
+void CBubbleVideoController::Reset()
+    {
+    delete iPlayer;
+    iPlayer = NULL;
+    delete iContainer;
+    iContainer = NULL;
+    delete iFileName;    
+    iFileName = NULL;
+    iVolumeLevel = 0;
+    iObserver = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// PrepareToPlayVideo
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::PrepareToPlayVideo( 
+    const TDesC& aFileName,
+    CBubbleManager::TBubbleVideoPlayMode aPlayMode,
+    TInt aVolumeLevel,
+    TBool aArbitraryScaling,
+    MBubbleVideoPlaybackObserver* aObserver )
+    {
+    delete iFileName;
+    iFileName = aFileName.Alloc();
+    iPlayMode = aPlayMode;
+    iVolumeLevel = aVolumeLevel;
+    iArbitraryScaling = aArbitraryScaling;
+    iObserver = aObserver;
+    }
+
+// ---------------------------------------------------------------------------
+// CreatePlayerAndPlay
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::CreatePlayerAndPlay()
+    {
+    BUBBLE_PRINT("VideoCtrl::Play>");
+    TRAPD( err, DoPlayL() );
+   
+    if ( err != KErrNone )
+        {
+        ReportErrorAsync( MBubbleVideoPlaybackObserver::EPlayerInitFailure,
+                          err );            
+        }
+    BUBBLE_PRINTF("VideoCtrl::Play<:", err );                        
+    }
+
+// ---------------------------------------------------------------------------
+// StopAndDeleteVideoPlayer
+// ---------------------------------------------------------------------------
+//    
+void CBubbleVideoController::StopAndDeletePlayer()
+    {
+    BUBBLE_PRINT("VideoCtrl::StopAndDel");
+    if ( iPlayer )
+        {
+        iPlayer->StopPlaying();
+        }
+    // To delete player.
+    Reset();
+    }
+    
+// ---------------------------------------------------------------------------
+// Stop
+// ---------------------------------------------------------------------------
+//    
+void CBubbleVideoController::StopPlaying()
+    {
+    BUBBLE_PRINT("VideoCtrl::Stop");
+    if ( iPlayer )
+        {
+        iPlayer->StopPlaying();
+        }
+    }    
+
+// ---------------------------------------------------------------------------
+// Mute
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::MutePlaying()
+    {
+    BUBBLE_PRINT("VideoCtrl::Mute");
+    if ( iPlayer )
+        {
+        iPlayer->MuteAudio();    
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// HandleLayoutChange
+// ---------------------------------------------------------------------------
+//    
+void CBubbleVideoController::HandleLayoutChange()
+    {
+    BUBBLE_PRINT("VideoCtrl::HLC>");
+    if ( iPlayer && ( iPlayer->State() >= CBubbleVideoPlayer::EVideoReady ) )
+        {
+        BUBBLE_PRINT("VideoCtrl::HLC>1");
+        iPlayer->PausePlaying();
+        EnableRedraws();    
+        LayoutContainer();
+        if ( iArbitraryScaling )
+            {
+            iPlayer->AdjustToWindow2( iContainer->GetWindow() );     
+            }
+        else
+            {
+            iPlayer->AdjustToWindow( iContainer->GetWindow(), 
+                                     iUncropPane,
+                                     EFalse );    
+            }            
+        iContainer->DrawNow();
+        DisableRedraws();
+        iPlayer->ResumePlaying();
+        }
+    else if ( iContainer )
+        {
+        BUBBLE_PRINT("VideoCtrl::HLC>2");
+        LayoutContainer();    
+        }
+    BUBBLE_PRINT("VideoCtrl::HLC<");                
+    }
+    
+// ---------------------------------------------------------------------------
+// SetQcifVideoRects
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::SetQcifVideoPaneRects(
+    const TRect& aVideoPane,
+    const TRect& aUncropPane )
+    {
+    iVideoPaneRectQcif = aVideoPane;
+    iUncropPaneRectQcif = aUncropPane;
+    }
+    
+// ---------------------------------------------------------------------------
+// SetSubQcifVideoRects
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::SetSubQcifVideoPaneRects(
+    const TRect& aVideoPane,
+    const TRect& aUncropPane )
+    {
+    iVideoPaneRectSubQcif = aVideoPane;
+    iUncropPaneRectSubQcif = aUncropPane;   
+    }    
+                            
+// ---------------------------------------------------------------------------
+// SetVideoPaneBackgroundFrame
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::SetVideoPaneBackgroundFrame( 
+    const TAknsItemID& aFrameId,
+    const TRect& aOuterRect,
+    const TRect& aInnerRect )
+    {
+    TBool skinChanged = ( aFrameId == iBgFrameId ) ? EFalse : ETrue;
+    
+    iBgFrameId = aFrameId;
+    iBgFrameOuterRect = aOuterRect;
+    iBgFrameInnerRect = aInnerRect;
+    
+    if ( iContainer && skinChanged )
+        {
+        UpdateContainerBackground();
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// ConvertRingingType
+// ---------------------------------------------------------------------------
+//    
+CBubbleVideoPlayer::TRingingType ConvertRingingType(
+    CBubbleManager::TBubbleVideoPlayMode aRingingMode )
+    {
+    CBubbleVideoPlayer::TRingingType aRingingType
+        = CBubbleVideoPlayer::ETypeRinging; 
+    
+    switch ( aRingingMode )
+        {
+        case CBubbleManager::EPlayInLoop:
+            aRingingType = CBubbleVideoPlayer::ETypeRinging;
+            break;
+        case CBubbleManager::EPlayAscending:
+            aRingingType = CBubbleVideoPlayer::ETypeAscending;
+            break;
+        case CBubbleManager::EPlayOnce:
+            aRingingType = CBubbleVideoPlayer::ETypeRingingOnce;
+            break;
+        default:
+            break;
+        }
+    
+    return aRingingType;
+    }    
+
+// ---------------------------------------------------------------------------
+// DoPlayL
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::DoPlayL()
+    {
+    if ( !iContainer )
+        {
+        // Create container window for video playback
+        iContainer = CBubbleVideoContainer::NewL( &iBubbleManager ); 
+        LayoutContainer();
+        // Container window is set visible just before play. 
+        iContainer->MakeVisible( EFalse );
+        iContainer->ActivateL();
+        }
+    
+    // Create video player
+    delete iPlayer;
+    iPlayer = NULL;
+    iPlayer = CBubbleVideoPlayer::NewL( 
+              *iFileName,
+              KAudioPriorityPhoneCall, 
+              KAudioPrefIncomingCall,
+              *this, 
+              iContainer->GetWindow() );
+
+    // Play
+    iPlayer->Play( ConvertRingingType(iPlayMode), iVolumeLevel );
+    }
+
+// ---------------------------------------------------------------------------
+// LayoutContainer
+// ---------------------------------------------------------------------------
+//    
+void CBubbleVideoController::LayoutContainer()
+    {
+    if ( !iContainer )
+        {
+        return;    
+        }
+    
+    CBubbleVideoPlayer::TVideoResolution resolution =
+        CBubbleVideoPlayer::EVideoQCIF; 
+    if ( iPlayer && 
+         ( iPlayer->State() >= CBubbleVideoPlayer::EVideoReady ) )
+        {
+        resolution = iPlayer->VideoResolution();    
+        }
+        
+    TPoint offset = iBubbleManager.PositionRelativeToScreen();
+    if ( resolution == CBubbleVideoPlayer::EVideoSubQCIF &&
+         !iArbitraryScaling )
+        {
+        iContainer->SetRect( iVideoPaneRectSubQcif );
+        iUncropPane = iUncropPaneRectSubQcif;
+        iUncropPane.Move( offset );
+        }
+    else
+        {
+        iContainer->SetRect( iVideoPaneRectQcif );
+        iUncropPane = iUncropPaneRectQcif;
+        iUncropPane.Move( offset );
+        }        
+    
+    UpdateContainerBackground();
+    }
+    
+// ---------------------------------------------------------------------------
+// UpdateContainerBackground
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::UpdateContainerBackground()
+    {
+    // Set relative to container position
+    TPoint cntPosition = iContainer->Position();
+    TRect outerCntRect( iBgFrameOuterRect );
+    TRect innerCntRect( iBgFrameInnerRect );
+    outerCntRect.Move( -cntPosition );
+    innerCntRect.Move( -cntPosition );
+    iContainer->SetBackgroundFrame( iBgFrameId, 
+                                    outerCntRect, 
+                                    innerCntRect );    
+    }
+    
+// ---------------------------------------------------------------------------
+// ReportErrorAsync
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::ReportErrorAsync(
+    MBubbleVideoPlaybackObserver::TBubbleVideoPlaybackError aErrorType,
+    TInt aErrorCode )
+    {
+    BUBBLE_PRINT("VideoCtrl::RErrA");
+    Cancel();
+    iState = EReportingError;
+    iErrorType = aErrorType;
+    iErrorCode = aErrorCode;
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );
+    SetActive();    
+    }
+    
+// ---------------------------------------------------------------------------
+// ReportEventAsync
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::ReportEventAsync(
+    MBubbleVideoPlaybackObserver::TBubbleVideoPlaybackEvent aEvent )
+    {
+    BUBBLE_PRINT("VideoCtrl::REvnA");
+    Cancel();
+    iState = EReportingEvent;
+    iEventCode = aEvent;
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );
+    SetActive();    
+    }    
+
+
+// ---------------------------------------------------------------------------
+// From class MBubbleVideoPlayerObserver.
+// HandleVideoPlayerError
+// ---------------------------------------------------------------------------
+// 
+void CBubbleVideoController::HandleVideoPlayerError( 
+    TBubbleVideoPlayerErrorEvent aEvent,
+    TInt aError )
+    {
+    BUBBLE_PRINTF("VideoCtrl::HVPE.evn:", aEvent );
+    BUBBLE_PRINTF("VideoCtrl::HVPE.err:", aError );
+    switch( aEvent )
+        {
+        case EVideoPlayerInitializingFailure:
+            ReportErrorAsync( 
+                MBubbleVideoPlaybackObserver::EPlayerInitFailure, aError );    
+            break;
+        case EVideoPlayerPlayingFailure:
+            ReportErrorAsync( 
+                MBubbleVideoPlaybackObserver::EPlaybackFailure, aError );
+            break;
+        default:
+            break;            
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class MBubbleVideoPlayerObserver.
+// HandleVideoPlayerInitComplete
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::HandleVideoPlayerInitComplete()
+    {
+    BUBBLE_PRINT("VideoCtrl::HVPInitComp");
+    if ( iObserver )
+        {
+        ReportEventAsync( 
+            MBubbleVideoPlaybackObserver::EPlayerInitComplete );
+        }
+    
+    if ( iArbitraryScaling )
+        {
+        iPlayer->AdjustToWindow2( iContainer->GetWindow() );    
+        }
+    else
+        {
+        if ( iPlayer->VideoResolution() == CBubbleVideoPlayer::EVideoSubQCIF  )
+            {
+            // relayout for subqcif
+            LayoutContainer();    
+            }
+        iPlayer->AdjustToWindow( iContainer->GetWindow(), 
+                                 iUncropPane,
+                                 iArbitraryScaling );               
+        }
+    
+    // Make container visible before playin starts.
+    iContainer->MakeVisible( ETrue );
+     // Draw container now to prevent playback time redraw event.
+    iContainer->DrawNow();
+    DisableRedraws(); 
+    }
+
+// ---------------------------------------------------------------------------
+// From class MBubbleVideoPlayerObserver.
+// HandleVideoPlayerPlayingComplete
+// ---------------------------------------------------------------------------
+// 
+void CBubbleVideoController::HandleVideoPlayerPlayingComplete()
+    {
+    BUBBLE_PRINT("VideoCtrl::HVPPlayComp");
+    if ( iObserver )
+        {
+        ReportEventAsync(
+            MBubbleVideoPlaybackObserver::EPlayingComplete );    
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class MBubbleVideoPlayerObserver.
+// HandleVideoPlayerPlayingComplete
+// ---------------------------------------------------------------------------
+//    
+void CBubbleVideoController::HandleVideoPlayerBlittingAreaDefined( 
+    const TRect& aBlitRect )
+    {
+    if ( iArbitraryScaling )
+        {
+        TPoint offset = iBubbleManager.PositionRelativeToScreen();
+        TRect containerRect( aBlitRect );
+        containerRect.Move( -offset );
+        iContainer->SetRect( containerRect );    
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class CActive.
+// RunL
+// ---------------------------------------------------------------------------
+//    
+void CBubbleVideoController::RunL()
+    {
+    BUBBLE_PRINT("VideoCtrl::RunL");
+    switch ( iState )    
+        {
+        case EReportingError:
+            if ( iObserver )
+                {
+                EnableRedraws();
+                iObserver->HandleBubbleVideoPlaybackError( 
+                    iErrorType, iErrorCode );                        
+                }
+            break;
+        case EReportingEvent:
+            if ( iObserver )
+                {
+                iObserver->HandleBubbleVideoPlaybackEvent( 
+                    iEventCode );                        
+                }
+            break;            
+        default:
+            break;            
+        }
+    
+    iState = EIdle;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CActive.
+// DoCancel
+// ---------------------------------------------------------------------------
+//        
+void CBubbleVideoController::DoCancel()
+    {
+    // Request is completed immediately before SetActive.
+    }
+
+// ---------------------------------------------------------------------------
+// EnableRedraws
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::EnableRedraws()
+    {
+    iContainer->SetRedrawDisabled( EFalse );    
+    }
+
+// ---------------------------------------------------------------------------
+// DisableRedraws
+// ---------------------------------------------------------------------------
+//
+void CBubbleVideoController::DisableRedraws()
+    {
+    if ( iArbitraryScaling )    
+        {
+        // Container is covered entirely by video only
+        // when arbitrary scaling is supported.
+        iContainer->SetRedrawDisabled( ETrue );    
+        }    
+    }
+
+// End of File