diff -r 000000000000 -r 951a5db380a0 videoeditorengine/audioeditorengine/codecs/WAV/src/ProcWAVFrameHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditorengine/audioeditorengine/codecs/WAV/src/ProcWAVFrameHandler.cpp Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,384 @@ +/* +* 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 "ProcWAVFrameHandler.h" +#include "ProcFrameHandler.h" +#include "ProcTools.h" +#include "ProcConstants.h" + +#include +#include + + +TBool CProcWAVFrameHandler::ManipulateGainL(const HBufC8* aFrameIn, HBufC8*& aFrameOut, TInt8 aGain) + { + TInt a = 0; + + aFrameOut = HBufC8::NewLC(aFrameIn->Size()); + + aFrameOut->Des().Copy(aFrameIn->Ptr(), aFrameIn->Size()); + + aGain = static_cast(aGain / 2); + + TPtr8 framePtr(aFrameOut->Des()); + if (iBitsPerSample == 8) + { + + TReal multiplier = 0; + TReal gaR(aGain); + TReal exp = gaR/20; + Math::Pow(multiplier, 10, exp); + + for (a = 0 ; a < aFrameOut->Length() ; a++) + { + TInt oldGain = (*aFrameOut)[a]-128; + TInt newGain = 0; + + newGain = static_cast(oldGain * multiplier); + + if (newGain > 128) + { + newGain = 128; + } + else if (newGain < -128) + { + newGain = -128; + } + + framePtr[a] = static_cast(newGain+128); + + } + } + else if (iBitsPerSample == 16) + { + + TReal multiplier = 0; + TReal gaR(aGain); + TReal exp = gaR/20; + Math::Pow(multiplier, 10, exp); + + + for (a = 0 ; a < aFrameOut->Length()-1 ; a += 2) + { + + TUint16 oldGain = static_cast((*aFrameOut)[a+1]*256 + (*aFrameOut)[a]); + + TBool negative = EFalse; + + if (oldGain > 32767) + { + oldGain = static_cast(~oldGain+1);// - 65793; + negative = ETrue; + } + + TUint16 newGain = static_cast(oldGain * multiplier); + + if (newGain > 32727) + { + newGain = 32727; + } + + + if (negative) + { + newGain = static_cast(~newGain-1);// - 65793; + + } + framePtr[a+1] = static_cast(newGain/256); + framePtr[a] = static_cast(newGain%256); + + + + } + + } + + + CleanupStack::Pop(); // aFrameOut + return ETrue; + } + +TBool CProcWAVFrameHandler::GetGainL(const HBufC8* aFrame, RArray& aGains, TInt& aMaxGain) const + { + + TInt a = 0; + + TInt highest = 0; + + if (iBitsPerSample == 8) + { + + for (a = 0 ; a < aFrame->Length() ; a++) + { + + + if (Abs((*aFrame)[a]-128) > highest) + highest = Abs((*aFrame)[a]-128); + + } + } + else if (iBitsPerSample == 16) + { + + for (a = 0 ; a < aFrame->Length()-1 ; a += 2) + { + TInt ga = ((*aFrame)[a+1]*256 + (*aFrame)[a]); + + if (ga > 32767) ga-= 65792; + + + + if (ga > highest) highest = ga; + + + } + + } + + + aGains.Append(highest); + + if (iBitsPerSample == 8) aMaxGain = 128; + else if (iBitsPerSample == 16) aMaxGain = 32767; + + + return ETrue; + } + + +TBool CProcWAVFrameHandler::GetNormalizingMargin(const HBufC8* aFrame, TInt8& aMargin) const + + { + + + TInt maxGain = 0; + TInt highestGain = GetHighestGain(aFrame, maxGain); + + + TInt ma = ((maxGain - highestGain)*2)/5; + aMargin = static_cast(ma); + + return ETrue; + + + } + +TBool CProcWAVFrameHandler::IsMixingAvailable() const + { + return ETrue; + } +TBool CProcWAVFrameHandler::MixL(const HBufC8* aFrame1, const HBufC8* aFrame2, HBufC8*& aMixedFrame) + { + + if (aFrame1->Length() != aFrame2->Length()) + { + aMixedFrame = 0; + return EFalse; + } + + aMixedFrame = HBufC8::NewL(aFrame1->Length()); + + TInt a = 0; + TInt newGain = 0; + + if (iBitsPerSample == 8) + { + + for (a = 0 ; a < aFrame1->Length() ; a++) + { + + TInt oldGain1 = (*aFrame1)[a]-128; + TInt oldGain2 = (*aFrame2)[a]-128; + + newGain = oldGain1 + oldGain2; + + if (newGain > 128) + { + newGain = 128; + } + else if (newGain < -128) + { + newGain = -128; + } + + aMixedFrame->Des().Append(static_cast(newGain+128)); + + } + } + else if (iBitsPerSample == 16) + { + + + for (a = 0 ; a < aFrame1->Length()-1 ; a += 2) + { + + TUint16 oldGain1 = static_cast((*aFrame1)[a+1]*256 + (*aFrame1)[a]); + TUint16 oldGain2 = static_cast((*aFrame2)[a+1]*256 + (*aFrame2)[a]); + + + TBool negative1 = EFalse; + TBool negative2 = EFalse; + + if (oldGain1 > 32767) + { + //oldGain1 = ~oldGain1+1;// - 65793; + negative1 = ETrue; +// oldGain1 = oldGain1+((65536-oldGain1)/2); + + } + else + { + +// oldGain1 /= 2; + + } + + if (oldGain2 > 32767) + { + //oldGain2 = ~oldGain2+1;// - 65793; + negative2 = ETrue; +// oldGain2 = oldGain2+((65536-oldGain2)/2); + + } + else + { +// oldGain2 /= 2; + } + + + newGain = static_cast(oldGain1 + oldGain2); + + + if (negative1 && negative2) + { + if (newGain < 32767) + { + newGain = 32768; + } + } + else if (!negative1 && !negative2) + { + if (newGain > 32767) + { + newGain = 32767; + } + + } + + + aMixedFrame->Des().Append(static_cast(newGain%256)); + aMixedFrame->Des().Append(static_cast(newGain/256)); + + } + + } + + return ETrue; + + } + + + +CProcWAVFrameHandler::~CProcWAVFrameHandler() + { + + } + +CProcWAVFrameHandler* CProcWAVFrameHandler::NewL(TInt aBitsPerSample) + { + + + CProcWAVFrameHandler* self = NewLC(aBitsPerSample); + CleanupStack::Pop(self); + return self; + + } +CProcWAVFrameHandler* CProcWAVFrameHandler::NewLC(TInt aBitsPerSample) + { + + CProcWAVFrameHandler* self = new (ELeave) CProcWAVFrameHandler(aBitsPerSample); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + + } + +void CProcWAVFrameHandler::ConstructL() + { + + } + +CProcWAVFrameHandler::CProcWAVFrameHandler(TInt aBitsPerSample) : iBitsPerSample(aBitsPerSample) + { + + } + +TInt CProcWAVFrameHandler::GetHighestGain(const HBufC8* aFrame, TInt& aMaxGain) const + { + + TInt maxGain = 0; + TInt a = 0; + + if (iBitsPerSample == 8) + { + aMaxGain = 210; + + for (a = 0 ; a < aFrame->Length() ; a++) + { + + TInt gain = Abs((*aFrame)[a]-128); + if (gain > maxGain) maxGain = gain; + + } + } + else if (iBitsPerSample == 16) + { + + aMaxGain = 452; + for (a = 0 ; a < aFrame->Length()-1 ; a += 2) + { + TInt ga = ((*aFrame)[a+1]*256 + (*aFrame)[a]); + + if (ga > 32767) ga-= 65792; + + ga = Abs(ga); + + if (ga > maxGain) maxGain = ga; + + } + + } + + TReal result = 0; + TReal gai(maxGain); + + if (gai!= 0) Math::Log(result, gai); + result *= 100; + + return (TInt) result; + + + + + + } + +