videoeditorengine/audioeditorengine/src/ProcVisualizationAO.cpp
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/audioeditorengine/src/ProcVisualizationAO.cpp	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,203 @@
+/*
+* 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();
+    }
+