diff -r 951a5db380a0 -r d87d32eab1a9 videoeditorengine/audioeditorengine/codecs/WAV/src/ProcWAVInFileHandler.cpp --- a/videoeditorengine/audioeditorengine/codecs/WAV/src/ProcWAVInFileHandler.cpp Fri Jan 29 14:08:33 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,473 +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 "ProcWAVInFileHandler.h" -#include "ProcWAVFrameHandler.h" -#include "AudPanic.h" -#include "ProcTools.h" -#include "audconstants.h" - - - -CProcWAVInFileHandler* CProcWAVInFileHandler::NewL(const TDesC& aFileName, - RFile* aFileHandle, - CAudClip* aClip, - TInt aReadBufferSize, - TInt aTargetSampleRate, - TChannelMode aChannelMode) - { - - CProcWAVInFileHandler* self = NewLC(aFileName, aFileHandle, aClip, - aReadBufferSize, aTargetSampleRate, aChannelMode); - CleanupStack::Pop(self); - return self; - } - -CProcWAVInFileHandler* CProcWAVInFileHandler::NewLC(const TDesC& aFileName, - RFile* aFileHandle, - CAudClip* aClip, - TInt aReadBufferSize, - TInt aTargetSampleRate, - TChannelMode aChannelMode) - { - - CProcWAVInFileHandler* self = new (ELeave) CProcWAVInFileHandler(); - CleanupStack::PushL(self); - self->ConstructL(aFileName, aFileHandle, aClip, aReadBufferSize, aTargetSampleRate, aChannelMode); - return self; - } - -CProcWAVInFileHandler::CProcWAVInFileHandler() : CProcInFileHandler(), iNumberofSamplesInFrame(1) - { - - - } - -void CProcWAVInFileHandler::GetPropertiesL(TAudFileProperties* aProperties) - { - - if (iProperties != 0) - { - *aProperties = *iProperties; - return; - } - - - const TInt KFrameDurationMilli = 20; - const TInt KFramesPerSecond = 50; - - if (iFileOpen) - { - aProperties->iFileFormat = EAudFormatUnrecognized; - aProperties->iAudioType = EAudTypeUnrecognized; - aProperties->iAudioTypeExtension = EAudExtensionTypeNoExtension; - aProperties->iBitrate = 0; - aProperties->iBitrateMode = EAudBitrateModeNotRecognized; - aProperties->iChannelMode = EAudChannelModeNotRecognized; - aProperties->iDuration = 0; - aProperties->iSamplingRate = 0; - aProperties->iFrameLen = 0; - aProperties->iFrameCount = 0; - - TInt oldPos = iFilePos; - - // check the validity of WAVE header - - TBuf8<4> chunckID; - TBuf8<4> format; - TBuf8<4> fmt; - TBuf8<4> data; - - TBuf8<1> audioFormat; - - BufferedFileRead(0, chunckID); - BufferedFileRead(8, format); - BufferedFileRead(12, fmt); - BufferedFileRead(20, audioFormat); - BufferedFileRead(36, data); - - - if (chunckID.Compare(_L8("RIFF")) == 0 && - format.Compare(_L8("WAVE")) == 0 && - fmt.Compare(_L8("fmt ")) == 0 && - data.Compare(_L8("data")) == 0 && - audioFormat[0] == 0x01) - { - aProperties->iFileFormat = EAudFormatWAV; - aProperties->iAudioType = EAudWAV; - } - else - { - aProperties->iFileFormat = EAudFormatUnrecognized; - User::Leave(KErrNotSupported); - return; - - } - - TBuf8<1> numChannels; - BufferedFileRead(22, numChannels); - if (numChannels[0] == 0x01) - { - aProperties->iChannelMode = EAudSingleChannel; - } - else if (numChannels[0] == 0x02) - { - aProperties->iChannelMode = EAudStereo; - } - else - { - aProperties->iFileFormat = EAudFormatUnrecognized; - User::Leave(KErrNotSupported); - return; - } - - TBuf8<4> sr; - BufferedFileRead(24, sr); - - TBuf8<8> tmpBin; - TBuf8<8*4> srBin; - - // little endian: - for (TInt a = 3 ; a >= 0; a--) - { - ProcTools::Dec2Bin(sr[a], tmpBin); - srBin.Append(tmpBin); - } - - TUint srDec = 0; - ProcTools::Bin2Dec(srBin, srDec); - - aProperties->iSamplingRate = srDec; - - // Check that the sample rate is supported - if( (aProperties->iSamplingRate != KAedSampleRate8kHz) && - (aProperties->iSamplingRate != KAedSampleRate11kHz) && - (aProperties->iSamplingRate != KAedSampleRate16kHz) && - (aProperties->iSamplingRate != KAedSampleRate22kHz) && - (aProperties->iSamplingRate != KAedSampleRate24kHz) && - (aProperties->iSamplingRate != KAedSampleRate32kHz) && - (aProperties->iSamplingRate != KAedSampleRate44kHz) && - (aProperties->iSamplingRate != KAedSampleRate48kHz) ) - { - User::Leave(KErrNotSupported); - } - - iNumberofSamplesInFrame = srDec/(KFramesPerSecond/numChannels[0]); - if (iNumberofSamplesInFrame%2 != 0) iNumberofSamplesInFrame++; - - tmpBin.Delete(0, tmpBin.Length()); - - TBuf8<4> byteRate; - TBuf8<8*4> byteRateBin; - TUint byteRateDec = 0; - - BufferedFileRead(28, byteRate); - for (TInt b = 3 ; b >= 0; b--) - { - ProcTools::Dec2Bin(byteRate[b], tmpBin); - byteRateBin.Append(tmpBin); - } - ProcTools::Bin2Dec(byteRateBin, byteRateDec); - - aProperties->iBitrate = byteRateDec*8; - - TBuf8<1> numberOfBitsPerSample; - BufferedFileRead(34, numberOfBitsPerSample); - aProperties->iNumberOfBitsPerSample = numberOfBitsPerSample[0]; - - // other bit depths can be added later if (ever) needed - if (aProperties->iNumberOfBitsPerSample != 16 && - aProperties->iNumberOfBitsPerSample != 8) - { - aProperties->iFileFormat = EAudFormatUnrecognized; - User::Leave(KErrNotSupported); - return; - } - - if (aProperties->iNumberOfBitsPerSample == 16) - { - iNumberofSamplesInFrame *= 2; - } - - TBuf8<4> dataSize; - BufferedFileRead(40, dataSize); - - TBuf8<8*4> dataSizeBin; - TUint dataSizeDec = 0; - tmpBin.Delete(0, tmpBin.Length()); - - for (TInt c = 3 ; c >= 0; c--) - { - ProcTools::Dec2Bin(dataSize[c], tmpBin); - dataSizeBin.Append(tmpBin); - } - ProcTools::Bin2Dec(dataSizeBin, dataSizeDec); - - TTimeIntervalMicroSeconds durationMicro((TInt64)(TInt)((TReal(dataSizeDec)/byteRateDec)*1000000)); - - aProperties->iDuration = durationMicro; - aProperties->iBitrateMode = EAudConstant; - aProperties->iFrameLen = iNumberofSamplesInFrame; - - aProperties->iFrameDuration = KFrameDurationMilli*1000; - - aProperties->iFrameCount = (TInt)dataSizeDec/iNumberofSamplesInFrame; - aProperties->iNumFramesPerSample = 1; - - - - BufferedFileSetFilePos(oldPos); - } - else - { - TAudPanic::Panic(TAudPanic::EInternal); - } - - - if (iProperties == 0) - { - iProperties = new (ELeave) TAudFileProperties; - *iProperties = *aProperties; - } - - - } - -TBool CProcWAVInFileHandler::SeekAudioFrame(TInt32 aTime) - { - - TInt frameLengthMilliSeconds = ProcTools::MilliSeconds(iProperties->iFrameDuration); - - TInt framesFromStart = aTime/frameLengthMilliSeconds; - - TInt bytesFromStart = framesFromStart*iNumberofSamplesInFrame; - - const TInt KWAVHeaderLength = 44; - - BufferedFileSetFilePos(bytesFromStart+KWAVHeaderLength); - - if (!iFileOpen) - { - TAudPanic::Panic(TAudPanic::EInternal); - } - - iCurrentTimeMilliseconds = aTime; - - return ETrue; - } - -TBool CProcWAVInFileHandler::SeekCutInFrame() - { - - iCurrentTimeMilliseconds = iCutInTime; - return SeekAudioFrame(iCutInTime); - } - - - -void CProcWAVInFileHandler::ConstructL(const TDesC& aFileName, - RFile* aFileHandle, - CAudClip* aClip, - TInt aReadBufferSize, - TInt aTargetSampleRate, - TChannelMode aChannelMode) - { - - - - - - iTargetSampleRate = aTargetSampleRate; - iChannelMode = aChannelMode; - - InitAndOpenFileL(aFileName, aFileHandle, aReadBufferSize); - - - if (aClip != 0) - { - iCutInTime = ProcTools::MilliSeconds(aClip->CutInTime()); - - } - - - TAudFileProperties prop; - GetPropertiesL(&prop); - - if (iProperties != 0) - { - TInt samplesIn20ms = ((iProperties->iSamplingRate) * - (iProperties->iNumberOfBitsPerSample)/8)/50; - - if (iProperties->iChannelMode == EAudStereo) - { - samplesIn20ms *= 2; - - } - if (samplesIn20ms % 2 != 0) samplesIn20ms--; - - iSilentFrame = HBufC8::NewL(samplesIn20ms); - - if (iProperties->iNumberOfBitsPerSample == 16) - { - iSilentFrame->Des().SetLength(samplesIn20ms); - iSilentFrame->Des().Fill(0); - - } - else if(iProperties->iNumberOfBitsPerSample == 8) - { - iSilentFrame->Des().SetLength(samplesIn20ms); - iSilentFrame->Des().Fill(128); - - } - iSilentFrameDuration = 20; - } - else - { - User::Leave(KErrNotSupported); - } - - iClip = aClip; - - iFrameHandler = CProcWAVFrameHandler::NewL(iProperties->iNumberOfBitsPerSample); - - // Generate a decoder -----------------------> - - iDecoder = CProcDecoder::NewL(); - - iDecodingPossible = iDecoder->InitL(*iProperties, aTargetSampleRate, aChannelMode); - - - // <----------------------- Generate a decoder - - if (iClip != 0 && iClip->Normalizing()) - { - SetNormalizingGainL(iFrameHandler); - } - - } - - -TBool CProcWAVInFileHandler::GetEncAudioFrameL(HBufC8*& aFrame, TInt& aSize, TInt32& aTime) - { - - if (!iFileOpen) - { - TAudPanic::Panic(TAudPanic::EInternal); - } - - TInt numberOfBytesInFrame = iNumberofSamplesInFrame; - TInt bufferSize = numberOfBytesInFrame; - if (iProperties->iNumberOfBitsPerSample == 8) - { - // need to expand to 16 bits per sample since encoders and MMF sample rate converter assumes 16-bit signed input - bufferSize *= 2; - } - - - aFrame = HBufC8::NewL(bufferSize); - - TPtr8 tmpDes((TPtr8)aFrame->Des()); - - BufferedFileRead((TPtr8&)tmpDes , numberOfBytesInFrame); - - if (aFrame->Des().Length() < numberOfBytesInFrame) - { - delete aFrame; - aFrame = 0; - return EFalse; - } - aTime = ProcTools::MilliSeconds(iProperties->iFrameDuration); - iCurrentTimeMilliseconds += aTime; - - TRAPD(err, ManipulateGainL(aFrame)); - - if (err != KErrNone) - { - // something went wrong with the gain manipulation - // continue by returning the original frame - } - - if (iProperties->iNumberOfBitsPerSample == 8) - { - // need to expand to 16 bits per sample since encoders and MMF sample rate converter assumes 16-bit signed input - TUint8* buffer = const_cast(aFrame->Ptr()); - // start from the end to avoid overlapping - for ( TInt i = numberOfBytesInFrame-1; i >= 0 ; i-- ) - { - buffer[i*2+1] = TInt8(buffer[i]) - 128; // 8-bit Wav's are unsigned, 16-bit Wav's are signed - buffer[i*2] = 0; - } - tmpDes.SetLength(bufferSize); - - } - aSize = aFrame->Length(); - - - return ETrue; - - } - - - - -CProcWAVInFileHandler::~CProcWAVInFileHandler() - { - - ResetAndCloseFile(); - - if (iSilentFrame != 0) delete iSilentFrame; - - delete iFrameHandler; - - delete iDecoder; - - } - - -TBool CProcWAVInFileHandler::SetNormalizingGainL(const CProcFrameHandler* aFrameHandler) - { - - HBufC8* point = 0; - TInt siz; - TInt32 tim = 0; - TInt8 margin = 0; - TInt minMargin = KMaxTInt; - - while(GetEncAudioFrameL(point, siz, tim)) - - { - aFrameHandler->GetNormalizingMargin(point, margin); - - delete point; - point = 0; - - if (minMargin > margin) - { - minMargin = margin; - } - - } - - iNormalizingMargin = static_cast(minMargin); - - return ETrue; - - } -