os/mm/devsound/a3fdevsound/src/devsoundadaptor/cdevaudiocontrol.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2006-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
//
sl@0
    15
sl@0
    16
sl@0
    17
sl@0
    18
#include "cdevaudiocontrol.h"
sl@0
    19
sl@0
    20
#include <a3f/audioprocessingunittypeuids.h>
sl@0
    21
#include <mmf/server/mmfswcodecwrappercustominterfacesuids.hrh>
sl@0
    22
#include <a3f/maudiocontext.h>
sl@0
    23
#include <a3f/maudiostream.h>
sl@0
    24
#include <a3f/maudiocodec.h>
sl@0
    25
#include <a3f/maudiogaincontrol.h>
sl@0
    26
sl@0
    27
sl@0
    28
const TInt KMicroSecondsInSecond = 1000000;
sl@0
    29
const TInt KDefaultBufferSize = 4096;
sl@0
    30
sl@0
    31
const TUint KMaxCallbacksExpected = 2;
sl@0
    32
const TUint KDefaultSampleRate = 8000;
sl@0
    33
const TUid KDefaultMode = {KA3FModeMonoValue};
sl@0
    34
sl@0
    35
class TSampleRateTableEntry
sl@0
    36
	{
sl@0
    37
public:
sl@0
    38
	TInt		iSampleRateValue;
sl@0
    39
	TMMFSampleRate iSampleRate;
sl@0
    40
	};
sl@0
    41
sl@0
    42
const TSampleRateTableEntry KRateTableLookup[] = { 
sl@0
    43
							{ 8000, EMMFSampleRate8000Hz },
sl@0
    44
							{ 11025, EMMFSampleRate11025Hz },
sl@0
    45
							{ 12000, EMMFSampleRate12000Hz },
sl@0
    46
							{ 16000, EMMFSampleRate16000Hz },
sl@0
    47
							{ 22050, EMMFSampleRate22050Hz },
sl@0
    48
							{ 24000, EMMFSampleRate24000Hz },
sl@0
    49
							{ 32000, EMMFSampleRate32000Hz },
sl@0
    50
							{ 44100, EMMFSampleRate44100Hz },
sl@0
    51
							{ 48000, EMMFSampleRate48000Hz },
sl@0
    52
							{ 64000, EMMFSampleRate64000Hz },
sl@0
    53
							{ 88200, EMMFSampleRate88200Hz },
sl@0
    54
							{ 96000, EMMFSampleRate96000Hz },
sl@0
    55
						};
sl@0
    56
const TInt KMaxSampleRateIndex = 11; // must agree with length of table
sl@0
    57
sl@0
    58
class TAudioModeTableEntry
sl@0
    59
	{
sl@0
    60
public:
sl@0
    61
	TMMFMonoStereo	iAudioModeValue;
sl@0
    62
	TUid			iAudioMode;
sl@0
    63
	};
sl@0
    64
sl@0
    65
const TAudioModeTableEntry KModeTableLookup[] = {
sl@0
    66
							{ EMMFMono, {KA3FModeMonoValue} },
sl@0
    67
							{ EMMFStereo, {KA3FModeStereoNonInterleavedValue} },
sl@0
    68
							};
sl@0
    69
sl@0
    70
const TInt KMaxModeIndex = 1; // must agree with length of table
sl@0
    71
sl@0
    72
// ---------------------------------------------------------------------------
sl@0
    73
// Default constructor
sl@0
    74
// ---------------------------------------------------------------------------
sl@0
    75
//
sl@0
    76
CDevAudioControl::CDevAudioControl()
sl@0
    77
	{
sl@0
    78
	TRACE_CREATE();
sl@0
    79
	DP_CONTEXT(CDevAudioControl::CDevAudioControl *CD1*, CtxDevSound, DPLOCAL);
sl@0
    80
	DP_IN();
sl@0
    81
sl@0
    82
	// Local cache default values
sl@0
    83
	iCurrentSampleRate = KDefaultSampleRate;
sl@0
    84
	iCurrentMode = KDefaultMode; 
sl@0
    85
	iOutstandingCallbacks = KMaxCallbacksExpected; //by default we expect 2 callbacks for capabilities.
sl@0
    86
	iCallbackFromAdaptor = KCallbackNone;
sl@0
    87
	
sl@0
    88
	DP_OUT();
sl@0
    89
	}
sl@0
    90
sl@0
    91
sl@0
    92
void CDevAudioControl::ConstructL(CDevAudio* aDevAudio, MDevSoundAdaptationObserver& aDevSoundObserver)
sl@0
    93
	{
sl@0
    94
	TRACE_CREATE();
sl@0
    95
	DP_CONTEXT(CDevAudioControl::ConstructL *CD1*, CtxDevSound, DPLOCAL);
sl@0
    96
	DP_IN();
sl@0
    97
	iDevAudio = aDevAudio; 
sl@0
    98
	iAdaptationObserver = &aDevSoundObserver;
sl@0
    99
	
sl@0
   100
	iObserverRegistered = EFalse;
sl@0
   101
sl@0
   102
	TAudioChannelGain left;
sl@0
   103
	TAudioChannelGain right;
sl@0
   104
	
sl@0
   105
	left.iLocation = TAudioChannelGain::ELeft;
sl@0
   106
	right.iLocation = TAudioChannelGain::ERight;
sl@0
   107
		
sl@0
   108
	User::LeaveIfError(iChannelGains.Append(left)); // assumed element 0 in rest of code
sl@0
   109
	User::LeaveIfError(iChannelGains.Append(right)); // assumed element 1 in rest of code
sl@0
   110
sl@0
   111
	// Note this could be delayed now (volume is internal to adaptor until later in cycle)
sl@0
   112
	// Needed to allow CMMFDevSound::MaxVolume and similar calls before CMMFDevSound::InitializeL
sl@0
   113
	TAny* interface(NULL);
sl@0
   114
	interface = iDevAudio->iGainControl->Interface(KUidAudioGainControl);
sl@0
   115
	iGainControl = static_cast<MAudioGainControl*>(interface);
sl@0
   116
	DP_OUT();
sl@0
   117
	}
sl@0
   118
sl@0
   119
// ---------------------------------------------------------------------------
sl@0
   120
// Destructor
sl@0
   121
// ---------------------------------------------------------------------------
sl@0
   122
//
sl@0
   123
CDevAudioControl::~CDevAudioControl()
sl@0
   124
	{
sl@0
   125
	DP_CONTEXT(CDevAudioControl::~CDevAudioControl *CD1*, CtxDevSound, DPLOCAL);
sl@0
   126
	DP_IN();
sl@0
   127
	iChannelGains.Close();
sl@0
   128
	iSupportedRates.Close();
sl@0
   129
	iSupportedModes.Close();
sl@0
   130
	DP_OUT();
sl@0
   131
	}
sl@0
   132
	
sl@0
   133
// -----------------------------------------------------------------------------
sl@0
   134
// CacheAudioCodecIf
sl@0
   135
//
sl@0
   136
TInt CDevAudioControl::CacheAudioCodecIf()
sl@0
   137
	{
sl@0
   138
	DP_CONTEXT(CDevAudioControl::CacheAudioCodecIf *CD1*, CtxDevSound, DPLOCAL);
sl@0
   139
	DP_IN();
sl@0
   140
	if (iDevAudio->iAudioCodec==NULL)
sl@0
   141
		{
sl@0
   142
		DP0_RET(KErrNotReady,"%d");
sl@0
   143
		}
sl@0
   144
	TInt err = KErrNone;
sl@0
   145
	if (iAudioCodecIf==NULL)
sl@0
   146
		{
sl@0
   147
		MAudioCodec* codecInterface = static_cast<MAudioCodec*>(iDevAudio->iAudioCodec->Interface(KUidAudioCodec));
sl@0
   148
		__ASSERT_ALWAYS (codecInterface, CDevAudioControl::Panic(EAudioCodecIsNull));
sl@0
   149
		iAudioCodecIf = codecInterface; 
sl@0
   150
		}
sl@0
   151
	DP0_RET(err,"%d");
sl@0
   152
	}
sl@0
   153
sl@0
   154
sl@0
   155
// -----------------------------------------------------------------------------
sl@0
   156
// CDevAudioControl::Initialize
sl@0
   157
// -----------------------------------------------------------------------------
sl@0
   158
//
sl@0
   159
TInt CDevAudioControl::Initialize(TUid /*aFormat*/)
sl@0
   160
	{
sl@0
   161
	DP_CONTEXT(CDevAudioControl::Initialize *CD1*, CtxDevSound, DPLOCAL);
sl@0
   162
	DP_IN();
sl@0
   163
	ASSERT(EFalse);
sl@0
   164
	iObserverRegistered = EFalse;
sl@0
   165
	DP0_RET(KErrNone,"%d");
sl@0
   166
	}
sl@0
   167
sl@0
   168
// -----------------------------------------------------------------------------
sl@0
   169
// CDevAudioControl::Uninitialize
sl@0
   170
// -----------------------------------------------------------------------------
sl@0
   171
//
sl@0
   172
TInt CDevAudioControl::Uninitialize()
sl@0
   173
	{
sl@0
   174
	DP_CONTEXT(CDevAudioControl::Uninitialize *CD1*, CtxDevSound, DPLOCAL);
sl@0
   175
	DP_IN();
sl@0
   176
sl@0
   177
	// Remove pUnits only allowed when stream is uninitialized
sl@0
   178
	TInt err = iDevAudio->iAudioStream->Uninitialize();
sl@0
   179
sl@0
   180
	if (err == KErrNone)
sl@0
   181
		{
sl@0
   182
		err = iDevAudio->CommitAudioContext();
sl@0
   183
		}
sl@0
   184
	if (err == KErrNone)
sl@0
   185
		{
sl@0
   186
		iDevAudio->iActiveState = EDevSoundAdaptorUninitialising;
sl@0
   187
		}
sl@0
   188
sl@0
   189
	DP0_RET(err,"%d");
sl@0
   190
	}
sl@0
   191
sl@0
   192
// -----------------------------------------------------------------------------
sl@0
   193
// CDevAudioControl::Unload
sl@0
   194
// -----------------------------------------------------------------------------
sl@0
   195
//
sl@0
   196
TInt CDevAudioControl::Unload()
sl@0
   197
	{
sl@0
   198
	DP_CONTEXT(CDevAudioControl::Unload *CD1*, CtxDevSound, DPLOCAL);
sl@0
   199
	DP_IN();
sl@0
   200
sl@0
   201
	TInt err = iDevAudio->iAudioStream->Unload();
sl@0
   202
	if (err == KErrNone)
sl@0
   203
		{
sl@0
   204
		err = iDevAudio->CommitAudioContext();
sl@0
   205
		}
sl@0
   206
	if (err == KErrNone)
sl@0
   207
		{
sl@0
   208
		iDevAudio->iActiveState = EDevSoundAdaptorUnloading;
sl@0
   209
		}
sl@0
   210
sl@0
   211
	DP0_RET(err,"%d");
sl@0
   212
	}
sl@0
   213
sl@0
   214
// -----------------------------------------------------------------------------
sl@0
   215
// CDevAudioControl::GetCapabilities
sl@0
   216
// -----------------------------------------------------------------------------
sl@0
   217
//
sl@0
   218
TInt CDevAudioControl::GetCapabilities(TMMFCapabilities& aCap)
sl@0
   219
	{
sl@0
   220
	DP_CONTEXT(CDevAudioControl::GetCapabilities *CD1*, CtxDevSound, DPLOCAL);
sl@0
   221
	DP_IN();
sl@0
   222
	// At this phase of CAP, we only care about current codec capabilities. 
sl@0
   223
	// This will be supported as soon as the A3F API changes to support this are ready
sl@0
   224
	TInt err = KErrNone;
sl@0
   225
		
sl@0
   226
	if (iDevAudio->iActiveState != EDevSoundAdaptorCreated_Uninitialised)
sl@0
   227
		{
sl@0
   228
		err = CacheAudioCodecIf();
sl@0
   229
		if (err != KErrNone)
sl@0
   230
			{
sl@0
   231
			DP0_RET(err, "%d");			
sl@0
   232
			}
sl@0
   233
			
sl@0
   234
		if (err == KErrNone)
sl@0
   235
			{
sl@0
   236
			err = iAudioCodecIf->GetSupportedModes(iSupportedModes);
sl@0
   237
			if (err == KErrNone)
sl@0
   238
				{
sl@0
   239
				aCap.iChannels = GetModes(iSupportedModes);
sl@0
   240
				err = iAudioCodecIf->GetSupportedSamplesRates(iSupportedRates);
sl@0
   241
				
sl@0
   242
				if (err == KErrNone)
sl@0
   243
					{
sl@0
   244
					aCap.iRate = GetSampleRates(iSupportedRates);
sl@0
   245
					}
sl@0
   246
				else
sl@0
   247
					{
sl@0
   248
					//If was a problem getting sampleRates we don´t expect callbacks and return
sl@0
   249
					iOutstandingCallbacks = 0;
sl@0
   250
					}
sl@0
   251
					
sl@0
   252
				}
sl@0
   253
			else
sl@0
   254
				{
sl@0
   255
				//If was a problem getting modes we don´t expect callbacks and return
sl@0
   256
				iOutstandingCallbacks = 0;
sl@0
   257
				}
sl@0
   258
			}
sl@0
   259
		}
sl@0
   260
	else
sl@0
   261
		{
sl@0
   262
		err = KErrNotReady;
sl@0
   263
		}
sl@0
   264
	DP0_RET(err, "%d");
sl@0
   265
	}
sl@0
   266
sl@0
   267
// -----------------------------------------------------------------------------
sl@0
   268
// CDevAudioControl::GetConfig
sl@0
   269
// -----------------------------------------------------------------------------
sl@0
   270
//
sl@0
   271
TInt CDevAudioControl::GetConfig(TMMFCapabilities& aConfig)
sl@0
   272
	{
sl@0
   273
	DP_CONTEXT(CDevAudioControl::GetConfig *CD1*, CtxDevSound, DPLOCAL);
sl@0
   274
	DP_IN();
sl@0
   275
	TInt err(KErrNone);
sl@0
   276
sl@0
   277
	//TODO add a return error code if the sample rate or the channels are not found
sl@0
   278
	//We need to transform the local values to a supported value for the client
sl@0
   279
	aConfig.iRate = static_cast<TMMFSampleRate>(GetSampleRate(iCurrentSampleRate));
sl@0
   280
	aConfig.iChannels = static_cast<TMMFMonoStereo>(GetMode(iCurrentMode));
sl@0
   281
	aConfig.iBufferSize = KDefaultBufferSize;
sl@0
   282
	
sl@0
   283
	DP2(DLINFO, "rate 0x%x, channels 0x%x", aConfig.iRate, aConfig.iChannels);
sl@0
   284
sl@0
   285
	DP0_RET(err, "%d");
sl@0
   286
	}
sl@0
   287
sl@0
   288
// -----------------------------------------------------------------------------
sl@0
   289
// CDevAudioControl::SetConfig
sl@0
   290
// -----------------------------------------------------------------------------
sl@0
   291
//
sl@0
   292
TInt CDevAudioControl::SetConfig(const TMMFCapabilities& aConfig)
sl@0
   293
	{
sl@0
   294
	DP_CONTEXT(CDevAudioControl::SetConfig *CD1*, CtxDevSound, DPLOCAL);
sl@0
   295
	DP_IN();
sl@0
   296
	
sl@0
   297
	// TODO need to ensure if iChannels or iSampleRate is outside known values, then
sl@0
   298
	// the code handles that gracefully and returns the appropriate error code
sl@0
   299
	
sl@0
   300
	TInt err(KErrNone);
sl@0
   301
	TUid mode = KNullUid;
sl@0
   302
	//Reset the desired values
sl@0
   303
	iDesiredSampleRate = 0;
sl@0
   304
	iDesiredMode = KNullUid;
sl@0
   305
sl@0
   306
	err = ResolveMode(aConfig.iChannels, mode);
sl@0
   307
	if (err != KErrNone)
sl@0
   308
		{
sl@0
   309
		DP0_RET(err, "%d");
sl@0
   310
		}
sl@0
   311
sl@0
   312
	err = ResolveSampleRate(aConfig.iRate, iDesiredSampleRate);
sl@0
   313
	if (err != KErrNone)
sl@0
   314
		{
sl@0
   315
		DP0_RET(err, "%d");
sl@0
   316
		}
sl@0
   317
sl@0
   318
	// At this phase of CAP, we only care about codec, which checks config against
sl@0
   319
	// its own capabilities. Verification against stream specific capabilities
sl@0
   320
	// should be added later on.
sl@0
   321
	
sl@0
   322
	err = CacheAudioCodecIf();
sl@0
   323
	if (err != KErrNone)
sl@0
   324
		{
sl@0
   325
		DP0_RET(err, "%d");
sl@0
   326
		}
sl@0
   327
	
sl@0
   328
	err = iAudioCodecIf->SetSampleRate(iDesiredSampleRate);
sl@0
   329
		
sl@0
   330
	
sl@0
   331
	if(err == KErrNone)
sl@0
   332
		{
sl@0
   333
		err = iAudioCodecIf->SetMode(mode);
sl@0
   334
		}
sl@0
   335
	
sl@0
   336
	if(err == KErrNone)
sl@0
   337
		{
sl@0
   338
		err = iDevAudio->CommitAudioContext();
sl@0
   339
		if (err == KErrNone)
sl@0
   340
			{
sl@0
   341
			iDesiredMode = mode;
sl@0
   342
			}
sl@0
   343
		}
sl@0
   344
sl@0
   345
	DP0_RET(err, "%d");
sl@0
   346
	}
sl@0
   347
sl@0
   348
// -----------------------------------------------------------------------------
sl@0
   349
// CDevAudioControl::ProcessInit
sl@0
   350
// -----------------------------------------------------------------------------
sl@0
   351
//
sl@0
   352
TInt CDevAudioControl::ProcessInit()
sl@0
   353
	{
sl@0
   354
	DP_CONTEXT(CDevAudioControl::ProcessInit *CD1*, CtxDevSound, DPLOCAL);
sl@0
   355
	DP_IN();
sl@0
   356
	ASSERT(EFalse);
sl@0
   357
	DP0_RET(KErrNone,"%d");
sl@0
   358
	}
sl@0
   359
sl@0
   360
// -----------------------------------------------------------------------------
sl@0
   361
// CDevAudioControl::ProcessData
sl@0
   362
// -----------------------------------------------------------------------------
sl@0
   363
//
sl@0
   364
void CDevAudioControl::ProcessData()
sl@0
   365
	{
sl@0
   366
	DP_CONTEXT(CDevAudioControl::ProcessData *CD1*, CtxDevSound, DPLOCAL);
sl@0
   367
	DP_IN();
sl@0
   368
	ASSERT(EFalse);
sl@0
   369
	DP_OUT();
sl@0
   370
	}
sl@0
   371
sl@0
   372
// -----------------------------------------------------------------------------
sl@0
   373
// CDevAudioControl::GetSamples
sl@0
   374
// -----------------------------------------------------------------------------
sl@0
   375
//
sl@0
   376
TInt CDevAudioControl::GetSamples()
sl@0
   377
	{
sl@0
   378
	DP_CONTEXT(CDevAudioControl::GetSamples *CD1*, CtxDevSound, DPLOCAL);
sl@0
   379
	DP_IN();
sl@0
   380
	TInt err(KErrNone);
sl@0
   381
	TInt samplesplayed(0);
sl@0
   382
	
sl@0
   383
	TTimeIntervalMicroSeconds timeProcessed(0);
sl@0
   384
	err = iDevAudio->iAudioStream->GetStreamTime(timeProcessed);
sl@0
   385
sl@0
   386
	DP1(DLINFO,"CDevAudioControl::GetSamples iCurrentSampleRate %d",iCurrentSampleRate);
sl@0
   387
	
sl@0
   388
	if(err == KErrNone)
sl@0
   389
		{
sl@0
   390
		samplesplayed = (timeProcessed.Int64() * iCurrentSampleRate + KMicroSecondsInSecond/2) / TInt64(KMicroSecondsInSecond);
sl@0
   391
		}
sl@0
   392
	//TODO manage the error
sl@0
   393
sl@0
   394
	DP0_RET(samplesplayed, "%d");
sl@0
   395
	}
sl@0
   396
sl@0
   397
// -----------------------------------------------------------------------------
sl@0
   398
// CDevAudioControl::Stop
sl@0
   399
// -----------------------------------------------------------------------------
sl@0
   400
//
sl@0
   401
TInt CDevAudioControl::Stop()
sl@0
   402
	{
sl@0
   403
	DP_CONTEXT(CDevAudioControl::Stop *CD1*, CtxDevSound, DPLOCAL);
sl@0
   404
	DP_IN();
sl@0
   405
	ASSERT(EFalse);
sl@0
   406
	DP0_RET(KErrNone, "%d");
sl@0
   407
	}
sl@0
   408
sl@0
   409
// -----------------------------------------------------------------------------
sl@0
   410
// CDevAudioControl::Pause
sl@0
   411
// -----------------------------------------------------------------------------
sl@0
   412
//
sl@0
   413
TInt CDevAudioControl::Pause()
sl@0
   414
	{
sl@0
   415
	DP_CONTEXT(CDevAudioControl::Pause *CD1*, CtxDevSound, DPLOCAL);
sl@0
   416
	DP_IN();
sl@0
   417
	ASSERT(EFalse);
sl@0
   418
	DP0_RET(KErrNone, "%d");
sl@0
   419
	}
sl@0
   420
sl@0
   421
// -----------------------------------------------------------------------------
sl@0
   422
// CDevAudioControl::CustomInterface
sl@0
   423
// -----------------------------------------------------------------------------
sl@0
   424
//
sl@0
   425
TAny* CDevAudioControl::CustomInterface(TUid aInterfaceId)
sl@0
   426
	{
sl@0
   427
	DP_CONTEXT(CDevAudioControl::CustomInterface *CD1*, CtxDevSound, DPLOCAL);
sl@0
   428
	DP_IN();
sl@0
   429
	TAny* ciPtr(NULL);
sl@0
   430
	TInt err = KErrNone;
sl@0
   431
	if(iDevAudio->iAudioStream)
sl@0
   432
		{
sl@0
   433
		TAny* ptr = iDevAudio->iAudioStream->Interface(KUidExtensionInferface);
sl@0
   434
		if(ptr)
sl@0
   435
			{
sl@0
   436
			MCustomInterfaceSupport* ciSupport  = static_cast<MCustomInterfaceSupport*>(ptr);
sl@0
   437
			if(!iObserverRegistered)
sl@0
   438
				{
sl@0
   439
				err = ciSupport->RegisterObserver(*this);
sl@0
   440
				if(err == KErrNone)
sl@0
   441
					{
sl@0
   442
					iObserverRegistered = ETrue;
sl@0
   443
					}
sl@0
   444
				}
sl@0
   445
			err = ciSupport->RequestCustomInterface(aInterfaceId, ciPtr);
sl@0
   446
			if( err != KErrNone)
sl@0
   447
				{
sl@0
   448
				ciPtr = NULL;
sl@0
   449
				}
sl@0
   450
			}
sl@0
   451
		}
sl@0
   452
	DP0_RET(ciPtr, "0x%x");
sl@0
   453
	}
sl@0
   454
sl@0
   455
// -----------------------------------------------------------------------------
sl@0
   456
// CDevAudioControl::SetGain
sl@0
   457
// -----------------------------------------------------------------------------
sl@0
   458
TInt CDevAudioControl::SetGains(TInt aDevSoundGain, TInt aDevSoundMaxGain, TInt aBalance[2], const TTimeIntervalMicroSeconds& aRampDuration, TBool aBecomingActive)
sl@0
   459
	{
sl@0
   460
	DP_CONTEXT(CDevAudioControl::SetGains *CD1*, CtxDevSound, DPLOCAL);
sl@0
   461
	DP_IN();
sl@0
   462
	ASSERT(aDevSoundGain>=0 && aDevSoundGain<=aDevSoundMaxGain); // higher layer assumed to scale
sl@0
   463
	ASSERT(aBalance[ELeftCh]>=0 && aBalance[ELeftCh]<=100);
sl@0
   464
	ASSERT(aBalance[ERightCh]>=0 && aBalance[ERightCh]<=100);
sl@0
   465
	ASSERT(aDevSoundMaxGain>0); // assumed max gain is positive
sl@0
   466
	TInt a3fMaxGain;
sl@0
   467
	TInt err = iGainControl->GetMaxGain(a3fMaxGain);
sl@0
   468
	if (err==KErrNone)
sl@0
   469
		{
sl@0
   470
		iLegacyGain = TInt(TReal(aDevSoundGain)*TReal(a3fMaxGain)/TReal(aDevSoundMaxGain)+0.5);
sl@0
   471
		ASSERT(iLegacyGain>=0 && iLegacyGain<=a3fMaxGain);
sl@0
   472
		iLegacyLeft = aBalance[ELeftCh];
sl@0
   473
		iLegacyRight = aBalance[ERightCh];
sl@0
   474
sl@0
   475
		MapGains();
sl@0
   476
sl@0
   477
		// VolumeRamp is only applied when DevSound is becoming active
sl@0
   478
		if(err == KErrNone)
sl@0
   479
			{
sl@0
   480
			if (aRampDuration > 0 && aBecomingActive)
sl@0
   481
				{
sl@0
   482
				err = iGainControl->SetGain(iChannelGains, KUidGainSawTooth, aRampDuration);
sl@0
   483
				}
sl@0
   484
			else
sl@0
   485
				{
sl@0
   486
				err = iGainControl->SetGain(iChannelGains);
sl@0
   487
				}
sl@0
   488
			}
sl@0
   489
sl@0
   490
		// This call will result on commit only when we are already active
sl@0
   491
		// otherwise the changes will be commited by the DevAudioControl 
sl@0
   492
		// It means we're here due to RequestGainAndBalance call
sl@0
   493
		if(err == KErrNone && !aBecomingActive)
sl@0
   494
			{
sl@0
   495
			err = iDevAudio->CommitAudioContext();
sl@0
   496
			}		
sl@0
   497
		}
sl@0
   498
	DP0_RET(err,"%d");
sl@0
   499
	}
sl@0
   500
sl@0
   501
sl@0
   502
// -----------------------------------------------------------------------------
sl@0
   503
// CDevAudioControl::MapAndSetGains
sl@0
   504
// -----------------------------------------------------------------------------
sl@0
   505
//
sl@0
   506
void CDevAudioControl::MapGains()
sl@0
   507
	{
sl@0
   508
	DP_CONTEXT(CDevAudioControl::MapGains *CD1*, CtxDevSound, DPLOCAL);
sl@0
   509
	DP_IN();
sl@0
   510
sl@0
   511
	// Map legacy values to CAP channel array.
sl@0
   512
	if ( iLegacyLeft == iLegacyRight )
sl@0
   513
		{
sl@0
   514
		iChannelGains[ELeftCh].iGain = iLegacyGain;
sl@0
   515
		iChannelGains[ERightCh].iGain = iLegacyGain;
sl@0
   516
		}
sl@0
   517
	else if ( iLegacyLeft > iLegacyRight )
sl@0
   518
		{
sl@0
   519
		iChannelGains[ELeftCh].iGain = iLegacyGain;
sl@0
   520
		iChannelGains[ERightCh].iGain =
sl@0
   521
						static_cast<TUint>((iLegacyGain*iLegacyRight)/iLegacyLeft);
sl@0
   522
		}
sl@0
   523
	else
sl@0
   524
		{
sl@0
   525
		iChannelGains[ERightCh].iGain = iLegacyGain;
sl@0
   526
		iChannelGains[ELeftCh].iGain =
sl@0
   527
						static_cast<TUint>((iLegacyGain*iLegacyLeft)/iLegacyRight);
sl@0
   528
		}
sl@0
   529
sl@0
   530
	DP_OUT();
sl@0
   531
	}
sl@0
   532
sl@0
   533
// -----------------------------------------------------------------------------
sl@0
   534
// CDevAudioControl::DestroyChain
sl@0
   535
// -----------------------------------------------------------------------------
sl@0
   536
//
sl@0
   537
TBool CDevAudioControl::DestroyChain()
sl@0
   538
	{
sl@0
   539
	DP_CONTEXT(CDevAudioControl::DestroyChain *CD1*, CtxDevSound, DPLOCAL);
sl@0
   540
	DP_IN();
sl@0
   541
sl@0
   542
	TInt err = KErrNone;
sl@0
   543
	TBool readyToDestroy = EFalse;
sl@0
   544
	switch(iDevAudio->iActiveState)
sl@0
   545
		{
sl@0
   546
		case EDevSoundAdaptorActive_Active:
sl@0
   547
		case EDevSoundAdaptorPaused_Primed:
sl@0
   548
			{
sl@0
   549
			err = iDevAudio->iAudioStream->Stop();
sl@0
   550
			if(err == KErrNone)
sl@0
   551
				{
sl@0
   552
				err = iDevAudio->CommitAudioContext();
sl@0
   553
				}
sl@0
   554
			if (err == KErrNone)
sl@0
   555
				{
sl@0
   556
				iDevAudio->iActiveState = EDevSoundAdaptorStopping;
sl@0
   557
				}
sl@0
   558
			}
sl@0
   559
			break;
sl@0
   560
		case EDevSoundAdaptorInitialised_Idle:
sl@0
   561
			{
sl@0
   562
			err = iDevAudio->iAudioStream->Unload();
sl@0
   563
			if(err == KErrNone)
sl@0
   564
				{
sl@0
   565
				err = iDevAudio->CommitAudioContext();
sl@0
   566
				}
sl@0
   567
			if (err == KErrNone)
sl@0
   568
				{
sl@0
   569
				iDevAudio->iActiveState = EDevSoundAdaptorUnloading;
sl@0
   570
				}
sl@0
   571
			}
sl@0
   572
			break;
sl@0
   573
		case EDevSoundAdaptorInitialised_Initialised:
sl@0
   574
			{
sl@0
   575
			err = iDevAudio->iAudioStream->Uninitialize();
sl@0
   576
			if(err == KErrNone)
sl@0
   577
				{
sl@0
   578
				err = iDevAudio->CommitAudioContext();
sl@0
   579
				}
sl@0
   580
			if (err == KErrNone)
sl@0
   581
				{
sl@0
   582
				iDevAudio->iActiveState = EDevSoundAdaptorUninitialising;
sl@0
   583
				}
sl@0
   584
			}
sl@0
   585
			break;
sl@0
   586
		case EDevSoundAdaptorCreated_Uninitialised:
sl@0
   587
			readyToDestroy = ETrue;
sl@0
   588
			break;
sl@0
   589
		case EDevSoundAdaptorUnitialised_Uninitialised:
sl@0
   590
			//If following condition is true, then we are here because of a
sl@0
   591
			//pre-emption clash in last Commit cycle started from
sl@0
   592
			//CDevCommonControl::ContextEventUpdateWithStateEventNoError.
sl@0
   593
			if(iDevAudio->iPreviousState == EDevSoundAdaptorRemovingProcessingUnits)
sl@0
   594
				{
sl@0
   595
				err = RemoveProcessingUnits();
sl@0
   596
				break;
sl@0
   597
				}
sl@0
   598
		default:
sl@0
   599
			break;
sl@0
   600
		}
sl@0
   601
	
sl@0
   602
	// Destroy sequence fail!
sl@0
   603
	if(err != KErrNone)
sl@0
   604
		{
sl@0
   605
		DP0(DLINFO, "================ Destroy sequence fail! ================");
sl@0
   606
		readyToDestroy = ETrue;
sl@0
   607
		}
sl@0
   608
	// Set the flag only when needed
sl@0
   609
	iDevAudio->iClosing = !readyToDestroy;
sl@0
   610
	DP0_RET(readyToDestroy,"%d");
sl@0
   611
	}
sl@0
   612
sl@0
   613
sl@0
   614
// -----------------------------------------------------------------------------
sl@0
   615
// CDevAudioControl::RemoveProcessingUnits
sl@0
   616
// -----------------------------------------------------------------------------
sl@0
   617
//
sl@0
   618
TInt CDevAudioControl::RemoveProcessingUnits()
sl@0
   619
	{
sl@0
   620
	DP_CONTEXT(CDevAudioControl::RemoveProcessingUnits *CD1*, CtxDevSound, DPLOCAL);
sl@0
   621
	DP_IN();
sl@0
   622
sl@0
   623
	// Remove pUnits only allowed when stream is uninitialized
sl@0
   624
	TInt err = iDevAudio->iAudioStream->RemoveProcessingUnit(iDevAudio->iAudioSource);
sl@0
   625
		
sl@0
   626
	if(err == KErrNone)
sl@0
   627
		{
sl@0
   628
		err = iDevAudio->iAudioStream->RemoveProcessingUnit(iDevAudio->iAudioSink);	
sl@0
   629
		}
sl@0
   630
	if(err == KErrNone)
sl@0
   631
		{
sl@0
   632
		err = iDevAudio->iAudioStream->RemoveProcessingUnit(iDevAudio->iAudioCodec);
sl@0
   633
		}
sl@0
   634
sl@0
   635
	if (err == KErrNone)
sl@0
   636
		{
sl@0
   637
		err = iDevAudio->CommitAudioContext();
sl@0
   638
		}
sl@0
   639
		
sl@0
   640
	if(err == KErrNone)
sl@0
   641
		{
sl@0
   642
		iDevAudio->iActiveState = EDevSoundAdaptorRemovingProcessingUnits;		
sl@0
   643
		}
sl@0
   644
	DP0_RET(err,"%d");
sl@0
   645
	}
sl@0
   646
sl@0
   647
// -----------------------------------------------------------------------------
sl@0
   648
// From class MAudioStreamObserver
sl@0
   649
// CDevAudioControl::StateEvent
sl@0
   650
// -----------------------------------------------------------------------------
sl@0
   651
//
sl@0
   652
void CDevAudioControl::StateEvent(MAudioStream& /*aStream*/, 
sl@0
   653
									TInt /*aReason*/, 
sl@0
   654
									TAudioState /*aNewState*/)
sl@0
   655
	{
sl@0
   656
	DP_CONTEXT(CDevAudio::StateEvent *CD1*, CtxDevSound, DPLOCAL);
sl@0
   657
	DP_IN();
sl@0
   658
	ASSERT(EFalse);
sl@0
   659
	DP_OUT();
sl@0
   660
	}
sl@0
   661
sl@0
   662
// -----------------------------------------------------------------------------
sl@0
   663
// From class MAudioStreamObserver
sl@0
   664
// CDevAudioControl::AddProcessingUnitComplete
sl@0
   665
// -----------------------------------------------------------------------------
sl@0
   666
//
sl@0
   667
void CDevAudioControl::AddProcessingUnitComplete(MAudioStream& /*aStream*/, 
sl@0
   668
												MAudioProcessingUnit* /*aInstance*/,
sl@0
   669
												TInt /*aError*/)
sl@0
   670
	{
sl@0
   671
	}
sl@0
   672
sl@0
   673
// -----------------------------------------------------------------------------
sl@0
   674
// From class MAudioStreamObserver
sl@0
   675
// CDevAudioControl::RemoveProcessingUnitComplete
sl@0
   676
// -----------------------------------------------------------------------------
sl@0
   677
//
sl@0
   678
void CDevAudioControl::RemoveProcessingUnitComplete(MAudioStream& /*aStream*/,
sl@0
   679
													MAudioProcessingUnit* /*aInstance*/,
sl@0
   680
													TInt /*aError*/)
sl@0
   681
	{
sl@0
   682
	}
sl@0
   683
sl@0
   684
// -----------------------------------------------------------------------------
sl@0
   685
// From class MAudioStreamObserver
sl@0
   686
// CDevAudioControl::ProcessingFinished
sl@0
   687
// -----------------------------------------------------------------------------
sl@0
   688
//
sl@0
   689
void CDevAudioControl::ProcessingFinished(MAudioStream& /*aStream*/)
sl@0
   690
	{
sl@0
   691
	}
sl@0
   692
sl@0
   693
// -----------------------------------------------------------------------------
sl@0
   694
// From class MAudioStreamObserver
sl@0
   695
// CDevAudioControl::FlushComplete
sl@0
   696
// -----------------------------------------------------------------------------
sl@0
   697
//
sl@0
   698
void CDevAudioControl::FlushComplete (MAudioStream& /*aStream*/, TInt aError)
sl@0
   699
	{
sl@0
   700
	// no action needed - should complete as part of the ContextEvent.
sl@0
   701
	// otherwise could callback.
sl@0
   702
	TInt err = KErrNone;
sl@0
   703
	
sl@0
   704
	if(iPauseResumeSequenceDueToEmptyBuffers)
sl@0
   705
		{
sl@0
   706
		// Flush operation failed
sl@0
   707
		if(aError != KErrNone)
sl@0
   708
			{
sl@0
   709
			iPauseResumeSequenceDueToEmptyBuffers = EFalse;
sl@0
   710
			iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackFlushComplete, aError);
sl@0
   711
			}
sl@0
   712
		// Handle throw-off scenarios, resume is not possible from here
sl@0
   713
		// 1. ProcessingFinished has occurred
sl@0
   714
		// 2. Preemption occurred 
sl@0
   715
		else if(iCallbackFromAdaptor != KCallbackNone || 
sl@0
   716
			iDevAudio->iActiveState != EDevSoundAdaptorPaused_Primed)
sl@0
   717
			{
sl@0
   718
			iPauseResumeSequenceDueToEmptyBuffers = EFalse;
sl@0
   719
			iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackFlushComplete, KErrNone);
sl@0
   720
			
sl@0
   721
			}
sl@0
   722
		else
sl@0
   723
			{
sl@0
   724
			err = Resume();
sl@0
   725
			if(err != KErrNone)
sl@0
   726
				{
sl@0
   727
				iPauseResumeSequenceDueToEmptyBuffers = EFalse;
sl@0
   728
				iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackFlushComplete, aError);
sl@0
   729
				}
sl@0
   730
			// Once ContextEvent be received 
sl@0
   731
			// EmptyBuffers can be considered completed
sl@0
   732
			}
sl@0
   733
		}
sl@0
   734
	// EmptyBuffers operation has concluded here
sl@0
   735
	// we didn't go through pause - resume sequence
sl@0
   736
	else
sl@0
   737
		{
sl@0
   738
		iAdaptationObserver->CallbackFromAdaptorReceived(KCallbackFlushComplete, aError);
sl@0
   739
		}
sl@0
   740
	}
sl@0
   741
	
sl@0
   742
// -----------------------------------------------------------------------------
sl@0
   743
// From class MAudioGainControlObserver
sl@0
   744
// CDevAudioControl::MaxRampTimeChanged
sl@0
   745
// -----------------------------------------------------------------------------
sl@0
   746
//
sl@0
   747
void CDevAudioControl::MaxRampTimeChanged(MAudioGainControl& /*aGain*/)
sl@0
   748
	{
sl@0
   749
	DP_CONTEXT(CDevAudioControl::MaxRampTimeChanged *CD1*, CtxDevSound, DPLOCAL);
sl@0
   750
	DP_IN();
sl@0
   751
	// this is not cached, no actions needed
sl@0
   752
	DP_OUT();
sl@0
   753
	}
sl@0
   754
sl@0
   755
// -----------------------------------------------------------------------------
sl@0
   756
// From class MAudioGainControlObserver
sl@0
   757
// CDevAudioControl::MaxGainChanged
sl@0
   758
// -----------------------------------------------------------------------------
sl@0
   759
//
sl@0
   760
void CDevAudioControl::MaxGainChanged(MAudioGainControl& /*aGain*/)
sl@0
   761
	{
sl@0
   762
	DP_CONTEXT(CDevAudioControl::MaxGainChanged *CD1*, CtxDevSound, DPLOCAL);
sl@0
   763
	DP_IN();
sl@0
   764
	// this is not cached, no actions needed
sl@0
   765
	DP_OUT();
sl@0
   766
	}
sl@0
   767
sl@0
   768
// -----------------------------------------------------------------------------
sl@0
   769
// From class MAudioGainControlObserver
sl@0
   770
// CDevAudioControl::GainChanged
sl@0
   771
// -----------------------------------------------------------------------------
sl@0
   772
//
sl@0
   773
void CDevAudioControl::GainChanged(MAudioGainControl& aGain, TInt aError)
sl@0
   774
	{
sl@0
   775
	DP_CONTEXT(CDevAudioControl::GainChanged *CD1*, CtxDevSound, DPLOCAL);
sl@0
   776
	DP1_IN("aError=%d", aError);
sl@0
   777
sl@0
   778
	if(aError != KErrNone)
sl@0
   779
		{
sl@0
   780
		// Either our request failed, or MMRC has forced some values, and we
sl@0
   781
		// have to update local values.
sl@0
   782
		aGain.GetGain(iChannelGains);
sl@0
   783
		ASSERT(iChannelGains.Count()==2);
sl@0
   784
		// Map CAP channel array to legacy values. 
sl@0
   785
		// assumption: left%+right%=100
sl@0
   786
		if ( iChannelGains[ELeftCh].iGain == iChannelGains[ERightCh].iGain )
sl@0
   787
			{
sl@0
   788
			iLegacyGain = iChannelGains[ELeftCh].iGain;
sl@0
   789
			iLegacyLeft = 50;
sl@0
   790
			iLegacyRight = 50;
sl@0
   791
			}
sl@0
   792
		else if ( iChannelGains[ELeftCh].iGain > iChannelGains[ERightCh].iGain )
sl@0
   793
			{
sl@0
   794
			iLegacyGain = iChannelGains[ELeftCh].iGain;
sl@0
   795
			iLegacyLeft = static_cast<TUint>
sl@0
   796
				((100*iLegacyGain)/(iLegacyGain+iChannelGains[ERightCh].iGain));
sl@0
   797
			iLegacyRight = 100 - iLegacyLeft;
sl@0
   798
			//(not that accurate, but sufficient for now)
sl@0
   799
			}
sl@0
   800
		else
sl@0
   801
			{
sl@0
   802
			iLegacyGain = iChannelGains[ERightCh].iGain;
sl@0
   803
			iLegacyRight = static_cast<TUint>
sl@0
   804
				((100*iLegacyGain)/(iLegacyGain+iChannelGains[ELeftCh].iGain));
sl@0
   805
			iLegacyLeft = 100 - iLegacyRight;
sl@0
   806
			}
sl@0
   807
sl@0
   808
		DP3(DLINFO,"New values :iLegacyGain %d, iLegacyLeft %d, iLegacyRight %d",
sl@0
   809
				iLegacyGain,iLegacyLeft,iLegacyRight);
sl@0
   810
		}
sl@0
   811
	else
sl@0
   812
		{
sl@0
   813
		// our request completed succesfully, no need to update cached values
sl@0
   814
		// just print values in debug version
sl@0
   815
		#ifdef _DEBUG
sl@0
   816
		RArray<TAudioChannelGain> gains;
sl@0
   817
		TUint left;
sl@0
   818
		TUint right;
sl@0
   819
		TUint gain;
sl@0
   820
		aGain.GetGain(gains);
sl@0
   821
		ASSERT(gains.Count()==2);
sl@0
   822
		if ( iChannelGains[ELeftCh].iGain == iChannelGains[ERightCh].iGain )
sl@0
   823
			{
sl@0
   824
			gain = iChannelGains[ELeftCh].iGain;
sl@0
   825
			left = 50;
sl@0
   826
			right = 50;
sl@0
   827
			}
sl@0
   828
		else if ( iChannelGains[ELeftCh].iGain > iChannelGains[ERightCh].iGain )
sl@0
   829
			{
sl@0
   830
			gain = iChannelGains[ELeftCh].iGain;
sl@0
   831
			left = 
sl@0
   832
				static_cast<TUint>((100*gain)/(gain+iChannelGains[ERightCh].iGain));
sl@0
   833
			right = 100 - left;
sl@0
   834
			}
sl@0
   835
		else
sl@0
   836
			{
sl@0
   837
			gain = iChannelGains[ERightCh].iGain;
sl@0
   838
			right = 
sl@0
   839
				static_cast<TUint>((100*gain)/(gain+iChannelGains[ELeftCh].iGain));
sl@0
   840
			left = 100 - right;
sl@0
   841
			}
sl@0
   842
		gains.Close();
sl@0
   843
		DP3(DLINFO,"KErrNone (gain %d, left %d, right %d)", gain,left,right);
sl@0
   844
		#endif
sl@0
   845
		}
sl@0
   846
sl@0
   847
	DP_OUT();
sl@0
   848
	}
sl@0
   849
sl@0
   850
// -----------------------------------------------------------------------------
sl@0
   851
// From class MAudioCodecObserver
sl@0
   852
// CDevAudioControl::SampleRateSet
sl@0
   853
// -----------------------------------------------------------------------------
sl@0
   854
void CDevAudioControl::SampleRateSet(TInt aError)
sl@0
   855
	{
sl@0
   856
	if(aError==KErrNone)
sl@0
   857
		{
sl@0
   858
		//Review if we call SetConfig or is only the first time that we load the codec
sl@0
   859
		if (iDesiredSampleRate > 0)
sl@0
   860
			{
sl@0
   861
			iCurrentSampleRate = iDesiredSampleRate;
sl@0
   862
			}
sl@0
   863
		}
sl@0
   864
	else
sl@0
   865
	    {
sl@0
   866
        iAdaptationObserver->NotifyError(aError);
sl@0
   867
	    }
sl@0
   868
    iDesiredSampleRate = 0;
sl@0
   869
	}
sl@0
   870
sl@0
   871
// -----------------------------------------------------------------------------
sl@0
   872
// From class MAudioCodecObserver
sl@0
   873
// CDevAudioControl::ModeSet
sl@0
   874
// -----------------------------------------------------------------------------
sl@0
   875
void CDevAudioControl::ModeSet(TInt aError)
sl@0
   876
	{
sl@0
   877
	if(aError==KErrNone)
sl@0
   878
		{
sl@0
   879
		//Review if we call SetConfig or is only the first time that we load the codec
sl@0
   880
		if (iDesiredMode != KNullUid)
sl@0
   881
			{
sl@0
   882
			iCurrentMode = iDesiredMode;
sl@0
   883
			}
sl@0
   884
		}
sl@0
   885
    else
sl@0
   886
        {
sl@0
   887
        iAdaptationObserver->NotifyError(aError);
sl@0
   888
        }
sl@0
   889
    iDesiredMode = KNullUid;
sl@0
   890
	}
sl@0
   891
sl@0
   892
// -----------------------------------------------------------------------------
sl@0
   893
// From class MAudioCodecObserver
sl@0
   894
// CDevAudioControl::GetSupportedSampleRatesComplete
sl@0
   895
// -----------------------------------------------------------------------------
sl@0
   896
void CDevAudioControl::GetSupportedSampleRatesComplete(TInt aError)
sl@0
   897
	{
sl@0
   898
	iSupportedRates.Reset();
sl@0
   899
	CompleteMessageCap(aError);
sl@0
   900
	}
sl@0
   901
sl@0
   902
// -----------------------------------------------------------------------------
sl@0
   903
// From class MAudioCodecObserver
sl@0
   904
// CDevAudioControl::GetSupportedModesComplete
sl@0
   905
// -----------------------------------------------------------------------------
sl@0
   906
void CDevAudioControl::GetSupportedModesComplete(TInt aError)
sl@0
   907
	{
sl@0
   908
	iSupportedModes.Reset();
sl@0
   909
	CompleteMessageCap(aError);
sl@0
   910
	}
sl@0
   911
sl@0
   912
// -----------------------------------------------------------------------------
sl@0
   913
// CDevAudioControl::CompleteMessageCap
sl@0
   914
// -----------------------------------------------------------------------------
sl@0
   915
void CDevAudioControl::CompleteMessageCap(TInt aError)
sl@0
   916
	{
sl@0
   917
	if (iOutstandingCallbacks > 1) //waiting until the 2 outstanding callbacks arrival.
sl@0
   918
		{
sl@0
   919
		iOutstandingCallbacks--;
sl@0
   920
		iError = aError; //keeping the error.
sl@0
   921
		}
sl@0
   922
	else
sl@0
   923
		{
sl@0
   924
		if (iError == KErrNone)
sl@0
   925
			{
sl@0
   926
			iAdaptationObserver->AsynchronousOperationComplete(aError, ETrue);
sl@0
   927
			}
sl@0
   928
		else
sl@0
   929
			{
sl@0
   930
			iAdaptationObserver->AsynchronousOperationComplete(iError, ETrue);
sl@0
   931
			}
sl@0
   932
		iError = KErrNone;
sl@0
   933
		iOutstandingCallbacks = KMaxCallbacksExpected;
sl@0
   934
		}
sl@0
   935
	}
sl@0
   936
sl@0
   937
// -----------------------------------------------------------------------------
sl@0
   938
// CDevAudioControl::SetToneData
sl@0
   939
// -----------------------------------------------------------------------------
sl@0
   940
//
sl@0
   941
TInt CDevAudioControl::SetToneData(TToneData& /*aToneData*/)
sl@0
   942
	{
sl@0
   943
	DP_CONTEXT(CDevAudioControl::SetToneData *CD1*, CtxDevSound, DPLOCAL);
sl@0
   944
	DP_IN();
sl@0
   945
	DP0_RET(KErrNotSupported, "%d");
sl@0
   946
	}
sl@0
   947
sl@0
   948
sl@0
   949
// -----------------------------------------------------------------------------
sl@0
   950
// From class MAudioContextObserver
sl@0
   951
// CDevAudio::ContextEvent
sl@0
   952
// -----------------------------------------------------------------------------
sl@0
   953
//
sl@0
   954
void CDevAudioControl::ContextEvent(TUid aEvent, TInt aError)
sl@0
   955
	{
sl@0
   956
	DP_CONTEXT(CDevAudioControl::ContextEvent *CD1*, CtxDevSound, DPLOCAL);
sl@0
   957
	DP_IN();
sl@0
   958
sl@0
   959
    if(!(iAdaptationObserver->AdaptorControlsContext()))
sl@0
   960
        {
sl@0
   961
        iIgnoreAsyncOpComplete = ETrue;
sl@0
   962
        }
sl@0
   963
    
sl@0
   964
	if (aEvent == KUidA3FContextUpdateComplete)
sl@0
   965
		{
sl@0
   966
	    if(iIgnoreAsyncOpComplete)
sl@0
   967
			{
sl@0
   968
            iAdaptationObserver->PreemptionFinishedCallbackReceived(ETrue);
sl@0
   969
		    iIgnoreAsyncOpComplete = EFalse;
sl@0
   970
   	    	}
sl@0
   971
        else
sl@0
   972
            {
sl@0
   973
            iAdaptationObserver->AsynchronousOperationComplete(aError, ETrue);
sl@0
   974
           	}
sl@0
   975
		}
sl@0
   976
	else if(aEvent == KUidA3FContextPreEmption)
sl@0
   977
		{
sl@0
   978
		//If we are in a normal pre-emption cycle, we should not be in a mid-state.
sl@0
   979
		__ASSERT_DEBUG(!iDevAudio->IsMidState(iDevAudio->iActiveState), Panic(EInvalidStateDuringPreemptionCycle));
sl@0
   980
		iIgnoreAsyncOpComplete = ETrue;
sl@0
   981
		iAdaptationObserver->PreemptionStartedCallbackReceived();
sl@0
   982
		}
sl@0
   983
	//In a clashing pre-emption cycle we must be in a commit cycle, so do nothing here - CDevCommonControl deals
sl@0
   984
	//with this case.
sl@0
   985
	DP_OUT();
sl@0
   986
	}
sl@0
   987
sl@0
   988
sl@0
   989
// -----------------------------------------------------------------------------
sl@0
   990
// From class MCustomInterfaceSupportObserver
sl@0
   991
// CDevAudio::CustomInterfaceRemoval
sl@0
   992
// -----------------------------------------------------------------------------
sl@0
   993
//
sl@0
   994
void CDevAudioControl::CustomInterfaceRemoval(TUid aUid, TAny* /*aPtr*/)
sl@0
   995
	{
sl@0
   996
	DP_CONTEXT(CDevAudioControl::CustomInterfaceRemoval *CD1*, CtxDevSound, DPLOCAL);
sl@0
   997
	DP_IN();
sl@0
   998
	// TODO: Review this functionality
sl@0
   999
	iAdaptationObserver->InterfaceDeleted(aUid);
sl@0
  1000
	DP_OUT();
sl@0
  1001
	}
sl@0
  1002
sl@0
  1003
// ---------------------------------------------------------------------------
sl@0
  1004
// CDevAudioControl::ResolveSampleRate
sl@0
  1005
// ---------------------------------------------------------------------------
sl@0
  1006
TInt CDevAudioControl::ResolveSampleRate(TInt aSampleRate, TInt& aSampleRateValue)
sl@0
  1007
	{
sl@0
  1008
	DP_CONTEXT(CDevAudioControl::ResolveSampleRate, CtxDevSound, DPLOCAL);
sl@0
  1009
	DP_IN();
sl@0
  1010
	TInt err(KErrArgument);
sl@0
  1011
sl@0
  1012
	for (TUint i=0; i<=KMaxSampleRateIndex; i++)
sl@0
  1013
		{
sl@0
  1014
		if(KRateTableLookup[i].iSampleRate == aSampleRate)
sl@0
  1015
			{
sl@0
  1016
			aSampleRateValue = KRateTableLookup[i].iSampleRateValue;
sl@0
  1017
			err = KErrNone;
sl@0
  1018
			break;
sl@0
  1019
			}
sl@0
  1020
		}
sl@0
  1021
sl@0
  1022
	//To avoid the value return a non desired value.
sl@0
  1023
	if (err != KErrNone)
sl@0
  1024
		{
sl@0
  1025
		aSampleRateValue = 0;
sl@0
  1026
		}
sl@0
  1027
sl@0
  1028
	DP0_RET(err, "%d");
sl@0
  1029
	}
sl@0
  1030
sl@0
  1031
sl@0
  1032
// ---------------------------------------------------------------------------
sl@0
  1033
// CDevAudioControl::ResolveMode
sl@0
  1034
// ---------------------------------------------------------------------------
sl@0
  1035
TInt CDevAudioControl::ResolveMode(TUint aModeValue, TUid& aMode)
sl@0
  1036
	{
sl@0
  1037
	DP_CONTEXT(CDevAudioControl::ResolveMode *CD1*, CtxDevSound, DPLOCAL);
sl@0
  1038
	DP_IN();
sl@0
  1039
	TInt err(KErrArgument);
sl@0
  1040
sl@0
  1041
	
sl@0
  1042
	for (TInt i=0; i<=KMaxModeIndex; i++)
sl@0
  1043
		{
sl@0
  1044
		const TAudioModeTableEntry& entry = KModeTableLookup[i];
sl@0
  1045
		if (entry.iAudioModeValue == aModeValue)
sl@0
  1046
			{
sl@0
  1047
			aMode = entry.iAudioMode;
sl@0
  1048
			err = KErrNone;
sl@0
  1049
			break;
sl@0
  1050
			}
sl@0
  1051
		}
sl@0
  1052
	
sl@0
  1053
	DP0_RET(err,"%d");
sl@0
  1054
	}
sl@0
  1055
sl@0
  1056
// ---------------------------------------------------------------------------
sl@0
  1057
// CDevAudioControl::GetModes
sl@0
  1058
// ---------------------------------------------------------------------------
sl@0
  1059
TUint CDevAudioControl::GetModes(const RArray<TUid>& aMode)
sl@0
  1060
	{
sl@0
  1061
	DP_CONTEXT(CDevAudioControl::GetModes *CD1*, CtxDevSound, DPLOCAL);
sl@0
  1062
	DP_IN();
sl@0
  1063
sl@0
  1064
	TUint result = 0;
sl@0
  1065
	TInt count = aMode.Count();
sl@0
  1066
sl@0
  1067
	for (TInt i=0; i<count; i++)
sl@0
  1068
		{
sl@0
  1069
		result |= GetMode(aMode[i]);
sl@0
  1070
		}
sl@0
  1071
	DP0_RET(result,"%d");
sl@0
  1072
	}
sl@0
  1073
sl@0
  1074
sl@0
  1075
// ---------------------------------------------------------------------------
sl@0
  1076
// CDevAudioControl::GetMode
sl@0
  1077
// ---------------------------------------------------------------------------
sl@0
  1078
TUint CDevAudioControl::GetMode(TUid aMode)
sl@0
  1079
	{
sl@0
  1080
	DP_CONTEXT(CDevAudioControl::GetMode *CD1*, CtxDevSound, DPLOCAL);
sl@0
  1081
	DP_IN();
sl@0
  1082
	
sl@0
  1083
	TUint result = 0;
sl@0
  1084
	
sl@0
  1085
	for (TInt e=0; e<=KMaxModeIndex; e++)
sl@0
  1086
		{
sl@0
  1087
		if(KModeTableLookup[e].iAudioMode == aMode)
sl@0
  1088
			{
sl@0
  1089
			result = KModeTableLookup[e].iAudioModeValue;
sl@0
  1090
			break;
sl@0
  1091
			}
sl@0
  1092
		}
sl@0
  1093
	DP0_RET(result,"%d");
sl@0
  1094
	}
sl@0
  1095
sl@0
  1096
// ---------------------------------------------------------------------------
sl@0
  1097
// CDevAudioControl::GetSampleRates
sl@0
  1098
// ---------------------------------------------------------------------------
sl@0
  1099
TUint CDevAudioControl::GetSampleRates(const RArray<TInt>& aSampleRates)
sl@0
  1100
	{
sl@0
  1101
	DP_CONTEXT(CDevAudioControl::GetSampleRates *CD1*, CtxDevSound, DPLOCAL);
sl@0
  1102
	DP_IN();
sl@0
  1103
	
sl@0
  1104
	TUint result = 0;
sl@0
  1105
	TInt count = aSampleRates.Count();
sl@0
  1106
	
sl@0
  1107
	for (TInt i=0; i<count; i++)
sl@0
  1108
		{
sl@0
  1109
		result |= GetSampleRate(aSampleRates[i]);
sl@0
  1110
		}
sl@0
  1111
	DP0_RET(result,"%d");
sl@0
  1112
	}
sl@0
  1113
sl@0
  1114
// ---------------------------------------------------------------------------
sl@0
  1115
// CDevAudioControl::GetSampleRate
sl@0
  1116
// ---------------------------------------------------------------------------
sl@0
  1117
TUint CDevAudioControl::GetSampleRate(TInt aSampleRates)
sl@0
  1118
	{
sl@0
  1119
	DP_CONTEXT(CDevAudioControl::GetSampleRate *CD1*, CtxDevSound, DPLOCAL);
sl@0
  1120
	DP_IN();
sl@0
  1121
sl@0
  1122
	TUint result = 0;
sl@0
  1123
	TInt position = 0;
sl@0
  1124
	TInt lowerbound = 0;
sl@0
  1125
	TInt upperbound = KMaxSampleRateIndex;
sl@0
  1126
sl@0
  1127
	if ((aSampleRates < KRateTableLookup[lowerbound].iSampleRateValue) || (aSampleRates > KRateTableLookup[upperbound].iSampleRateValue)) 
sl@0
  1128
		{
sl@0
  1129
		//value request not found in the array.
sl@0
  1130
		DP0_RET(result,"%d");
sl@0
  1131
		}
sl@0
  1132
sl@0
  1133
	//Binary Search
sl@0
  1134
	position = ( lowerbound + upperbound) / 2;
sl@0
  1135
sl@0
  1136
	while((KRateTableLookup[position].iSampleRateValue != aSampleRates) && (lowerbound <= upperbound))
sl@0
  1137
		{
sl@0
  1138
		if (KRateTableLookup[position].iSampleRateValue > aSampleRates)
sl@0
  1139
			{
sl@0
  1140
			upperbound = position - 1;
sl@0
  1141
			}
sl@0
  1142
		else
sl@0
  1143
			{
sl@0
  1144
			lowerbound = position + 1;
sl@0
  1145
			}
sl@0
  1146
		position = (lowerbound + upperbound) / 2;
sl@0
  1147
		}
sl@0
  1148
sl@0
  1149
	result = KRateTableLookup[position].iSampleRate;
sl@0
  1150
sl@0
  1151
	DP0_RET(result,"%d");
sl@0
  1152
	}
sl@0
  1153
sl@0
  1154
// ---------------------------------------------------------------------------
sl@0
  1155
// CDevAudioControl::ProcessingFinishedReceived
sl@0
  1156
// ---------------------------------------------------------------------------
sl@0
  1157
TInt CDevAudioControl::ProcessingFinishedReceived(TBool& /*aAyncOperation*/)
sl@0
  1158
	{
sl@0
  1159
	return KErrNone;
sl@0
  1160
	}
sl@0
  1161
	
sl@0
  1162
// ---------------------------------------------------------------------------
sl@0
  1163
// CDevAudioControl::ProcessingError
sl@0
  1164
// ---------------------------------------------------------------------------
sl@0
  1165
TInt CDevAudioControl::ProcessingError(TBool& /*aAyncOperation*/)
sl@0
  1166
    {
sl@0
  1167
    return KErrNone;
sl@0
  1168
    }
sl@0
  1169
sl@0
  1170
// ---------------------------------------------------------------------------
sl@0
  1171
// CDevAudioControl::RequestEmptyBuffers
sl@0
  1172
// ---------------------------------------------------------------------------	
sl@0
  1173
TInt CDevAudioControl::RequestEmptyBuffers()
sl@0
  1174
	{
sl@0
  1175
	DP_CONTEXT(CDevAudioControl::RequestEmptyBuffers *CD1*, CtxDevSound, DPLOCAL);
sl@0
  1176
	DP_IN();
sl@0
  1177
sl@0
  1178
	TInt err(KErrNotReady);
sl@0
  1179
sl@0
  1180
	if(iDevAudio)
sl@0
  1181
		{
sl@0
  1182
		if(iDevAudio->iActiveState == EDevSoundAdaptorPaused_Primed)
sl@0
  1183
			{
sl@0
  1184
			err = iDevAudio->iAudioStream->Flush();
sl@0
  1185
			}
sl@0
  1186
		else if (iDevAudio->iActiveState == EDevSoundAdaptorActive_Active)
sl@0
  1187
			{
sl@0
  1188
			err = Pause();
sl@0
  1189
			if(err == KErrNone)
sl@0
  1190
				{
sl@0
  1191
				iPauseResumeSequenceDueToEmptyBuffers = ETrue;
sl@0
  1192
				}
sl@0
  1193
			
sl@0
  1194
			}
sl@0
  1195
		}
sl@0
  1196
	DP0_RET(err,"%d");
sl@0
  1197
	};
sl@0
  1198
sl@0
  1199
void CDevAudioControl::Panic(TDevSoundAdaptorPanicCode aCode)
sl@0
  1200
	{
sl@0
  1201
	_LIT(KMMFDevSoundAdaptorPanicCategory, "DevSoundAdaptor");
sl@0
  1202
	User::Panic(KMMFDevSoundAdaptorPanicCategory, aCode);
sl@0
  1203
	}
sl@0
  1204
sl@0
  1205
// ---------------------------------------------------------------------------
sl@0
  1206
// CDevAudioControl::GetTimePlayed
sl@0
  1207
// ---------------------------------------------------------------------------
sl@0
  1208
TInt CDevAudioControl::GetTimePlayed(TTimeIntervalMicroSeconds& aTime)
sl@0
  1209
	{
sl@0
  1210
	DP_CONTEXT(CDevAudioControl::GetTimePlayed *CD1*, CtxDevSound, DPLOCAL);
sl@0
  1211
	DP_IN();
sl@0
  1212
	TInt err = iDevAudio->iAudioStream->GetStreamTime(aTime);
sl@0
  1213
	DP0_RET(err,"%d");
sl@0
  1214
	}
sl@0
  1215
sl@0
  1216
// ---------------------------------------------------------------------------
sl@0
  1217
// CDevAudioControl::Resume
sl@0
  1218
// ---------------------------------------------------------------------------
sl@0
  1219
TBool CDevAudioControl::Resume()
sl@0
  1220
	{
sl@0
  1221
	DP_CONTEXT(CDevAudioControl::Stop *CD1*, CtxDevSound, DPLOCAL);
sl@0
  1222
	DP_IN();
sl@0
  1223
	ASSERT(EFalse);
sl@0
  1224
	DP0_RET(KErrNone, "%d");
sl@0
  1225
	}
sl@0
  1226
sl@0
  1227
// -----------------------------------------------------------------------------
sl@0
  1228
// CDevAudioControl::BufferErrorEvent
sl@0
  1229
// -----------------------------------------------------------------------------
sl@0
  1230
//
sl@0
  1231
void CDevAudioControl::BufferErrorEvent()
sl@0
  1232
	{
sl@0
  1233
	ASSERT(EFalse); //This should never happen
sl@0
  1234
	}
sl@0
  1235
// End of file