videoeditorengine/audioeditorengine/src/ProcVisualizationAO.cpp
author Mikael Laine <mikael.laine@ixonos.com>
Fri, 29 Jan 2010 14:08:33 +0200
changeset 0 951a5db380a0
permissions -rw-r--r--
Committing the Video Editor package under the Eclipse Public License

/*
* Copyright (c) 2010 Ixonos Plc.
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the "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:
* Ixonos Plc
*
* Description:  
*
*/



#include "ProcVisualizationAO.h"
#include "ProcVisProcessor.h"
#include "AudPanic.h"


void CProcVisualizationAO::RunL()
    {
    __ASSERT_DEBUG(iProcVisProcessor != 0, TAudPanic::Panic(TAudPanic::EInternal));
    __ASSERT_DEBUG(iObserver != 0, TAudPanic::Panic(TAudPanic::EInternal));
    
    if(iVisualizationState == EProcVisualizationIdle) 
        {
        TAudPanic::Panic(TAudPanic::EInternal);
        }
    
    else if (iVisualizationState == EProcGettingClipVisualization) 
        {
        
        TBool completed = EFalse;
        TInt progress = 0;
        TRAPD(err, completed = iProcVisProcessor->VisualizeClipPieceL(progress));
        
        if (err != KErrNone)
            {
            delete iProcVisProcessor;
            iProcVisProcessor = 0;
            
            MAudVisualizationObserver* observer = iObserver;
            iObserver = 0;
            iSize = 0;
            iVisualizationState = EProcVisualizationIdle;
            observer->NotifyClipInfoVisualizationCompleted(*iClipInfo, err, NULL, 0);
            }
        else if (completed)
            {
            TInt8* visualization = 0;
            TInt size = 0;
            TRAPD(err2, iProcVisProcessor->GetFinalVisualizationL(visualization, size));
            
            if (err2 != KErrNone)
                {
                MAudVisualizationObserver* observer = iObserver;
                iObserver = 0;
            
                if (visualization != 0) delete[] visualization;
                delete iProcVisProcessor;
                iProcVisProcessor = 0;
                iVisualizationState = EProcVisualizationIdle;
                
                observer->NotifyClipInfoVisualizationCompleted(*iClipInfo, err2, 0, 0);
                return;
                }
            
            delete iProcVisProcessor;
            iProcVisProcessor = 0;
            
            MAudVisualizationObserver* observer = iObserver;
            iObserver = 0;
            iSize = 0;
            iVisualizationState = EProcVisualizationIdle;

            // NOTE: the upper level application is responsible for releasing "visualization"
            observer->NotifyClipInfoVisualizationCompleted(*iClipInfo, KErrNone, visualization, size);
            }
        else
            {

            // progress is sent every 1 percent
            if (iPreviousProgressValue < progress)
                {
                iObserver->NotifyClipInfoVisualizationProgressed(*iClipInfo, progress);
                iPreviousProgressValue = progress;
                }

            SetActive();
            TRequestStatus* status = &iStatus;
            User::RequestComplete(status, KErrNone);
            }
        
        }
    }

void CProcVisualizationAO::DoCancel() 
    {

    // ref to observer should be reset before callback to avoid recursion
    MAudVisualizationObserver* observer = iObserver;
    iObserver = 0;
    // ref to clipInfo is good to reset before callback
    const CAudClipInfo* clipInfo = iClipInfo;
    iClipInfo = 0;
    // processor not needed and should not exist any more; a new processor will be created for next visualization
    delete iProcVisProcessor;
    iProcVisProcessor = 0;
    
    if ((observer != 0) && (iVisualizationState == EProcGettingClipVisualization))
        {
        // reset state
        iVisualizationState = EProcVisualizationIdle;

        // note! this callback at least at the time of writing deletes this object => no operations should be done after this call
        observer->NotifyClipInfoVisualizationCompleted(*clipInfo, KErrCancel, 0, 0);
        }
    }
   
CProcVisualizationAO* CProcVisualizationAO::NewL() 
    {
    CProcVisualizationAO* self = new (ELeave) CProcVisualizationAO();
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
    }

CProcVisualizationAO::~CProcVisualizationAO()
    {
    // cancel the active object; it also deletes or resets member variables
    Cancel();
    }
    

void CProcVisualizationAO::ConstructL() 
    {
    // nothing to do; iProcVisProcessor will be created when started
    }

CProcVisualizationAO::CProcVisualizationAO() : 
        CActive(0),
        iVisualizationState(EProcVisualizationIdle) 
        {

    CActiveScheduler::Add(this);

    }

void CProcVisualizationAO::StartClipVisualizationL(const CAudClipInfo* aClipInfo, TInt aSize,
                                                   MAudVisualizationObserver& aObserver, 
                                                   TInt aPriority) 
    {

    if (iVisualizationState != EProcVisualizationIdle || iClipInfo != 0) 
        {
        TAudPanic::Panic(TAudPanic::EVisualizationProcessAlreadyRunning);
        }

    iSize = aSize;
    iClipInfo = aClipInfo;
    iProcVisProcessor = CProcVisProcessor::NewL();
    
    iPreviousProgressValue = 0;


    TRAPD(err, iProcVisProcessor->VisualizeClipL(aClipInfo, aSize));

    if (err != KErrNone)
        {
        delete iProcVisProcessor;
        iProcVisProcessor = 0;
        aObserver.NotifyClipInfoVisualizationCompleted(*aClipInfo, err, 0, 0);
        User::Leave(err);
        }

    aObserver.NotifyClipInfoVisualizationStarted(*aClipInfo, KErrNone);

    iObserver = &aObserver;

    SetPriority(aPriority);
    SetActive();
    TRequestStatus* status = &iStatus;
    User::RequestComplete(status, KErrNone);

    iVisualizationState = EProcGettingClipVisualization;

    }




void CProcVisualizationAO::CancelVisualization() 
    {
    Cancel();
    }