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