Revision: 201039 RCL_3 PDK_3.0.4
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 16:15:10 +0300
branchRCL_3
changeset 65 af86cc8a4692
parent 55 e51ae4fd18e6
child 67 b35006be8823
Revision: 201039 Kit: 201041
devsound/a3fdevsound/src/mmfdevsoundserver/mmfdevsoundsession.cpp
devsound/a3fdevsound/src/mmfdevsoundserver/mmfdevsoundsession.h
devsound/a3fintegrationtest/scripts/tsi_a3f_devsound_pcm_play.script
devsound/a3fintegrationtest/src/tsi_a3f_devsound_play.cpp
devsound/a3fintegrationtest/src/tsi_a3f_devsound_play.h
devsoundextensions/telephonyaudiorouting/TelephonyAudioRoutingManager/src/TelephonyAudioRoutingManager.cpp
mm_pub/drm_audio_player_api/tsrc/data/mmc/drm/test3gp.dcf
mm_pub/drm_audio_player_api/tsrc/data/mmc/drm/testmp3.dcf
mmresourcemgmt/mmresctrl/src/mmrcserver/mmrcserver.cpp
--- a/devsound/a3fdevsound/src/mmfdevsoundserver/mmfdevsoundsession.cpp	Wed Sep 15 13:51:05 2010 +0300
+++ b/devsound/a3fdevsound/src/mmfdevsoundserver/mmfdevsoundsession.cpp	Wed Oct 13 16:15:10 2010 +0300
@@ -269,8 +269,25 @@
 	iAsyncQueueStart->Cancel(); // just in case.
     ResetNotifiedError();
 
+    if (aMessage.Function() == RMessage2::EDisConnect)
+        {
+        TBool complete = iAdapter->CloseDevSound();
+        if(!complete)
+            {
+            iRequestBeingServiced.SetMessage(aMessage);
+            iOperationCompletePending = ETrue;
+            ResetNotifiedError();
+            }
+        else
+            {
+            // if we get here, iClosing wait will have been started and we'd be waiting
+            iClosingWait->AsyncStop();
+            }
+        return;
+        }
+    
     TMMFMessageDestinationPckg destinationPckg;
-	MmfMessageUtil::ReadL(aMessage, 0, destinationPckg);
+	User::LeaveIfError(MessageRead(aMessage, 0, destinationPckg));
 	SYMBIAN_DEBPRN2(_L("CMMFDevSoundSession[0x%x]::DoServiceRequestL - DestinationHandle [%d] InterfaceId [%d] "), destinationPckg().DestinationHandle(), destinationPckg().InterfaceId());
 	if ((destinationPckg().DestinationHandle() == KMMFObjectHandleDevSound) &&
 	    (destinationPckg().InterfaceId() == KUidInterfaceMMFDevSound))
@@ -459,21 +476,6 @@
 				}
 			}
 		}
-	else if (aMessage.Function() == RMessage2::EDisConnect)
-	    {
-        TBool complete = iAdapter->CloseDevSound();
-        if(!complete)
-            {
-            iRequestBeingServiced.SetMessage(aMessage);
-            iOperationCompletePending = ETrue;
-            ResetNotifiedError();
-            }
-        else
-            {
-            // if we get here, iClosing wait will have been started and we'd be waiting
-            iClosingWait->AsyncStop();
-            }
-	    }
 	else
 		{
 		// If there's a CI extension, see if that handles this request
@@ -578,12 +580,14 @@
 
 void CMMFDevSoundSession::EnqueueRequest(const RMmfIpcMessage& aMessage)
 	{
+    SYMBIAN_DEBPRN0(_L("CMMFDevSoundSession[0x%x]::EnqueueRequest - Enter"));
 	// Encapsule the request
 	TMMFDevSoundRequest request;
 	request.SetMessage(aMessage);
 	// Append
 	TInt error = iQueuedRequests.Append(request);
-	__ASSERT_DEBUG(error == KErrNone, Panic(EQueueRequestsFailedToAppend)); 
+	__ASSERT_DEBUG(error == KErrNone, Panic(EQueueRequestsFailedToAppend));
+	SYMBIAN_DEBPRN0(_L("CMMFDevSoundSession[0x%x]::EnqueueRequest - Exit"));
 	}
 
 //
@@ -607,7 +611,7 @@
 	User::LeaveIfError(err);
 	DoSetClientConfigL();// added here instead of the CreateL()
 	TMMFDevSoundProxySettingsPckg devSoundBuf;
-	MmfMessageUtil::ReadL(aMessage,1,devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage,1,devSoundBuf));
 	iCachedClientData = devSoundBuf;
 	TMMFState mode = devSoundBuf().iMode;
 	iAdapter->InitializeL(mode);
@@ -644,7 +648,7 @@
 	User::LeaveIfError(err);
 	DoSetClientConfigL();// added here instead of the CreateL()
 	TMMFDevSoundProxySettingsPckg devSoundBuf;
-	MmfMessageUtil::ReadL(aMessage,1,devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage,1,devSoundBuf));
 	iCachedClientData = devSoundBuf;
 	TUid HWDev = devSoundBuf().iHWDev;
 	TMMFState mode = devSoundBuf().iMode;
@@ -678,7 +682,7 @@
 	User::LeaveIfError(err);
 	DoSetClientConfigL();// added here instead of the CreateL()
 	TMMFDevSoundProxySettingsPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage, TInt(1), devSoundBuf));
 	iCachedClientData = devSoundBuf;
 	TFourCC desiredFourCC = devSoundBuf().iDesiredFourCC;
 	TMMFState mode = devSoundBuf().iMode;
@@ -718,7 +722,6 @@
 		{
 		aMessage.Complete(err);
 		iOperationCompletePending = EFalse;
-		return ETrue;
 		}
 	else
 		{
@@ -755,7 +758,7 @@
 	TMMFDevSoundProxySettings devSoundSet;
 	devSoundSet.iConfig = iAdapter->Config();
 	TMMFDevSoundProxySettingsPckg pckg(devSoundSet);
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 	return ETrue;
 	}
 
@@ -766,7 +769,7 @@
 TBool CMMFDevSoundSession::DoSetConfigL(const RMmfIpcMessage& aMessage)
 	{
 	TMMFDevSoundProxySettingsPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),devSoundBuf));
 	TMMFCapabilities config = devSoundBuf().iConfig;
 	iAdapter->SetConfigL(config);
 	iOperationCompletePending = ETrue;
@@ -782,7 +785,7 @@
 	TMMFDevSoundProxySettings devSoundSet;
 	devSoundSet.iMaxVolume = iAdapter->MaxVolume();
 	TMMFDevSoundProxySettingsPckg pckg(devSoundSet);
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 	return ETrue;
 	}
 
@@ -795,7 +798,7 @@
 	TMMFDevSoundProxySettings devSoundSet;
 	devSoundSet.iVolume = iAdapter->Volume();
 	TMMFDevSoundProxySettingsPckg pckg(devSoundSet);
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 	return ETrue;
 	}
 
@@ -806,7 +809,7 @@
 TBool CMMFDevSoundSession::DoSetVolumeL(const RMmfIpcMessage& aMessage)
 	{
 	TMMFDevSoundProxySettingsPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage, TInt(1),devSoundBuf));
 	TInt volume = devSoundBuf().iVolume;
 	TBool asyncOperation;
 	User::LeaveIfError(iAdapter->SetVolume(volume, asyncOperation));
@@ -823,7 +826,7 @@
 	TMMFDevSoundProxySettings devSoundSet;
 	devSoundSet.iMaxGain = iAdapter->MaxGain();
 	TMMFDevSoundProxySettingsPckg pckg(devSoundSet);
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 	return ETrue;
 	}
 
@@ -836,7 +839,7 @@
 	TMMFDevSoundProxySettings devSoundSet;
 	devSoundSet.iGain = iAdapter->Gain();
 	TMMFDevSoundProxySettingsPckg pckg(devSoundSet);
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 	return ETrue;
 	}
 
@@ -847,7 +850,7 @@
 TBool CMMFDevSoundSession::DoSetGainL(const RMmfIpcMessage& aMessage)
 	{
 	TMMFDevSoundProxySettingsPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),devSoundBuf));
 	TInt gain = devSoundBuf().iGain;
 	TBool asyncOperation;
 	User::LeaveIfError(iAdapter->SetGain(gain, asyncOperation));
@@ -864,7 +867,7 @@
 	TMMFDevSoundProxySettings devSoundSet;
 	iAdapter->GetPlayBalanceL(devSoundSet.iLeftPercentage, devSoundSet.iRightPercentage);
 	TMMFDevSoundProxySettingsPckg pckg(devSoundSet);
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 	return ETrue;
 	}
 
@@ -875,7 +878,7 @@
 TBool CMMFDevSoundSession::DoSetPlayBalanceL(const RMmfIpcMessage& aMessage)
 	{
 	TMMFDevSoundProxySettingsPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+    User::LeaveIfError(MessageRead(aMessage,TInt(1),devSoundBuf));
 	TInt leftPercentage = devSoundBuf().iLeftPercentage;
 	TInt rightPercentage = devSoundBuf().iRightPercentage;
 	TBool asyncOperation;
@@ -893,7 +896,7 @@
 	TMMFDevSoundProxySettings devSoundSet;
 	iAdapter->GetRecordBalanceL(devSoundSet.iLeftPercentage, devSoundSet.iRightPercentage);
 	TMMFDevSoundProxySettingsPckg pckg(devSoundSet);
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 	return ETrue;
 	}
 
@@ -904,7 +907,7 @@
 TBool CMMFDevSoundSession::DoSetRecordBalanceL(const RMmfIpcMessage& aMessage)
 	{
 	TMMFDevSoundProxySettingsPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),devSoundBuf));
 	TInt leftPercentage = devSoundBuf().iLeftPercentage;
 	TInt rightPercentage = devSoundBuf().iRightPercentage;
 	TBool asyncOperation;
@@ -970,7 +973,7 @@
 		}
 
 	TMMFDevSoundProxyHwBufPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),devSoundBuf));
 	iBufferPlay->SetLastBuffer(devSoundBuf().iLastBuffer);
 
 	TPtr8 dataPtr(iChunk.Base(), devSoundBuf().iBufferSize, devSoundBuf().iBufferSize);
@@ -1002,7 +1005,7 @@
 	TBool completed = iAdapter->Stop();
 	if (completed)
 		{
-		iQueuedRequests.Reset();
+        FlushQueuedRequests();
 		FlushEventQueue(); // completed returned here means we were idle to start with. TODO could possibly skip this flush
 		iChunk.Close();
 		}
@@ -1030,7 +1033,7 @@
 	{
     SYMBIAN_DEBPRN0(_L("CMMFDevSoundSession[0x%x]::DoPlayToneL - Enter"));
     TMMFDevSoundProxySettingsPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),devSoundBuf));
 	iCachedClientData = devSoundBuf;
 	TInt frequency = devSoundBuf().iFrequencyOne;
 	TTimeIntervalMicroSeconds duration(devSoundBuf().iDuration);
@@ -1060,7 +1063,7 @@
 	{
     SYMBIAN_DEBPRN0(_L("CMMFDevSoundSession[0x%x]::DoPlayDualToneL - Enter"));
     TMMFDevSoundProxySettingsPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),devSoundBuf));
 	iCachedClientData = devSoundBuf;
 	TInt frequencyOne = devSoundBuf().iFrequencyOne;
 	TInt frequencyTwo = devSoundBuf().iFrequencyTwo;
@@ -1101,8 +1104,7 @@
 
 	iDtmfString = HBufC::NewL(dtmfLength);
 	TPtr dtmfPtr = iDtmfString->Des();
-	aMessage.ReadL(TInt(2), dtmfPtr);
-
+    User::LeaveIfError(MessageRead(aMessage, TInt(2), dtmfPtr));
 	iAdapter->PlayDTMFStringL(*iDtmfString);
 	iOperationCompletePending = ETrue;
 	SYMBIAN_DEBPRN1(_L("CMMFDevSoundSession[0x%x]::DoPlayDTMFStringL - Exit. Return value is [%d]"), ETrue);
@@ -1136,7 +1138,7 @@
 
 	iToneSeqBuf = HBufC8::NewL(toneLength);
 	TPtr8 toneSeqPtr = iToneSeqBuf->Des();
-	aMessage.ReadL(TInt(1), toneSeqPtr);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1), toneSeqPtr));
 
 	iAdapter->PlayToneSequenceL(*iToneSeqBuf);
 	iOperationCompletePending = ETrue;
@@ -1162,7 +1164,7 @@
 	{
     SYMBIAN_DEBPRN0(_L("CMMFDevSoundSession[0x%x]::DoPlayFixedSequenceL - Enter"));
     TPckgBuf<TInt> buf;
-	aMessage.ReadL(TInt(1),buf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),buf));
 	TInt seqNum = buf();
 	iSeqNum = seqNum;
 	iAdapter->PlayFixedSequenceL(seqNum);
@@ -1189,7 +1191,7 @@
 	{
     SYMBIAN_DEBPRN0(_L("CMMFDevSoundSession[0x%x]::DoSetDTMFLengthsL - Enter"));
     TMMFDevSoundProxySettingsPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),devSoundBuf));
 	TTimeIntervalMicroSeconds32 toneOnLength = devSoundBuf().iToneOnLength;
 	TTimeIntervalMicroSeconds32 toneOffLength = devSoundBuf().iToneOffLength;
 	TTimeIntervalMicroSeconds32 pauseLength = devSoundBuf().iPauseLength;
@@ -1206,7 +1208,7 @@
 	{
     SYMBIAN_DEBPRN0(_L("CMMFDevSoundSession[0x%x]::DoSetVolumeRampL - Enter"));
     TMMFDevSoundProxySettingsPckg devSoundBuf;
-	aMessage.ReadL(TInt(1),devSoundBuf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),devSoundBuf));
 	TTimeIntervalMicroSeconds duration = devSoundBuf().iDuration;
 	User::LeaveIfError(iAdapter->SetVolumeRamp(duration));
 	iOperationCompletePending = EFalse; // Volume ramp doesn't result on commit
@@ -1224,14 +1226,14 @@
 	iArray.Reset();
 
 	TMMFPrioritySettingsPckg prioritySetBuf;
-	aMessage.ReadL(TInt(1),prioritySetBuf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),prioritySetBuf));
 	TMMFPrioritySettings prioritySet = prioritySetBuf();
 
 	iAdapter->GetSupportedInputDataTypesL(iArray, prioritySet);
 
 	TPckgBuf<TInt> pckg;
 	pckg() = iArray.Count();
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 
 	return ETrue;
 	}
@@ -1246,14 +1248,14 @@
 	iArray.Reset();
 
 	TMMFPrioritySettingsPckg prioritySetBuf;
-	aMessage.ReadL(TInt(1),prioritySetBuf);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),prioritySetBuf));
 	TMMFPrioritySettings prioritySet = prioritySetBuf();
 
 	iAdapter->GetSupportedOutputDataTypesL(iArray, prioritySet);
 
 	TPckgBuf<TInt> pckg;
 	pckg() = iArray.Count();
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 
 	return ETrue;
 	}
@@ -1266,7 +1268,7 @@
 	{
 	TPckgBuf<TInt> pckg;
 	pckg() = iAdapter->SamplesRecorded();
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 	return ETrue;
 	}
 
@@ -1278,7 +1280,7 @@
 	{
 	TPckgBuf<TInt> pckg;
 	pckg() = iAdapter->SamplesPlayed();
-	aMessage.WriteL(TInt(2),pckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),pckg));
 	return ETrue;
 	}
 
@@ -1290,10 +1292,10 @@
 	{
     SYMBIAN_DEBPRN0(_L("CMMFDevSoundSession[0x%x]::DoSetToneRepeatsL - Enter"));
     TPckgBuf<TInt> countRepeat;
-	aMessage.ReadL(TInt(1),countRepeat);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),countRepeat));
 
 	TPckgBuf<TTimeIntervalMicroSeconds> repeatTS;
-	aMessage.ReadL(TInt(2),repeatTS);
+	User::LeaveIfError(MessageRead(aMessage,TInt(2),repeatTS));
 	User::LeaveIfError(iAdapter->SetToneRepeats(countRepeat(), repeatTS()));
     SYMBIAN_DEBPRN1(_L("CMMFDevSoundSession[0x%x]::DoSetToneRepeatsL - Exit. Return value is [%d]"), ETrue);
 	return ETrue;
@@ -1307,7 +1309,7 @@
 						const RMmfIpcMessage& aMessage)
 	{
 	TPckgBuf<TMMFPrioritySettings> prioritySet;
-	aMessage.ReadL(TInt(1),prioritySet);
+	User::LeaveIfError(MessageRead(aMessage,TInt(1),prioritySet));
 
 	User::LeaveIfError(iAdapter->SetPrioritySettings(prioritySet()));
 	iOperationCompletePending = EFalse;
@@ -1326,7 +1328,7 @@
 	TInt fixSeqCount = iAdapter->FixedSequenceCount();
 	fixSeqCountPckg = fixSeqCount;
 
-	aMessage.WriteL(TInt(2),fixSeqCountPckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),fixSeqCountPckg));
     SYMBIAN_DEBPRN1(_L("CMMFDevSoundSession[0x%x]::DoFixedSequenceCountL - Exit. Return value is [%d]"), ETrue);
 	return ETrue;
 	}
@@ -1354,7 +1356,7 @@
 		stream.WriteInt32L(iArray[i].FourCC());
 		i++;
 		}
-	aMessage.WriteL(TInt(2), dataCopyBuffer->Ptr(0));
+	User::LeaveIfError(MessageWrite(aMessage, TInt(2), dataCopyBuffer->Ptr(0)));
 	stream.Close();
 	CleanupStack::PopAndDestroy(&stream);
 	CleanupStack::PopAndDestroy(dataCopyBuffer);
@@ -1377,14 +1379,14 @@
 		return EFalse;	
 		}
 	TPckgBuf<TInt> requestChunkBuf;
-	MmfMessageUtil::Read(aMessage, TInt(1), requestChunkBuf);
+	User::LeaveIfError(MessageRead(aMessage, TInt(1), requestChunkBuf));
 	TBool requestChunk = requestChunkBuf();
 	if (requestChunk)
 		{
 		// if the client requests, always do EOpen
 		iHwBufPckgFill().iChunkOp = EOpen;
 		}
-	TInt err = MmfMessageUtil::Write(aMessage, TInt(2), iHwBufPckgFill);
+	TInt err = MessageWrite(aMessage, TInt(2), iHwBufPckgFill);
 	if ( (err == KErrNone) && (iHwBufPckgFill().iChunkOp == EOpen) )
 		{
 		aMessage.Complete(iChunk);
@@ -1410,7 +1412,7 @@
 		return EFalse;	
 		}
 	
-	TInt err = MmfMessageUtil::Write(aMessage, TInt(2), iHwBufPckgEmpty);
+	TInt err = MessageWrite(aMessage, TInt(2), iHwBufPckgEmpty);
 	if ( (err == KErrNone) && (iHwBufPckgEmpty().iChunkOp == EOpen) )
 		{
 		aMessage.Complete(iChunk);
@@ -1456,7 +1458,7 @@
 		aMessage.Complete(err);
 		return EFalse;		
 		}
-	aMessage.WriteL(TInt(2),timePckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),timePckg));
 	return ETrue;
 	}
 
@@ -1465,7 +1467,7 @@
 	TBool isSupported = EFalse;
 	TPckgBuf<TBool> isSupportedPckg(isSupported);
 	isSupportedPckg() = iAdapter->IsResumeSupported();
-	aMessage.WriteL(TInt(2),isSupportedPckg);
+	User::LeaveIfError(MessageWrite(aMessage,TInt(2),isSupportedPckg));
 	return ETrue;
 	}
 
@@ -1522,7 +1524,8 @@
 // (other items were commented in a header).
 //
 CMMFDevSoundSession::CMMFDevSoundSession() :
-	iSetClientConfigApplied (EFalse)
+	iSetClientConfigApplied (EFalse),
+	iDisconnecting (EFalse)
 	{
 	}
 
@@ -1640,6 +1643,8 @@
 void CMMFDevSoundSession::Disconnect(const RMessage2& aMessage)
 	{
     SYMBIAN_DEBPRN0(_L("CMMFDevSoundSession[0x%x]::Disconnect - Enter"));
+    iDisconnecting = ETrue;
+	
     if (NeedToQueue())
         {
         // if we are in the middle of something, enqueue and wait
@@ -2106,7 +2111,7 @@
 				if (iRequestBeingServiced.Function()==EMMFDevSoundProxyStop)
 					{
 					// flush the queue - will have removed any stale items added between initial call and MMRC's reaction
-					iQueuedRequests.Reset();
+                    FlushQueuedRequests();
 					FlushEventQueue();
 					iChunk.Close();
 					}
@@ -2116,7 +2121,7 @@
 					TMMFDevSoundProxySettings devSoundSet;
 					devSoundSet.iCaps = iDevSoundCapabilities;
 					TMMFDevSoundProxySettingsPckg pckg(devSoundSet);
-					iRequestBeingServiced.Message().Write(TInt(2),pckg);
+					MessageWrite(iRequestBeingServiced.Message(),TInt(2),pckg);
 					}
 				
 				if(iRequestBeingServiced.Function()==EMMFDevSoundProxyCancelInitialize)
@@ -2541,11 +2546,11 @@
 TBool CMMFDevSoundSession::DoRegisterAsClientL(const RMmfIpcMessage& aMessage)
 	{
 	TMMFDevSoundProxySettingsPckg buf;
-	aMessage.ReadL(0,buf);
+	User::LeaveIfError(MessageRead(aMessage,0,buf));
 	HBufC8* notificationRegistrationData = NULL;
 	notificationRegistrationData = HBufC8::NewLC(User::LeaveIfError(aMessage.GetDesLengthL(1)));
 	TPtr8 dataPtr(notificationRegistrationData->Des());  	
-	aMessage.ReadL(1,dataPtr);
+	User::LeaveIfError(MessageRead(aMessage,1,dataPtr));
 	DoSetClientConfigL();// added here instead of the CreateL()
 	TInt err = KErrNone;
 	err = iAdapter->RegisterAsClient(buf().iNotificationEventUid,dataPtr);
@@ -2561,7 +2566,7 @@
 TBool CMMFDevSoundSession::DoCancelRegisterAsClientL(const RMmfIpcMessage& aMessage)
 	{
 	TMMFDevSoundProxySettingsPckg buf;
-	aMessage.ReadL(0,buf);
+	User::LeaveIfError(MessageRead(aMessage,0,buf));
 	TInt err = KErrNone;
 	err = iAdapter->CancelRegisterAsClient(buf().iNotificationEventUid);
 	if (err != KErrNone)
@@ -2575,14 +2580,14 @@
 TBool CMMFDevSoundSession::DoGetResourceNotificationDataL(const RMmfIpcMessage& aMessage)
 	{
 	TMMFDevSoundProxySettingsPckg buf;
-	aMessage.ReadL(0,buf);
+	User::LeaveIfError(MessageRead(aMessage,0,buf));
 	HBufC8* notificationData = NULL;
 	notificationData = HBufC8::NewLC(User::LeaveIfError(aMessage.GetDesMaxLengthL(2)));
 	TPtr8 dataPtr(notificationData->Des());  	
-	aMessage.ReadL(2,dataPtr);
+	User::LeaveIfError(MessageRead(aMessage,2,dataPtr));
 	TInt err = KErrNone;
 	err = iAdapter->GetResourceNotificationData(buf().iNotificationEventUid,dataPtr);
-	aMessage.WriteL(2,*notificationData);
+	User::LeaveIfError(MessageWrite(aMessage,2,*notificationData));
 	CleanupStack::PopAndDestroy(1); // Notification data
 	if (err != KErrNone)
 		{
@@ -2611,7 +2616,7 @@
 		if (aMessage.HasCapability(ECapabilityMultimediaDD) && aMessage.HasCapability(ECapabilityUserEnvironment))
 			{
 			TPckgBuf<TThreadId> threadId;
-			aMessage.ReadL(1, threadId);
+			User::LeaveIfError(MessageRead(aMessage, 1, threadId));
 			
 			CMMFDevSoundServer* server = 
 				const_cast<CMMFDevSoundServer*>(static_cast<const CMMFDevSoundServer*>(Server()));
@@ -2640,6 +2645,46 @@
 	iAdapter->BufferErrorEvent();
 	}
 
+void CMMFDevSoundSession::FlushQueuedRequests()
+    {
+    for (TInt queueIndex = (iQueuedRequests.Count() - 1); queueIndex >= 0; --queueIndex)
+        {
+        if ((iQueuedRequests[queueIndex].Type() == TMMFDevSoundRequest::ESessionEvents) && 
+                (iQueuedRequests[queueIndex].Function() == RMessage2::EDisConnect))
+            {
+            continue;
+            }
+        iQueuedRequests.Remove(queueIndex);
+        }    
+    }
+
+TInt CMMFDevSoundSession::MessageRead(const RMmfIpcMessage& aMessage, TInt aParam, TDes8& aResult)
+    {
+    if (!iDisconnecting)
+        {
+        return MmfMessageUtil::Read(aMessage, aParam, aResult);    
+        }
+    return KErrBadHandle;
+    }
+
+TInt CMMFDevSoundSession::MessageRead(const RMmfIpcMessage& aMessage, TInt aParam, TDes16& aResult)
+    {
+    if (!iDisconnecting)
+        {
+        return aMessage.Read(aParam, aResult);    
+        }
+    return KErrBadHandle;
+    }
+
+TInt CMMFDevSoundSession::MessageWrite(const RMmfIpcMessage& aMessage, TInt aParam, const TDesC8& aValue)
+    {
+    if (!iDisconnecting)
+        {
+        return MmfMessageUtil::Write(aMessage, aParam, aValue);
+        }
+    return KErrBadHandle;
+    }
+
 void CMMFDevSoundSession::ResetNotifiedError()
 // called at beginning of commit cycle, so any error will be from callbacks
     {
--- a/devsound/a3fdevsound/src/mmfdevsoundserver/mmfdevsoundsession.h	Wed Sep 15 13:51:05 2010 +0300
+++ b/devsound/a3fdevsound/src/mmfdevsoundserver/mmfdevsoundsession.h	Wed Oct 13 16:15:10 2010 +0300
@@ -1534,6 +1534,22 @@
 	*/
 	void BufferErrorEvent();
 
+	/*
+	 Removes all entries from iQueuedRequests except for
+	 disconnect requests.
+	 */
+	void FlushQueuedRequests();
+	
+	/*
+	 Helper functions, used to guard against accessing the equivalent
+	 functions on bad message handles during a disconnection. These
+	 methods should be used whenever a Read or Write is made outside the 
+	 context of DoServiceRequestL().
+	 */
+	TInt MessageRead(const RMmfIpcMessage& aMessage, TInt aParam, TDes8& aResult);
+	TInt MessageRead(const RMmfIpcMessage& aMessage, TInt aParam, TDes16& aResult);
+	TInt MessageWrite(const RMmfIpcMessage& aMessage, TInt aParam, const TDesC8& aValue);
+
 protected:
 
 	/**
@@ -1614,6 +1630,7 @@
 	TInt iSeqNum;
 	TBool iPreemptionClash;
 	TInt iNotifiedError;
+	TBool iDisconnecting;
 
 	};
 
--- a/devsound/a3fintegrationtest/scripts/tsi_a3f_devsound_pcm_play.script	Wed Sep 15 13:51:05 2010 +0300
+++ b/devsound/a3fintegrationtest/scripts/tsi_a3f_devsound_pcm_play.script	Wed Oct 13 16:15:10 2010 +0300
@@ -334,10 +334,8 @@
 //! @SYMTestActions				1. Configure DevSound to play PCM16 raw audio data in mono mode with sampling rate of 8 kHz.
 //!								2. Start playing and read recorded data from file.
 //!								3. Stop playback once EOF is reached.
-//!								4. Initialize again
-//!								5. Check that time played is 0
-//!								6. Restart playback again
-//!								7. Stop test when EOF is reached again
+//!								4. Restart playback again
+//!								5. Stop test when EOF is reached again
 //! @SYMTestExpectedResults		Devsound to successfully play PCM16 audio data in mono mode with sampling rate of 8 KHz twice with all the DevSound callback 
 //!								functions being executed as required throughout the test.
 
--- a/devsound/a3fintegrationtest/src/tsi_a3f_devsound_play.cpp	Wed Sep 15 13:51:05 2010 +0300
+++ b/devsound/a3fintegrationtest/src/tsi_a3f_devsound_play.cpp	Wed Oct 13 16:15:10 2010 +0300
@@ -2610,8 +2610,8 @@
 				ERR_PRINTF2(_L("Could not Open the File: Error = %d"), err);
 				StopTest(err);
 				}
-            iPlayState = EStatePlayStart;
-            Fsm(EEventPlayStart, KErrNone);
+			iPlayState = EStatePlayInitializing;
+			Fsm(EEventInitCompletePlay, KErrNone);
 			}
 		else
 			{
@@ -2626,50 +2626,6 @@
 
 	}
 
-/*
- *
- * InitializeComplete
- *
- */
-void RStepA3FDevSoundPlayEOFPlayMultipleTimes::InitializeComplete(TInt aError)
-    {
-    INFO_PRINTF2(_L("Initialize returned with = %d"), aError);
-    if (aError == KErrNone)
-        {
-        TTimeIntervalMicroSeconds time;
-        TInt err = iMMFDevSound->GetTimePlayed(time);
-        if (err != KErrNone)
-            {
-            INFO_PRINTF2(_L("CMMFDevSound::GetTimePlayed unexpectedly returned %d - abort test"), err);
-            StopTest(err, EFail);
-            return;
-            }
-        
-        // checking low 32bits should be enough - sample played should never exceed 4000-ish seconds
-        INFO_PRINTF2(_L("Time played is %d after Play-Initialisation"), I64LOW(time.Int64()));
-        if (I64LOW(time.Int64()) != 0)
-            {
-            INFO_PRINTF1(_L("Time played is not 0 after Play-Initialisation - abort test"));
-            StopTest(KErrNone, EFail);
-            return;
-            }
-        
-        TInt samples = iMMFDevSound->SamplesPlayed();
-        INFO_PRINTF2(_L("Sample played is %d after Play-Initialisation"), samples);
-        if (samples != 0)
-            {
-            INFO_PRINTF1(_L("Sample played is not 0 after Play-Initialisation - abort test"));
-            StopTest(KErrNone, EFail);
-            return;
-            }
-        
-        // This is to trigger iMMFDevSound->PlayInitL as next step in the base Fsm
-        iPlayState = EStatePlayInitializing;
-        Fsm(EEventInitCompletePlay, KErrNone);
-        }
-    }
-
-
 //
 // RStepA3FDevSoundInititalizeDuringInitialize
 //
--- a/devsound/a3fintegrationtest/src/tsi_a3f_devsound_play.h	Wed Sep 15 13:51:05 2010 +0300
+++ b/devsound/a3fintegrationtest/src/tsi_a3f_devsound_play.h	Wed Oct 13 16:15:10 2010 +0300
@@ -384,7 +384,6 @@
 
 	// From MDevSoundObserver
 	virtual void PlayError(TInt aError);
-	virtual void InitializeComplete(TInt aError);
 
 private:
 	TInt iRepeatCount;
--- a/devsoundextensions/telephonyaudiorouting/TelephonyAudioRoutingManager/src/TelephonyAudioRoutingManager.cpp	Wed Sep 15 13:51:05 2010 +0300
+++ b/devsoundextensions/telephonyaudiorouting/TelephonyAudioRoutingManager/src/TelephonyAudioRoutingManager.cpp	Wed Oct 13 16:15:10 2010 +0300
@@ -31,12 +31,7 @@
 
 const TInt KTelAudRtngServerStackSize=0x2000;			//  8KB
 const TInt KTelAudRtngServerInitHeapSize=0x1000;		//  4KB
-#if defined __WINSCW__      
-//Telephoney Audio routing server requires only 1MB data for emulator
-const TInt KTelAudRtngServerMaxHeapSize=0x100000;      // 1MB
-#else
 const TInt KTelAudRtngServerMaxHeapSize=0x1000000;		// 16MB
-#endif
     
 // ================= MEMBER FUNCTIONS =======================
 
--- a/mmresourcemgmt/mmresctrl/src/mmrcserver/mmrcserver.cpp	Wed Sep 15 13:51:05 2010 +0300
+++ b/mmresourcemgmt/mmresctrl/src/mmrcserver/mmrcserver.cpp	Wed Oct 13 16:15:10 2010 +0300
@@ -224,17 +224,6 @@
 	// Need to check that the server exists.
 	if ( findCountServer.Next(name) != KErrNone )
 		{
-#if (defined (__WINS__) || defined (__WINSCW__) )
-		  // Create the thread for the server. Don't allocate a separate
-          // heap but use client thread's heap instead. This saves memory
-          // space in the single process model used in the emulator.
-		res = aServerThread.Create(KMMRCServerName,
-			CMMRCServer::ThreadFunction,
-			KMMRCServerStackSize,
-			NULL,
-			NULL
-			);
-#else
 		  // Create the thread for the server.
 		res = aServerThread.Create(KMMRCServerName,
 			CMMRCServer::ThreadFunction,
@@ -243,7 +232,6 @@
 			KMMRCServerMaxHeapSize,
 			NULL
 			);
-#endif	
 			
 		// The thread has been created OK so get it started - however
 		// we need to make sure that it has started before we continue.