videditor/ManualVideoEditor/src/VeiCutAudioView.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 FILES
// System includes
#include <aknviewappui.h>
#include <avkon.hrh>
#include <manualvideoeditor.rsg>
#include <VedAudioClipInfo.h>

#include <akntitle.h> 
#include <barsread.h>
#include <stringloader.h> 
#include <aknnotewrappers.h>
#include <aknquerydialog.h>
#include <aknnavide.h>
#include <eikbtgpc.h>
#include <eikmenub.h>
#include <eikmenup.h>
#include <eikprogi.h>
#include <apparc.h>
#include <aknselectionlist.h>

//User includes
#include "VeiAppUi.h"
#include "VeiCutAudioView.h"
#include "VeiCutAudioContainer.h" 
#include "ManualVideoEditor.hrh"
#include "VeiTimeLabelNavi.h"
#include "VideoEditorCommon.h"
#include "VeiVideoEditorSettings.h"
#include "VeiErrorUi.h"

CVeiCutAudioView* CVeiCutAudioView::NewL()
    {
    CVeiCutAudioView* self = CVeiCutAudioView::NewLC();
    CleanupStack::Pop( self );

    return self;
    }


CVeiCutAudioView* CVeiCutAudioView::NewLC()
    {
    CVeiCutAudioView* self = new (ELeave) CVeiCutAudioView();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }

CVeiCutAudioView::CVeiCutAudioView()
    {
    }

void CVeiCutAudioView::ConstructL()
    {
    BaseConstructL( R_VEI_CUT_AUDIO_VIEW );

    CEikStatusPane* sp = StatusPane();

    iNaviPane = (CAknNavigationControlContainer*) sp->ControlL(
            TUid::Uid(EEikStatusPaneUidNavi));

    iTimeNavi = CreateTimeLabelNaviL();
    iTimeNavi->SetMopParent( this );

    iVolumeNavi = iNaviPane->CreateVolumeIndicatorL(
            R_AVKON_NAVI_PANE_VOLUME_INDICATOR );

    iErrorUI = CVeiErrorUI::NewL( *iCoeEnv );   
    
    iTimeUpdater = CPeriodic::NewL( CActive::EPriorityLow );
    iVolumeHider = CPeriodic::NewL( CActive::EPriorityLow );
    }

// ---------------------------------------------------------
// CVeiCutAudioView::~CVeiCutAudioView()
// ?implementation_description
// ---------------------------------------------------------
//
CVeiCutAudioView::~CVeiCutAudioView()
    {
    if ( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        delete iContainer;
        iContainer = 0;
        }
    if ( iTimeUpdater )
        {
        iTimeUpdater->Cancel();
        delete iTimeUpdater;
        }
    if ( iVolumeHider )
        {
        iVolumeHider->Cancel();
        delete iVolumeHider;
        }

    if ( iErrorUI )
        {
        delete iErrorUI;
        }

    delete iVolumeNavi;

    delete iTimeNavi;
    
    delete iCallBack;
    }


void CVeiCutAudioView::DynInitMenuPaneL( TInt aResourceId,CEikMenuPane* aMenuPane )
    {
    TInt state = iContainer->State();

    if (aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU_CLEAR_MARKS)
        {
        // delet in, out, in & out as necessary.

        if (iMovie->AudioClipCutInTime(iIndex) <= TTimeIntervalMicroSeconds(0)) 
            {
            aMenuPane->SetItemDimmed(EVeiCmdCutVideoViewClearMarksIn, ETrue);
            }
        if (iMovie->AudioClipCutOutTime(iIndex) >= iMovie->AudioClipInfo(iIndex)->Duration() ) 
            {
            aMenuPane->SetItemDimmed(EVeiCmdCutVideoViewClearMarksOut, ETrue);
            }
        if (!((iMovie->AudioClipCutOutTime(iIndex) < iMovie->AudioClipInfo(iIndex)->Duration())
            && (iMovie->AudioClipCutInTime(iIndex) > TTimeIntervalMicroSeconds(0))))
            {
            aMenuPane->SetItemDimmed(EVeiCmdCutVideoViewClearMarksInOut, ETrue);
            }
        }

    if ( aResourceId == R_VEI_CUT_VIDEO_VIEW_MENU )
        {
        aMenuPane->SetItemDimmed( EVeiCmdCutVideoTakeSnapshot, ETrue );

        if ( iPopupMenuOpened != EFalse )
            {
            aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewClearMarks, ETrue );
            aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewHelp, ETrue );
            }

        if ( ( iMovie->AudioClipCutInTime( iIndex ) == TTimeIntervalMicroSeconds( 0 ) && 
            iMovie->AudioClipCutOutTime( iIndex ) == iMovie->AudioClipInfo( iIndex )->Duration() ) )
            {
            aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewPlayMarked );
            }
        if ( state != CVeiCutAudioContainer::EStatePlayingMenuOpen && 
            state != CVeiCutAudioContainer::EStatePaused )
            {
            aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewContinue );
            }
        if ( ( state == CVeiCutAudioContainer::EStateStopped ) ||
             ( state == CVeiCutAudioContainer::EStateStoppedInitial ) )
            {
            aMenuPane->DeleteMenuItem( EVeiCmdCutVideoViewStop );
            }

        if ( ( iMovie->AudioClipCutOutTime( iIndex ) >= iMovie->AudioClipInfo( iIndex )->Duration() ) &&
            ( iMovie->AudioClipCutInTime( iIndex ) <= TTimeIntervalMicroSeconds( 0 ) ) ) 
            {
            aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewClearMarks, ETrue );
            }
        if ( state == CVeiCutAudioContainer::EStatePaused )
            {
            aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewPlay, ETrue  );
            }
        if ( state == CVeiCutAudioContainer::EStateStoppedInitial )
            {
            //aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewMarkIn, ETrue );
            //aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewMarkOut, ETrue );    
            }
        }

    if ( aResourceId != R_VEI_CUT_VIDEO_VIEW_MENU )
        return;


    if ( ( state != CVeiCutAudioContainer::EStateStopped ) && 
        ( state != CVeiCutAudioContainer::EStateStoppedInitial ) &&
        ( state != CVeiCutAudioContainer::EStatePaused ) )
        {
        aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewPlay, ETrue  );
        aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewMarkIn, ETrue  );
        aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewMarkOut, ETrue  ); 
        }
    else
        {
        if ( iContainer->PlaybackPositionL() <= iMovie->AudioClipCutInTime( iIndex ) )
            {
            aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewMarkOut, ETrue );  
            }
        else 
            {
            if ( iContainer->PlaybackPositionL() >= iMovie->AudioClipCutOutTime( iIndex ) )
                {
                aMenuPane->SetItemDimmed( EVeiCmdCutVideoViewMarkIn, ETrue );
                }
            }
        }

    }

TUid CVeiCutAudioView::Id() const
    {
    return TUid::Uid( EVeiCutAudioView );
    }

void CVeiCutAudioView::HandleCommandL(TInt aCommand)
    {   
    switch ( aCommand )
        {
        case EAknSoftkeyOk:
            {
            iPopupMenuOpened = ETrue;
            if (iContainer->State() == CVeiCutAudioContainer::EStatePlaying) 
                {
                PausePreviewL();
                iContainer->SetStateL(CVeiCutAudioContainer::EStatePlayingMenuOpen);
                }

            MenuBar()->TryDisplayMenuBarL();
            if (iContainer->State() == CVeiCutAudioContainer::EStatePlayingMenuOpen) 
                {
                iContainer->SetStateL(CVeiCutAudioContainer::EStatePaused);
                }
            iPopupMenuOpened = EFalse;
            break;
            }       
        case EVeiCmdCutVideoViewDone:
        case EVeiCmdCutVideoViewBack:
        case EAknSoftkeyBack:
            {
            iContainer->CloseStreamL();

            StopNaviPaneUpdateL();

            // Activate Edit Video view
            AppUi()->ActivateLocalViewL( TUid::Uid(EVeiEditVideoView) );
            break;
            }

        case EVeiCmdCutVideoViewMarkIn:
            {
            MarkInL();
            break;
            }
        case EVeiCmdCutVideoViewMarkOut:
            {
            MarkOutL();
            break;
            }
        case EVeiCmdCutVideoViewClearMarksInOut:
            {
            ClearInOutL( ETrue, ETrue );
            break;
            }
        case EVeiCmdCutVideoViewClearMarksIn:
            {
            ClearInOutL( ETrue, EFalse );
            break;
            }
        case EVeiCmdCutVideoViewClearMarksOut:
            {
            ClearInOutL( EFalse, ETrue );
            break;
            }
        case EVeiCmdCutVideoViewPlayMarked:
            {
            STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
                SetPauseIconVisibilityL( EFalse );
            PlayMarkedL();
            break;
            }
        case EVeiCmdCutVideoViewPlay:
            {
            STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
                SetPauseIconVisibilityL( EFalse );
            iNaviPane->PushL( *iTimeNavi );
            
            PlayPreviewL();
            break;
            }
        case EVeiCmdCutVideoViewStop:
            {
            STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
                SetPauseIconVisibilityL( EFalse );
            iNaviPane->PushL( *iTimeNavi );
            iContainer->StopL();
            StopNaviPaneUpdateL();
            break;
            }
        case EVeiCmdCutVideoViewContinue:
            {
            STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
                SetPauseIconVisibilityL( EFalse );
            iNaviPane->PushL( *iTimeNavi );
            PlayPreviewL();
            break;
            }
        case EVeiCmdCutVideoVolumeDown:
            {
            if ( !iAudioMuted )
                {
                VolumeDownL();
                }
            break;
            }
        case EVeiCmdCutVideoVolumeUp:
            {
            if ( !iAudioMuted )
                {
                VolumeUpL();    
                }
            break;
            }
        //
        // Options->Help
        //
        case EVeiCmdCutVideoViewHelp:
            {
            // CS Help launching is handled in Video Editor's AppUi.
            AppUi()->HandleCommandL( EVeiCmdCutVideoViewHelp );
            break;
            }
        default:
            {
            AppUi()->HandleCommandL( aCommand );
            break;
            }
        }
    }


void CVeiCutAudioView::DoActivateL(
   const TVwsViewId& /*aPrevViewId*/,TUid /*aCustomMessageId*/,
   const TDesC8& /*aCustomMessage*/)
    {

    if (!iContainer)
        {
        iContainer = CVeiCutAudioContainer::NewL( AppUi()->ClientRect(), *this, *iErrorUI );
        iContainer->SetMopParent( this );
        AppUi()->AddToStackL( *this, iContainer );
        }

    CEikStatusPane *statusPane = ( ( CAknAppUi* )iEikonEnv->EikAppUi() )->StatusPane(); 
    
    CAknTitlePane* titlePane = (CAknTitlePane*) statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) );
    TResourceReader reader1;
    iCoeEnv->CreateResourceReaderLC( reader1, R_VEI_CUTAUDIO_VIEW_TITLE_NAME );
    titlePane->SetFromResourceL( reader1 );
    CleanupStack::PopAndDestroy(); //reader1

    iNaviPane->PushL( *iTimeNavi );
    
    iAudioMuted = EFalse;

    STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->
        SetVolumeIconVisibilityL( ETrue );
    STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
            SetPauseIconVisibilityL( EFalse );
    
    iContainer->SetInTimeL( iMovie->AudioClipCutInTime( iIndex ) );
    iContainer->SetOutTimeL( iMovie->AudioClipCutOutTime( iIndex ) );
    iContainer->SetDuration( iMovie->AudioClipInfo( iIndex )->Duration() );
    
    // <testing>
/*  TTimeIntervalMicroSeconds time1 = iMovie->AudioClipInfo( iIndex )->Duration();
    TTimeIntervalMicroSeconds time2 = iMovie->AudioClipCutInTime( iIndex );
    TTimeIntervalMicroSeconds time3 = iMovie->AudioClipCutOutTime( iIndex );    
    TTimeIntervalMicroSeconds time4 = iMovie->AudioClipStartTime( iIndex );
    TTimeIntervalMicroSeconds time5 = iMovie->AudioClipEndTime( iIndex );
    TTimeIntervalMicroSeconds time6 = iMovie->AudioClipEditedDuration( iIndex );
    TTimeIntervalMicroSeconds time7(time3.Int64() - time2.Int64());
    TTimeIntervalMicroSeconds time8(time5.Int64() - time4.Int64());
*/  // </testing>

    // Start processing the file asynchronously. This is needed because
    // CVeiCutAudioContainer::OpenAudioFileL launches a progress dialog.
    // If it is called syncronously the previous view deactivation has 
    // not completed, and view shutter dismisses the progress dialog...
    if (! iCallBack)
        {       
        TCallBack cb (CVeiCutAudioView::AsyncOpenAudioFile, this);
        iCallBack = new (ELeave) CAsyncCallBack(cb, CActive::EPriorityStandard);
        }
    iCallBack->CallBack();

    iOriginalCutInTime = iMovie->AudioClipCutInTime( iIndex );
    
    DrawTimeNaviL();

    iErrorNmb = 0;      
    }

// ---------------------------------------------------------
// CVeiCutAudioView::AsyncOpenAudioFile
// ?implementation_description
// ---------------------------------------------------------
//
TInt CVeiCutAudioView::AsyncOpenAudioFile(TAny* aThis)
    {
    LOG( KVideoEditorLogFile, "CVeiCutAudioView::AsyncOpenAudioFile");

    // In the asynchronous version, trap the rest of the functions 
    // to make sure that the caller's TRequestStatus is always 
    // completed, also in case of failures.
    CVeiCutAudioView* view = static_cast<CVeiCutAudioView*>(aThis);
    TRAPD(err, view->OpenAudioFileL() );

    if (err)
        {
        // Display error message here, otherwise it would be quietly ignored.
        TBuf<256> unused;
        view->AppUi()->HandleError(err, SExtendedError(), unused, unused);
        }

    return err;
    }

// ---------------------------------------------------------
// CVeiCutAudioView::OpenAudioFileL()
// ?implementation_description
// ---------------------------------------------------------
//
void CVeiCutAudioView::OpenAudioFileL()
    {
    TFileName audioClipFileName = iMovie->AudioClipInfo( iIndex )->FileName();
    iContainer->OpenAudioFileL( audioClipFileName );
    }

// ---------------------------------------------------------
// CVeiCutAudioView::DoDeactivate()
// ?implementation_description
// ---------------------------------------------------------
//
void CVeiCutAudioView::DoDeactivate()
   {  
    iNaviPane->Pop( iVolumeNavi );

    if ( iTimeUpdater )
        {
        iTimeUpdater->Cancel();
        }
    if ( iVolumeHider )
        {
        iVolumeHider->Cancel();
        }
    if ( iContainer )
        {
        iNaviPane->Pop( iTimeNavi );
        AppUi()->RemoveFromViewStack( *this, iContainer );

        delete iContainer;
        iContainer = NULL;
        }

    }

void CVeiCutAudioView::SetVideoClipAndIndex( CVedMovie& aVideoClip, TInt aIndex )
    {
    iMovie = &aVideoClip;

    iIndex = aIndex;
    }

void CVeiCutAudioView::PlayPreviewL()
    {
    iPlayMarked = EFalse;
    StartNaviPaneUpdateL();
    iContainer->PlayL();
    }

void CVeiCutAudioView::PausePreviewL()
    {
    STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
        SetPauseIconVisibilityL( ETrue );
    StopNaviPaneUpdateL();
    iContainer->PauseL();
    }

void CVeiCutAudioView::UpdateCBAL(TInt aState)
    {
    switch (aState)
        {
        case CVeiCutAudioContainer::EStateInitializing:
        case CVeiCutAudioContainer::EStateOpening:
            {
            Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_EMPTY); 
            break;
            }
        case CVeiCutAudioContainer::EStateStoppedInitial:
            {           
            if ( ( iMovie->AudioClipCutInTime( iIndex ) == TTimeIntervalMicroSeconds( 0 ) ) &&
                 ( iMovie->AudioClipCutOutTime( iIndex ) == iMovie->AudioClipInfo(iIndex)->Duration() ) )
                {       
                Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_BACK);   
                }
            else
                {                                                               
                Cba()->SetCommandSetL(R_VEI_SOFTKEYS_OPTIONS_DONE);             
                }
            break;          
            }
        case CVeiCutAudioContainer::EStatePaused:
        case CVeiCutAudioContainer::EStateStopped:
            {
            if ( ( iMovie->AudioClipCutInTime( iIndex ) == TTimeIntervalMicroSeconds( 0 ) ) &&
                 ( iMovie->AudioClipCutOutTime( iIndex ) == iMovie->AudioClipInfo(iIndex)->Duration() ) )
                {       
                Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_BACK);   
                }
            else
                {                                                               
                Cba()->SetCommandSetL(R_VEI_SOFTKEYS_OPTIONS_DONE);             
                }
            break;
            }
        case CVeiCutAudioContainer::EStatePlaying:
            {

            if ( iContainer->PlaybackPositionL() < iMovie->AudioClipCutInTime( iIndex ) )
                {
                Cba()->SetCommandSetL( R_VEI_SOFTKEYS_IN_EMPTY ); 
                iMarkState = EMarkStateIn;
                }
            else if ( iContainer->PlaybackPositionL() < iMovie->AudioClipCutOutTime( iIndex ) )
                {
                Cba()->SetCommandSetL( R_VEI_SOFTKEYS_IN_OUT ); 
                iMarkState = EMarkStateInOut;
                }
            else if ( ( iContainer->PlaybackPositionL() > iMovie->AudioClipCutOutTime( iIndex ) ) && iPlayMarked )
                {
                iContainer->StopL();
                iPlayMarked = EFalse;
                }
            else
                {
                Cba()->SetCommandSetL( R_VEI_SOFTKEYS_EMPTY_OUT ); 
                iMarkState = EMarkStateOut;
                }
            break;
            }
        default:
            {
            break;  
            }
        }
    Cba()->DrawDeferred();
    }

void CVeiCutAudioView::PlayMarkedL()
    {
    TTimeIntervalMicroSeconds audioPlayStartTime;
    audioPlayStartTime = iMovie->AudioClipCutInTime( iIndex );
    
    TTimeIntervalMicroSeconds audioPlayCutOutTime;
    audioPlayCutOutTime = iMovie->AudioClipCutOutTime( iIndex );
    
    if ( !(( audioPlayStartTime.Int64() + 50000 ) > audioPlayCutOutTime.Int64() ) )
        {
        iPlayMarked = ETrue;    
        StartNaviPaneUpdateL();
    
        iContainer->PlayL( audioPlayStartTime.Int64() + 1000 );
        }
    else    
        {
        iContainer->StopL();
        }
    }

void CVeiCutAudioView::ClearInOutL( TBool aClearIn, TBool aClearOut )
    {
    if ( aClearIn ) 
        {
        iMovie->AudioClipSetCutInTime( iIndex, TTimeIntervalMicroSeconds( 0 ) );
        iContainer->SetInTimeL( iMovie->AudioClipCutInTime( iIndex ) );
        }
    if ( aClearOut ) 
        {
        TTimeIntervalMicroSeconds audioClipOriginalDuration;
        audioClipOriginalDuration = iMovie->AudioClipInfo( iIndex )->Duration();
        iMovie->AudioClipSetCutOutTime( iIndex, audioClipOriginalDuration );
        iContainer->SetOutTimeL( audioClipOriginalDuration );
        }
        
    TTimeIntervalMicroSeconds cutin = iMovie->AudioClipCutInTime( iIndex );
    TTimeIntervalMicroSeconds cutout = iMovie->AudioClipCutOutTime( iIndex );
    
    if ( ( cutin == TTimeIntervalMicroSeconds( 0 ) ) &&
         ( cutout == iMovie->AudioClipInfo(iIndex)->Duration() ) )
        {       
        Cba()->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_BACK);   
        Cba()->DrawDeferred();
        }   
    }

void CVeiCutAudioView::MarkInL()
    {
    STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
                SetPauseIconVisibilityL( ETrue );
    StopNaviPaneUpdateL();
/* Check that cut in time is before cut out time */
    TTimeIntervalMicroSeconds cutOutTime = iMovie->AudioClipCutOutTime( iIndex );
    TTimeIntervalMicroSeconds cutInTime = iContainer->PlaybackPositionL();
    if ( cutInTime >= cutOutTime )
        {
        cutInTime = cutOutTime.Int64() - 100000;
        }
    
    iMovie->AudioClipSetCutInTime( iIndex, cutInTime );
    iContainer->MarkedInL();
    }

void CVeiCutAudioView::MarkOutL()
    {
    STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl() )->
        SetPauseIconVisibilityL( ETrue );
    StopNaviPaneUpdateL();
    
    TTimeIntervalMicroSeconds cutOutTime = iContainer->PlaybackPositionL();
    TTimeIntervalMicroSeconds cutInTime = iMovie->AudioClipCutInTime( iIndex );
    if ( cutOutTime <= cutInTime )
        {
        cutOutTime = cutInTime.Int64() + 100000;
        }           
    
    //iMovie->AudioClipSetCutOutTime( iIndex, iContainer->PlaybackPositionL() );
    iMovie->AudioClipSetCutOutTime( iIndex, cutOutTime );   
    iContainer->MarkedOutL();
    }

void CVeiCutAudioView::MoveStartOrEndMarkL( TTimeIntervalMicroSeconds aPosition, CVeiCutAudioContainer::TCutMark aMarkType )
	{
	LOG(KVideoEditorLogFile, "CVeiCutAudioView::MoveStartOrEndMarkL, In");
	
	StopNaviPaneUpdateL();
	
	LOG(KVideoEditorLogFile, "CVeiCutAudioView::MoveStartOrEndMarkL, 2");
	
	if ( aMarkType == CVeiCutAudioContainer::EStartMark )
		{
		iMovie->VideoClipSetCutInTime( iIndex, aPosition );
		}
	else if ( aMarkType == CVeiCutAudioContainer::EEndMark )
		{
		iMovie->VideoClipSetCutOutTime( iIndex, aPosition );
		}		
	LOG( KVideoEditorLogFile, "CVeiCutAudioView::MoveStartOrEndMarkL, Out" );
	}


TUint CVeiCutAudioView::InPointTime()
    {
    if ( !iMovie )
        {
        return 0;
        }
    else
        {
        return (static_cast<TInt32>(iMovie->AudioClipCutInTime(iIndex).Int64() / 1000));
        }
    }

TUint CVeiCutAudioView::OutPointTime()
    {
    if ( !iMovie )
        {
        return 0;
        }
    else
        {
        return (static_cast<TInt32>(iMovie->AudioClipCutOutTime(iIndex).Int64() / 1000));
        }
    }

CAknNavigationDecorator* CVeiCutAudioView::CreateTimeLabelNaviL()
    {
    CVeiTimeLabelNavi* timelabelnavi = CVeiTimeLabelNavi::NewLC();
    CAknNavigationDecorator* decoratedFolder =
        CAknNavigationDecorator::NewL(iNaviPane, timelabelnavi, CAknNavigationDecorator::ENotSpecified);
    CleanupStack::Pop(timelabelnavi);
    
    CleanupStack::PushL(decoratedFolder);
    decoratedFolder->SetContainerWindowL(*iNaviPane);
    CleanupStack::Pop(decoratedFolder);
    decoratedFolder->MakeScrollButtonVisible(EFalse);

    return decoratedFolder;
    }

TInt CVeiCutAudioView::UpdateTimeCallbackL(TAny* aPtr)
    {
    CVeiCutAudioView* view = (CVeiCutAudioView*)aPtr;

    view->UpdateTimeL();

    return 1;
    }


void CVeiCutAudioView::UpdateTimeL()
    {
    DrawTimeNaviL();

    TTimeIntervalMicroSeconds playbackPos = iContainer->PlaybackPositionL();

    if (iMarkState == EMarkStateIn) 
        {
        if (playbackPos > iMovie->AudioClipCutInTime( iIndex )) 
            {
            UpdateCBAL(iContainer->State());
            }
        }
    else if (iMarkState == EMarkStateOut) 
        {
        if (playbackPos < iMovie->AudioClipCutOutTime( iIndex )) 
            {
            UpdateCBAL(iContainer->State());
            }
        }
    else 
        {
        if ((playbackPos < iMovie->AudioClipCutInTime( iIndex )) ||
            (playbackPos > iMovie->AudioClipCutOutTime( iIndex ))) 
            {
            UpdateCBAL(iContainer->State());
            }
        }
    }

void CVeiCutAudioView::DrawTimeNaviL()
    {
    TTime elapsed( iContainer->PlaybackPositionL().Int64() );
    TTime total( iContainer->TotalLength().Int64() );

    TBuf<16> elapsedBuf;
    TBuf<16> totalBuf;

    HBufC* dateFormatString;

    if ( ( total.Int64() / 1000 ) < 3600000 )   // check if time is over 99:59
        {
        dateFormatString = iEikonEnv->AllocReadResourceLC( R_QTN_TIME_DURAT_MIN_SEC );
        }
    else
        {
        dateFormatString = iEikonEnv->AllocReadResourceLC( R_QTN_TIME_DURAT_LONG );
        }

    elapsed.FormatL(elapsedBuf, *dateFormatString);
    total.FormatL(totalBuf, *dateFormatString);
    CleanupStack::PopAndDestroy(dateFormatString);
           
    CDesCArrayFlat* strings = new (ELeave) CDesCArrayFlat(2);
    CleanupStack::PushL(strings);
    strings->AppendL(elapsedBuf);
    strings->AppendL(totalBuf);
    HBufC* stringholder = StringLoader::LoadL(R_VEI_NAVI_TIME, *strings, iEikonEnv);
    CleanupStack::PopAndDestroy(strings);
    CleanupStack::PushL(stringholder);

    STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetLabelL(stringholder->Des());

    CleanupStack::PopAndDestroy(stringholder);


    /* Prevent the screen light dimming. */
    if (elapsed.DateTime().Second() == 0 || elapsed.DateTime().Second() == 15 || elapsed.DateTime().Second() == 30 || elapsed.DateTime().Second() == 45)
        {
        User::ResetInactivityTime();
        }
    }


void CVeiCutAudioView::StartNaviPaneUpdateL()
    {
    DrawTimeNaviL();
    if (iTimeUpdater && !iTimeUpdater->IsActive())
        {
        iTimeUpdater->Start(500000, 500000, TCallBack(CVeiCutAudioView::UpdateTimeCallbackL, this));
        }
    }

void CVeiCutAudioView::StopNaviPaneUpdateL()
    {
    if (iContainer)
        {
        DrawTimeNaviL();
        }
    if (iTimeUpdater && iTimeUpdater->IsActive())
        {
        iTimeUpdater->Cancel();
        }
    }

TInt CVeiCutAudioView::HideVolumeCallbackL(TAny* aPtr)
    {
    CVeiCutAudioView* view = (CVeiCutAudioView*)aPtr;
    view->HideVolume();
    return 0;
    }

void CVeiCutAudioView::HideVolume()
    {
    iNaviPane->Pop(iVolumeNavi);
    }

void CVeiCutAudioView::VolumeMuteL()
    {
    iContainer->SetVolumeL(-1000);
    }

void CVeiCutAudioView::VolumeDownL()
    {
    iContainer->SetVolumeL(-1);
    TInt volume = iContainer->Volume();
    if (iVolumeHider->IsActive())
        {
        iVolumeHider->Cancel();
        }
    if (volume == 0) 
        {
        STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->
            SetVolumeIconVisibilityL( EFalse );
        HideVolume();
        volume = 1;
        return;
        }

    iNaviPane->PushL(*iVolumeNavi);
    iVolumeHider->Start(1000000, 100000, TCallBack(CVeiCutAudioView::HideVolumeCallbackL, this));

    STATIC_CAST(CAknVolumeControl*, iVolumeNavi->DecoratedControl())->SetValue(volume);

    STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetLeftArrowVisibilityL(ETrue);

    if (volume < iContainer->MaxVolume())
        {
        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetRightArrowVisibilityL(ETrue);
        }
    else
        {
        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetRightArrowVisibilityL(EFalse);
        }
    }

void CVeiCutAudioView::VolumeUpL()
    {
    iContainer->SetVolumeL(1);
    STATIC_CAST( CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->
            SetVolumeIconVisibilityL( ETrue );

    TInt volume = iContainer->Volume();
    if (iVolumeHider->IsActive())
        {
        iVolumeHider->Cancel();
        }
    iNaviPane->PushL(*iVolumeNavi);
    iVolumeHider->Start(1000000, 1000000, TCallBack(CVeiCutAudioView::HideVolumeCallbackL, this));

    STATIC_CAST(CAknVolumeControl*, iVolumeNavi->DecoratedControl())->SetValue(volume);

    if (volume > iContainer->MinVolume() + 1)
        {
        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetLeftArrowVisibilityL(ETrue);
        }
    else
        {
        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetLeftArrowVisibilityL(EFalse);
        }

    if (volume < iContainer->MaxVolume())
        {
        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetRightArrowVisibilityL(ETrue);
        }
    else
        {
        STATIC_CAST(CVeiTimeLabelNavi*, iTimeNavi->DecoratedControl())->SetRightArrowVisibilityL(EFalse);
        }
    
    }

void CVeiCutAudioView::HandleForegroundEventL  ( TBool aForeground )
    {
    if ( !aForeground )
        {
        // If the application is closing down, calling PauseL could result in 
        // a callback from the MMF player after the container is already deleted,
        // causing KERN-EXEC 3
        if ( static_cast<CVeiAppUi*>( AppUi() )->AppIsOnTheWayToDestruction() )
            {
            iContainer->PrepareForTerminationL();
            }
        else
            {
            iContainer->PauseL();
            }
        iNaviPane->Pop( iTimeNavi );
        }
    else
        {
        iNaviPane->PushL( *iTimeNavi );
        }
    }

// ---------------------------------------------------------
// CVeiCutAudioView::HandleStatusPaneSizeChange()
// ---------------------------------------------------------
//
void CVeiCutAudioView::HandleStatusPaneSizeChange()
    {
    if ( iContainer )
        {
        iContainer->SetRect( AppUi()->ClientRect() );
        }
    }

void CVeiCutAudioView::GetAudioVisualizationL()
    {
    LOG(KVideoEditorLogFile, "CVeiCutAudioView::GetAudioVisualization(), In");
    CVedAudioClipInfo* audioInfo = NULL;
    if (iMovie)
        {       
        audioInfo = iMovie->AudioClipInfo( iIndex );        
        if (audioInfo && iContainer)
            {
            TInt64 duration = audioInfo->Duration().Int64();
            TInt resolution = (duration/1000)/KAudioSampleInterval;

            LOGFMT(KVideoEditorLogFile, "CVeiCutAudioView::GetAudioVisualization() 2, calling audioInfo->GetVisualizationL(*iContainer, resolution, 1), where resolution is:%Ld", resolution);
            audioInfo->GetVisualizationL(*iContainer, resolution, 1);
            }               
        }

    LOG(KVideoEditorLogFile, "CVeiCutAudioView::GetAudioVisualization(), Out");
    }

void CVeiCutAudioView::CancelVisualizationL()
    {
    CVedAudioClipInfo* audioInfo = NULL;
    if (iMovie)
        {       
        audioInfo = iMovie->AudioClipInfo( iIndex );        
        }
    if (audioInfo && iContainer)
        {       
        TInt resolution = (audioInfo->Duration().Int64()/1000)/KAudioSampleInterval;    
        audioInfo->CancelVisualizationL();      
        }   
    }

void CVeiCutAudioView::HandleResourceChange(TInt aType)
    {
    LOGFMT(KVideoEditorLogFile, "CVeiCutAudioView::HandleResourceChange() In, aType:%d", aType);
    
    if (KAknsMessageSkinChange == aType)
        {
        // Handle skin change in the navi label controls - they do not receive 
        // it automatically since they are not in the control stack
        iTimeNavi->DecoratedControl()->HandleResourceChange( aType );
        iVolumeNavi->DecoratedControl()->HandleResourceChange( aType );
        }
    
    LOG(KVideoEditorLogFile, "CVeiCutAudioView::HandleResourceChange() Out");
    }

// End of File