vtprotocolplugins/VideoSource/src/cmultiframeloopao.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 23 Nov 2009 14:47:47 +0200
changeset 0 ed9695c8bcbe
permissions -rw-r--r--
Revision: 200948

/*
* 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