mmlibs/mmfw/src/Plugin/Codec/audio/MmfimaadpcmTopcm16codec.cpp
author hgs
Tue, 02 Nov 2010 12:28:51 +0000
changeset 6 fe9d1bf55678
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk46_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
// All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
// Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
// Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
// Description:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
#include "MMFImaAdPcmToPcm16Codec.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
#include <mmfcodec/mmfimaaudiocodecstate.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
#include <mmf/common/mmfaudio.h> // TMMFAudioConfig
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
#include <mmf/plugin/mmfcodecimplementationuids.hrh> // KUidMmfCodecAudioSettings
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
const TUid KUidCodecAudioConfig = {KUidMmfCodecAudioSettings};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
// __________________________________________________________________________
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
// Implementation
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
CMMFCodec* CMMFImaAdPcmPcm16Codec::NewL(TAny* aInitParams)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
	CMMFImaAdPcmPcm16Codec* self=new(ELeave) CMMFImaAdPcmPcm16Codec();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
	CleanupStack::PushL(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
	self->ConstructL(aInitParams);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
	CleanupStack::Pop(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
	return STATIC_CAST( CMMFCodec*, self );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
CMMFImaAdPcmPcm16Codec::~CMMFImaAdPcmPcm16Codec()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
CMMFImaAdPcmPcm16Codec::CMMFImaAdPcmPcm16Codec() : iImaAdpcmTo16Pcm(1)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
void CMMFImaAdPcmPcm16Codec::ConstructL(TAny*  /*aInitParams*/)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
	iTempSrcBufferPtr = iTempSrcBuffer;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
	iTempSrcBufferCount = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
	iChannels = 1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
	iSamplesRate = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
	iSamplesPerBlock = KImaAdpcmSamplesPerBlock;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
	iBlockAlign = KImaAdpcmBlockAlign;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
void CMMFImaAdPcmPcm16Codec::ResetL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
	//Reset the actual codec
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
	TMMFImaAdpcmCodecStateOld state;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
	state.iIndex = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
	state.iPredicted = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
	iImaAdpcmTo16Pcm.SetState(state);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
	iTempSrcBufferPtr = iTempSrcBuffer;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
	iTempSrcBufferCount = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
CMMFImaAdPcmPcm16Codec::ProcessL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
This function converts IMA ADPCM samples to PCM 16 samples, 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
it is for mono ADPCM only at the moment.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
TCodecProcessResult CMMFImaAdPcmPcm16Codec::ProcessL(const CMMFBuffer& aSrc, CMMFBuffer& aDst)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
	TCodecProcessResult result;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
	result.iStatus = TCodecProcessResult::EProcessIncomplete;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
	//convert from generic CMMFBuffer to CMMFDataBuffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
	iSrc = STATIC_CAST(const CMMFDataBuffer*, &aSrc);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
	iDst = STATIC_CAST(CMMFDataBuffer*, &aDst);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
	const TUint srcLen = iSrc->Data().Length();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
	const TUint dstMaxLen = iDst->Data().MaxLength();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
	const TUint sourceRemain = srcLen - iSrc->Position();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
	if (dstMaxLen < (iSamplesPerBlock * 2))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
	if ((iSrc->FrameNumber() == 0) && (iDst->Position() == 0))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
		ResetL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
	//reset data if not a consecutive frame number
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
	if ((iSrc->FrameNumber() != iLastFrameNumber) && (iSrc->FrameNumber() != (iLastFrameNumber+1)))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
		iTempSrcBufferPtr = iTempSrcBuffer;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
		iTempSrcBufferCount = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
	iLastFrameNumber = iSrc->FrameNumber();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
	TUint dstRemain = (dstMaxLen - iDst->Position());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
	TUint srcToFillTempBuffer = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
	//take account of src to be added to temporary buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
	if (iTempSrcBufferCount > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
		srcToFillTempBuffer = iBlockAlign - iTempSrcBufferCount;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
		if (srcToFillTempBuffer < sourceRemain) //enough source to fill temporary buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
			dstRemain -= (iSamplesPerBlock * 2);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
		else //not enough source to fill the temporary buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
			srcToFillTempBuffer = sourceRemain;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
	//calculate how much source is required to fill the destination buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
	TUint blocksRemaining = dstRemain / (iSamplesPerBlock * 2);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
	TUint maxUsableDst = blocksRemaining * iSamplesPerBlock * 2;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
	TUint srcToUse = blocksRemaining * iBlockAlign;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
	srcToUse += srcToFillTempBuffer;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
	srcToUse = (srcToUse < sourceRemain) ? srcToUse : sourceRemain;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
	//we need to cast away CONST even on the source, as the TClass needs a TUint8*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
	TUint8* pSrc = CONST_CAST(TUint8*,iSrc->Data().Ptr());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
	pSrc += iSrc->Position();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
	TUint8* pDst = CONST_CAST(TUint8*,iDst->Data().Ptr());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
	pDst += iDst->Position();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
	TUint dstBytesAdded = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
	TUint srcLeft = srcToUse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
	//convert remaining source from previous call to ProcessL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
	if (iTempSrcBufferCount > 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
		//Fill temp buffer from source buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
		while((iTempSrcBufferCount < iBlockAlign) && (srcLeft))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
			*iTempSrcBufferPtr++ = *pSrc++;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
			iTempSrcBufferCount++;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
			srcLeft --;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
		if (iTempSrcBufferCount == iBlockAlign) //temp buffer full
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
			//reset
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
			iTempSrcBufferCount = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
			iTempSrcBufferPtr = iTempSrcBuffer;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
			iImaAdpcmTo16Pcm.Convert(iTempSrcBufferPtr, pDst, iSamplesPerBlock);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
			pDst += (iSamplesPerBlock * 2);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
			dstBytesAdded += (iSamplesPerBlock * 2);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
	//convert full blocks
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
	while (srcLeft >= iBlockAlign) 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
		iImaAdpcmTo16Pcm.Convert(pSrc, pDst, iSamplesPerBlock);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
		pSrc += iBlockAlign;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
		pDst += (iSamplesPerBlock * 2);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
		dstBytesAdded += (iSamplesPerBlock * 2);	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
		srcLeft -= iBlockAlign;	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
	while (srcLeft)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
		*iTempSrcBufferPtr++ = *pSrc++;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
		iTempSrcBufferCount++;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
		srcLeft--;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
	//if the source buffer is consumed
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
	if ((srcLen == srcToUse + iSrc->Position()))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
		if (dstBytesAdded < maxUsableDst)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
			result.iStatus = TCodecProcessResult::EDstNotFilled;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
			result.iStatus = TCodecProcessResult::EProcessComplete;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
	result.iSrcBytesProcessed = srcToUse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
	result.iDstBytesAdded = dstBytesAdded;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
	iDst->Data().SetLength( iDst->Position() + result.iDstBytesAdded);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
	return result;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
Sets codec configuration.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
@param  aConfigType
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
        The UID of the codec to configure.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
@param  aConfigData
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
        The configuration information.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
void CMMFImaAdPcmPcm16Codec::ConfigureL(TUid aConfigType, const TDesC8& aConfigData)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
	if (aConfigType != KUidCodecAudioConfig)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
		User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
	const TMMFAudioConfig& audioConfig = static_cast<const TPckgBuf<TMMFAudioConfig>&>(aConfigData)();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
	iChannels = audioConfig.iChannels;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
	iSamplesRate = audioConfig.iSampleRate;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
	switch (iSamplesRate * iChannels)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
		case 8000: // fall through, same as 11025
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
		case 11025:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
		case 16000:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
			iBlockAlign = 256;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
		case 22050:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
			iBlockAlign = 512;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
		case 44100:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
			iBlockAlign = 1024;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
		case 88200:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
			iBlockAlign = 2048;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
		default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
			User::Leave(KErrArgument);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
	// SamplesPerBlock = [(BlockAlign - 4 * Channels) * 8] / (BitsPerSample * Channels) + 1
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
	iSamplesPerBlock = (iBlockAlign - 4 * iChannels) * 8 / (KImaAdpcmBitsPerSample * iChannels) + 1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
TInt CMMFImaAdPcmPcm16Codec::Extension_(TUint aExtensionId, TAny*& aExtPtr, TAny*)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
	if (aExtensionId == KUidCustomInterfaceDevSoundFileBlockLength.iUid)	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
		aExtPtr = static_cast<MMMFDevSoundCustomInterfaceFileBlockLength*>(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
		return KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
		return CMMFCodec::Extension_(aExtensionId, aExtPtr, NULL);	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
void CMMFImaAdPcmPcm16Codec::SetFileBlockLength(TUint aBlockAlign)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
	{	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
    iBlockAlign = aBlockAlign;		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
  	iSamplesPerBlock = (iBlockAlign - 4 * iChannels) * 8 / (KImaAdpcmBitsPerSample * iChannels) + 1;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
  		    
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260