diff -r 000000000000 -r bde4ae8d615e os/mm/mmlibs/mmfw/tsrc/mmfunittest/SwCodecDevices/TSU_MMF_SignConversionCodecs.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/mm/mmlibs/mmfw/tsrc/mmfunittest/SwCodecDevices/TSU_MMF_SignConversionCodecs.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,984 @@ +// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// +// Description: +// TSU_MMF_CodecTests.cpp +// +// + +// EPOC includes +#include +#include +#include +#include + +// Test system includes +#include "TSU_MMF_DeviceSuite.h" +#include "TSU_MMF_SignConversionCodecs.h" + +//[ codec includes ] +#include +#include "MmfPcm16toAlawhwDevice.h" +#include "MmfALawToPcm16HwDevice.h" +#include "mmfpcm16toMulawhwdevice.h" +#include "MmfMuLawToPcm16hwDevice.h" +#include "mmfpcmS8ToPcmS16HwDevice.h" +#include "mmfpcmS16PcmS8HwDevice.h" +#include "mmfpcm16topcmU16BEHwDevice.h" +#include "mmfpcm16SwapEndianhwdevice.h" +#include "mmfpcm16ToImaAdpcm.h" +#include "MmfImaAdpcmtopcm16hwdevice.h" +#include "MMFpcm16ToPcm16HwDevice.h" +#include "MMFpcm16ToPcmU8HwDevice.h" +#include "MMFpcmU8ToPcm16HwDevice.h" +#include "mmfpcmS16PcmS8HwDevice.h" + + +//[ Codec Unit tests structure +// The unit tests shall use text files +// for small portions of test data +// which should be stored are stored in a simple format +// containing the relevant parameters for the test +//] +class TSignConversionTestParams + { +public: + const TText* iTestName; // name of the test + }; + +// constant table of parameters for tests +const TSignConversionTestParams KSignConversionParameters[] = + { + {_S("MM-MMF-SWCODECDEVICES-U-0017-HP")}, + {_S("MM-MMF-SWCODECDEVICES-U-0018-HP")}, + {_S("MM-MMF-SWCODECDEVICES-U-0019-HP")}, + {_S("MM-MMF-SWCODECDEVICES-U-0020-HP")}, + {_S("MM-MMF-SWCODECDEVICES-U-0021-HP")} + }; + +/** +* +* PrintComparisonDataL +* @param aCodedData the coded data buffer +* @param aRefCodedData the reference coded data buffer +* +*/ +void CMMFDataGenerator::PrintComparisonDataL( CMMFDataBuffer& aCodedData, CMMFDataBuffer& aRefCodedData ) + { + //[precondition reference coded data is equal in size or longer than coded data ] + if( aRefCodedData.Data().Length() < aCodedData.Data().Length() ) + { + //[coded data is longer than reference data] + // RDebug::Print(_L("Coded Data is longer than refernce data")); Commented under DEF105143 + User::Leave( KErrCorrupt ); + } + + TUint8* ptr1 = CONST_CAST(TUint8*, aCodedData.Data().Ptr()); + TUint8* ptr2 = CONST_CAST(TUint8*, aRefCodedData.Data().Ptr()); + TInt length = aCodedData.Data().Length(); + //[ now print the results for comparison ] + for( TInt i = 0; i < length; i++ ) + { + RDebug::Print( _L("difference: %d, coded: %d, RefCoded: %d"), (*ptr1-*ptr2), *ptr1++, *ptr2++ ); + } + } + +/** +* +* AssembleValue +* @param aData src data buffer +* @param aValue resultant value +* @param aBigEndian whether the value is in BigEndian format +* @precondition aData is not null and has length >= 2 +* +*/ +void CMMFDataGenerator::AssembleValue( TUint8* aData, TInt16& aValue, TBool aBigEndian ) + { + __ASSERT_DEBUG( aData, Panic(EBadArgument)); + if( aBigEndian ) + { + aValue = static_cast( aData[1] &KAndMask8bit ); + aValue |= static_cast((aData[0] << 8 )); + } + else + { + aValue = static_cast( aData[0] &KAndMask8bit); + aValue |= static_cast((aData[1] << 8 )); + } + } + +/** +* +* AssembleValue +* @param aData src data buffer +* @param aValue resultant value +* @param aBigEndian whether the value is in BigEndian format +* @precondition aData is not null and has length >= 2 +* +*/ +void CMMFDataGenerator::AssembleValue( TUint8* aData, TUint16& aValue, TBool aBigEndian ) + { + __ASSERT_DEBUG( aData, Panic(EBadArgument)); + if( aBigEndian ) + { + aValue = aData[1] ; //[ big endian format] + aValue |= (aData[0] << 8 ); + } + else + { + aValue = aData[0] ; + aValue |= (aData[1] << 8 ); + } + } +/** +* +* CMMFPcmU16toPcmU16BGenerator +* +**/ +CMMFPcmU16toPcmU16BGenerator::CMMFPcmU16toPcmU16BGenerator() + { + } + +/** +* +* ~CMMFPcmU16toPcmU16BGenerator +* +**/ +CMMFPcmU16toPcmU16BGenerator::~CMMFPcmU16toPcmU16BGenerator() + { + } + +/** +* +* GenerateSourceDataL +* +**/ +void CMMFPcmU16toPcmU16BGenerator::GenerateSourceDataL( CMMFDataBuffer* &aBuffer, TInt aSize ) + { + const TUint16 KScale2 = 32000; + + //[ create a buffer large enough to fill with the data ] + aBuffer = CMMFDescriptorBuffer::NewL(aSize); + + TUint8* pDst = CONST_CAST(TUint8*,aBuffer->Data().Ptr()); + + //[ lets fill it with a 400hz signal at approx -3db ] + //[encode the data] + TUint16 srcValue = 0; + TReal val = 0.0; + TReal theta = 0.0; + + TInt noSamples = aSize/sizeof(TInt16); + for(TInt i=0; i< noSamples; i++) + { + //[ assign data and place in buffer] + theta = (KPi*i)/10; // fundamental of 400hz sampled @8khz has 20 db or + // better reproduction through gsm codec + User::LeaveIfError(Math::Sin(val,theta)); + srcValue = static_cast( (KScale2 * val ) + KScale2+0.5); + *pDst++ = static_cast( srcValue &KAndMask8bit); + *pDst++ = static_cast( (srcValue >>8) &KAndMask8bit); + } + + aBuffer->Data().SetLength(aSize); + } + +/** +* +* GenerateComparisonDataL +* +**/ +void CMMFPcmU16toPcmU16BGenerator::GenerateComparisonDataL( CMMFDataBuffer* &aBuffer, TInt aSize ) + { + const TUint16 KScale2 = 32000; + + //[ create a buffer large eneough to fill with the data ] + aBuffer = CMMFDescriptorBuffer::NewL(aSize); + + TUint8* pDst = CONST_CAST(TUint8*,aBuffer->Data().Ptr()); + + //[ lets fill it with a 400hz signal at approx -3db ] + //[encode the data] + TUint16 srcValue = 0; + TReal val = 0.0; + TReal theta = 0.0; + + TInt noSamples = aSize/sizeof(TInt16); + for(TInt i=0; i< noSamples; i++) + { + //[ assign data and place in buffer] + theta = (KPi*i)/10; // fundamental of 400hz sampled @8khz has 20 db or + // better reproduction through gsm codec + User::LeaveIfError(Math::Sin(val,theta)); + srcValue = static_cast( (KScale2 * val)+KScale2 +0.5); + //[endian swap here ] + *pDst++ = static_cast( (srcValue >>8) &KAndMask8bit); + *pDst++ = static_cast( srcValue &KAndMask8bit); + } + + aBuffer->Data().SetLength(aSize); + } + +/** +* +* PrintComparisonDataL +* Prints out coded results for comparison with the +* Reference values and is used when the results differ +* +**/ +void CMMFPcmU16toPcmU16BGenerator::PrintComparisonDataL( CMMFDataBuffer& aCodedData, CMMFDataBuffer& aRefCodedData ) + { + //[precondition reference coded data is equal in size or longer than coded data ] + if( aRefCodedData.Data().Length() < aCodedData.Data().Length() ) + { + //[coded data is longer than reference data] + // RDebug::Print( _L("Coded Data is longer than refernce data"));Commented under DEF105143 + User::Leave( KErrCorrupt ); + } + + //[ now print the results for comparison ] + TUint8* ptr1 = CONST_CAST(TUint8*, aCodedData.Data().Ptr()); + TUint8* ptr2 = CONST_CAST(TUint8*, aRefCodedData.Data().Ptr()); + TInt length = aCodedData.Data().Length(); + length /= 2; // [for 16bit words length is half] + //[ assert invariant length is even ] + __ASSERT_DEBUG( (length % 2 == 0 ), Panic(EBadInvariant)); + + TUint16 codedValue = 0; + TUint16 refCodedValue = 0; + //[ now print the results for comparison ] + for( TInt i = 0; i < length; i++ ) + { + //[ assemble 16bit values from buffer values ] + AssembleValue( ptr1, codedValue, ETrue ); + AssembleValue( ptr2, refCodedValue, ETrue ); + RDebug::Print( _L("difference: %u, coded: %u, RefCoded: %u"), (refCodedValue-codedValue), codedValue, refCodedValue ); + if( i % 100 == 0 ) //deal with debug printf deficiencies + { + User::After(100 ); + } + ptr1+=2; + ptr2+=2; + } + } + +/** +* +* CMMFPcmU16BtoPcmU16Generator +* +**/ +CMMFPcmU16BtoPcmU16Generator::CMMFPcmU16BtoPcmU16Generator() + { + } + +/** +* +* ~CMMFPcmU16BtoPcmU16Generator +* +**/ +CMMFPcmU16BtoPcmU16Generator::~CMMFPcmU16BtoPcmU16Generator() + { + } + +/** +* +* GenerateSourceDataL +* +**/ +void CMMFPcmU16BtoPcmU16Generator::GenerateSourceDataL( CMMFDataBuffer* &aBuffer, TInt aSize ) + { + const TUint8 KScale2 = 127; + + //[ create a buffer large eneough to fill with the data ] + aBuffer = CMMFDescriptorBuffer::NewL(aSize); + + TUint8* pDst = CONST_CAST(TUint8*,aBuffer->Data().Ptr()); + + //[ lets fill it with a 400hz signal at approx -3db ] + //[encode the data] + TInt8 srcValue = 0; + TReal val = 0.0; + TReal theta = 0.0; + + TInt noSamples = aSize/sizeof(TInt16); + for(TInt i=0; i< noSamples; i++) + { + //[ assign data and place in buffer] + theta = (KPi*i)/10; // fundamental of 400hz sampled @8khz has 20 db or + // better reproduction through gsm codec + User::LeaveIfError(Math::Sin(val,theta)); + srcValue = static_cast( (KScale2 * val) ); + //[endian swap here ] + *pDst++ = static_cast( (srcValue >>8) &KAndMask8bit); + *pDst++ = static_cast( srcValue &KAndMask8bit); + } + + aBuffer->Data().SetLength(aSize); + } + +/** +* +* GenerateComparisonDataL +* +**/ +void CMMFPcmU16BtoPcmU16Generator::GenerateComparisonDataL( CMMFDataBuffer* &aBuffer, TInt aSize ) + { + const TUint8 KScale2 = 127; + + //[ create a buffer large eneough to fill with the data ] + aBuffer = CMMFDescriptorBuffer::NewL(aSize); + + TUint8* pDst = CONST_CAST(TUint8*,aBuffer->Data().Ptr()); + + //[ lets fill it with a 400hz signal at approx -3db ] + //[encode the data] + TUint16 srcValue = 0; + TReal val = 0.0; + TReal theta = 0.0; + TInt noSamples = aSize/sizeof(TInt16); + for(TInt i=0; i< noSamples; i++) + { + //[ assign data and place in buffer] + theta = (KPi*i)/10; // fundamental of 400hz sampled @8khz has 20 db or + // better reproduction through gsm codec + User::LeaveIfError(Math::Sin(val,theta)); + srcValue = static_cast( KScale2 * val ); + *pDst++ = static_cast( srcValue &KAndMask8bit); + *pDst++ = static_cast( (srcValue >>8) &KAndMask8bit); + } + + aBuffer->Data().SetLength(aSize); + } + +/** +* +* PrintComparisonDataL +* Prints out coded results for comparison with the +* Reference values and is used when the results differ +* +**/ +void CMMFPcmU16BtoPcmU16Generator::PrintComparisonDataL( CMMFDataBuffer& aCodedData, CMMFDataBuffer& aRefCodedData ) + { + //[precondition reference coded data is equal in size or longer than coded data ] + if( aRefCodedData.Data().Length() < aCodedData.Data().Length() ) + { + //[coded data is longer than reference data] + // RDebug::Print( _L("Coded Data is longer than refernce data"));Commented under DEF105143 + User::Leave( KErrCorrupt ); + } + + //[ now print the results for comparison ] + TUint8* ptr1 = CONST_CAST(TUint8*, aCodedData.Data().Ptr()); + TUint8* ptr2 = CONST_CAST(TUint8*, aRefCodedData.Data().Ptr()); + TInt length = aCodedData.Data().Length(); + length /= 2; //[ for 16bit words ] + TUint16 codedValue = 0; + TUint16 refCodedValue = 0; + //[ now print the results for comparison ] + for( TInt i = 0; i < length; i++ ) + { + // assemble 16bit values + AssembleValue( ptr1, codedValue, EFalse); + AssembleValue( ptr2, refCodedValue, EFalse ); + RDebug::Print( _L("difference: %u, coded: %u, RefCoded: %u"), (refCodedValue-codedValue), codedValue, refCodedValue ); + if( i % 100 == 0 ) //deal with debug printf deficiencies + { + User::After( 100 ); + } + ptr1+=2; + ptr2+=2; + } + } + +/** +* +* CMMFPcm8ToPcm16Generator +* +**/ +CMMFPcm8ToPcm16Generator::CMMFPcm8ToPcm16Generator() + { + } + +/** +* +* CMMFPcm8ToPcm16Generator +* +**/ +CMMFPcm8ToPcm16Generator::~CMMFPcm8ToPcm16Generator() + { + } + +/** +* +* GenerateSourceDataL +* +**/ +void CMMFPcm8ToPcm16Generator::GenerateSourceDataL( CMMFDataBuffer* &aBuffer, TInt aSize ) + { + const TInt8 KScale2 = 127; + + //[ create a buffer large eneough to fill with the data ] + aBuffer = CMMFDescriptorBuffer::NewL(aSize); + + TUint8* pDst = CONST_CAST(TUint8*,aBuffer->Data().Ptr()); + + //[ lets fill it with a 400hz signal at approx -3db ] + //[encode the data] + TInt8 srcValue = 0; + TReal val = 0.0; + TReal theta = 0.0; + TInt noSamples = aSize/sizeof(TInt8); + for(TInt i=0; i< noSamples; i++) + { + //[ assign data and place in buffer] + theta = (KPi*i)/10; // fundamental of 400hz sampled @8khz has 20 db or + // better reproduction through gsm codec + User::LeaveIfError(Math::Sin(val,theta)); + srcValue = static_cast( (KScale2 * val) ); + *pDst++ = srcValue; + } + + aBuffer->Data().SetLength(aSize); + } + +/** +* +* GenerateSourceDataL +* +**/ +void CMMFPcm8ToPcm16Generator::GenerateComparisonDataL( CMMFDataBuffer* &aBuffer, TInt aSize ) + { + const TInt8 KScale2 = 127; + + //[ create a buffer large eneough to fill with the data ] + aBuffer = CMMFDescriptorBuffer::NewL(aSize); + + TUint8* pDst = CONST_CAST(TUint8*,aBuffer->Data().Ptr()); + + //[ lets fill it with a 400hz signal at approx -3db ] + //[encode the data] + TInt16 srcValue = 0; + TReal val = 0.0; + TReal theta = 0.0; + TInt noSamples = aSize/sizeof(TInt16); + for(TInt i=0; i< noSamples; i++) + { + //[ assign data and place in buffer] + theta = (KPi*i)/10; // fundamental of 400hz sampled @8khz has 20 db or + // better reproduction through gsm codec + User::LeaveIfError(Math::Sin(val,theta)); + TInt8 temp = static_cast((KScale2 * val)); + srcValue = static_cast( temp << 8); + *pDst++ = static_cast( srcValue&KAndMask8bit); + *pDst++ = static_cast((srcValue>>8)&KAndMask8bit); + } + + aBuffer->Data().SetLength(aSize); + } + +/** +* +* PrintComparisonDataL +* Prints out coded results for comparison with the +* Reference values and is used when the results differ +* +**/ +void CMMFPcm8ToPcm16Generator::PrintComparisonDataL( CMMFDataBuffer& aCodedData, CMMFDataBuffer& aRefCodedData ) + { + //[precondition reference coded data is equal in size or longer than coded data ] + if( aRefCodedData.Data().Length() < aCodedData.Data().Length() ) + { + //[coded data is longer than reference data] + // RDebug::Print( _L("Coded Data is longer than refernce data"));Commented under DEF105143 + User::Leave( KErrCorrupt ); + } + + //[ now print the results for comparison ] + TUint8* ptr1 = CONST_CAST(TUint8*, aCodedData.Data().Ptr()); + TUint8* ptr2 = CONST_CAST(TUint8*, aRefCodedData.Data().Ptr()); + TInt length = aCodedData.Data().Length(); + length /= 2; //[ for 16bit words ] + TInt16 codedValue = 0; + TInt16 refCodedValue = 0; + //[ now print the results for comparison ] + for( TInt i = 0; i < length; i++ ) + { + // assemble 16bit values + AssembleValue( ptr1, codedValue, EFalse ); + AssembleValue( ptr2, refCodedValue, EFalse ); + RDebug::Print( _L("difference: %d, coded: %d, RefCoded: %d"), (refCodedValue-codedValue), codedValue, refCodedValue ); + if( i % 100 == 0 ) //deal with debug printf deficiencies + { + User::After(100 ); + } + ptr1+=2; + ptr2+=2; + } + } + +/** +* +* CMMFPcmU8ToPcm16Generator +* +**/ +CMMFPcmU8ToPcm16Generator::CMMFPcmU8ToPcm16Generator() + { + } + +/** +* +* ~CMMFPcmU8ToPcm16Generator +* +**/ +CMMFPcmU8ToPcm16Generator::~CMMFPcmU8ToPcm16Generator() + { + } + +/** +* +* GenerateSourceDataL +* @param aBuffer +* @param aSize in bytes +* +**/ +void CMMFPcmU8ToPcm16Generator::GenerateSourceDataL( CMMFDataBuffer* &aBuffer, TInt aSize ) + { + const TUint8 KScale2 = 127; + + //[ create a buffer large eneough to fill with the data ] + aBuffer = CMMFDescriptorBuffer::NewL(aSize); + + TUint8* pDst = CONST_CAST(TUint8*,aBuffer->Data().Ptr()); + + //[ lets fill it with a 400hz signal at approx -3db ] + //[encode the data] + TUint8 srcValue = 0; + TReal val = 0.0; + TReal theta = 0.0; + TInt noSamples = aSize/sizeof(TUint8); + for(TInt i=0; i< noSamples; i++) + { + //[ assign data and place in buffer] + theta = KPi*i/10; // fundamental of 400hz sampled @8khz has 20 db or + // better reproduction through gsm codec + User::LeaveIfError(Math::Sin(val,theta)); + + srcValue = static_cast((KScale2 * val+KScale2+0.5)); + *pDst++ = srcValue; + //RDebug::Print( _L("U8 = %u"), srcValue ); Statement commented under DEf105143 + } + + aBuffer->Data().SetLength(aSize); + } + +/** +* +* GenerateComparisonDataL +* @param aBuffer +* @param aSize +* +**/ +void CMMFPcmU8ToPcm16Generator::GenerateComparisonDataL( CMMFDataBuffer* &aBuffer, TInt aSize ) + { + const TInt8 KScale2 = 127; + + //[ create a buffer large eneough to fill with the data ] + aBuffer = CMMFDescriptorBuffer::NewL(aSize); + + TUint8* pDst = CONST_CAST(TUint8*,aBuffer->Data().Ptr()); + + //[ lets fill it with a 400hz signal at approx -3db ] + //[encode the data] +// RDebug::Print( _L("Generation"));Commented under DEF105143 + TUint8 theValue = 0; + TReal val = 0.0; + TReal theta = 0.0; + TUint8 rrr = 0; + TInt length = aSize/sizeof(TInt16); + for(TInt i=0; i< length; i++) + { + //[ assign data and place in buffer] + theta = KPi*i/10; // fundamental of 400hz sampled @8khz has 20 db or + // better reproduction through gsm codec + User::LeaveIfError(Math::Sin(val,theta)); + theValue = static_cast(KScale2 *val + KScale2 + 0.5); + //[ apply the same transformation as the codec ] + rrr = static_cast( theValue^KMaskSign8bit ); + //RDebug::Print( _L("U8 = %u"), theValue ); Statement commented under DEf105143 + *pDst++ = rrr; + *pDst++ = rrr; + } + + aBuffer->Data().SetLength(aSize); + } + +/** +* +* PrintComparisonDataL +* Prints out coded results for comparison with the +* Reference values and is used when the results differ +* +**/ +void CMMFPcmU8ToPcm16Generator::PrintComparisonDataL( CMMFDataBuffer& aCodedData, CMMFDataBuffer& aRefCodedData ) + { + //[precondition reference coded data is equal in size or longer than coded data ] + if( aRefCodedData.Data().Length() < aCodedData.Data().Length() ) + { + //[coded data is longer than reference data] + // RDebug::Print( _L("Coded Data is longer than reference data"));Commented under DEF105143 + User::Leave( KErrCorrupt ); + } + + //[ now print the results for comparison ] + TUint8* ptr1 = CONST_CAST(TUint8*, aCodedData.Data().Ptr()); + TUint8* ptr2 = CONST_CAST(TUint8*, aRefCodedData.Data().Ptr()); + TInt length = aCodedData.Data().Length(); + length /= 2; //[ for 16bit words ] + TInt16 codedValue = 0; + TInt16 refCodedValue = 0; + //[ now print the results for comparison ] + for( TInt i = 0; i < length; i++ ) + { + // assemble 16bit values + AssembleValue( ptr1, codedValue, EFalse ); + AssembleValue( ptr2, refCodedValue, EFalse ); + RDebug::Print( _L("delta %d c %d, rf %d"), (refCodedValue-codedValue), codedValue, refCodedValue ); + if( i % 100 == 0 ) //deal with debug printf deficiencies + { + User::After(100 ); + } + ptr1+=2; + ptr2+=2; + } + + } + +/** +* +* CMMFPcm16ToPcmU8Generator +* +**/ +CMMFPcm16ToPcmU8Generator::CMMFPcm16ToPcmU8Generator() + { + //Nothing doing + } + +/** +* +* CMMFPcm16ToPcmU8Generator +* +**/ +CMMFPcm16ToPcmU8Generator::~CMMFPcm16ToPcmU8Generator() + { + //Nothing doing + } + +/** +* +* GenerateSourceDataL +* @param aBuffer +* @param aSize in bytes +* This function generates a 400hz sine wav +* under the assumption the sampling frequency is 8khz +* +*/ +void CMMFPcm16ToPcmU8Generator::GenerateSourceDataL( CMMFDataBuffer* &aBuffer, TInt aSize ) + { + const TInt KScale = 320; + + //[ create a buffer large eneough to fill with the data ] + aBuffer = CMMFDescriptorBuffer::NewL(aSize); + + TUint8* pDst = CONST_CAST(TUint8*,aBuffer->Data().Ptr()); + + //[ lets fill it with a 400hz signal at approx -3db ] + //[encode the data] + TInt16 srcValue = 0; + TReal val = 0.0; + TReal theta = 0.0; + TInt noSamples = aSize/sizeof(TInt16); + for(TInt i=0; i< noSamples; i++) + { + //[ assign data and place in buffer] + theta = (KPi*i)/10; // fundamental of 400hz sampled @8khz has 20 db or + // better reproduction through gsm codec + User::LeaveIfError(Math::Sin(val,theta)); + srcValue = static_cast( KScale * val ); + *pDst++ = static_cast( srcValue & KAndMask8bit); + *pDst++ = static_cast((srcValue >> 8) & KAndMask8bit ); + } + + aBuffer->Data().SetLength(aSize); + } + +/** +* +* GenerateComparisonDataL +* @param aBuffer +* @param aSize in bytes +* This function generates a 400hz sine wav +* under the assumption the sampling frequency is 8khz +*/ +//[ use partial sopecialization to provide copncrete implmentation] +void CMMFPcm16ToPcmU8Generator::GenerateComparisonDataL( CMMFDataBuffer* &aBuffer, TInt aSize ) + { + const TInt KScale2 = 320; //low value chosen to emphasize the distortion of this codec! + + //[ create a buffer large eneough to fill with the data ] + aBuffer = CMMFDescriptorBuffer::NewL(aSize); + + TUint8* pDst = CONST_CAST(TUint8*,aBuffer->Data().Ptr()); + + //[ lets fill it with a 400hz signal at approx -3db ] + //[encode the data] + TInt16 srcValue = 0; + TReal val = 0.0; + TReal theta = 0.0; + TInt noSamples = aSize/sizeof(TUint8); + for(TInt i=0; i< noSamples; i++) + { + //[ assign data and place in buffer] + theta = (KPi*i)/10; // fundamental of 400hz sampled @8khz has 20 db or + // better reproduction through gsm codec + User::LeaveIfError(Math::Sin(val,theta)); + srcValue = static_cast( KScale2 * val ); + *pDst++ = static_cast( (srcValue >> 8) - KMaskSign8bit); + } + + aBuffer->Data().SetLength(aSize); + } + +/** +* +* PrintComparisonDataL +* Prints out coded results for comparison with the +* Reference values and is used when the results differ +* +**/ +void CMMFPcm16ToPcmU8Generator::PrintComparisonDataL( CMMFDataBuffer& aCodedData, CMMFDataBuffer& aRefCodedData ) + { + //[precondition reference coded data is equal in size or longer than coded data ] + if( aRefCodedData.Data().Length() < aCodedData.Data().Length() ) + { + //[coded data is longer than reference data] + // RDebug::Print( _L("Coded Data is longer than refernce data"));Commented under DEF105143 + User::Leave( KErrCorrupt ); + } + + //[ now print the results for comparison ] + TUint8* ptr1 = CONST_CAST(TUint8*, aCodedData.Data().Ptr()); + TUint8* ptr2 = CONST_CAST(TUint8*, aRefCodedData.Data().Ptr()); + TInt length = aCodedData.Data().Length(); + //[ now print the results for comparison ] + for( TInt i = 0; i < length; i++ ) + { + RDebug::Print( _L("difference: %u, coded: %u, RefCoded: %u"), (*ptr1-*ptr2), *ptr1, *ptr2 ); + if( i % 100 == 0 ) //deal with debug printf deficiencies + { + User::After(100 ); + } + ptr1++; + ptr2++; + } + } + +/** +* +* CompareData +* @param aData1 first data buffer for comparison +* @param aData2 second data buffer for comparison +* result TBool data is the same +* @precondition aData1 has the same amount of data as aData2 +* +*/ +template +TBool CTestStepSignConversionTest::CompareData( CMMFDataBuffer* aData1, CMMFDataBuffer* aData2) + { + TBool result = ETrue; + + //[ precondition aData1 != NULL ] + if( !aData1 ) + { + User::Leave( KErrArgument ); + } + + //[ precondition aData2 != NULL ] + if( !aData2 ) + { + User::Leave( KErrArgument ); + } + + //[precondition aData1 length == aData2 length ] + if( aData1->Data().Length() != aData2->Data().Length() ) + { + User::Leave( KErrArgument ); + } + + //[Now Compare the data] + TUint8* ptr1 = CONST_CAST(TUint8*, aData1->Data().Ptr()); + TUint8* ptr2 = CONST_CAST(TUint8*, aData2->Data().Ptr()); + TInt dataLength = aData2->Data().Length(); + if( Mem::Compare( ptr1, dataLength, ptr2, dataLength )!=0) + { + TUint8* p1 = ptr1; + TUint8* p2 = ptr2; + TInt16 s1 = 0; + TInt16 s2 = 0; + INFO_PRINTF1(_L("------------------------------")); + for( TInt i = 0; i < dataLength/2; i++ ) + { + s1 = static_cast( p1[0] &KAndMask8bit); + s1 |= static_cast((p1[1] << 8 )); + s2 = static_cast( p2[0] &KAndMask8bit); + s2 |= static_cast((p2[1] << 8 )); + INFO_PRINTF3(_L("%d %d"), s1, s2); + p1+=2; + p2+=2; + } + INFO_PRINTF1(_L("------------------------------")); + // RDebug::Print( _L("Comparison has failed")); Commented under DEF105143 + iGenerator->PrintComparisonDataL( *aData1, *aData2 ); + result = EFalse ; + } + return result; + } + +/** +* +* DoTestStepL +* @result TVerdict +* +*/ +template +TVerdict CTestStepSignConversionTest::DoTestStepL() + { + __MM_HEAP_MARK; + TVerdict result = EPass; + + //[pre condition iSourceData ] + if( !iSourceData ) + { + INFO_PRINTF1(_L("Source Data Failure")); + User::Leave( KErrCorrupt); + } + //[precondition iCodedData ] + if( !iCodedData ) + { + INFO_PRINTF1(_L("Coded Data Failure")); + User::Leave( KErrCorrupt); + } + //[precondition iRefData ] + if( !iRefCodedData ) + { + INFO_PRINTF1(_L("RefCodedData Argument Failure")); + User::Leave( KErrCorrupt); + } + + //[ lets code the data and compare it to the reference data ] + iCodecUnderTest->ProcessL(*iSourceData, *iCodedData); + if(!CompareData(iCodedData, iRefCodedData)) + { + INFO_PRINTF1(_L("Coded Results do not match reference coded results")); + + result = EFail; + } + + __MM_HEAP_MARKEND; + return result; + } + +/** +* +* DoTestStepPostambleL +* @result TVerdict +* +*/ +template +TVerdict CTestStepSignConversionTest::DoTestStepPostambleL() + { + TVerdict result = EPass; + //[delete the buffers & Codec] + delete iCodecUnderTest; + delete iGenerator; + delete iSourceData; + delete iCodedData; + delete iRefCodedData; + return result; + } + +/** +* +* DoTestStepPreambleL +* @result TVerdict +* +*/ +template +TVerdict CTestStepSignConversionTest::DoTestStepPreambleL() + { + TVerdict result = EPass; + + iCodecUnderTest = new(ELeave) T; // a cmmfcodec ; + iGenerator = new(ELeave) Generator; // src generator + + //[ensure the number of samples is >= srcbuffers] + const TInt KNumBuffers = 2; + const TInt dataSrcSize = KNumBuffers * iCodecUnderTest->SourceBufferSize(); + + //[generate src data] + iGenerator->GenerateSourceDataL( iSourceData, dataSrcSize); + + const TInt dataSinkSize = KNumBuffers * iCodecUnderTest->SinkBufferSize(); + + //[generate comparison data] + iGenerator->GenerateComparisonDataL( iRefCodedData, dataSinkSize); + + //[reserve space for coded data ] + iCodedData = CMMFDescriptorBuffer::NewL(dataSinkSize); + + return result; + } + +/** +* +* CTestStepCodecUnitTest +* +*/ +template +CTestStepSignConversionTest::CTestStepSignConversionTest() + { + // store the name of this test case + // this is the name that is used by the script file + iTestStepName = (&KSignConversionParameters[index])->iTestName; + } + +/** +* +* CTestStepCodecUnitTest +* +*/ +template +CTestStepSignConversionTest::~CTestStepSignConversionTest() + { + } + +/** +* +* This is used for template instantiation. +* +**/ + +template class CTestStepSignConversionTest; +template class CTestStepSignConversionTest; +template class CTestStepSignConversionTest; +template class CTestStepSignConversionTest; +template class CTestStepSignConversionTest; +