videoeditorengine/audioeditorengine/src/AudClip.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:  
*
*/


/* Copyright (c) 2003 Nokia. All rights reserved. */

#include "AudClip.h"
#include "AudPanic.h"

#include "AudClipInfo.h"
#include "AudSong.h"
#include "ProcTools.h"

    
CAudClip* CAudClip::NewL(CAudSong* aSong, const TDesC& aFileName,
        TTimeIntervalMicroSeconds aStartTime,                            
        MAudClipInfoObserver& aObserver, TInt aTrackIndex) 
    {
    
    CAudClip* self = new (ELeave) CAudClip(aSong);
    CleanupStack::PushL(self);
    self->ConstructL(aFileName, aStartTime, aObserver, aTrackIndex);
    CleanupStack::Pop(self);
    return self;
    
    }
    
CAudClip* CAudClip::NewL(CAudSong* aSong, RFile* aFileHandle,
        TTimeIntervalMicroSeconds aStartTime,                            
        MAudClipInfoObserver& aObserver, TInt aTrackIndex) 
    {
    
    CAudClip* self = new (ELeave) CAudClip(aSong);
    CleanupStack::PushL(self);
    self->ConstructL(aFileHandle, aStartTime, aObserver, aTrackIndex);
    CleanupStack::Pop(self);
    return self;
    
    }


CAudClip::CAudClip(CAudSong* aSong) : iSong(aSong), iMute(EFalse), iNormalize(EFalse), 
iPriority(KAudClipPriorityNormal) 
    {
    
    }

EXPORT_C CAudClipInfo* CAudClip::Info() const 
    {

    return iInfo;
    }

EXPORT_C TBool CAudClip::Normalizing() const 
    {

    return iNormalize;
    }

EXPORT_C TAudDynamicLevelMark CAudClip::DynamicLevelMark(TInt aIndex) const 
    {

    return *iDynamicLevelMarkArray[aIndex];
    }
    
EXPORT_C TInt CAudClip::DynamicLevelMarkCount() const 
    {

    return iDynamicLevelMarkArray.Count();
    }
EXPORT_C TBool CAudClip::Muting() const
    {
    return iMute;
    }

EXPORT_C void CAudClip::SetStartTime(TTimeIntervalMicroSeconds aStartTime) 
    {

    if (iStartTime.Int64() != aStartTime.Int64()-iCutInTime.Int64()) 
        {
        iStartTime = aStartTime.Int64()-iCutInTime.Int64();
        }
        

    TInt clipIndexOnSong = iSong->FindClipIndexOnSong(this);
    TInt newIndex = 0;
    TBool found = EFalse;
    for (newIndex = 0 ; newIndex < iSong->ClipCount(KAllTrackIndices); newIndex++) 
        {
        if (iSong->iClipArray[newIndex]->StartTime() > aStartTime) 
            {
            found = ETrue;
            break;
            }
        }
    if (!found) 
        {
        newIndex = iSong->ClipCount(KAllTrackIndices);
        }

    // the order is the same
    if (newIndex == clipIndexOnSong || newIndex == clipIndexOnSong+1) 
        {
        
        iSong->FireClipTimingsChanged(iSong, this);
        }
    else 
        {


        TInt oldIndexOnTrack = iIndex;
        iSong->UpdateClipArray();
        iSong->UpdateClipIndexes();
        TInt newIndexOnTrack = iIndex;

        if (oldIndexOnTrack != newIndexOnTrack) 
            {
            iSong->FireClipIndicesChanged(iSong, oldIndexOnTrack, newIndexOnTrack, iTrackIndex);
            }
        else 
            {
            iSong->FireClipTimingsChanged(iSong, this);
            }

        }

    }




EXPORT_C TTimeIntervalMicroSeconds CAudClip::StartTime() const 
    {

    return iStartTime.Int64()+iCutInTime.Int64();
    }



TInt32 CAudClip::StartTimeMilliSeconds() const 
    {

    return ProcTools::MilliSeconds(iStartTime);
    
    }

EXPORT_C TTimeIntervalMicroSeconds CAudClip::EndTime() const
    {
    return TTimeIntervalMicroSeconds(iStartTime.Int64()+iCutOutTime.Int64());

    }


EXPORT_C TTimeIntervalMicroSeconds CAudClip::EditedDuration() const
    {
    TTimeIntervalMicroSeconds edDur(iCutOutTime.Int64()-iCutInTime.Int64());
    return edDur;

    }

EXPORT_C TInt CAudClip::Priority() const
    {
    return iPriority;
    
    }


EXPORT_C TInt CAudClip::IndexOnTrack() const 
    {

    return iIndex;
    }



EXPORT_C TInt CAudClip::TrackIndex() const 
    {

    return iTrackIndex;
    }


EXPORT_C TTimeIntervalMicroSeconds CAudClip::CutInTime() const 
    {
    
    return iCutInTime;
    }
    

TInt32 CAudClip::CutInTimeMilliSeconds() const 
    {

    return ProcTools::MilliSeconds(iCutInTime);
    
    }

EXPORT_C void CAudClip::SetCutInTime(TTimeIntervalMicroSeconds aCutInTime) 
    {

    TInt64 oldCutIn = iCutInTime.Int64();
    TInt64 cutDif = aCutInTime.Int64() - oldCutIn;  

    iCutInTime = aCutInTime;
    iStartTime = (TTimeIntervalMicroSeconds)(iStartTime.Int64()-cutDif);
    iSong->FireClipTimingsChanged(iSong, this);
    }
    
EXPORT_C TTimeIntervalMicroSeconds CAudClip::CutOutTime() const 
    {

    return iCutOutTime;
    }

TInt32 CAudClip::CutOutTimeMilliSeconds() const 
    {

    return ProcTools::MilliSeconds(iCutOutTime);
    

    }
    
EXPORT_C void CAudClip::SetCutOutTime(TTimeIntervalMicroSeconds aCutOutTime) 
    {

    iCutOutTime = aCutOutTime;
    iSong->FireClipTimingsChanged(iSong, this);
    }




EXPORT_C TBool CAudClip::SetPriority(TInt aPriority)

    {
    if (aPriority < 0) return EFalse;

    iPriority = aPriority;
    return ETrue;

    }


EXPORT_C TInt CAudClip::InsertDynamicLevelMarkL(const TAudDynamicLevelMark& aMark) 
    {

    if (aMark.iTime < TTimeIntervalMicroSeconds(0)) 
        {
        TAudPanic::Panic(TAudPanic::EIllegalDynamicLevelMark);
        }

    TAudDynamicLevelMark* newMark = new (ELeave) TAudDynamicLevelMark(aMark);
    
    TBool added = EFalse;
    TInt err = KErrNone;

    // insert marks so that they are always sorted by time
    TInt index = 0;
    for (index = 0 ; index < iDynamicLevelMarkArray.Count() ; index++) 
        {
        if (iDynamicLevelMarkArray[index]->iTime == newMark->iTime) 
            {
            // replace the level
            TAudDynamicLevelMark* oldMark = iDynamicLevelMarkArray[index];
            iDynamicLevelMarkArray.Remove(index);
            delete oldMark;
            err = iDynamicLevelMarkArray.Insert(newMark, index);
            added = ETrue;
            break;
            }
        else if (iDynamicLevelMarkArray[index]->iTime > newMark->iTime) 
            {
            err = iDynamicLevelMarkArray.Insert(newMark, index);
            added = ETrue;
            break;
            }
        }
    if (!added) 
        {
        index = iDynamicLevelMarkArray.Count();
        err = iDynamicLevelMarkArray.Insert(newMark, index);
        }
    if (err != KErrNone) 
        {
        User::Leave(err);
        }

    iSong->FireDynamicLevelMarkInserted(*this, *newMark, index);
    return index;


    }
    
EXPORT_C TBool CAudClip::RemoveDynamicLevelMark(TInt aIndex) 
    {

    if (aIndex > iDynamicLevelMarkArray.Count() || aIndex < 0) 
        {
        TAudPanic::Panic(TAudPanic::EAudioClipIllegalIndex);
        }
    
    TAudDynamicLevelMark* mark = iDynamicLevelMarkArray[aIndex];
    
    iDynamicLevelMarkArray.Remove(aIndex);
    delete mark;
    
    iSong->FireDynamicLevelMarkRemoved(*this, aIndex);
    return ETrue;
    }
    
EXPORT_C void CAudClip::SetMuting(TBool aMuted)
    {
    
    iMute = aMuted;
    
    }

EXPORT_C void CAudClip::SetNormalizing(TBool aNormalizing) 
    {
    
    iNormalize = aNormalizing;    

    }

EXPORT_C void CAudClip::Reset(TBool aNotify) 
    {

    TInt a = 0;

    for (a = 0 ; a < iDynamicLevelMarkArray.Count() ; a++) 
        {
        delete iDynamicLevelMarkArray[a];
        }
    iDynamicLevelMarkArray.Reset();
    iCutInTime = 0;
    
    if (iInfo != 0)
        {
        iCutOutTime = iInfo->Properties().iDuration;
        }

    if (aNotify) 
        {
        iSong->FireClipReseted(*this);
        }

    }


EXPORT_C void CAudClip::SetVolumeGain(TInt aVolumeGain)
    {
    iVolumeGain = aVolumeGain;
    }

EXPORT_C TInt CAudClip::GetVolumeGain()
    {
    return iVolumeGain;
    }

/*
EXPORT_C TBool CAudClip::operator<(const CAudClip &c2) const {

    return (this->iStartTime < c2.StartTime());

}


EXPORT_C TBool CAudClip::operator>(const CAudClip &c2) const {

    return (this->iStartTime > c2.StartTime());

}

EXPORT_C TBool CAudClip::operator==(const CAudClip &c2) const {

    return (this->iStartTime == c2.StartTime());

}
*/
TInt CAudClip::Compare(const CAudClip& c1, const CAudClip& c2) 
    {

    if (c1.iStartTime > c2.iStartTime) 
        {
        return 1;
        }
    else if (c1.iStartTime < c2.iStartTime) 
        {
        return -1;
        }
    else 
        {
        return 0;
        }
    }



void CAudClip::ConstructL(const TDesC& aFileName,
                          TTimeIntervalMicroSeconds aStartTime,
                          MAudClipInfoObserver& aObserver, TInt aTrackIndex) 
    {
    
    __ASSERT_ALWAYS(aStartTime >= TInt64(0), 
        TAudPanic::Panic(TAudPanic::EAudioClipIllegalStartTime));
    iStartTime = aStartTime;
    iTrackIndex = aTrackIndex;
    
    iInfo = CAudClipInfo::NewL(aFileName, aObserver);
    
    }
    
void CAudClip::ConstructL(RFile* aFileHandle,
                          TTimeIntervalMicroSeconds aStartTime,
                          MAudClipInfoObserver& aObserver, TInt aTrackIndex) 
    {
    
    __ASSERT_ALWAYS(aStartTime >= TInt64(0), 
        TAudPanic::Panic(TAudPanic::EAudioClipIllegalStartTime));
    iStartTime = aStartTime;
    iTrackIndex = aTrackIndex;
    
    iInfo = CAudClipInfo::NewL(aFileHandle, aObserver);
    
    }


CAudClip::~CAudClip() 
    {

    Reset(EFalse);
    if (iInfo != 0)
        {
        delete iInfo;
        iInfo = 0;
        }
    
    }