os/mm/devsound/sounddevbt/src/A2dpBlueTooth/server/A2dpBTHeadsetAudioIfServer.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) 2005-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
#include <s32mem.h>
sl@0
    17
#include "A2dpBTHeadsetAudioIfServer.h"
sl@0
    18
#include "A2dpBTHeadsetAudioIfServerStart.h"
sl@0
    19
#include "A2dpBTheadsetAudioIf.h"
sl@0
    20
#include "MMFBtRoutingSoundDevice.h"	// for TRange
sl@0
    21
sl@0
    22
sl@0
    23
CA2dpBTHeadsetAudioIfServer* CA2dpBTHeadsetAudioIfServer::NewL()
sl@0
    24
	{
sl@0
    25
	CA2dpBTHeadsetAudioIfServer* self = new(ELeave) CA2dpBTHeadsetAudioIfServer();
sl@0
    26
	CleanupStack::PushL(self);
sl@0
    27
	self->ConstructL();
sl@0
    28
	CleanupStack::Pop();
sl@0
    29
	return self;
sl@0
    30
	}
sl@0
    31
	
sl@0
    32
CA2dpBTHeadsetAudioIfServer::~CA2dpBTHeadsetAudioIfServer()
sl@0
    33
	{
sl@0
    34
	delete iBTAudioInterface;
sl@0
    35
	}
sl@0
    36
	
sl@0
    37
CMmfIpcSession* CA2dpBTHeadsetAudioIfServer::NewSessionL(const TVersion &aVersion) const
sl@0
    38
	{
sl@0
    39
	TVersion version(	KBTAudioServerMajorVersionNumber,
sl@0
    40
						KBTAudioServerMinorVersionNumber,
sl@0
    41
						KBTAudioServerBuildVersionNumber);
sl@0
    42
sl@0
    43
	if(!User::QueryVersionSupported(version, aVersion))
sl@0
    44
		{
sl@0
    45
		User::Leave(KErrNotSupported);
sl@0
    46
		}
sl@0
    47
	
sl@0
    48
	CA2dpBTHeadsetAudioIfSession* session = CA2dpBTHeadsetAudioIfSession::NewL(iBTAudioInterface);
sl@0
    49
	return session;
sl@0
    50
	}
sl@0
    51
sl@0
    52
CA2dpBTHeadsetAudioIfServer::CA2dpBTHeadsetAudioIfServer() :
sl@0
    53
							 CMmfIpcServer(EPriorityStandard)
sl@0
    54
	{
sl@0
    55
	}
sl@0
    56
	
sl@0
    57
void CA2dpBTHeadsetAudioIfServer::ConstructL()
sl@0
    58
	{
sl@0
    59
	// Create the interface to the BT headset
sl@0
    60
	iBTAudioInterface = CA2dpBTHeadsetAudioInterface::NewL();
sl@0
    61
	
sl@0
    62
	// Call base class to Start server
sl@0
    63
	TName name(RThread().Name());
sl@0
    64
	StartL(name);
sl@0
    65
	}
sl@0
    66
sl@0
    67
sl@0
    68
/*
sl@0
    69
 Session implementation.
sl@0
    70
 */
sl@0
    71
CA2dpBTHeadsetAudioIfSession* CA2dpBTHeadsetAudioIfSession::NewL( CA2dpBTHeadsetAudioInterface* 
sl@0
    72
																	aBTAudioInterface)
sl@0
    73
	{
sl@0
    74
	CA2dpBTHeadsetAudioIfSession* self = new(ELeave) CA2dpBTHeadsetAudioIfSession(aBTAudioInterface);
sl@0
    75
	CleanupStack::PushL(self);
sl@0
    76
	self->ConstructL();
sl@0
    77
	CleanupStack::Pop(self);
sl@0
    78
	return self;
sl@0
    79
	}
sl@0
    80
	
sl@0
    81
CA2dpBTHeadsetAudioIfSession::CA2dpBTHeadsetAudioIfSession(CA2dpBTHeadsetAudioInterface* aBTAudioInterface) :
sl@0
    82
							iBTAudioInterface(aBTAudioInterface)
sl@0
    83
	{
sl@0
    84
	}
sl@0
    85
sl@0
    86
void CA2dpBTHeadsetAudioIfSession::ConstructL()
sl@0
    87
	{
sl@0
    88
	// Create the AO event handlers
sl@0
    89
	iInitHandler = CA2dpBTHeadsetIfEventHandler::NewL();
sl@0
    90
	iOpenDeviceHandler = CA2dpBTHeadsetIfEventHandler::NewL();
sl@0
    91
	iCloseDeviceHandler = CA2dpBTHeadsetIfEventHandler::NewL();
sl@0
    92
	iPlayDataHandler = CA2dpBTHeadsetIfEventHandler::NewL();
sl@0
    93
	iNotifyErrorHandler = CA2dpBTHeadsetIfEventHandler::NewL();
sl@0
    94
	}
sl@0
    95
sl@0
    96
CA2dpBTHeadsetAudioIfSession::~CA2dpBTHeadsetAudioIfSession()
sl@0
    97
	{
sl@0
    98
	delete iInitHandler;
sl@0
    99
	delete iOpenDeviceHandler;
sl@0
   100
	delete iCloseDeviceHandler;
sl@0
   101
	delete iPlayDataHandler;
sl@0
   102
	delete iNotifyErrorHandler;
sl@0
   103
	}
sl@0
   104
	
sl@0
   105
void CA2dpBTHeadsetAudioIfSession::ServiceL(const RMessage2& aMessage)
sl@0
   106
	{
sl@0
   107
	// Service the message
sl@0
   108
	TBool complete = EFalse;
sl@0
   109
	TInt err = KErrNone;
sl@0
   110
	switch(aMessage.Function())
sl@0
   111
		{
sl@0
   112
	case EBTAudioServerInitialize:
sl@0
   113
		complete = DoInitializeL(aMessage);
sl@0
   114
		break;
sl@0
   115
	case EBTAudioServerCancelInitialize:
sl@0
   116
		complete = DoCancelInitializeL(aMessage);
sl@0
   117
		break;
sl@0
   118
	case EBTAudioServerCopyFourCCArrayData:
sl@0
   119
		complete = DoCopyFourCCArrayDataL(aMessage);
sl@0
   120
		break;
sl@0
   121
	case EBTAudioServerCopyChannelsArrayData:
sl@0
   122
		complete = DoCopyChannelsArrayDataL(aMessage);
sl@0
   123
		break;
sl@0
   124
	case EBTAudioServerGetSupportedDataTypes:
sl@0
   125
		err = DoGetSupportedDataTypesL(aMessage);
sl@0
   126
		aMessage.Complete(err);
sl@0
   127
		break;
sl@0
   128
	case EBTAudioServerGetSupportedSampleRates:
sl@0
   129
		err = DoGetSupportedSampleRatesL(aMessage);
sl@0
   130
		aMessage.Complete(err);
sl@0
   131
		break;
sl@0
   132
	case EBTAudioServerGetSupportedSampleRatesDiscrete:
sl@0
   133
		complete = DoGetSupportedSampleRatesDiscreteL(aMessage);
sl@0
   134
		break;
sl@0
   135
	case EBTAudioServerGetSupportedSampleRatesRange:
sl@0
   136
		complete = DoGetSupportedSampleRatesRangeL(aMessage);
sl@0
   137
		break;
sl@0
   138
	case EBTAudioServerGetSupportedChannels:
sl@0
   139
		err = DoGetSupportedChannelsL(aMessage);
sl@0
   140
		aMessage.Complete(err);
sl@0
   141
		break;
sl@0
   142
	case EBTAudioServerSetDataType:
sl@0
   143
		err = DoSetDataTypeL(aMessage);
sl@0
   144
		aMessage.Complete(err);
sl@0
   145
		break;
sl@0
   146
	case EBTAudioServerSetSampleRate:
sl@0
   147
		err = DoSetSampleRateL(aMessage);
sl@0
   148
		aMessage.Complete(err);
sl@0
   149
		break;
sl@0
   150
	case EBTAudioServerSetChannels:
sl@0
   151
		err = DoSetChannelsL(aMessage);
sl@0
   152
		aMessage.Complete(err);
sl@0
   153
		break;
sl@0
   154
	case EBTAudioServerOpenDevice:
sl@0
   155
		complete = DoOpenDeviceL(aMessage);
sl@0
   156
		break;
sl@0
   157
	case EBTAudioServerCancelOpenDevice:
sl@0
   158
		complete = DoCancelOpenDevice(aMessage);
sl@0
   159
		break;
sl@0
   160
	case EBTAudioServerCloseDevice:
sl@0
   161
		complete = DoCloseDeviceL(aMessage);
sl@0
   162
		break;
sl@0
   163
	case EBTAudioServerVolume:
sl@0
   164
		complete = DoVolumeL(aMessage);
sl@0
   165
		break;
sl@0
   166
	case EBTAudioServerSetVolume:
sl@0
   167
		err = DoSetVolumeL(aMessage);
sl@0
   168
		aMessage.Complete(err);
sl@0
   169
		break;
sl@0
   170
	case EBTAudioServerPlayData:
sl@0
   171
		complete = DoPlayDataL(aMessage);
sl@0
   172
		break;
sl@0
   173
	case EBTAudioServerCancelPlayData:
sl@0
   174
		complete = DoCancelPlayDataL(aMessage);
sl@0
   175
		break;
sl@0
   176
	case EBTAudioServerFlushBuffer:
sl@0
   177
		complete = DoFlushBufferL(aMessage);
sl@0
   178
		break;
sl@0
   179
	case EBTAudioServerBytesPlayed:
sl@0
   180
		complete = DoBytesPlayedL(aMessage);
sl@0
   181
		break;
sl@0
   182
	case EBTAudioServerResetBytesPlayed:
sl@0
   183
		complete = DoResetBytesPlayedL(aMessage);
sl@0
   184
		break;
sl@0
   185
	case EBTAudioServerPauseBuffer:
sl@0
   186
		complete = DoPauseBufferL(aMessage);
sl@0
   187
		break;
sl@0
   188
	case EBTAudioServerResumePlaying:
sl@0
   189
		complete = DoResumePlayingL(aMessage);
sl@0
   190
		break;
sl@0
   191
	case EBTAudioServerNotifyError:
sl@0
   192
		complete = DoNotifyErrorL(aMessage);
sl@0
   193
		break;
sl@0
   194
	case EBTAudioServerCancelNotifyError:
sl@0
   195
		complete = DoCancelNotifyErrorL(aMessage);
sl@0
   196
		break;
sl@0
   197
	default:
sl@0
   198
		User::Leave(KErrNotSupported);
sl@0
   199
		break;
sl@0
   200
		}
sl@0
   201
sl@0
   202
	if (complete)
sl@0
   203
		{
sl@0
   204
		aMessage.Complete(KErrNone);
sl@0
   205
		}
sl@0
   206
	}
sl@0
   207
sl@0
   208
TBool CA2dpBTHeadsetAudioIfSession::DoInitializeL(const RMmfIpcMessage& aMessage)
sl@0
   209
	{
sl@0
   210
	// Get the address from the message
sl@0
   211
	TPckgBuf<TBTDevAddr> btAddrPckg;
sl@0
   212
	aMessage.ReadL(0, btAddrPckg);
sl@0
   213
	TBTDevAddr& devAddr = btAddrPckg();
sl@0
   214
	iInitHandler->StartL(aMessage);
sl@0
   215
	iBTAudioInterface->Initialize(devAddr, iInitHandler->iStatus);
sl@0
   216
		
sl@0
   217
	return EFalse;
sl@0
   218
	}
sl@0
   219
sl@0
   220
TBool CA2dpBTHeadsetAudioIfSession::DoCancelInitializeL(const RMmfIpcMessage& /*aMessage*/)
sl@0
   221
	{
sl@0
   222
	iBTAudioInterface->CancelInitialize();
sl@0
   223
	iInitHandler->Stop();
sl@0
   224
	return ETrue;
sl@0
   225
	}
sl@0
   226
sl@0
   227
TBool CA2dpBTHeadsetAudioIfSession::DoCopyFourCCArrayDataL(const RMmfIpcMessage& aMessage)
sl@0
   228
	{
sl@0
   229
	const TInt KBufExpandSize8 = 8;//two TInts
sl@0
   230
	CBufFlat* dataCopyBuffer = CBufFlat::NewL(KBufExpandSize8);
sl@0
   231
	CleanupStack::PushL(dataCopyBuffer);
sl@0
   232
	RBufWriteStream stream;
sl@0
   233
	stream.Open(*dataCopyBuffer);
sl@0
   234
	CleanupClosePushL(stream);
sl@0
   235
	for (TInt i = 0; i < iFourCCArray.Count(); i++)
sl@0
   236
		{
sl@0
   237
		stream.WriteInt32L(iFourCCArray[i].FourCC());
sl@0
   238
		}
sl@0
   239
	aMessage.WriteL(0, dataCopyBuffer->Ptr(0));
sl@0
   240
	stream.Close();
sl@0
   241
	CleanupStack::PopAndDestroy(2);//dataCopyBuffer, stream
sl@0
   242
	return ETrue;
sl@0
   243
	}
sl@0
   244
sl@0
   245
TBool CA2dpBTHeadsetAudioIfSession::DoCopyUintArrayDataL(const RMmfIpcMessage& aMessage, RArray<TUint> aArray)
sl@0
   246
	{
sl@0
   247
	const TInt KBufExpandSize8 = 8;//two TInts
sl@0
   248
	CBufFlat* dataCopyBuffer = CBufFlat::NewL(KBufExpandSize8);
sl@0
   249
	CleanupStack::PushL(dataCopyBuffer);
sl@0
   250
	RBufWriteStream stream;
sl@0
   251
	stream.Open(*dataCopyBuffer);
sl@0
   252
	CleanupClosePushL(stream);
sl@0
   253
	for (TInt i = 0; i < aArray.Count(); i++)
sl@0
   254
		{
sl@0
   255
		stream.WriteInt32L(aArray[i]);
sl@0
   256
		}
sl@0
   257
	aMessage.WriteL(0, dataCopyBuffer->Ptr(0));
sl@0
   258
	stream.Close();
sl@0
   259
	CleanupStack::PopAndDestroy(2);//dataCopyBuffer, stream	
sl@0
   260
	return ETrue;
sl@0
   261
	}
sl@0
   262
sl@0
   263
TInt CA2dpBTHeadsetAudioIfSession::DoGetSupportedDataTypesL(const RMmfIpcMessage& aMessage)
sl@0
   264
	{
sl@0
   265
	iFourCCArray.Reset();
sl@0
   266
sl@0
   267
	TInt err = iBTAudioInterface->GetSupportedDataTypes(iFourCCArray);
sl@0
   268
sl@0
   269
	TPckgBuf<TInt> pckg;
sl@0
   270
	pckg() = iFourCCArray.Count();
sl@0
   271
	aMessage.WriteL(TInt(0),pckg);	
sl@0
   272
	
sl@0
   273
	return err;
sl@0
   274
	}
sl@0
   275
sl@0
   276
TInt CA2dpBTHeadsetAudioIfSession::DoGetSupportedSampleRatesL(const RMmfIpcMessage& aMessage)
sl@0
   277
	{
sl@0
   278
	iDiscreteArray.Reset();
sl@0
   279
	iRangeArray.Reset();
sl@0
   280
	
sl@0
   281
	TInt err = iBTAudioInterface->GetSupportedSampleRates(iDiscreteArray, iRangeArray);
sl@0
   282
	
sl@0
   283
	TPckgBuf<TRatesArrayElements> pckg;
sl@0
   284
	pckg().iDiscrete = iDiscreteArray.Count();
sl@0
   285
	pckg().iRange = iRangeArray.Count();
sl@0
   286
	
sl@0
   287
	aMessage.WriteL(0, pckg);
sl@0
   288
	
sl@0
   289
	return err;
sl@0
   290
	}
sl@0
   291
sl@0
   292
TBool CA2dpBTHeadsetAudioIfSession::DoGetSupportedSampleRatesDiscreteL(const RMmfIpcMessage& aMessage)
sl@0
   293
	{
sl@0
   294
	return DoCopyUintArrayDataL(aMessage, iDiscreteArray);
sl@0
   295
	}
sl@0
   296
sl@0
   297
TBool CA2dpBTHeadsetAudioIfSession::DoGetSupportedSampleRatesRangeL(const RMmfIpcMessage& aMessage)
sl@0
   298
	{
sl@0
   299
	const TInt KBufExpandSize8 = 8;//two TInts
sl@0
   300
	CBufFlat* dataCopyBuffer = CBufFlat::NewL(KBufExpandSize8);
sl@0
   301
	CleanupStack::PushL(dataCopyBuffer);
sl@0
   302
	RBufWriteStream stream;
sl@0
   303
	stream.Open(*dataCopyBuffer);
sl@0
   304
	CleanupClosePushL(stream);
sl@0
   305
	for (TInt i = 0; i < iRangeArray.Count(); i++)
sl@0
   306
		{
sl@0
   307
		stream.WriteInt32L(iRangeArray[i].iLow);
sl@0
   308
		stream.WriteInt32L(iRangeArray[i].iHigh);
sl@0
   309
		}
sl@0
   310
	aMessage.WriteL(0, dataCopyBuffer->Ptr(0));
sl@0
   311
	stream.Close();
sl@0
   312
	CleanupStack::PopAndDestroy(2);//dataCopyBuffer, stream
sl@0
   313
	return ETrue;
sl@0
   314
	}
sl@0
   315
sl@0
   316
TInt CA2dpBTHeadsetAudioIfSession::DoGetSupportedChannelsL(const RMmfIpcMessage& aMessage)
sl@0
   317
	{
sl@0
   318
	// Array of uints
sl@0
   319
	iStereoSupportArray.Reset();
sl@0
   320
	TMMFStereoSupport stereoSupport;
sl@0
   321
sl@0
   322
	TInt err = iBTAudioInterface->GetSupportedChannels(iStereoSupportArray, stereoSupport);
sl@0
   323
	
sl@0
   324
	TPckgBuf<TChannelsSupport> pckg;
sl@0
   325
	pckg().iElementCount = iStereoSupportArray.Count();
sl@0
   326
	pckg().iSupport = stereoSupport;
sl@0
   327
	
sl@0
   328
	aMessage.WriteL(0, pckg);
sl@0
   329
	
sl@0
   330
	return err;
sl@0
   331
	}
sl@0
   332
sl@0
   333
TBool CA2dpBTHeadsetAudioIfSession::DoCopyChannelsArrayDataL(const RMmfIpcMessage& aMessage)
sl@0
   334
	{
sl@0
   335
	return DoCopyUintArrayDataL(aMessage, iStereoSupportArray);
sl@0
   336
	}
sl@0
   337
sl@0
   338
TInt CA2dpBTHeadsetAudioIfSession::DoSetDataTypeL(const RMmfIpcMessage& aMessage)
sl@0
   339
	{
sl@0
   340
	TPckgBuf<TFourCC> dataTypePckg;
sl@0
   341
	aMessage.ReadL(0, dataTypePckg);
sl@0
   342
	TFourCC dataType = dataTypePckg();
sl@0
   343
	return iBTAudioInterface->SetDataType(dataType);
sl@0
   344
	}
sl@0
   345
sl@0
   346
TInt CA2dpBTHeadsetAudioIfSession::DoSetSampleRateL(const RMmfIpcMessage& aMessage)
sl@0
   347
	{
sl@0
   348
	TPckgBuf<TUint> ratePckg;
sl@0
   349
	aMessage.ReadL(0, ratePckg);
sl@0
   350
	TUint rate = ratePckg();
sl@0
   351
	return iBTAudioInterface->SetSampleRate(rate);
sl@0
   352
	}
sl@0
   353
sl@0
   354
TInt CA2dpBTHeadsetAudioIfSession::DoSetChannelsL(const RMmfIpcMessage& aMessage)
sl@0
   355
	{
sl@0
   356
	TPckgBuf<TChannelsSupport> pckgBuf;
sl@0
   357
	aMessage.ReadL(0, pckgBuf);
sl@0
   358
	TChannelsSupport support = pckgBuf();
sl@0
   359
	return iBTAudioInterface->SetChannels(support.iElementCount, support.iSupport);
sl@0
   360
	}
sl@0
   361
sl@0
   362
TBool CA2dpBTHeadsetAudioIfSession::DoOpenDeviceL(const RMmfIpcMessage& aMessage)
sl@0
   363
	{
sl@0
   364
	iOpenDeviceHandler->StartL(aMessage);
sl@0
   365
	iBTAudioInterface->OpenDevice(iOpenDeviceHandler->iStatus);
sl@0
   366
	return EFalse;
sl@0
   367
	}
sl@0
   368
sl@0
   369
TBool CA2dpBTHeadsetAudioIfSession::DoCancelOpenDevice(const RMmfIpcMessage& /*aMessage*/)
sl@0
   370
	{
sl@0
   371
	iBTAudioInterface->CancelOpenDevice();
sl@0
   372
	return ETrue;
sl@0
   373
	}
sl@0
   374
	
sl@0
   375
TBool CA2dpBTHeadsetAudioIfSession::DoCloseDeviceL(const RMmfIpcMessage& aMessage)
sl@0
   376
	{
sl@0
   377
	iCloseDeviceHandler->StartL(aMessage);
sl@0
   378
	iBTAudioInterface->CloseDevice(iCloseDeviceHandler->iStatus);
sl@0
   379
	return EFalse;
sl@0
   380
	}
sl@0
   381
sl@0
   382
TBool CA2dpBTHeadsetAudioIfSession::DoVolumeL(const RMmfIpcMessage& aMessage)
sl@0
   383
	{	
sl@0
   384
	TUint volume = iBTAudioInterface->Volume();
sl@0
   385
	TPckgBuf<TUint> pckg(volume);
sl@0
   386
	aMessage.WriteL(0, pckg);
sl@0
   387
	return ETrue;
sl@0
   388
	}
sl@0
   389
sl@0
   390
TInt CA2dpBTHeadsetAudioIfSession::DoSetVolumeL(const RMmfIpcMessage& aMessage)
sl@0
   391
	{
sl@0
   392
	TPckgBuf<TUint> pckg;
sl@0
   393
	aMessage.ReadL(0, pckg);
sl@0
   394
	TUint volume = pckg();
sl@0
   395
	return iBTAudioInterface->SetVolume(volume);
sl@0
   396
	}
sl@0
   397
sl@0
   398
TBool CA2dpBTHeadsetAudioIfSession::DoPlayDataL(const RMmfIpcMessage& aMessage)
sl@0
   399
	{
sl@0
   400
	// Client's in the same process so access the buffer directly
sl@0
   401
	const TPtr8* ptr = static_cast<const TPtr8*>(aMessage.Ptr0());
sl@0
   402
	iPlayDataHandler->StartL(aMessage);
sl@0
   403
	iBTAudioInterface->PlayData(*ptr, iPlayDataHandler->iStatus);
sl@0
   404
	return EFalse;
sl@0
   405
	}
sl@0
   406
sl@0
   407
TBool CA2dpBTHeadsetAudioIfSession::DoCancelPlayDataL(const RMmfIpcMessage& /*aMessage*/)
sl@0
   408
	{
sl@0
   409
	iBTAudioInterface->CancelPlayData();
sl@0
   410
	iPlayDataHandler->Stop();
sl@0
   411
	return ETrue;
sl@0
   412
	}
sl@0
   413
sl@0
   414
TBool CA2dpBTHeadsetAudioIfSession::DoFlushBufferL(const RMmfIpcMessage& /*aMessage*/)
sl@0
   415
	{
sl@0
   416
	iBTAudioInterface->FlushBuffer();
sl@0
   417
	return ETrue;
sl@0
   418
	}
sl@0
   419
sl@0
   420
TBool CA2dpBTHeadsetAudioIfSession::DoBytesPlayedL(const RMmfIpcMessage& aMessage)
sl@0
   421
	{
sl@0
   422
	TUint bytesPlayed = iBTAudioInterface->BytesPlayed();
sl@0
   423
	TPckgBuf<TUint> pckg(bytesPlayed);
sl@0
   424
	aMessage.WriteL(0, pckg);
sl@0
   425
	return ETrue;
sl@0
   426
	}
sl@0
   427
sl@0
   428
TBool CA2dpBTHeadsetAudioIfSession::DoResetBytesPlayedL(const RMmfIpcMessage& /*aMessage*/)
sl@0
   429
	{
sl@0
   430
	iBTAudioInterface->ResetBytesPlayed();
sl@0
   431
	return ETrue;
sl@0
   432
	}
sl@0
   433
sl@0
   434
TBool CA2dpBTHeadsetAudioIfSession::DoPauseBufferL(const RMmfIpcMessage& /*aMessage*/)
sl@0
   435
	{
sl@0
   436
	iBTAudioInterface->PauseBuffer();
sl@0
   437
	return ETrue;
sl@0
   438
	}
sl@0
   439
sl@0
   440
TBool CA2dpBTHeadsetAudioIfSession::DoResumePlayingL(const RMmfIpcMessage& /*aMessage*/)
sl@0
   441
	{
sl@0
   442
	iBTAudioInterface->ResumePlaying();
sl@0
   443
	return ETrue;
sl@0
   444
	}
sl@0
   445
sl@0
   446
TBool CA2dpBTHeadsetAudioIfSession::DoNotifyErrorL(const RMmfIpcMessage& aMessage)
sl@0
   447
	{
sl@0
   448
	iNotifyErrorHandler->StartL(aMessage);
sl@0
   449
	iBTAudioInterface->NotifyError(iNotifyErrorHandler->iStatus);
sl@0
   450
	return EFalse;
sl@0
   451
	}
sl@0
   452
sl@0
   453
TBool CA2dpBTHeadsetAudioIfSession::DoCancelNotifyErrorL(const RMmfIpcMessage& /*aMessage*/)
sl@0
   454
	{
sl@0
   455
	iBTAudioInterface->CancelNotifyError();
sl@0
   456
	iNotifyErrorHandler->Stop();
sl@0
   457
	return ETrue;
sl@0
   458
	}
sl@0
   459
sl@0
   460
/**
sl@0
   461
 * Implementation of Active Object to handle asynch requests to the Bluetooth interface.
sl@0
   462
 */
sl@0
   463
CA2dpBTHeadsetIfEventHandler* CA2dpBTHeadsetIfEventHandler::NewL()
sl@0
   464
	{
sl@0
   465
	CA2dpBTHeadsetIfEventHandler* self = new(ELeave) CA2dpBTHeadsetIfEventHandler();
sl@0
   466
	CleanupStack::PushL(self);
sl@0
   467
	self->ConstructL();
sl@0
   468
	CleanupStack::Pop(self);
sl@0
   469
	return self;
sl@0
   470
	}
sl@0
   471
	
sl@0
   472
CA2dpBTHeadsetIfEventHandler::~CA2dpBTHeadsetIfEventHandler()
sl@0
   473
	{
sl@0
   474
	Cancel();
sl@0
   475
	delete iMessage;
sl@0
   476
	}
sl@0
   477
sl@0
   478
void CA2dpBTHeadsetIfEventHandler::RunL()
sl@0
   479
	{
sl@0
   480
	TInt err = iStatus.Int();
sl@0
   481
	// Complete the message
sl@0
   482
	iMessage->Complete(err);
sl@0
   483
	delete iMessage;
sl@0
   484
	iMessage = NULL;
sl@0
   485
	}
sl@0
   486
sl@0
   487
void CA2dpBTHeadsetIfEventHandler::DoCancel()
sl@0
   488
	{
sl@0
   489
	if (iMessage)
sl@0
   490
		{
sl@0
   491
		iMessage->Complete(KErrCancel);		
sl@0
   492
		}
sl@0
   493
	}
sl@0
   494
	
sl@0
   495
CA2dpBTHeadsetIfEventHandler::CA2dpBTHeadsetIfEventHandler() : CActive(EPriorityStandard)
sl@0
   496
	{
sl@0
   497
	CActiveScheduler::Add(this);
sl@0
   498
	}
sl@0
   499
sl@0
   500
void CA2dpBTHeadsetIfEventHandler::ConstructL()
sl@0
   501
	{
sl@0
   502
	}
sl@0
   503
sl@0
   504
void CA2dpBTHeadsetIfEventHandler::StartL(const RMmfIpcMessage& aMessage)
sl@0
   505
	{
sl@0
   506
	// take a copy of the message to complete later
sl@0
   507
	delete iMessage;	// ensure we only have one message!
sl@0
   508
	iMessage = NULL;
sl@0
   509
	iMessage = new(ELeave) RMmfIpcMessage(aMessage);
sl@0
   510
sl@0
   511
	if (!IsActive())
sl@0
   512
		{
sl@0
   513
		SetActive();
sl@0
   514
		}
sl@0
   515
	}
sl@0
   516
	
sl@0
   517
void CA2dpBTHeadsetIfEventHandler::Stop()
sl@0
   518
	{
sl@0
   519
	Cancel();
sl@0
   520
	}