os/mm/devsound/sounddevbt/src/Plugin/HwDevice/Audio/Gsm610/BtGsm610.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// * INCLUDE FILES:
sl@0
    15
// 
sl@0
    16
//
sl@0
    17
sl@0
    18
// Standard includes
sl@0
    19
#include <e32std.h>
sl@0
    20
#include <mmfbtswcodecwrapper.h>
sl@0
    21
sl@0
    22
#include <ecom/implementationproxy.h>
sl@0
    23
#include "BtGsm610.h"
sl@0
    24
#include "gsm610fr.h"
sl@0
    25
#include <ecom/ecom.h>
sl@0
    26
#include <e32def.h>
sl@0
    27
#include <mmfbthwdeviceimplementationuids.hrh>
sl@0
    28
#include "../../../MmfBtFileDependencyUtil.h"
sl@0
    29
sl@0
    30
/**
sl@0
    31
*
sl@0
    32
* NewL
sl@0
    33
* @return CMmfGsm610ToPcm16HwDevice*
sl@0
    34
*
sl@0
    35
*/
sl@0
    36
CMmfGsm610ToPcm16HwDevice* CMmfGsm610ToPcm16HwDevice::NewL()
sl@0
    37
	{
sl@0
    38
	CMmfGsm610ToPcm16HwDevice* self=new(ELeave) CMmfGsm610ToPcm16HwDevice();
sl@0
    39
	CleanupStack::PushL(self);
sl@0
    40
	self->ConstructL();
sl@0
    41
	CleanupStack::Pop(self);
sl@0
    42
	return self;
sl@0
    43
	}
sl@0
    44
sl@0
    45
/**
sl@0
    46
*
sl@0
    47
* Codec
sl@0
    48
*
sl@0
    49
*/
sl@0
    50
CMMFSwCodec& CMmfGsm610ToPcm16HwDevice::Codec()
sl@0
    51
	{						  
sl@0
    52
	return *iCodec;
sl@0
    53
	}
sl@0
    54
sl@0
    55
/**
sl@0
    56
*
sl@0
    57
* CMmfGsm610ToPcm16HwDevice
sl@0
    58
*
sl@0
    59
*/
sl@0
    60
CMmfGsm610ToPcm16HwDevice::~CMmfGsm610ToPcm16HwDevice()
sl@0
    61
	{
sl@0
    62
	}
sl@0
    63
sl@0
    64
sl@0
    65
/**
sl@0
    66
*
sl@0
    67
* ConstructL
sl@0
    68
*
sl@0
    69
*/
sl@0
    70
void CMmfGsm610ToPcm16HwDevice::ConstructL()
sl@0
    71
	{
sl@0
    72
	CMMFGsm610ToPcm16Codec* ptr= new(ELeave)CMMFGsm610ToPcm16Codec();
sl@0
    73
	CleanupStack::PushL(ptr); 
sl@0
    74
	ptr->ConstructL();
sl@0
    75
	iCodec = ptr;
sl@0
    76
	CleanupStack::Pop(ptr);
sl@0
    77
	}
sl@0
    78
sl@0
    79
/**
sl@0
    80
*
sl@0
    81
* CMmfPcm16ToGsm610HwDevice
sl@0
    82
*
sl@0
    83
*/
sl@0
    84
CMmfPcm16ToGsm610HwDevice* CMmfPcm16ToGsm610HwDevice::NewL()
sl@0
    85
	{
sl@0
    86
	CMmfPcm16ToGsm610HwDevice* self=new(ELeave) CMmfPcm16ToGsm610HwDevice();
sl@0
    87
	CleanupStack::PushL(self);
sl@0
    88
	self->ConstructL();
sl@0
    89
	CleanupStack::Pop(self);
sl@0
    90
	return self;
sl@0
    91
	}
sl@0
    92
sl@0
    93
/**
sl@0
    94
*
sl@0
    95
* Codec
sl@0
    96
* @return CMMFSwCodec&
sl@0
    97
*
sl@0
    98
*/
sl@0
    99
CMMFSwCodec& CMmfPcm16ToGsm610HwDevice::Codec()
sl@0
   100
	{
sl@0
   101
	return *iCodec;
sl@0
   102
	}
sl@0
   103
sl@0
   104
/**
sl@0
   105
*
sl@0
   106
* ~CMmfPcm16ToGsm610HwDevice
sl@0
   107
*
sl@0
   108
*/
sl@0
   109
CMmfPcm16ToGsm610HwDevice::~CMmfPcm16ToGsm610HwDevice()
sl@0
   110
	{
sl@0
   111
	}
sl@0
   112
sl@0
   113
/**
sl@0
   114
*
sl@0
   115
* ConstructL
sl@0
   116
*
sl@0
   117
*/
sl@0
   118
void CMmfPcm16ToGsm610HwDevice::ConstructL()
sl@0
   119
	{
sl@0
   120
	CMMFPcm16ToGsm610Codec* ptr =new(ELeave) CMMFPcm16ToGsm610Codec();
sl@0
   121
	CleanupStack::PushL(ptr); 
sl@0
   122
	ptr->ConstructL();
sl@0
   123
	iCodec = ptr;
sl@0
   124
	CleanupStack::Pop(ptr);
sl@0
   125
	}
sl@0
   126
sl@0
   127
/**
sl@0
   128
*
sl@0
   129
* CMMFGsm610ToPcm16Codec
sl@0
   130
*
sl@0
   131
*/
sl@0
   132
CMMFGsm610ToPcm16Codec::CMMFGsm610ToPcm16Codec()
sl@0
   133
	{	
sl@0
   134
	}
sl@0
   135
sl@0
   136
/**
sl@0
   137
*
sl@0
   138
* ConstructL
sl@0
   139
*
sl@0
   140
*/
sl@0
   141
void CMMFGsm610ToPcm16Codec::ConstructL()
sl@0
   142
	{
sl@0
   143
    iGsmDecoder = new (ELeave) CGSM610FR_Decoder;
sl@0
   144
	iGsmDecoder->ConstructL();
sl@0
   145
	iGsmDecoder->StartL();
sl@0
   146
	}
sl@0
   147
sl@0
   148
/**
sl@0
   149
*
sl@0
   150
* NewL
sl@0
   151
*
sl@0
   152
*/
sl@0
   153
CMMFGsm610ToPcm16Codec*  CMMFGsm610ToPcm16Codec::NewL()
sl@0
   154
	{
sl@0
   155
	CMMFGsm610ToPcm16Codec* self=new(ELeave) CMMFGsm610ToPcm16Codec();
sl@0
   156
	CleanupStack::PushL(self);
sl@0
   157
	self->ConstructL();
sl@0
   158
	CleanupStack::Pop(self);
sl@0
   159
	return self;
sl@0
   160
	}
sl@0
   161
sl@0
   162
/**
sl@0
   163
*
sl@0
   164
* ~CMMFGsm610ToPcm16Codec
sl@0
   165
*
sl@0
   166
*/
sl@0
   167
CMMFGsm610ToPcm16Codec::~CMMFGsm610ToPcm16Codec()
sl@0
   168
	{
sl@0
   169
	delete iGsmDecoder;
sl@0
   170
	}
sl@0
   171
sl@0
   172
/**
sl@0
   173
*
sl@0
   174
* ProcessL
sl@0
   175
* @param aSource
sl@0
   176
* @param aDest
sl@0
   177
* @pre input buffer length is mod 65
sl@0
   178
* @pre output buffer has sufficient space for coded input
sl@0
   179
*
sl@0
   180
*/
sl@0
   181
CMMFSwCodec::TCodecProcessResult CMMFGsm610ToPcm16Codec::ProcessL(const CMMFBuffer& aSrc, CMMFBuffer& aDest)
sl@0
   182
	{
sl@0
   183
	CMMFSwCodec::TCodecProcessResult result;
sl@0
   184
	result.iCodecProcessStatus =	result.iCodecProcessStatus = TCodecProcessResult::EProcessComplete;
sl@0
   185
sl@0
   186
	//convert from generic CMMFBuffer to CMMFDataBuffer
sl@0
   187
	CMMFBuffer* pSrcBuffer =const_cast<CMMFBuffer*>(&aSrc);
sl@0
   188
	if( !pSrcBuffer )
sl@0
   189
		{
sl@0
   190
		User::Leave( KErrArgument );
sl@0
   191
		}
sl@0
   192
sl@0
   193
	CMMFDataBuffer* src = static_cast<CMMFDataBuffer*>( pSrcBuffer );
sl@0
   194
    if( !src )
sl@0
   195
		{
sl@0
   196
		User::Leave( KErrArgument );
sl@0
   197
		}
sl@0
   198
sl@0
   199
	CMMFDataBuffer* dst = static_cast<CMMFDataBuffer*>(&aDest);
sl@0
   200
	if( !dst )
sl@0
   201
		{
sl@0
   202
		User::Leave( KErrArgument );
sl@0
   203
		}
sl@0
   204
sl@0
   205
	if(!CheckInputBuffers( *src, *dst ))
sl@0
   206
		{
sl@0
   207
		User::Leave( KErrArgument );
sl@0
   208
		}
sl@0
   209
sl@0
   210
	TInt numBuffersToProcess = NumBuffersToProcess( *src );
sl@0
   211
	TUint8* pSrc = CONST_CAST(TUint8*,src->Data().Ptr());
sl@0
   212
	TUint8* pDst = CONST_CAST(TUint8*,dst->Data().Ptr());
sl@0
   213
	
sl@0
   214
	for( TInt count = 0; count < numBuffersToProcess; count++ )
sl@0
   215
		{
sl@0
   216
		// Encode two frames of gsm data
sl@0
   217
		iGsmDecoder->ExecuteL( pSrc, pDst );
sl@0
   218
		pSrc                      += KGsmFrameSize;;
sl@0
   219
		pDst                      += KPcmDataForGsmFrame;
sl@0
   220
		result.iSrcBytesProcessed += KGsmFrameSize;
sl@0
   221
		result.iDstBytesAdded     += KPcmDataForGsmFrame;
sl@0
   222
		}
sl@0
   223
sl@0
   224
    dst->Data().SetLength( result.iDstBytesAdded );
sl@0
   225
	__ASSERT_DEBUG( ProcessPostCondition( result ), TMmfGsmCodecPanicsNameSpace::Panic( TMmfGsmCodecPanicsNameSpace::EPostConditionViolation ));
sl@0
   226
	return result;
sl@0
   227
	}
sl@0
   228
sl@0
   229
/**
sl@0
   230
*
sl@0
   231
* CheckInputBuffers
sl@0
   232
* @param aSrc
sl@0
   233
* @param aDest
sl@0
   234
* @return TBool
sl@0
   235
* This function returns ETrue if the preconditions of processL are met
sl@0
   236
*
sl@0
   237
*/
sl@0
   238
TBool CMMFGsm610ToPcm16Codec::CheckInputBuffers( CMMFDataBuffer& aSrc, CMMFDataBuffer& aDest )
sl@0
   239
	{
sl@0
   240
	TBool result = ETrue;    
sl@0
   241
    TInt numInputSubFrames     = aSrc.Data().Length() / KGsmFrameSize;
sl@0
   242
	TInt numOutputSubFrames    = aDest.Data().MaxLength() / KPcmDataForGsmFrame;
sl@0
   243
	TBool validInputDataLength = (aSrc.Data().Length() % KGsmFrameSize == 0);
sl@0
   244
    
sl@0
   245
	if( (numInputSubFrames > numOutputSubFrames) ||  // sufficient space in the output for the input
sl@0
   246
        (aSrc.Position() > 0 )  ||                   // position must be zero since we can eat all the data
sl@0
   247
		(aDest.Position() > 0 ) ||
sl@0
   248
		(!validInputDataLength))                         //position must be zero
sl@0
   249
		{
sl@0
   250
		result = EFalse;
sl@0
   251
		}
sl@0
   252
sl@0
   253
	return result;
sl@0
   254
	}
sl@0
   255
sl@0
   256
/**
sl@0
   257
*
sl@0
   258
* NumBuffersToProcess
sl@0
   259
* @param aSrc
sl@0
   260
* @return TBool
sl@0
   261
* This method returns the number of buffers to process
sl@0
   262
*
sl@0
   263
*/
sl@0
   264
TInt CMMFGsm610ToPcm16Codec::NumBuffersToProcess( const CMMFDataBuffer& aSrc )
sl@0
   265
	{
sl@0
   266
    TInt numBuffers = (aSrc.Data().Length() / KGsmFrameSize );
sl@0
   267
	return numBuffers;
sl@0
   268
	}
sl@0
   269
sl@0
   270
/**
sl@0
   271
*
sl@0
   272
* ProcessPostCondition
sl@0
   273
* @param aResult
sl@0
   274
* @return TBool Etrue if the post condition is satisfied
sl@0
   275
*
sl@0
   276
**/
sl@0
   277
TBool CMMFGsm610ToPcm16Codec::ProcessPostCondition( const CMMFSwCodec::TCodecProcessResult& aResult )
sl@0
   278
	{
sl@0
   279
     TBool status = ETrue;
sl@0
   280
	 if( (aResult.iSrcBytesProcessed / KGsmFrameSize ) != (aResult.iDstBytesAdded / KPcmDataForGsmFrame ) )
sl@0
   281
		 {
sl@0
   282
		 status = EFalse;
sl@0
   283
		 }
sl@0
   284
	 return status;
sl@0
   285
	}
sl@0
   286
sl@0
   287
/************************>----------------------------------<*****************************/
sl@0
   288
sl@0
   289
/**
sl@0
   290
*
sl@0
   291
* CMMFPcm16ToGsm610Codec
sl@0
   292
*
sl@0
   293
*/
sl@0
   294
CMMFPcm16ToGsm610Codec::CMMFPcm16ToGsm610Codec()
sl@0
   295
	{	
sl@0
   296
	}
sl@0
   297
sl@0
   298
/**
sl@0
   299
*
sl@0
   300
* ConstructL
sl@0
   301
*
sl@0
   302
*/
sl@0
   303
void CMMFPcm16ToGsm610Codec::ConstructL()
sl@0
   304
	{
sl@0
   305
	iGsmEncoder = new (ELeave) CGSM610FR_Encoder;
sl@0
   306
	iGsmEncoder->ConstructL();
sl@0
   307
	iGsmEncoder->StartL();
sl@0
   308
	}
sl@0
   309
sl@0
   310
/**
sl@0
   311
*
sl@0
   312
* NewL
sl@0
   313
*
sl@0
   314
*/
sl@0
   315
CMMFPcm16ToGsm610Codec* CMMFPcm16ToGsm610Codec::NewL()
sl@0
   316
	{
sl@0
   317
	CMMFPcm16ToGsm610Codec* self=new(ELeave) CMMFPcm16ToGsm610Codec();
sl@0
   318
	CleanupStack::PushL(self);
sl@0
   319
	self->ConstructL();
sl@0
   320
	CleanupStack::Pop(self);
sl@0
   321
	return self;
sl@0
   322
	}
sl@0
   323
sl@0
   324
/**
sl@0
   325
*
sl@0
   326
* CMMFPcm16ToGsm610Codec
sl@0
   327
*
sl@0
   328
*/
sl@0
   329
CMMFPcm16ToGsm610Codec::~CMMFPcm16ToGsm610Codec()
sl@0
   330
	{
sl@0
   331
	delete iGsmEncoder;
sl@0
   332
	}
sl@0
   333
sl@0
   334
/**
sl@0
   335
*
sl@0
   336
* ProcessL
sl@0
   337
* @param aSource
sl@0
   338
* @param aDest TCodecProcessResult
sl@0
   339
* @return
sl@0
   340
* @pre input buffer length is mod 320
sl@0
   341
* @pre output buffer has sufficient space for coded input
sl@0
   342
*/
sl@0
   343
CMMFSwCodec::TCodecProcessResult CMMFPcm16ToGsm610Codec::ProcessL(const CMMFBuffer& aSrc, CMMFBuffer& aDest)
sl@0
   344
	{
sl@0
   345
	CMMFSwCodec::TCodecProcessResult result;
sl@0
   346
	result.iCodecProcessStatus = 	result.iCodecProcessStatus = TCodecProcessResult::EProcessComplete;
sl@0
   347
sl@0
   348
	//convert from generic CMMFBuffer to CMMFDataBuffer
sl@0
   349
	CMMFBuffer* pSrcBuffer =const_cast<CMMFBuffer*>(&aSrc);
sl@0
   350
	if( !pSrcBuffer )
sl@0
   351
		{
sl@0
   352
		User::Leave( KErrArgument );
sl@0
   353
		}
sl@0
   354
sl@0
   355
	CMMFDataBuffer* src = static_cast<CMMFDataBuffer*>( pSrcBuffer );
sl@0
   356
    if( !src )
sl@0
   357
		{
sl@0
   358
		User::Leave( KErrArgument );
sl@0
   359
		}
sl@0
   360
sl@0
   361
	CMMFDataBuffer* dst = static_cast<CMMFDataBuffer*>(&aDest);
sl@0
   362
	if( !dst )
sl@0
   363
		{
sl@0
   364
		User::Leave( KErrArgument );
sl@0
   365
		}
sl@0
   366
sl@0
   367
sl@0
   368
	if(!CheckInputBuffers( *src, *dst ))
sl@0
   369
		{
sl@0
   370
		User::Leave( KErrArgument );
sl@0
   371
		}
sl@0
   372
sl@0
   373
	TInt numBuffersToProcess = NumBuffersToProcess( *src );
sl@0
   374
	TUint8* pSrc = CONST_CAST(TUint8*,src->Data().Ptr());
sl@0
   375
	TUint8* pDst = CONST_CAST(TUint8*,dst->Data().Ptr());
sl@0
   376
	
sl@0
   377
	for( TInt count = 0; count < numBuffersToProcess; count++ )
sl@0
   378
		{
sl@0
   379
		// Encode two frames of gsm data
sl@0
   380
		iGsmEncoder->ExecuteL (pSrc, pDst);
sl@0
   381
		pSrc                      += KPcmDataForGsmFrame;
sl@0
   382
		pDst                      += KGsmFrameSize;
sl@0
   383
		result.iSrcBytesProcessed += KPcmDataForGsmFrame;
sl@0
   384
		result.iDstBytesAdded     += KGsmFrameSize;
sl@0
   385
		}
sl@0
   386
sl@0
   387
    dst->Data().SetLength( result.iDstBytesAdded ); 
sl@0
   388
sl@0
   389
	__ASSERT_DEBUG( ProcessPostCondition(result), TMmfGsmCodecPanicsNameSpace::Panic( TMmfGsmCodecPanicsNameSpace::EPostConditionViolation ));
sl@0
   390
sl@0
   391
    return result ;
sl@0
   392
	}
sl@0
   393
sl@0
   394
/**
sl@0
   395
*
sl@0
   396
* CheckInputBuffers
sl@0
   397
* @param aSrc
sl@0
   398
* @param aDest
sl@0
   399
* @return TBool
sl@0
   400
* This function returns ETrue if there is sufficient space
sl@0
   401
* in the output buffer for the coded input and
sl@0
   402
* the position of both input buffers is zero
sl@0
   403
*
sl@0
   404
*/
sl@0
   405
TBool CMMFPcm16ToGsm610Codec::CheckInputBuffers( CMMFDataBuffer& aSrc, CMMFDataBuffer& aDest )
sl@0
   406
	{
sl@0
   407
	TBool result = ETrue;    
sl@0
   408
    TInt numInputSubFrames     = aSrc.Data().Length() / KPcmDataForGsmFrame;
sl@0
   409
	TInt numOutputSubFrames    = aDest.Data().MaxLength() / KGsmFrameSize;
sl@0
   410
	TBool validInputDataLength = (aSrc.Data().Length() % KPcmDataForGsmFrame == 0);
sl@0
   411
    
sl@0
   412
	if( (numInputSubFrames > numOutputSubFrames) ||  // sufficient space in the output for the input
sl@0
   413
        (aSrc.Position() > 0 )  ||                   // position must be zero since we can eat all the data
sl@0
   414
		(aDest.Position() > 0 ) ||
sl@0
   415
		(!validInputDataLength))                         //position must be zero
sl@0
   416
		{
sl@0
   417
		result = EFalse;
sl@0
   418
		}
sl@0
   419
sl@0
   420
	return result;
sl@0
   421
	}
sl@0
   422
sl@0
   423
/**
sl@0
   424
*
sl@0
   425
* NumBuffersToProcess
sl@0
   426
* @param aSrc
sl@0
   427
* @return TBool
sl@0
   428
* This method returns the number of buffers to process
sl@0
   429
*
sl@0
   430
*/
sl@0
   431
TInt CMMFPcm16ToGsm610Codec::NumBuffersToProcess( const CMMFDataBuffer& aSrc )
sl@0
   432
	{
sl@0
   433
	TInt numBuffers = ( aSrc.Data().Length() / KPcmDataForGsmFrame );
sl@0
   434
	return numBuffers;
sl@0
   435
	}
sl@0
   436