diff -r 000000000000 -r 5f000ab63145 phoneuis/BubbleManager/Src/BMVideoController.cpp --- /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 +#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