--- a/videoeditorengine/audioeditorengine/src/AudSong.cpp Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1438 +0,0 @@
-/*
-* 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 "AudSong.h"
-#include "AudClip.h"
-#include "AudPanic.h"
-#include "ProcInFileHandler.h"
-#include "ProcADTSInFileHandler.h"
-#include "ProcAMRInFileHandler.h"
-#include "ProcMP4InFileHandler.h"
-#include "ProcAWBInFileHandler.h"
-#include "AACConstants.h"
-#include "audconstants.h"
-
-#include "AudProcessor.h"
-#include "AACApi.h"
-#include "aedproctimeestimate.h"
-
-#include <e32base.h>
-
-// Debug print macro
-#if defined _DEBUG
-#include <e32svr.h>
-#define PRINT(x) RDebug::Print x;
-#else
-#define PRINT(x)
-#endif
-
-EXPORT_C CAudSong* CAudSong::NewL(RFs *aFs)
- {
- CAudSong* self = NewLC(aFs);
- CleanupStack::Pop(self);
- return self;
- }
-
-
-EXPORT_C CAudSong* CAudSong::NewLC(RFs *aFs)
- {
- CAudSong* self = new (ELeave) CAudSong(aFs);
- CleanupStack::PushL(self);
- self->ConstructL();
- return self;
- }
-
-CAudSong::CAudSong(RFs *aFs) : iFs(aFs), iClipArray(32), iSongDuration(0),
- iSongDurationManuallySet(EFalse), iObserverArray(16), iNormalize(EFalse)
- {
- }
-
-
-void CAudSong::ConstructL()
- {
- iProperties = new (ELeave) TAudFileProperties();
-
- iProperties->iAudioType = EAudNoAudio;
- iProperties->iFileFormat = EAudFormatUnrecognized;
- iProperties->iDuration = 0;
- iProperties->iFrameCount = 0;
- iProperties->iFrameLen = 0;
- iProperties->iFrameDuration = 0;
-
-
- iProcessOperation = CAudSongProcessOperation::NewL(this);
- iAddOperation = CAudSongAddClipOperation::NewL(this);
-
-
-#ifdef _WRITE_OUTPUT_TO_FILE_
-
-
- TBuf<32> fileName;
- _LIT(KFn, "C:\\audioEngineOut.");
- _LIT(KTextFileName, "C:\\audioEngineOut.txt");
-
- fileName.Append(KFn);
-
- if (iProperties->iAudioType == EAudAMR)
- {
- fileName.Append(_L("amr"));
- }
- else
- {
- fileName.Append(_L("aac"));
- }
-
-
- User::LeaveIfError(iDebFs.Connect());
- iDebFs.Delete(fileName);
- iDebFs.Delete(KTextFileName);
-
- iFileOpen = EFalse;
- TInt err1 = iAudioFile.Create(iDebFs, fileName, EFileWrite);
-
- TInt err2 = iTextFile.Create(iDebFs, KTextFileName, EFileWrite);
-
- if (err1 == KErrNone && err2 == KErrNone)
- {
- iFileOpen = ETrue;
- }
-
- if (iFileOpen && iProperties->iAudioType == EAudAMR)
- {
- iAudioFile.Write(_L8("#!AMR"));
- }
-
-#endif
-
-
- }
-
-
-EXPORT_C CAudSong::~CAudSong()
- {
-
- Reset(EFalse);
- delete iProperties;
- iProperties = 0;
- delete iProcessOperation;
- iProcessOperation = 0;
- delete iAddOperation;
- iAddOperation = 0;
-
-
- iObserverArray.Reset();
-
-
-#ifdef _WRITE_OUTPUT_TO_FILE_
- iAudioFile.Close();
- iTextFile.Close();
- iDebFs.Close();
-
-#endif
-
- }
-
-EXPORT_C TInt CAudSong::GetSizeEstimateL() const
- {
-
-
- // if there are no clips added yet
- if (iClipArray.Count() == 0)
- {
- return 0;
- }
-
- TInt durationMilli = ProcTools::MilliSeconds(iClipArray[iClipArray.Count()-1]->EndTime());
- TInt silenceDuration = ProcTools::MilliSeconds(iSongDuration) - durationMilli;
-
- if (silenceDuration < 0)
- {
- silenceDuration = 0;
- }
-
- TInt sizeInBytes = 0;
-
- const TInt KBitrate = iProperties->iBitrate;
- const TInt KBitsInByte = 8;
- TInt KByterate = KBitrate/KBitsInByte;
-
- // make sure we round up
- sizeInBytes = (durationMilli/1000+1)*KByterate;
-
- TInt frameDurationMilli = 20; // AMR
- TInt silentFrameLen = 13; // AMR
-
- if (iProperties->iAudioType == EAudAAC_MPEG4)
- {
-
- frameDurationMilli = ((1024*1000)/(iProperties->iSamplingRate));
-
- if (iProperties->iChannelMode == EAudSingleChannel)
- {
- silentFrameLen = KSilentMonoAACFrameLenght;
- }
- else
- {
- silentFrameLen = KSilentStereoAACFrameLenght;
- }
-
- }
-
- if (frameDurationMilli > 0)
- {
- TInt silentFrames = silenceDuration/frameDurationMilli;
- TInt silenceSize = silentFrames*silentFrameLen;
- sizeInBytes += silenceSize;
-
- }
-
- return sizeInBytes;
-
- }
-
-EXPORT_C TInt CAudSong::GetFrameSizeEstimateL(TTimeIntervalMicroSeconds aStartTime,
- TTimeIntervalMicroSeconds aEndTime) const
- {
- // if there are no clips added yet
- if (iClipArray.Count() == 0)
- {
- return 0;
- }
-
- TInt frameDurationMicro = 20000; // AMR
-
- if (iProperties->iAudioType == EAudAAC_MPEG4)
- {
-
- frameDurationMicro = ((1024*1000)/(iProperties->iSamplingRate))*1000;
- }
-
- // just in case to prevent infinite loop
- if (frameDurationMicro <= 0)
- {
- return 0;
- }
-
- TInt size = 0;
-
- // Calculate the time of the first frame included in the time interval
- TInt64 firstFrameIndex = aStartTime.Int64() / frameDurationMicro;
- TInt64 currentTime = firstFrameIndex * frameDurationMicro;
-
- while (currentTime + frameDurationMicro <= aEndTime.Int64()) // Make sure the whole frame fits inside the time interval
- {
-
- TBool silence = ETrue;
- TInt clipIndex = 0;
- TInt overLappingClips = 0;
-
- for (TInt a = 0 ; a < iClipArray.Count() ; a++)
- {
- if (!iClipArray[a]->Muting())
- {
-
- if ((currentTime >= iClipArray[a]->iStartTime.Int64() + iClipArray[a]->iCutInTime.Int64()) &&
- (currentTime < iClipArray[a]->iStartTime.Int64() + iClipArray[a]->iCutOutTime.Int64()))
-
- {
- silence = EFalse;
- clipIndex = a;
- overLappingClips++;
-
- }
- }
- }
-
- TInt frameSize = 0;
- if (silence)
- {
-
- // if there is no audio around "aTime", just return a silent frame length
-
- if (iProperties->iAudioType == EAudAAC_MPEG4)
- {
-
- if (iProperties->iChannelMode == EAudSingleChannel)
- {
- frameSize = KSilentMonoAACFrameLenght;
- }
- else
- {
- frameSize = KSilentStereoAACFrameLenght;
- }
- }
- else if (iProperties->iAudioType == EAudAMR)
- {
-
- TInt KSilentFrameLen = 13; // AMR
- frameSize = KSilentFrameLen;
-
- }
-
- size +=frameSize;
- currentTime += frameDurationMicro;
- continue;
-
- }
-
-
-
- // if not silent, estimate according to bitrate if transcoding
- // if no transcoding is necessary, return the frame length of the original
- // input clip
-
- // input clip is not transcoded if the original clip has the same
- // audio properties as the output clip and no mixing is needed
-
- TAudFileProperties clipProp = iClipArray[clipIndex]->Info()->Properties();
-
- TBool clipTranscoded = EFalse;
-
- if (clipProp.iAudioType !=
- iProperties->iAudioType ||
- clipProp.iSamplingRate !=
- iProperties->iSamplingRate ||
- clipProp.iChannelMode !=
- iProperties->iChannelMode)
- {
- clipTranscoded = ETrue;
- }
-
- if (overLappingClips > 1)
- {
- clipTranscoded = ETrue;
- }
-
-
- if (clipTranscoded)
- {
- const TInt KBitrate = iProperties->iBitrate;
- const TInt KBitsInByte = 8;
-
- TInt KByterate = KBitrate/KBitsInByte;
-
- TInt frameDurationMilli = 20; // AMR
-
- if (iProperties->iAudioType == EAudAAC_MPEG4)
- {
-
- frameDurationMilli = ((1024*1000)/(iProperties->iSamplingRate));
-
- }
-
- frameSize = (KByterate/(1000/frameDurationMilli)+1);
-
- }
- else
- {
-
- frameSize = clipProp.iFrameLen;
-
- }
-
- size +=frameSize;
- currentTime += frameDurationMicro;
- continue;
-
- }
-
- return size;
-
- }
-
-EXPORT_C TAudFileProperties CAudSong::OutputFileProperties() const
- {
-
- return *iProperties;
- }
-
-
-EXPORT_C TBool CAudSong::GetMP4DecoderSpecificInfoLC(HBufC8*& aDecSpecInfo, TInt aMaxSize) const
- {
-
- if (iClipArray.Count() == 0)
- {
- return EFalse;
- }
-
- if (iProperties->iAudioType == EAudAAC_MPEG4)
-
- {
-
- int16 frameLen = 1024;
- int32 sampleRate = iProperties->iSamplingRate;
- uint8 profile = LC_OBJECT;
- uint8 nChannels = 1;
- uint8 decSpecInfo[16];
- int16 nConfigBytes;
-
- if (iProperties->iChannelMode == EAudStereo)
- {
- nChannels = 2;
- }
-
-
- //nConfigBytes = AACGetMP4ConfigInfo(&aacInfo, decSpecInfo, 16);
- nConfigBytes = AACGetMP4ConfigInfo(sampleRate, profile,
- nChannels, frameLen, decSpecInfo, aMaxSize);
-
-
- if (nConfigBytes > 0)
- {
-
- aDecSpecInfo = HBufC8::NewLC(nConfigBytes);
- aDecSpecInfo->Des().Append(decSpecInfo, nConfigBytes);
-
- }
-
- return ETrue;
-
- }
- else if (iProperties->iAudioType == EAudAMR)
- {
- aDecSpecInfo = HBufC8::NewLC(aMaxSize);
-
- const TUint8 frameDecSpecInfo[] = {0x14,0x08}; //the decoder specific
- const TInt frameSize = 2; //constant as maximum size of decoderspecific info is 2
-
- for (TInt a = 0 ; a < frameSize ; a++)
- {
- aDecSpecInfo->Des().Append(frameDecSpecInfo[a]);
- }
-
-
- return ETrue;
- }
-
- else
- {
- return EFalse;
- }
-
-
- }
-
-EXPORT_C TBool CAudSong::GetTimeEstimateL(MAudTimeEstimateObserver& aObserver,
- TAudType aAudType,
- TInt aSamplingRate,
- TChannelMode aChannelMode,
- TInt aBitRate)
- {
-
-
- if (iClipArray.Count() == 0)
- {
- return EFalse;
- }
-
- if (SetOutputFileFormat(aAudType, aSamplingRate, aChannelMode, aBitRate))
- {
- return iProcessOperation->GetTimeEstimateL(aObserver);
-
- }
- else
- {
- return EFalse;
- }
-
-
- }
-
-EXPORT_C TTimeIntervalMicroSeconds CAudSong::GetTimeEstimateL()
- {
- TAudFileProperties prop;
- TInt64 estimatedTime = TInt64(0);
- TReal complexityFactor = 0.0;
- TInt a;
-
- for (a = 0; a < iClipArray.Count() ; a++)
- {
- complexityFactor = 0.0;
-
- prop = iClipArray[a]->Info()->Properties();
- if ( iClipArray[a]->Muting() )
- {
- // the clip is muted
- complexityFactor = KAEDMutingComplFactor;
- }
- else if ( (prop.iAudioType != iProperties->iAudioType )
- || (prop.iChannelMode != iProperties->iChannelMode )
- || (prop.iSamplingRate != iProperties->iSamplingRate ) )
- {
- // need transcoding
-
- // decoding
- switch (prop.iAudioType)
- {
- case EAudAMR :
- {
- // AMR decoding
- complexityFactor = KAEDAMRDecComplFactor;
- }
- break;
- case EAudAAC_MPEG4 :
- {
- // AAC decoding
- complexityFactor = KAEDAACDecComplFactor;
- }
- break;
- case EAudAMRWB :
- {
- // AMR-WB decoding
- complexityFactor = KAEDAMRWBDecComplFactor;
- }
- break;
- case EAudMP3 :
- {
- // MP3 decoding
- complexityFactor = KAEDMP3DecComplFactor;
- }
- break;
- default:
- {
- //EAudWAV
- complexityFactor = KAEDWavDecComplFactor;
- }
- }
- if ( prop.iChannelMode == EAudStereo )
- {
- complexityFactor += KAEDAACStereoDecAddComplFactor;
- }
- if ( prop.iSamplingRate > 8000 )
- {
- complexityFactor *= prop.iSamplingRate/16000;
- }
-
-
- // encoding
- if (iProperties->iAudioType == EAudAMR)
- {
- // AMR encoding
- complexityFactor += KAEDAMREncComplFactor;
- }
- else
- {
- // AAC encoding
- complexityFactor += KAEDAACEncComplFactor;
- if ( iProperties->iChannelMode == EAudStereo )
- {
- complexityFactor += KAEDAACStereoEncAddComplFactor;
- }
- complexityFactor *= iProperties->iSamplingRate/16000;
- }
-
-
- }
- else if (iClipArray[a]->DynamicLevelMarkCount() > 0)
- {
- // need bitstream processing (level control etc)
- complexityFactor = KAEDBitstreamProcComplFactor;
- }
- else
- {
- // just passing through
- complexityFactor = KAEDPassThroughComplFactor;
- }
-
-
-
- estimatedTime = estimatedTime + TInt64(complexityFactor * I64INT(iClipArray[a]->EditedDuration().Int64()));
- }
-
- return estimatedTime;
- }
-
-EXPORT_C TInt CAudSong::GetFrameDurationMicro()
- {
- TInt frameDurationMicro = 20000; // AMR
-
- if (iProperties->iAudioType == EAudAAC_MPEG4)
- {
- frameDurationMicro = ((1024 * 1000) / iProperties->iSamplingRate) * 1000;
- }
-
- return frameDurationMicro;
- }
-
-
-EXPORT_C TInt CAudSong::ClipCount(TInt aTrackIndex) const
- {
-
-
- if (aTrackIndex == KAllTrackIndices)
- {
- return iClipArray.Count();
-
- }
-
- TInt amount = 0;
- for (TInt a = 0; a < iClipArray.Count() ; a++)
- {
- if (iClipArray[a]->TrackIndex() == aTrackIndex) amount++;
-
- }
-
- return amount;
-
- }
-
-
-EXPORT_C CAudClip* CAudSong::Clip(TInt aIndex, TInt aTrackIndex) const
- {
-
- if (aTrackIndex == KAllTrackIndices)
- {
- return iClipArray[aIndex];
- }
-
-
- TInt index = 0;
- TInt a = 0;
- TBool found = EFalse;
-
- if (aTrackIndex == KAllTrackIndices)
- {
- return iClipArray[aIndex];
- }
-
- for (a = 0; a < iClipArray.Count() ; a++)
- {
-
- if (iClipArray[a]->TrackIndex() == aTrackIndex) index++;
-
- if (index == aIndex+1)
- {
- found = ETrue;
- break;
- }
-
-
- }
-
- if (found)
- {
- return iClipArray[a];
- }
- else
- {
- TAudPanic::Panic(TAudPanic::EAudioClipIllegalIndex);
- }
- return NULL;
- }
-
-
-
-EXPORT_C void CAudSong::AddClipL(const TDesC& aFileName,
- TTimeIntervalMicroSeconds aStartTime, TInt aTrackIndex,
- TTimeIntervalMicroSeconds aCutInTime,
- TTimeIntervalMicroSeconds aCutOutTime)
- {
-
- PRINT((_L("CAudSong::AddClipL in")));
- if (iAddOperation->iClip != 0)
- {
- TAudPanic::Panic(TAudPanic::ESongAddOperationAlreadyRunning);
- }
- if (iProcessOperation->iProcessor != 0 )
- {
- TAudPanic::Panic(TAudPanic::ESongProcessingOperationAlreadyRunning);
- }
-
-
- iAddOperation->iClip = CAudClip::NewL(this, aFileName, aStartTime, *iAddOperation, aTrackIndex);
- iAddOperation->iClip->iCutInTime = aCutInTime;
- iAddOperation->iClip->iCutOutTime = aCutOutTime;
-
- PRINT((_L("CAudSong::AddClipL out")));
-
- }
-
-
-EXPORT_C void CAudSong::RemoveClip(TInt aIndex, TInt aTrackIndex)
- {
- PRINT((_L("CAudSong::RemoveClip in")));
-
- TInt index = -1;
- TInt a = 0;
- TBool found = EFalse;
-
- for (a = 0; a < iClipArray.Count() ; a++)
- {
-
-
- if (iClipArray[a]->TrackIndex() == aTrackIndex) index++;
-
- if (index == aIndex)
- {
- found = ETrue;
- break;
- }
-
- }
-
-
- if (found)
- {
-
- CAudClip* clip = iClipArray[a];
- iClipArray.Remove(a);
- delete clip;
- UpdateClipIndexes();
- FireClipRemoved(this, aIndex, aTrackIndex);
- }
- else
- {
- TAudPanic::Panic(TAudPanic::EAudioClipIllegalIndex);
- }
-
- PRINT((_L("CAudSong::RemoveClip out")));
-
- }
-
-
-EXPORT_C TBool CAudSong::SetOutputFileFormat(TAudType aAudType,
- TInt aSamplingRate,
- TChannelMode aChannelMode,
- TInt aBitRate)
- {
- PRINT((_L("CAudSong::SetOutputFileFormat in")));
-
- // allow both EAudAAC_MPEG2 and EAudAAC_MPEG4
- // as inpyt type, but consider all AAC_ MPEG as mpeg4
-
- if (aAudType == EAudAAC_MPEG2)
- {
- aAudType = EAudAAC_MPEG4;
- }
-
- // make sure the given parameters are correct
-
- if (aBitRate == KAudBitRateDefault)
- {
- // the defaut bitrates:
- PRINT((_L("CAudSong::SetOutputFileFormat use default bitrate")));
- if (aAudType == EAudAMR)
- {
- aBitRate = KAedBitRateAMR;
- }
- else if (aAudType == EAudAAC_MPEG4)
- {
- if (aSamplingRate == KAedSampleRate16kHz)
- {
- aBitRate = KAedBitRateAAC16kHz;
- }
- else
- {
- aBitRate = KAedBitRateAAC48kHz;
- }
- }
- }
-
- if (aAudType == EAudAAC_MPEG4)
- {
-
- iProperties->iAudioType = EAudAAC_MPEG4;
- iProperties->iAACObjectType = EAudAACObjectTypeLC;
-
- TInt channels = (aChannelMode == EAudSingleChannel) ? 1 : 2;
-
- // legal sampling rates are 16000 and 48000 Hz
- if (aSamplingRate == KAedSampleRate16kHz)
- {
- if (aBitRate < KAedAACMinBitRateMultiplier * KAedSampleRate16kHz * channels ||
- aBitRate > KAedAACMaxBitRateMultiplier * KAedSampleRate16kHz * channels)
- {
- // illegal bitrate
- PRINT((_L("CAudSong::SetOutputFileFormat out, unsupported bitrate given")));
- return EFalse;
- }
- else
- {
- iProperties->iSamplingRate = aSamplingRate;
- iProperties->iBitrate = aBitRate;
- iProperties->iChannelMode = aChannelMode;
- }
- }
- else if (aSamplingRate == KAedSampleRate48kHz)
- {
- if (aBitRate < KAedAACMinBitRateMultiplier * KAedSampleRate48kHz * channels ||
- aBitRate > KAedAACMaxBitRateMultiplier * KAedSampleRate48kHz * channels)
- {
- // illegal bitrate
- PRINT((_L("CAudSong::SetOutputFileFormat out, unsupported bitrate given")));
- return EFalse;
- }
- else
- {
- iProperties->iSamplingRate = aSamplingRate;
- iProperties->iBitrate = aBitRate;
- iProperties->iChannelMode = aChannelMode;
- }
- }
- else
- {
- PRINT((_L("CAudSong::SetOutputFileFormat out, unsupported sampling rate given")));
- return EFalse;
- }
-
- }
-
-
- else if (aAudType == EAudAMR)
- {
-
- iProperties->iAudioType = EAudAMR;
- // for AMR the bitrate is always set to 12200 and sampling rate to 8000
- iProperties->iSamplingRate = KAedSampleRate8kHz;
- iProperties->iBitrate = KAedBitRateAMR;
- iProperties->iChannelMode = EAudSingleChannel;
-
- }
-
- else
- {
- PRINT((_L("CAudSong::SetOutputFileFormat out, unsupported output format given")));
- return EFalse;
- }
-
-
- PRINT((_L("CAudSong::SetOutputFileFormat out")));
- return ETrue;
- }
-
-EXPORT_C TBool CAudSong::AreOutputPropertiesSupported(const TAudFileProperties& aProperties )
- {
- if ( ( aProperties.iAudioType == EAudAAC_MPEG4 )
- && ((aProperties.iSamplingRate == KAedSampleRate16kHz)
- || (aProperties.iSamplingRate == KAedSampleRate48kHz)))
- {
- return ETrue;
- }
- else if ( (aProperties.iAudioType == EAudAMR)
- && (aProperties.iSamplingRate == KAedSampleRate8kHz))
- {
- return ETrue;
- }
- else
- {
- return EFalse;
- }
- }
-
-
-EXPORT_C TBool CAudSong::SyncStartProcessingL()
- {
- PRINT((_L("CAudSong::SyncStartProcessingL")));
- return iProcessOperation->StartSyncProcL();
- }
-
-EXPORT_C TBool CAudSong::SyncProcessFrameL(HBufC8*& aFrame, TInt& aProgress,
- TTimeIntervalMicroSeconds& aDuration)
- {
- PRINT((_L("CAudSong::SyncProcessFrameL in")));
-
- aFrame = 0;
- TBool ret = iProcessOperation->ProcessSyncPieceL(aFrame, aProgress, aDuration);
-
-#ifdef _WRITE_OUTPUT_TO_FILE_
-
-
- if (!ret)
- {
-
- if (iFileOpen)
- {
-
-
-
- TBuf8<32> mes;
- mes.Append(_L8("aProgress: "));
- mes.AppendNum(aProgress);
- mes.Append(_L8("aDuration: "));
- mes.AppendNum(I64INT(aDuration.Int64()/1000));
- mes.Append(_L8("\n"));
-
-
- iTextFile.Write(mes);
-
-
- if (iProperties->iAudioType == EAudAMR)
- {
- iAudioFile.Write(aFrame->Des());
-
- }
- else
- {
- TBuf8<7> adtsHeader;
-
- ProcTools::GenerateADTSHeaderL(adtsHeader, aFrame->Size(), *iProperties);
- iAudioFile.Write(adtsHeader);
- iAudioFile.Write(aFrame->Des());
-
- }
-
- }
-
- }
-
-#endif
-
- PRINT((_L("CAudSong::SyncProcessFrameL out")));
- return ret;
-
- }
-
-EXPORT_C void CAudSong::SyncCancelProcess()
- {
-
- iProcessOperation->Cancel();
-
- }
-
-
-EXPORT_C void CAudSong::Reset(TBool aNotify)
- {
- iSongDurationManuallySet = EFalse;
-
- iDynamicLevelMarkArray.ResetAndDestroy();
- iClipArray.ResetAndDestroy();
-
- if (aNotify)
- {
- FireSongReseted(*this);
- }
- }
-
-EXPORT_C TBool CAudSong::SetDuration(TTimeIntervalMicroSeconds aDuration)
- {
-
- if (aDuration.Int64() > 0)
- {
- iSongDuration = aDuration;
- iSongDurationManuallySet = ETrue;
- return ETrue;
- }
-
- return EFalse;
- }
-
-
-EXPORT_C void CAudSong::RegisterSongObserverL(MAudSongObserver* aObserver)
- {
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- if (iObserverArray[i] == aObserver)
- {
- TAudPanic::Panic(TAudPanic::ESongObserverAlreadyRegistered);
- }
- }
-
- User::LeaveIfError(iObserverArray.Append(aObserver));
- }
-
-
-EXPORT_C void CAudSong::UnregisterSongObserver(MAudSongObserver* aObserver)
- {
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- if (iObserverArray[i] == aObserver)
- {
- iObserverArray.Remove(i);
- return;
- }
- }
-
- TAudPanic::Panic(TAudPanic::ESongObserverNotRegistered);
- }
-
-
-void CAudSong::UpdateClipIndexes()
- {
-
- for (TInt i = 0; i < iClipArray.Count() ; i++)
- {
-
- iClipArray[i]->iIndex = Index2IndexOnTrack(i);
-
- }
-
- }
-
-void CAudSong::UpdateClipArray()
- {
-
- TLinearOrder<CAudClip> order(CAudClip::Compare);
- iClipArray.Sort(order);
-
-
- }
-
-TInt CAudSong::Index2IndexOnTrack(TInt aIndex)
- {
-
- if (aIndex > iClipArray.Count())
- {
- TAudPanic::Panic(TAudPanic::EInternal);
- }
- TInt indexOnTrack = 0;
- TInt trackIndex = iClipArray[aIndex]->TrackIndex();
-
- for (TInt a = 0; a < aIndex ; a++)
- {
-
- if (iClipArray[a]->TrackIndex() == trackIndex)
- {
- indexOnTrack++;
- }
-
- }
- return indexOnTrack;
- }
-
-TInt CAudSong::FindClipIndexOnSong(const CAudClip* aClip) const
- {
-
- for (TInt index = 0 ; index < iClipArray.Count() ; index++)
- {
- if (iClipArray[index] == aClip)
- {
- return index;
- }
- }
-
- // if the clip is not in the array...
- TAudPanic::Panic(TAudPanic::EInternal);
- return 0;
-
- }
-
-void CAudSong::FireClipAdded(CAudSong* aSong, CAudClip* aClip, TInt aIndex, TInt aTrackIndex)
- {
-
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- iObserverArray[i]->NotifyClipAdded(*aSong, *aClip, aIndex, aTrackIndex);
- }
- }
-
-void CAudSong::FireClipAddingFailed(CAudSong* aSong, TInt aError, TInt aTrackIndex)
- {
-
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- iObserverArray[i]->NotifyClipAddingFailed(*aSong, aError, aTrackIndex);
- }
- }
-
-void CAudSong::FireClipRemoved(CAudSong* aSong, TInt aIndex, TInt aTrackIndex)
- {
-
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- iObserverArray[i]->NotifyClipRemoved(*aSong, aIndex, aTrackIndex);
- }
-
- }
-
-void CAudSong::FireClipIndicesChanged(CAudSong* aSong, TInt aOldIndex,
- TInt aNewIndex, TInt aTrackIndex)
- {
-
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- iObserverArray[i]->NotifyClipIndicesChanged(*aSong, aOldIndex, aNewIndex, aTrackIndex);
- }
- }
-
-void CAudSong::FireClipTimingsChanged(CAudSong* aSong, CAudClip* aClip)
- {
-
-
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- iObserverArray[i]->NotifyClipTimingsChanged(*aSong, *aClip);
- }
-
- }
-
-
-void CAudSong::FireDynamicLevelMarkInserted(CAudClip& aClip,
- TAudDynamicLevelMark& aMark,
- TInt aIndex)
- {
-
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- iObserverArray[i]->NotifyDynamicLevelMarkInserted(aClip, aMark, aIndex);
- }
-
-
- }
-
-void CAudSong::FireDynamicLevelMarkRemoved(CAudClip& aClip, TInt aIndex)
- {
-
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- iObserverArray[i]->NotifyDynamicLevelMarkRemoved(aClip, aIndex);
- }
-
- }
-
-void CAudSong::FireSongReseted(CAudSong& aSong)
- {
-
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- iObserverArray[i]->NotifySongReseted(aSong);
- }
- }
-
-void CAudSong::FireClipReseted(CAudClip& aClip)
- {
-
- for (TInt i = 0; i < iObserverArray.Count(); i++)
- {
- iObserverArray[i]->NotifyClipReseted(aClip);
- }
- }
-
-
-
-CAudSongProcessOperation* CAudSongProcessOperation::NewL(CAudSong* aSong)
- {
- CAudSongProcessOperation* self =
- new (ELeave) CAudSongProcessOperation(aSong);
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop(self);
- return self;
- }
-
-
-CAudSongProcessOperation::CAudSongProcessOperation(CAudSong* aSong)
-: iSong(aSong), iObserver(0), iProcessor(0)
- {
-
- }
-
-
-void CAudSongProcessOperation::ConstructL()
- {
- }
-
-CAudSongProcessOperation::~CAudSongProcessOperation()
- {
-
- if (iProcessor != 0)
- {
- delete iProcessor;
- iProcessor = 0;
-
- }
-
- }
-
-
-
-void CAudSongProcessOperation::NotifyAudioProcessingStartedL()
- {
- if (iObserver != 0)
- iObserver->NotifyAudioProcessingStartedL(*iSong);
-
- }
-void CAudSongProcessOperation::NotifyAudioProcessingProgressed(TInt aPercentage)
- {
- if (iObserver != 0)
- iObserver->NotifyAudioProcessingProgressed(*iSong, aPercentage);
-
- }
-void CAudSongProcessOperation::NotifyAudioProcessingCompleted(TInt aError)
- {
-
- delete iProcessor;
- iProcessor = 0;
-
- MAudSongProcessingObserver* observer = iObserver;
- iObserver = 0;
- if (observer != 0)
- {
- observer->NotifyAudioProcessingProgressed(*iSong, 100);
- observer->NotifyAudioProcessingCompleted(*iSong, aError);
- }
- }
-
-void CAudSongProcessOperation::NotifyTimeEstimateReady(TInt64 aTimeEstimate)
- {
-
- delete iProcessor;
- iProcessor = 0;
-
- MAudTimeEstimateObserver* observer = iTEObserver;
- iTEObserver = 0;
-
- if (observer != 0)
- {
- observer->NotifyTimeEstimateReady(aTimeEstimate);
- }
- }
-
-
-TBool CAudSongProcessOperation::StartSyncProcL()
- {
-
- if (iProcessor != 0)
- {
- User::Leave(KErrNotReady);
- }
-
- CAudProcessor* processor = CAudProcessor::NewLC();
- TBool ret = processor->StartSyncProcessingL(iSong);
- CleanupStack::Pop(processor);
- iProcessor = processor;
-
- return ret;
-
- }
-
-TBool CAudSongProcessOperation::ProcessSyncPieceL(HBufC8*& aFrame, TInt& aProgress,
- TTimeIntervalMicroSeconds& aDuration)
- {
- TBool ret = iProcessor->ProcessSyncPieceL(aFrame, aProgress, aDuration);
- if (!ret) return EFalse;
- else
- {
- delete iProcessor;
- iProcessor = 0;
- return ETrue;
-
- }
-
- }
-
-
-void CAudSongProcessOperation::Cancel()
- {
-
- if (iProcessor == 0)
- {
- TAudPanic::Panic(TAudPanic::ESongProcessingOperationNotRunning);
- }
- else
- {
- iProcessor->CancelProcessing(*this);
- }
- }
-
-TBool CAudSongProcessOperation::GetTimeEstimateL(MAudTimeEstimateObserver& aTEObserver)
- {
-
-
-
- if (iProcessor != 0)
- {
- User::Leave(KErrNotReady);
- }
- iTEObserver = &aTEObserver;
-
- CAudProcessor* processor = CAudProcessor::NewLC();
-
-
- TBool ret = processor->StartTimeEstimateL(iSong, *this);
- CleanupStack::Pop(processor);
- iProcessor = processor;
-
- return ret;
-
- }
-
-
-CAudSongAddClipOperation* CAudSongAddClipOperation::NewL(CAudSong* aSong)
- {
- CAudSongAddClipOperation* self =
- new (ELeave) CAudSongAddClipOperation(aSong);
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop(self);
- return self;
- }
-
-
-CAudSongAddClipOperation::CAudSongAddClipOperation(CAudSong* aSong)
- : iSong(aSong), iClip(0)
- {
- }
-
-
-void CAudSongAddClipOperation::ConstructL()
- {
- }
-
-
-CAudSongAddClipOperation::~CAudSongAddClipOperation()
- {
- if (iClip)
- {
- delete iClip;
- iClip = 0;
- }
-
- }
-
-
-void CAudSongAddClipOperation::NotifyClipInfoReady(CAudClipInfo& /*aInfo*/,
- TInt aError)
- {
-
-
- iError = aError;
- CompleteAddClipOperation();
-
- }
-
-
-void CAudSongAddClipOperation::CompleteAddClipOperation()
- {
- PRINT((_L("CAudSongAddClipOperation::CompleteAddClipOperation in")));
-
-
- if (iError != KErrNone)
- {
- TInt trackIndex = iClip->TrackIndex();
- delete iClip;
- iClip = 0;
- iSong->FireClipAddingFailed(iSong, iError, trackIndex);
- PRINT((_L("CAudSong::CompleteAddClipOperation failed, out")));
- return;
- }
- else
- {
-
- TAudFileProperties info = iClip->iInfo->Properties();
-
- if (iSong->iClipArray.Count() > 0)
- {
- if (!(info.isCompatible(iSong->iClipArray[0]->Info()->Properties())))
- {
- TInt trackIndex = iClip->TrackIndex();
-
- delete iClip;
- iClip = 0;
- iSong->FireClipAddingFailed(iSong, KErrNotSupported, trackIndex);
- PRINT((_L("CAudSong::CompleteAddClipOperation failed, out")));
- return;
- }
- }
-
- if (iClip->CutOutTime() == TTimeIntervalMicroSeconds(KClipEndTime))
- {
-
- iClip->iCutOutTime = info.iDuration;
- }
-
-
- TInt err = KErrNone;
-
- TBool added = EFalse;
-
- // insert clips so that they are always sorted by start time
- TInt index = 0;
- for (index = 0 ; index < iSong->iClipArray.Count() ; index++)
- {
- if (iSong->iClipArray[index]->StartTime() > iClip->StartTime())
- {
- err = iSong->iClipArray.Insert(iClip, index);
- added = ETrue;
- break;
- }
- }
- if (!added)
- {
- index = iSong->iClipArray.Count();
- err = iSong->iClipArray.Insert(iClip, index);
- if (err != KErrNone)
- {
- TInt trackIndex = iClip->TrackIndex();
- delete iClip;
- iClip = 0;
- iSong->FireClipAddingFailed(iSong, KErrGeneral, trackIndex);
- PRINT((_L("CAudSong::CompleteAddClipOperation failed, out")));
- return;
- }
-
- }
- iClip->iIndex = iSong->Index2IndexOnTrack(index);
-
- if (err != KErrNone)
- {
- TInt trackIndex = iClip->TrackIndex();
-
- delete iClip;
- iClip = 0;
- iSong->FireClipAddingFailed(iSong, err, trackIndex);
- }
- else
- {
- iSong->UpdateClipIndexes();
- CAudClip* clip = iClip;
- iClip = 0;
-
-
- if (clip->EndTime() > iSong->iSongDuration)
- {
- iSong->iSongDuration = clip->EndTime();
- }
-
-
- iSong->FireClipAdded(iSong, clip, clip->iIndex, clip->iTrackIndex);
-
-
- }
- }
- PRINT((_L("CAudSongAddClipOperation::CompleteAddClipOperation out")));
- }
-
-EXPORT_C void CAudSong::AddClipL(RFile* aFileHandle,
- TTimeIntervalMicroSeconds aStartTime, TInt aTrackIndex,
- TTimeIntervalMicroSeconds aCutInTime,
- TTimeIntervalMicroSeconds aCutOutTime)
- {
-
- PRINT((_L("CAudSong::AddClipL in")));
- if (iAddOperation->iClip != 0)
- {
- TAudPanic::Panic(TAudPanic::ESongAddOperationAlreadyRunning);
- }
- if (iProcessOperation->iProcessor != 0 )
- {
- TAudPanic::Panic(TAudPanic::ESongProcessingOperationAlreadyRunning);
- }
-
- iAddOperation->iClip = CAudClip::NewL(this, aFileHandle, aStartTime, *iAddOperation, aTrackIndex);
- iAddOperation->iClip->iCutInTime = aCutInTime;
- iAddOperation->iClip->iCutOutTime = aCutOutTime;
-
- PRINT((_L("CAudSong::AddClipL out")));
-
- }
-
-
-