diff -r 000000000000 -r 40261b775718 mmlibs/mmfw/src/utils/audioutils/rateconvertimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmlibs/mmfw/src/utils/audioutils/rateconvertimpl.h Tue Feb 02 01:56:55 2010 +0200 @@ -0,0 +1,183 @@ +// Copyright (c) 2002-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: +// + +#ifndef RATECONVERTIMPL_H +#define RATECONVERTIMPL_H + +#include "mmf/utils/rateconvert.h" + +/** +Abstract class that all specific converters derive from. +*/ +NONSHARABLE_CLASS( CChannelAndSampleRateConverterCommon ) : public CChannelAndSampleRateConverter + { +public: + virtual void SetRates(TInt aSrcRate,TInt aDstRate); + + // from CChannelAndSampleRateConverter + void Reset(); + TInt MaxConvertBufferSize(TInt aSrcBufferSize, TBool aRoundUpToPower); + +protected: + CChannelAndSampleRateConverterCommon(); + + static TInt NextPowerUp(TInt aValue); + inline static TInt StereoToMono(TInt aSample); + inline static TInt MonoToStereo(TInt aSample); + + inline static TInt LengthBytesTo16Bit(TInt aLength); + inline static TInt LengthBytesTo32Bit(TInt aLength); + inline static TInt Length16BitToBytes(TInt aLength); + inline static TInt Length32BitToBytes(TInt aLength); + }; + +/* functions for copying from mono to stereo and from stereo to mono */ + +inline TInt CChannelAndSampleRateConverterCommon::StereoToMono(TInt aSample) + { + TInt topChannel = aSample>>16; // will naturally keep sign + TInt bottomChannel = TInt16(aSample&0xffff); // need to sign extend + TInt monoSample = (topChannel + bottomChannel)/2; // add two channels and divide + return monoSample; + } + +inline TInt CChannelAndSampleRateConverterCommon::MonoToStereo(TInt aSample) + { + TInt32 stereoSample = (aSample<<16) | (aSample&0xffff); +#ifdef _DEBUG + TInt monoSample = StereoToMono(stereoSample); + ASSERT(monoSample==aSample); +#endif + return TInt(stereoSample); + } + +// Convert various lengths by multipling or dividing by 2 or 4 + +inline TInt CChannelAndSampleRateConverterCommon::LengthBytesTo16Bit(TInt aLength) + { + return aLength/sizeof(TInt16); + } + +inline TInt CChannelAndSampleRateConverterCommon::LengthBytesTo32Bit(TInt aLength) + { + return aLength/sizeof(TInt32); + } + +inline TInt CChannelAndSampleRateConverterCommon::Length16BitToBytes(TInt aLength) + { + return aLength*sizeof(TInt16); + } + +inline TInt CChannelAndSampleRateConverterCommon::Length32BitToBytes(TInt aLength) + { + return aLength*sizeof(TInt32); + } + +/** +Abstract class that all specific rate converters derive from - as opposed to channel converters +*/ +NONSHARABLE_CLASS( CChannelAndSampleRateConvert ) : public CChannelAndSampleRateConverterCommon + { +public: + + // from CChannelAndSampleRateConverterCommon + void Reset(); + TInt MaxConvertBufferSize(TInt aSrcBufferSize, TBool aRoundUpToPower); + void SetRates(TInt aSrcRate,TInt aDstRate); + +protected: + CChannelAndSampleRateConvert(); + + TInt SizeOfUpsampleBuffer(TInt aBufferLength); +protected: + /* + The sample rate of the data in the source buffer + */ + TInt iFromRate; + /* + The sample rate of the data in the destination buffer + */ + TInt iToRate; + + TInt iFraction; + TInt iIndex; + }; + +NONSHARABLE_CLASS( CStereoToMonoRateConverter ) : public CChannelAndSampleRateConvert + { +public: + CStereoToMonoRateConverter(); + +protected: + // from CChannelAndSampleRateConvert + TInt Convert(const TDesC8& aSrcBuffer, TDes8& aDstBuffer); + TInt MaxConvertBufferSize(TInt aSrcBufferSize, TBool aRoundUpToPower); + }; + +NONSHARABLE_CLASS( CStereoToMonoConverter ) : public CChannelAndSampleRateConverterCommon + { +public: + CStereoToMonoConverter(); + +protected: + // from CChannelAndSampleRateConverterCommon + TInt Convert(const TDesC8& aSrcBuffer, TDes8& aDstBuffer); + TInt MaxConvertBufferSize(TInt aSrcBufferSize, TBool aRoundUpToPower); + }; + +NONSHARABLE_CLASS( CStereoToStereoRateConverter ) : public CChannelAndSampleRateConvert + { +public: + CStereoToStereoRateConverter(); + +protected: + // from CChannelAndSampleRateConvert + TInt Convert(const TDesC8& aSrcBuffer, TDes8& aDstBuffer); + }; + +NONSHARABLE_CLASS( CMonoToMonoRateConverter ) : public CChannelAndSampleRateConvert + { +public: + CMonoToMonoRateConverter(); + +protected: + // from CChannelAndSampleRateConvert + TInt Convert(const TDesC8& aSrcBuffer, TDes8& aDstBuffer); + }; + +NONSHARABLE_CLASS( CMonoToStereoConverter ) : public CChannelAndSampleRateConverterCommon + { +public: + CMonoToStereoConverter(); + +protected: + // from CChannelAndSampleRateConverterCommon + TInt Convert(const TDesC8& aSrcBuffer, TDes8& aDstBuffer); + TInt MaxConvertBufferSize(TInt aSrcBufferSize, TBool aRoundUpToPower); + }; + +NONSHARABLE_CLASS( CMonoToStereoRateConverter ) : public CChannelAndSampleRateConvert + { +public: + CMonoToStereoRateConverter(); + +protected: + // from CChannelAndSampleRateConvert + TInt Convert(const TDesC8& aSrcBuffer, TDes8& aDstBuffer); + TInt MaxConvertBufferSize(TInt aSrcBufferSize, TBool aRoundUpToPower); + }; + +#endif +