mmlibs/mmfw/Codecs/Src/MMFCodecCommon/MMFAudioMuLawToS16PcmCodec.cpp
author Tapani Kanerva <tapani.kanerva@nice.fi>
Tue, 16 Nov 2010 14:11:25 +0200
branchRCL_3
changeset 67 b35006be8823
parent 0 40261b775718
permissions -rw-r--r--
Bug 3673 - Seeking via grabbing the Music Player progress bar does not work.

// 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:
//

#include "MMFAudioMuLawToS16PcmCodec.h"

/***
*
* Convert
*
*/
EXPORT_C void TMMFAudioMuLawToS16PcmCodec::Convert(TUint8* aSrc, TUint8* aDst, TInt aSamples)
	{
	ASSERT(aSrc);
	ASSERT(aDst);
	
	TInt pcm;
	while (aSamples--)
		{
		pcm = MulawSampleToPcm(*aSrc++);
		*aDst++ = STATIC_CAST( TUint8, pcm&KAndMask8bit);
		*aDst++ = STATIC_CAST( TUint8, pcm>>8);
		}
	
	}

/***
*
* MulawSampleToPcm
* @param aMuLaw
* @return TInt
*
*/
TInt TMMFAudioMuLawToS16PcmCodec::MulawSampleToPcm(TUint8 aMulaw)
	{
	TInt sign, exponent, mantissa, sample;
	
    aMulaw = STATIC_CAST( TUint8, ~aMulaw);
    sign = ( aMulaw & KMaskSign8bit );
    exponent = ( aMulaw >> 4 ) & 0x07;
    mantissa = aMulaw & 0x0F;
    sample = KExpLut[exponent] + ( mantissa << ( exponent + 3 ) );
    if ( sign != 0 )
		sample = -sample;
	
    return sample;
	}

const TInt TMMFAudioMuLawToS16PcmCodec::KExpLut[KMdaMulawTo16PcmExpLutSize] = 
	{
	0, 132, 396, 924, 1980, 4092, 8316, 16764
	};