diff -r 000000000000 -r ed9695c8bcbe vtprotocolplugins/VideoSource/src/cmultiframeloopao.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vtprotocolplugins/VideoSource/src/cmultiframeloopao.cpp Mon Nov 23 14:47:47 2009 +0200 @@ -0,0 +1,233 @@ +/* +* Copyright (c) 2008 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 Source subsystem. +* +*/ + + +// INCLUDE FILES +#include "cmultiframeloopao.h" +#include "cmultiframeprovider.h" +#include "VSPanic.h" + +// MACROS + +#ifdef _DEBUG +# define __IF_DEBUG(t) {RDebug::t;} +#else +# define __IF_DEBUG(t) +#endif +// ============================ CMultiframeloopAO =============================== + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::CMultiframeloopAO( CMultiframeProvider* aRequester ) +// ----------------------------------------------------------------------------- +// +CMultiframeloopAO::CMultiframeloopAO( CMultiframeProvider* aRequester ) +: CActive( EPriorityLow ), iRequester( aRequester ), iFreeBMCount(0), iRequireStopping(EFalse) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::CMultiframeloopAO() >>"), RThread().Id().operator TUint())); + RThread me; + iThreadId = me.Id(); + CActiveScheduler::Add( this ); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::CMultiframeloopAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::~CMultiframeloopAO() +// ----------------------------------------------------------------------------- +// +CMultiframeloopAO::~CMultiframeloopAO() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::~CMultiframeloopAO() >>"), RThread().Id().operator TUint())); + Cancel(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::~CMultiframeloopAO() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::Signal( ) +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::Signal( ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::Signal() >>"), RThread().Id().operator TUint())); + iRequester->iAnimation = ETrue; + if ( !IsActive() ) + { + SetActive(); + TRequestStatus* pStatus = &iStatus; + RThread me; + if ( me.Id() == iThreadId ) + { + User::RequestComplete( pStatus, KErrNone ); + } + else + { + if ( me.Open( iThreadId ) == KErrNone ) + { + *pStatus = KRequestPending; + me.RequestComplete( pStatus, KErrNone ); + me.Close(); + } + else + { + Panic( EVSPanicThreadOpenFailure ); + } + } + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::Signal() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::RunL() +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::RunL() + { + iRequester->WaitForConverting(); + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() >>"), RThread().Id().operator TUint())); + + //stop loop ao + if (iRequireStopping) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() CANCEL CALLED,stop by flag"), RThread().Id().operator TUint())); + iRequireStopping = EFalse; + iRequester->ReleaseForConverting(); + return; + } + + // Cancel is handled in this way because + if ( iStatus == KErrCancel) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() CANCEL CALLED IN PROTO THREAD STOP LOOPPING"), RThread().Id().operator TUint())); + iRequester->ReleaseForConverting(); + return; + } + + //If free bitmaps proceed next frame + if ( iFreeBMCount > 0 ) + { + ++iIndex; + // Loop animation starting from first frame + if ( iIndex > iFramecount - 1 ) + { + iIndex = KFirstFrameIndx; + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() RunL index %d"), RThread().Id().operator TUint(), iIndex)); + iRequester->ConvertAndScaleL( iIndex ); + } + //Wait until free bitmaps to proceed + else + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() NO FREE BMs"), RThread().Id().operator TUint())); + iStatus = KRequestPending; + SetActive(); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RunL() <<"), RThread().Id().operator TUint())); + iRequester->ReleaseForConverting(); + } +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::RemoveFreeBitmaps() +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::RemoveFreeBitmaps( TInt aCount ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RemoveFreeBitmaps() >>"), RThread().Id().operator TUint())); + iFreeBMCount = iFreeBMCount - aCount; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::RemoveFreeBitmaps() frames %d <<"), RThread().Id().operator TUint(), aCount)); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::SetFreeBitmaps() +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::SetFreeBitmaps( TInt aCount ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::SetFreeBitmaps() >>"), RThread().Id().operator TUint())); + iFreeBMCount = iFreeBMCount + aCount; + if ( IsActive() && iStatus == KRequestPending) + { + TRequestStatus* pStatus = &iStatus; + User::RequestComplete( pStatus, KErrNone ); + } + + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::SetFreeBitmaps() frames %d <<"), RThread().Id().operator TUint(), aCount)); + } +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::SetFrameCount() +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::SetFrameCount( TInt aCount ) + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::SetFrameCount() >>"), RThread().Id().operator TUint())); + iFramecount = aCount; + iIndex = 0; + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::SetFrameCount() frames %d <<"), RThread().Id().operator TUint(), aCount)); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::CancelDataLoop() +// ----------------------------------------------------------------------------- +// + void CMultiframeloopAO::CancelDataLoop() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::CancelDataLoop() >>"), RThread().Id().operator TUint())); + if ( IsActive() ) + { + if ( iStatus == KRequestPending ) + { + RThread me; + if ( me.Id() == iThreadId ) + { + Cancel(); + } + else + { + if ( me.Open( iThreadId ) == KErrNone ) + { + TRequestStatus* pStatus = &iStatus; + *pStatus = KRequestPending; + me.RequestComplete( pStatus, KErrCancel ); + me.Close(); + } + else + { + Panic( EVSPanicThreadOpenFailure ); + } + } + } + else + { + iRequireStopping = ETrue; + } + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::CancelDataLoop() <<"), RThread().Id().operator TUint())); + } + +// ----------------------------------------------------------------------------- +// CMultiframeloopAO::DoCancel() +// ----------------------------------------------------------------------------- +// +void CMultiframeloopAO::DoCancel() + { + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::DoCancel() >>"), RThread().Id().operator TUint())); + if ( iStatus == KRequestPending ) + { + TRequestStatus* pStatus = &iStatus; + User::RequestComplete( pStatus, KErrCancel ); + } + __IF_DEBUG(Print(_L("VideoSource [%d]: CMultiframeloopAO::DoCancel() <<"), RThread().Id().operator TUint())); + } + +// End of File