diff -r 000000000000 -r 951a5db380a0 videoeditorengine/audioeditorengine/src/ProcVisualizationAO.cpp --- /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(); + } +