mmlibs/mmfw/tsrc/mmfintegrationtest/ACLNT/TestMultiClientARN.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/tsrc/mmfintegrationtest/ACLNT/TestMultiClientARN.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,2334 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// CPP file: Audio Resource Notification tests for Multiple Audio Clients.
+// 
+//
+
+/**
+ @file TestMultiClientARN.cpp
+*/
+
+#include "TestAudioClientUtilitiesARN.h"
+
+//------------------------------------------------------------------------------
+//********************PREQ 797 - Audio Resource Notification********************
+//------------------------------------------------------------------------------
+
+//
+//CTestMdaAudioMultiClientCallbackSupport
+//
+
+/**
+ * NewL
+ */
+CTestMdaAudioMultiClientCallbackSupport* CTestMdaAudioMultiClientCallbackSupport::NewL(MTestAudioResourceNotificationCallback& aCallback)
+	{
+	return new(ELeave) CTestMdaAudioMultiClientCallbackSupport(aCallback);
+	}
+
+/**
+ * MarncResourceAvailable
+ */
+void CTestMdaAudioMultiClientCallbackSupport::MarncResourceAvailable(TUid aNotificationEventId, const TDesC8& aNotificationData)
+	{
+	iCallback.MarncResourceAvailableTest(aNotificationEventId, aNotificationData, *this);
+	}
+
+/**
+ * Constructor
+ */
+CTestMdaAudioMultiClientCallbackSupport::CTestMdaAudioMultiClientCallbackSupport(MTestAudioResourceNotificationCallback& aCallback):iCallback(aCallback)
+	{
+
+	}
+
+//
+//CTestMmfAclntMultiClientARN
+//
+
+/**
+ * Constructor
+ */
+CTestMmfAclntMultiClientARN::CTestMmfAclntMultiClientARN(const TDesC& aTestName, const TDesC& aSectName)
+	{
+	// store the name of this test case
+	// this is the name that is used by the script file
+	// Each test step initialises it's own name
+	iTestStepName=aTestName;
+	iHeapSize = 800000;
+	iSectName = aSectName;
+	}
+
+/**
+ * MarncResourceAvailableTest
+ */
+void CTestMmfAclntMultiClientARN::MarncResourceAvailableTest(TUid aNotificationEventId, const TDesC8& aNotificationData, CTestMdaAudioMultiClientCallbackSupport& aMdaAudioMultiClientCallbackSupport)
+	{
+	if (aNotificationEventId == KMMFEventCategoryAudioResourceAvailable)
+		{
+		INFO_PRINTF1(_L("iAudioOutputStream::MMMFAudioResourceNotificationCallback -> KMMFEventCategoryAudioResourceAvailable"));
+
+		//Convert TDesc8 to TInt64
+		TMMFTimeIntervalMicroSecondsPckg timeIntvbuf;
+		timeIntvbuf.Copy(aNotificationData);
+		TTimeIntervalMicroSeconds intPos = timeIntvbuf();
+		iPosition = intPos;
+
+		if (&aMdaAudioMultiClientCallbackSupport == iMdaAudioPlayerCallbackSupport)
+			{
+			INFO_PRINTF1(_L("iAudioPlayer -> MMMFAudioResourceNotificationCallback NotificationReceived"));
+			TRAP(iError, FsmL(EMarncResourceAvailablePlayer));
+			}
+		else if (&aMdaAudioMultiClientCallbackSupport == iMdaAudioRecorderCallbackSupport)
+			{
+			INFO_PRINTF1(_L("iAudioRecorder -> MMMFAudioResourceNotificationCallback NotificationReceived"));
+			TRAP(iError, FsmL(EMarncResourceAvailableRecorder));
+			}
+		else if (&aMdaAudioMultiClientCallbackSupport == iMdaAudioOutputStreamCallbackSupport)
+			{
+			INFO_PRINTF1(_L("iAudioOutputStream -> MMMFAudioResourceNotificationCallback NotificationReceived"));
+			TRAP(iError, FsmL(EMarncResourceAvailableOS));
+			}
+		}
+	else
+		{
+		INFO_PRINTF1(_L("MMMFAudioResourceNotificationCallback, but NOT KMMFEventCategoryAudioResourceAvailable"));
+		}
+	}
+
+/**
+ * MapcInitCompleteTest
+ */
+void CTestMmfAclntMultiClientARN::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& aDuration)
+	{
+	iDuration = aDuration;
+	INFO_PRINTF2(_L("iAudioPlayer -> MMdaAudioPlayerCallback InitComplete (%d)"),aError);
+	TRAP(iError, FsmL(EMapcInitComplete, aError));
+	}
+
+/**
+ * MapcPlayCompleteTest
+ */
+void CTestMmfAclntMultiClientARN::MapcPlayComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("iAudioPlayer -> MMdaAudioPlayerCallback PlayComplete (%d)"), aError);
+	TRAP(iError, FsmL(EMapcPlayComplete, aError));
+	}
+
+/**
+ * MoscoStateChangeEventTest
+ */
+void CTestMmfAclntMultiClientARN::MoscoStateChangeEvent(CBase* /*aObject*/, TInt aPreviousState, TInt aCurrentState, TInt aErrorCode)
+	{
+	INFO_PRINTF1(_L("iAudioRecorder -> MMdaObjectStateChangeObserver StateChanged"));
+	INFO_PRINTF4(_L("iTestAudioRecorder -> aErrorCode : %d, aPreviousState : %d, aCurrentState : %d"), aErrorCode, aPreviousState, aCurrentState);
+	TRAP(iError, FsmL(EMoscoStateChangeEvent, aErrorCode, iTestAudioRecorder->State()));
+	}
+
+/**
+ * MMdaAudioOutputStreamCallback->MaoscOpenComplete
+ */
+void CTestMmfAclntMultiClientARN::MaoscOpenComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("iAudioOutputStream -> MMdaAudioOutputStreamCallback : MaoscOpenComplete (%d)"),aError);
+	TRAP(iError, FsmL(EMaoscOpenComplete, aError));
+	}
+
+/**
+ * MMdaAudioOutputStreamCallback->MaoscBufferCopied
+ */
+void CTestMmfAclntMultiClientARN::MaoscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/)
+	{
+	INFO_PRINTF2(_L("iAudioOutputStream -> MMdaAudioOutputStreamCallback : MaoscBufferCopied  (%d)"), aError);
+	TRAP(iError, FsmL(EMaoscBufferCopied, aError));
+	}
+
+/**
+ * MMdaAudioOutputStreamCallback->MaoscPlayComplete
+ */
+void CTestMmfAclntMultiClientARN::MaoscPlayComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("iAudioOutputStream -> MMdaAudioOutputStreamCallback : MaoscPlayComplete  (%d)"), aError);
+	TRAP(iError, FsmL(EMaoscPlayComplete, aError));
+	}
+
+/**
+ * DoTestStepPreambleL
+ */
+TVerdict CTestMmfAclntMultiClientARN::DoTestStepPreambleL()
+	{
+	iError = KErrTimedOut;
+	TPtrC filename;
+	TVerdict verdict;
+	
+	// Install the scheduler - Call base DoTestStepPreambleL()
+	verdict = CTestMmfAclntStep::DoTestStepPreambleL();
+	if (verdict == EFail)
+		{
+		return verdict;
+		}
+	
+	iEventChecker = CMultiEventChecker::NewL();
+	//************** Initialise CMdaAudioPlayerUtility***************
+	INFO_PRINTF1(_L("Initialise CMdaAudioPlayerUtility : EMdaPriorityNormal"));
+	// Get file name
+	if(!GetStringFromConfig(iSectName, _L("playerAudioFile1"), filename))
+		{
+		return EInconclusive;
+		}
+	GetDriveName(iFilenamePlayer);
+	iFilenamePlayer.Append(filename);
+	
+	// Callback Handler
+	iMdaAudioPlayerCallbackSupport = CTestMdaAudioMultiClientCallbackSupport::NewL(*this);
+	
+	// Initialise Audio Player
+	iTestAudioPlayer = CMdaAudioPlayerUtility::NewL(*this, EMdaPriorityNormal);
+	
+	//************** Initialise CMdaAudioRecorderUtility*************
+	INFO_PRINTF1(_L("Initialise CMdaAudioRecorderUtility : EMdaPriorityMax"));
+	// Get file name
+	if(!GetStringFromConfig(iSectName, _L("playerAudioFile2"), filename))
+		{
+		return EInconclusive;
+		}
+	GetDriveName(iFilenameRecorder);
+	iFilenameRecorder.Append(filename);
+	
+	// Callback Handler
+	iMdaAudioRecorderCallbackSupport = CTestMdaAudioMultiClientCallbackSupport::NewL(*this);
+	
+	// Initialise Audio Recorder
+	iTestAudioRecorder = CMdaAudioRecorderUtility::NewL(*this, NULL, EMdaPriorityMax);
+	
+	//************** Initialise CMdaAudioOutputStream****************
+	INFO_PRINTF1(_L("Initialise CMdaAudioOutputStream  : EMdaPriorityMin"));
+	// Connect RFs session
+	TInt err = iFs.Connect();
+	if (err != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error connecting to File session (RFs) = %d"), err);
+		return EFail;
+		}
+	// Callback Handler
+	iMdaAudioOutputStreamCallbackSupport = CTestMdaAudioMultiClientCallbackSupport::NewL(*this);
+	
+	// Initialise iTestAudioOutputStream
+	TRAP(err, iTestAudioOutputStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMin, EMdaPriorityPreferenceTimeAndQuality));
+	if (err != KErrNone || iTestAudioOutputStream == NULL )
+		{
+		INFO_PRINTF2(_L("Error Creating iTestAudioOutputStream = %d"), err);
+		return EInconclusive;
+		}
+	// Open RFile
+	err = iFile.Open(iFs, KStreamRawFile1, EFileRead);
+	if (err != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error opening iFile = %d"), err);
+		return EFail;
+		}
+	// Get size of iFile
+	err = iFile.Size(iFileSize);
+	if (err != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error getting size of iFile = %d"), err);
+		return EFail;
+		}
+	// Initialise iBuf
+	iBuf.CreateMaxL(iFileSize);
+	
+	// Initialise the CCallBackTimer.
+	iCallBackTimer = CCallBackTimer::NewL(TCallBack(stopActiveScheduler));
+	
+	return verdict;
+	}
+
+/**
+ * DoTestStepPostambleL
+ */
+TVerdict CTestMmfAclntMultiClientARN::DoTestStepPostambleL()
+	{
+	// Delete all the Audio Client utilities.
+	if (iTestAudioPlayer)
+		iTestAudioPlayer->Close();
+	delete iTestAudioPlayer;
+	iTestAudioPlayer = NULL;
+	iTestAudioRecorder->Close();
+	delete iTestAudioRecorder;
+	iTestAudioRecorder = NULL;
+	delete iTestAudioOutputStream;
+	iTestAudioOutputStream = NULL;
+	// Delete CTestMdaAudioRecorderCallbackSupport
+	delete iMdaAudioPlayerCallbackSupport;
+	delete iMdaAudioRecorderCallbackSupport;
+	delete iMdaAudioOutputStreamCallbackSupport;
+	// Close RBuf8
+	iBuf.Close();
+	// Delete the CCallBackTimer.
+	delete iCallBackTimer;
+	iCallBackTimer=NULL;
+	// Close the File Handles
+	iFile.Close();
+	iFs.Close();
+	delete iEventChecker;
+	
+	return CTestMmfAclntStep::DoTestStepPostambleL();
+	}
+
+/**
+ * DoTestStepL
+ */
+TVerdict CTestMmfAclntMultiClientARN::DoTestStepL()
+	{
+	return( DoTestL() );
+	}
+
+/**
+ * StateInit
+ */
+void CTestMmfAclntMultiClientARN::StateInit()
+	{
+	iExpectedEvent=EIdleMulti;
+	iExpectedRecorderState=CMdaAudioClipUtility::ENotReady;
+	iExpectedError=KErrNone;
+	iState=0;
+	}
+
+/**
+ * StateChange
+ */
+void CTestMmfAclntMultiClientARN::StateChange(TMmfAudioMultiClientEvents aExpectedEvent, TInt aExpectedError, CMdaAudioClipUtility::TState aExpectedRecorderState)
+	{
+	iExpectedEvent=aExpectedEvent;
+	iExpectedRecorderState=aExpectedRecorderState;
+	iExpectedError=aExpectedError;
+	iState++;
+	}
+
+/**
+ * FsmCheck
+ */
+TBool CTestMmfAclntMultiClientARN::FsmCheck(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	TBool retFsmCheck = EFalse;
+	if ((iExpectedError !=KErrUnderflow) && (aError == KErrUnderflow))
+		{
+		INFO_PRINTF1(_L("Underflow !"));
+		}
+	else if (iExpectedEvent != aEventCode)
+		{
+		ERR_PRINTF3(_L("ExpectedEvent : %d, ActualEvent : %d"), iExpectedEvent, aEventCode);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	else if (iExpectedError != aError)
+		{
+		ERR_PRINTF3(_L("ExpectedError : %d, ActualError : %d"), iExpectedError, aError);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	else if (iExpectedRecorderState != aRecorderState)
+		{
+		ERR_PRINTF3(_L("ExpectedRecorderState : %d, ActualRecorderState : %d"), iExpectedRecorderState, aRecorderState);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	else
+		{
+		retFsmCheck = ETrue;
+		}
+	return retFsmCheck;
+	}
+
+//
+//CTestMmfAclntARN9001
+//
+
+/**
+ * Constructor
+ */
+CTestMmfAclntARN9001::CTestMmfAclntARN9001(const TDesC& aTestName, const TDesC& aSectName)
+	: CTestMmfAclntMultiClientARN(aTestName, aSectName)
+	{}
+
+/**
+ * NewL
+ */
+CTestMmfAclntARN9001* CTestMmfAclntARN9001::NewL(const TDesC& aTestName, const TDesC& aSectName)
+	{
+	CTestMmfAclntARN9001* self = new (ELeave) CTestMmfAclntARN9001(aTestName, aSectName);
+	return self;
+	}
+
+/**
+ * DoTestL
+ */
+TVerdict CTestMmfAclntARN9001::DoTestL()
+	{
+	return( PerformTestL() );
+	}
+
+/**
+ * FsmCheck
+ */
+TBool CTestMmfAclntARN9001::FsmCheck(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	TBool retFsmCheck = EFalse;
+	if ((iExpectedError !=KErrUnderflow) && (aError == KErrUnderflow))
+		{
+		INFO_PRINTF1(_L("Underflow !"));
+		}
+	else if (iExpectedEvent != aEventCode)
+		{
+        if ((aEventCode == EMoscoStateChangeEvent))
+	        {
+	        retFsmCheck = ETrue;
+	        if (iEventOccured == EMarncResourceAvailableOS)
+	            {
+	            return retFsmCheck;
+	            }
+            else
+                {
+                iEventOccured = EMoscoStateChangeEvent;
+                }
+	        }
+        else if (aEventCode == EMarncResourceAvailableOS)
+            {
+            retFsmCheck = ETrue;
+            if (iEventOccured == EMoscoStateChangeEvent)
+                {
+                return retFsmCheck;
+                }
+            else
+                {
+                iEventOccured = EMarncResourceAvailableOS;
+                }
+            }
+        else
+            {
+    		ERR_PRINTF3(_L("ExpectedEvent : %d, ActualEvent : %d"), iExpectedEvent, aEventCode);
+    		iTestStepResult = EFail;
+    		CActiveScheduler::Stop();
+            }
+		}
+	else if (iExpectedError != aError)
+		{
+		ERR_PRINTF3(_L("ExpectedError : %d, ActualError : %d"), iExpectedError, aError);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	else if (iExpectedRecorderState != aRecorderState)
+		{
+		ERR_PRINTF3(_L("ExpectedRecorderState : %d, ActualRecorderState : %d"), iExpectedRecorderState, aRecorderState);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	else
+		{
+		retFsmCheck = ETrue;
+		}
+	return retFsmCheck;
+	}
+
+/**
+ * FsmL
+ */
+void CTestMmfAclntARN9001::FsmL(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (FsmCheck(aEventCode, aError, aRecorderState))
+		{
+		TInt err = KErrNone;
+		switch (iState)
+			{
+			case 0:
+				// Open iTestAudioPlayer
+				iTestAudioPlayer->OpenFileL(iFilenamePlayer);
+				INFO_PRINTF1(_L("iTestAudioPlayer->OpenFileL()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMapcInitComplete);
+				break;
+			case 1:
+				// Play iTestAudioPlayer
+				iTestAudioPlayer->Play();
+				INFO_PRINTF1(_L("iTestAudioPlayer->Play()"));
+				// Open iTestAudioRecorder
+				iTestAudioRecorder->OpenFileL(iFilenameRecorder);
+				INFO_PRINTF1(_L("iTestAudioRecorder->OpenFileL()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EOpen);
+				break;
+			case 2:
+				// Play iTestAudioRecorder
+				iTestAudioRecorder->PlayL();
+				INFO_PRINTF1(_L("iTestAudioRecorder->PlayL()"));
+				// Set ExpectedEvent and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EPlaying);
+				break;
+			case 3:
+				// iTestAudioPlayer gets PlayError.
+				StateChange(EMapcPlayComplete, KErrInUse);
+				break;
+			case 4:
+				// Register iTestAudioPlayer for Notification
+				err = iTestAudioPlayer->RegisterAudioResourceNotification(*iMdaAudioPlayerCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+				INFO_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification : Status - %d "), err);
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				// Register iTestAudioOutputStream for Notification
+				err = iTestAudioOutputStream->RegisterAudioResourceNotification(*iMdaAudioOutputStreamCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+				INFO_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification : Status - %d "), err);
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				// Open iTestAudioOutputStream
+				iTestAudioOutputStream->Open(NULL);
+				INFO_PRINTF1(_L("iTestAudioOutputStream->Open()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMaoscOpenComplete);
+				break;
+			case 5:
+				// iFile->Read()
+				err = iFile.Read(iBuf); //-synchronous
+				if (err != KErrNone)
+					{
+					INFO_PRINTF2(_L("Error reading iFile %d"), err);
+					User::Leave(err);
+					}
+				// iTestAudioOutputStream->WriteL()
+				INFO_PRINTF1(_L("iTestAudioOutputStream->WriteL()"));
+				iTestAudioOutputStream->WriteL(iBuf); //-Should get Play Error.
+				// Set ExpectedEvent & ExpectedError and change the State
+				StateChange(EMaoscBufferCopied, KErrInUse);
+				break;
+			case 6:
+				// Set ExpectedEvent & ExpectedError and change the State
+				StateChange(EMaoscPlayComplete, KErrInUse);
+				break;
+			case 7:
+				// Delete the instance iTestAudioPlayer
+				delete iTestAudioPlayer;
+				iTestAudioPlayer = NULL;
+				INFO_PRINTF1(_L("delete iTestAudioPlayer"));
+				User::After(100000);
+				// Wait for iTestAudioRecorder to complete playing
+				// Set ExpectedEvent and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EOpen);
+				break;
+			case 8:
+				// Timer to check if Notification Event Occurs.
+				iCallBackTimer->After(2000000);
+				// Set ExpectedEvent and change the State
+				StateChange(EMarncResourceAvailableOS, KErrNone);
+				break;
+			case 9:
+				iCallBackTimer->Cancel(); // in case something else stopped the AS
+				INFO_PRINTF1(_L("iTestAudioOutputStream->NotificationReceived"));
+				iTestStepResult = EPass;
+				CActiveScheduler::Stop();
+				break;
+			}
+		}
+	}
+
+/**
+ * PerformTestL
+ */
+TVerdict CTestMmfAclntARN9001::PerformTestL()
+	{
+	INFO_PRINTF1(_L("Receipt of Notification (on deleting the Audio Play Client instance of a Notified Client) of a Resource Available Event."));
+	iTestStepResult = EFail;
+	
+	// Initialise the state variables
+	StateInit();
+	
+	// Begin the process
+	FsmL(EIdleMulti, CMdaAudioClipUtility::ENotReady);
+	
+	// Start the scheduler - Done only once !
+	CActiveScheduler::Start();
+	
+	return iTestStepResult;
+	}
+
+
+//
+//CTestMmfAclntARN9002
+//
+
+/**
+ * Constructor
+ */
+CTestMmfAclntARN9002::CTestMmfAclntARN9002(const TDesC& aTestName, const TDesC& aSectName)
+	: CTestMmfAclntMultiClientARN(aTestName, aSectName)
+	{}
+
+/**
+ * NewL
+ */
+CTestMmfAclntARN9002* CTestMmfAclntARN9002::NewL(const TDesC& aTestName, const TDesC& aSectName)
+	{
+	CTestMmfAclntARN9002* self = new (ELeave) CTestMmfAclntARN9002(aTestName, aSectName);
+	return self;
+	}
+
+/**
+ * DoTestL
+ */
+TVerdict CTestMmfAclntARN9002::DoTestL()
+	{
+	return( PerformTestL() );
+	}
+
+void CTestMmfAclntARN9002::InitTest()
+	{
+	iEventChecker = CMultiEventChecker::NewL();
+	//Keep adding handlers
+	iStateHandlers[EStateApInitComplete] = &CTestMmfAclntARN9002::HandleStateApInitComplete;
+	iStateHandlers[EStateRecoderOpen] = &CTestMmfAclntARN9002::HandleStateRecorderOpen;
+	iStateHandlers[EStateRecoderPlaying] = &CTestMmfAclntARN9002::HandleStateRecorderPlaying;
+	iStateHandlers[EStateApPlayCompleteKErrInUse] = &CTestMmfAclntARN9002::HandleApPlayCompleteKErrInUse;
+	iStateHandlers[EStateAosOpenComplete] = &CTestMmfAclntARN9002::HandleStateAosOpenComplete;
+	iStateHandlers[EStateAosBufferCopiedKErrInUse] = &CTestMmfAclntARN9002::HandleStateAosBufferCopiedKErrInUse;
+	iStateHandlers[EStateAosPlayCompleteKErrInUse] = &CTestMmfAclntARN9002::HandleStateAosPlayCompleteKErrInUse;
+	iStateHandlers[EStateRecorderrelease] = &CTestMmfAclntARN9002::HandleStateRecorderrelease;
+	iStateHandlers[EStateApResourceAvailable] = &CTestMmfAclntARN9002::HandleStateApResourceAvailable;
+	iStateHandlers[EStateApPlayComplete] = &CTestMmfAclntARN9002::HandleStateApPlayComplete;
+	iStateHandlers[EStateAosResourceAvailable] = &CTestMmfAclntARN9002::HandleStateAosResourceAvailable;
+	}
+	
+void CTestMmfAclntARN9002::StartTestL()
+	{
+	// Open iTestAudioPlayer
+	iTestAudioPlayer->OpenFileL(iFilenamePlayer);
+	INFO_PRINTF1(_L("iTestAudioPlayer->OpenFileL()"));
+	iEventChecker->SetExpectedEvent(0,EMapcInitComplete,KErrNone);
+	iEventChecker->SetExpectedState(EStateApInitComplete);
+	}
+	
+TVerdict CTestMmfAclntARN9002::HandleStateApInitComplete()
+	{
+	iTestAudioPlayer->Play();
+	INFO_PRINTF1(_L("iTestAudioPlayer->Play()"));
+	// Open iTestAudioRecorder
+	iTestAudioRecorder->OpenFileL(iFilenameRecorder);
+	INFO_PRINTF1(_L("iTestAudioRecorder->OpenFileL()"));
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent, KErrNone,CMdaAudioClipUtility::EOpen);
+	iEventChecker->SetExpectedState(EStateRecoderOpen);
+	return EPass;
+	}
+	
+TVerdict CTestMmfAclntARN9002::HandleStateRecorderOpen()
+	{
+	iTestAudioRecorder->PlayL();
+	INFO_PRINTF1(_L("iTestAudioRecorder->PlayL()"));
+	// Set ExpectedEvent and change the State
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent,KErrNone,CMdaAudioClipUtility::EPlaying);
+	iEventChecker->SetExpectedState(EStateRecoderPlaying);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9002::HandleStateRecorderPlaying()
+	{
+	iEventChecker->SetExpectedEvent(0,EMapcPlayComplete,KErrInUse);
+	iEventChecker->SetExpectedState(EStateApPlayCompleteKErrInUse);
+	return EPass;
+	}
+	
+TVerdict CTestMmfAclntARN9002::HandleApPlayCompleteKErrInUse()
+	{
+	TInt err = iTestAudioPlayer->RegisterAudioResourceNotification(*iMdaAudioPlayerCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+	INFO_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification : Status - %d "), err);
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	// Register iTestAudioOutputStream for Notification
+	err = iTestAudioOutputStream->RegisterAudioResourceNotification(*iMdaAudioOutputStreamCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+	INFO_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification : Status - %d "), err);
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	// Open iTestAudioOutputStream
+	iTestAudioOutputStream->Open(NULL);
+	INFO_PRINTF1(_L("iTestAudioOutputStream->Open()"));
+	// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+	iEventChecker->SetExpectedEvent(2,EMaoscOpenComplete,KErrNone);
+	iEventChecker->SetExpectedState(EStateAosOpenComplete);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9002::HandleStateAosOpenComplete()
+	{
+	// iFile->Read()
+	TInt err = iFile.Read(iBuf); //-synchronous
+	if (err != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error reading iFile %d"), err);
+		User::Leave(err);
+		}
+	// iTestAudioOutputStream->WriteL()
+	INFO_PRINTF1(_L("iTestAudioOutputStream->WriteL()"));
+	iTestAudioOutputStream->WriteL(iBuf); //-Should get Play Error.
+	// Set ExpectedEvent & ExpectedError and change the State
+	iEventChecker->SetExpectedEvent(2,EMaoscBufferCopied,KErrInUse);
+	iEventChecker->SetExpectedState(EStateAosBufferCopiedKErrInUse);
+	return EPass;	
+	}
+
+TVerdict CTestMmfAclntARN9002::HandleStateAosBufferCopiedKErrInUse()
+	{
+	iEventChecker->SetExpectedEvent(2,EMaoscPlayComplete,KErrInUse);
+	iEventChecker->SetExpectedState(EStateAosPlayCompleteKErrInUse);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9002::HandleStateAosPlayCompleteKErrInUse()
+	{
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent,KErrNone,CMdaAudioClipUtility::EOpen);
+	iEventChecker->SetExpectedState(EStateRecorderrelease);
+	return EPass;
+	}
+	
+TVerdict CTestMmfAclntARN9002::HandleStateRecorderrelease()
+	{
+	// Timer to check if Notification Event Occurs.
+	iCallBackTimer->After(2000000);
+	// Set ExpectedEvent and change the State
+	iEventChecker->SetExpectedEvent(0,EMarncResourceAvailablePlayer,KErrNone);
+	iEventChecker->SetExpectedState(EStateApResourceAvailable);
+	return EPass;
+	}
+	
+TVerdict CTestMmfAclntARN9002::HandleStateApResourceAvailable()
+	{
+	iCallBackTimer->Cancel(); // in case something else stopped the AS
+	INFO_PRINTF1(_L("iTestAudioPlayer->NotificationReceived"));
+	TInt err = iTestAudioPlayer->WillResumePlay();
+	INFO_PRINTF1(_L("iTestAudioPlayer->WillResumePlay()"));
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioPlayer->WillResumePlay() - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	iTestAudioPlayer->SetPosition(iPosition);
+	INFO_PRINTF1(_L("iTestAudioPlayer->SetPosition()"));
+	// Play iTestAudioPlayer
+	iTestAudioPlayer->Play();
+	// Set ExpectedEvent & ExpectedError and change the State
+	iEventChecker->RegisterClientEventToMonitor(0,EMapcPlayComplete,KErrNone,EStateApPlayComplete);
+	iEventChecker->RegisterClientEventToMonitor(2,EMarncResourceAvailableOS,KErrNone,EStateAosResourceAvailable);
+	iEventChecker->EnableMultipleEventMonitor();
+	return EPass;
+	}
+	
+TVerdict CTestMmfAclntARN9002::HandleStateApPlayComplete()
+	{
+	INFO_PRINTF1(_L("AudioPlayer->PlayComplete"));
+	if(iEventChecker->IsMonitoringFinished())
+		{
+		iTestStepResult = EPass;
+		iCallBackTimer->Cancel();
+		iEventChecker->StopTest();
+		}
+	else
+		{
+		iEventChecker->EnableMultipleEventMonitor();
+		}
+	return EPass;		
+	}
+	
+TVerdict CTestMmfAclntARN9002::HandleStateAosResourceAvailable()
+	{
+	INFO_PRINTF1(_L("iTestAudioOutputStream->NotificationReceived"));
+	if(iEventChecker->IsMonitoringFinished())
+		{
+		iCallBackTimer->Cancel();
+		iTestStepResult = EPass;
+		iEventChecker->StopTest();
+		}
+	else
+		{
+		iEventChecker->EnableMultipleEventMonitor();
+		}
+	return EPass;	
+	}
+	
+void CTestMmfAclntARN9002::DecideFsmState(TInt aClientNumber,CMultiEventChecker::TClientUtilityType aClientType, TInt aEventCode, TInt aError,CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (iEventChecker->CheckFsm(aClientNumber, aClientType, aEventCode, aError,aRecorderState))
+		{
+		iTestStepResult = (this->*(iStateHandlers[iEventChecker->NextState()]))();
+ 		if(iTestStepResult != EPass)
+ 			{
+ 			iEventChecker->StopTest();
+ 			}
+		}
+	}
+
+void CTestMmfAclntARN9002::FsmL(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (aEventCode == EMapcInitComplete || aEventCode == EMapcPlayComplete || aEventCode == EMarncResourceAvailablePlayer)
+		{
+			DecideFsmState(0,CMultiEventChecker::EAudioPlayer,aEventCode,aError);
+		}
+	if (aEventCode == EMoscoStateChangeEvent || aEventCode == EMarncResourceAvailableRecorder)
+		{
+			DecideFsmState(1,CMultiEventChecker::EAudioRecorder,aEventCode,aError,aRecorderState);
+		}
+	if (aEventCode == EMaoscOpenComplete || aEventCode == EMaoscBufferCopied || aEventCode == EMaoscPlayComplete || aEventCode == EMarncResourceAvailableOS)
+		{
+			DecideFsmState(2,CMultiEventChecker::EAudioStream,aEventCode,aError);
+		}
+	}
+
+TVerdict CTestMmfAclntARN9002::PerformTestL()
+	{
+	INFO_PRINTF1(_L("Receipt of Notification (on completion of play of a Notifed Client) of a Resource Available Event."));
+	iTestStepResult = EFail;
+	
+	// Initialise the handler functions
+	InitTest();
+	
+	// Initiate the process
+	StartTestL();
+	
+	// Start the scheduler - Done only once !
+	CActiveScheduler::Start();
+	
+	return iTestStepResult;
+	}
+
+
+//
+//CTestMmfAclntARN9003
+//
+
+/**
+ * Constructor
+ */
+CTestMmfAclntARN9003::CTestMmfAclntARN9003(const TDesC& aTestName, const TDesC& aSectName)
+	: CTestMmfAclntMultiClientARN(aTestName, aSectName)
+	{}
+
+/**
+ * NewL
+ */
+CTestMmfAclntARN9003* CTestMmfAclntARN9003::NewL(const TDesC& aTestName, const TDesC& aSectName)
+	{
+	CTestMmfAclntARN9003* self = new (ELeave) CTestMmfAclntARN9003(aTestName, aSectName);
+	return self;
+	}
+
+/**
+ * DoTestL
+ */
+TVerdict CTestMmfAclntARN9003::DoTestL()
+	{
+	return( PerformTestL() );
+	}
+
+/**
+ * FsmL
+ */
+void CTestMmfAclntARN9003::FsmL(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (FsmCheck(aEventCode, aError, aRecorderState))
+		{
+		TInt err = KErrNone;
+		switch (iState)
+			{
+			case 0:
+				// Open iTestAudioPlayer
+				iTestAudioPlayer->OpenFileL(iFilenamePlayer);
+				INFO_PRINTF1(_L("iTestAudioPlayer->OpenFileL()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMapcInitComplete);
+				break;
+			case 1:
+				// Play iTestAudioPlayer
+				iTestAudioPlayer->Play();
+				INFO_PRINTF1(_L("iTestAudioPlayer->Play()"));
+				// Open iTestAudioRecorder
+				iTestAudioRecorder->OpenFileL(iFilenameRecorder);
+				INFO_PRINTF1(_L("iTestAudioRecorder->OpenFileL()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EOpen);
+				break;
+			case 2:
+				// Play iTestAudioRecorder
+				iTestAudioRecorder->PlayL();
+				INFO_PRINTF1(_L("iTestAudioRecorder->PlayL()"));
+				// Set ExpectedEvent and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EPlaying);
+				break;
+			case 3:
+				// iTestAudioPlayer gets PlayError.
+				StateChange(EMapcPlayComplete, KErrInUse);
+				break;
+			case 4:
+				// Register iTestAudioPlayer for Notification
+				err = iTestAudioPlayer->RegisterAudioResourceNotification(*iMdaAudioPlayerCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+				INFO_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification : Status - %d "), err);
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				// Register iTestAudioOutputStream for Notification
+				err = iTestAudioOutputStream->RegisterAudioResourceNotification(*iMdaAudioOutputStreamCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+				INFO_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification : Status - %d "), err);
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				// Open iTestAudioOutputStream
+				iTestAudioOutputStream->Open(NULL);
+				INFO_PRINTF1(_L("iTestAudioOutputStream->Open()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMaoscOpenComplete);
+				break;
+			case 5:
+				// iFile->Read()
+				err = iFile.Read(iBuf); //-synchronous
+				if (err != KErrNone)
+					{
+					INFO_PRINTF2(_L("Error reading iFile %d"), err);
+					User::Leave(err);
+					}
+				// iTestAudioOutputStream->WriteL()
+				INFO_PRINTF1(_L("iTestAudioOutputStream->WriteL()"));
+				iTestAudioOutputStream->WriteL(iBuf); //-Should get Play Error.
+				// Set ExpectedEvent & ExpectedError and change the State
+				StateChange(EMaoscBufferCopied, KErrInUse);
+				break;
+			case 6:
+				// Set ExpectedEvent & ExpectedError and change the State
+				StateChange(EMaoscPlayComplete, KErrInUse);
+				break;			
+			case 7:
+				// Wait for iTestAudioRecorder to complete playing
+				// Set ExpectedEvent and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EOpen);
+				break;
+			case 8:
+				// Timer to check if Notification Event Occurs.
+				iCallBackTimer->After(2000000);
+				// Set ExpectedEvent and change the State
+				StateChange(EMarncResourceAvailablePlayer, KErrNone);
+				break;
+			case 9:
+				iCallBackTimer->Cancel(); // in case something else stopped the AS
+				INFO_PRINTF1(_L("iTestAudioPlayer->NotificationReceived"));
+				err = iTestAudioPlayer->WillResumePlay();
+				INFO_PRINTF1(_L("iTestAudioPlayer->WillResumePlay()"));
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioPlayer->WillResumePlay() - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				iTestAudioPlayer->SetPosition(iPosition);
+				INFO_PRINTF1(_L("iTestAudioPlayer->SetPosition()"));
+				// Play iTestAudioPlayer
+				iTestAudioPlayer->Play();
+				// Stop & Close iTestAudioPlayer
+				WaitWithTimeout(iRequestStatus,1000000);
+				iTestAudioPlayer->Stop();
+				INFO_PRINTF1(_L("iTestAudioPlayer->Stop()"));
+				iTestAudioPlayer->Close();
+				INFO_PRINTF1(_L("iTestAudioPlayer->Close()"));
+				// Timer to check if Notification Event Occurs.
+				iCallBackTimer->After(2000000);
+				// Set ExpectedEvent and change the State
+				StateChange(EMarncResourceAvailableOS);
+				break;
+			case 10:
+				iCallBackTimer->Cancel(); // in case something else stopped the AS
+				INFO_PRINTF1(_L("iTestAudioOutputStream->NotificationReceived"));
+				iTestStepResult = EPass;
+				CActiveScheduler::Stop();
+				break;
+			}
+		}
+	}
+
+/**
+ * PerformTestL
+ */
+TVerdict CTestMmfAclntARN9003::PerformTestL()
+	{
+	INFO_PRINTF1(_L("Receipt of Notification (on stopping play of a Notitifed Client) of a Resource Available Event."));
+	iTestStepResult = EFail;
+	
+	// Initialise the state variables
+	StateInit();
+	
+	// Begin the process
+	FsmL(EIdleMulti, CMdaAudioClipUtility::ENotReady);
+	
+	// Start the scheduler - Done only once !
+	CActiveScheduler::Start();
+	
+	return iTestStepResult;
+	}
+
+//
+//CTestMmfAclntARN9004
+//
+
+/**
+ * Constructor
+ */
+CTestMmfAclntARN9004::CTestMmfAclntARN9004(const TDesC& aTestName, const TDesC& aSectName)
+	: CTestMmfAclntMultiClientARN(aTestName, aSectName)
+	{}
+
+/**
+ * NewL
+ */
+CTestMmfAclntARN9004* CTestMmfAclntARN9004::NewL(const TDesC& aTestName, const TDesC& aSectName)
+	{
+	CTestMmfAclntARN9004* self = new (ELeave) CTestMmfAclntARN9004(aTestName, aSectName);
+	return self;
+	}
+
+/**
+ * DoTestL
+ */
+TVerdict CTestMmfAclntARN9004::DoTestL()
+	{
+	return( PerformTestL() );
+	}
+
+/**
+ * FsmCheck
+ */
+TBool CTestMmfAclntARN9004::FsmCheck(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	TBool retFsmCheck = EFalse;
+	if ((iExpectedError !=KErrUnderflow) && (aError == KErrUnderflow))
+		{
+		INFO_PRINTF1(_L("Underflow !"));
+		}
+	else if (iExpectedEvent != aEventCode)
+		{
+        if ((aEventCode == EMoscoStateChangeEvent))
+	        {
+	        retFsmCheck = ETrue;
+#ifdef SYMBIAN_MULTIMEDIA_A3FDEVSOUND
+	        if (iEventOccured == EMarncResourceAvailablePlayer)
+#else
+   	        if (iEventOccured == EMarncResourceAvailableOS)
+#endif
+	            {
+	            return retFsmCheck;
+	            }
+            else
+                {
+                iEventOccured = EMoscoStateChangeEvent;
+                }
+	        }
+#ifdef SYMBIAN_MULTIMEDIA_A3FDEVSOUND
+        else if (aEventCode == EMarncResourceAvailablePlayer)
+#else
+        else if (aEventCode == EMarncResourceAvailableOS)
+#endif
+            {
+            retFsmCheck = ETrue;
+            if (iEventOccured == EMoscoStateChangeEvent)
+                {
+                return retFsmCheck;
+                }
+            else
+                {
+#ifdef SYMBIAN_MULTIMEDIA_A3FDEVSOUND
+                iEventOccured = EMarncResourceAvailablePlayer;
+#else
+				iEventOccured = EMarncResourceAvailableOS;
+#endif
+		       }
+            }
+        else
+            {
+    		ERR_PRINTF3(_L("ExpectedEvent : %d, ActualEvent : %d"), iExpectedEvent, aEventCode);
+    		iTestStepResult = EFail;
+    		CActiveScheduler::Stop();
+            }
+		}
+	else if (iExpectedError != aError)
+		{
+		ERR_PRINTF3(_L("ExpectedError : %d, ActualError : %d"), iExpectedError, aError);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	else if (iExpectedRecorderState != aRecorderState)
+		{
+		ERR_PRINTF3(_L("ExpectedRecorderState : %d, ActualRecorderState : %d"), iExpectedRecorderState, aRecorderState);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	else
+		{
+		retFsmCheck = ETrue;
+		}
+	return retFsmCheck;
+	}
+
+/**
+ * FsmL
+ */
+void CTestMmfAclntARN9004::FsmL(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (FsmCheck(aEventCode, aError, aRecorderState))
+		{
+		TInt err = KErrNone;
+		switch (iState)
+			{
+			case 0:
+				// Open iTestAudioPlayer
+				iTestAudioPlayer->OpenFileL(iFilenamePlayer);
+				INFO_PRINTF1(_L("iTestAudioPlayer->OpenFileL()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMapcInitComplete);
+				break;
+			case 1:
+				// Play iTestAudioPlayer
+				iTestAudioPlayer->Play();
+				INFO_PRINTF1(_L("iTestAudioPlayer->Play()"));
+				// Open iTestAudioRecorder
+				iTestAudioRecorder->OpenFileL(iFilenameRecorder);
+				INFO_PRINTF1(_L("iTestAudioRecorder->OpenFileL()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EOpen);
+				break;
+			case 2:
+				// Play iTestAudioRecorder
+				iTestAudioRecorder->PlayL();
+				INFO_PRINTF1(_L("iTestAudioRecorder->PlayL()"));
+				// Set ExpectedEvent and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EPlaying);
+				break;
+			case 3:
+				// iTestAudioPlayer gets PlayError.
+				StateChange(EMapcPlayComplete, KErrInUse);
+				break;
+			case 4:
+				// Register iTestAudioOutputStream for Notification
+				err = iTestAudioOutputStream->RegisterAudioResourceNotification(*iMdaAudioOutputStreamCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+				INFO_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification : Status - %d "), err);
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				// Register iTestAudioPlayer for Notification
+				err = iTestAudioPlayer->RegisterAudioResourceNotification(*iMdaAudioPlayerCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+				INFO_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification : Status - %d "), err);
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				// Open iTestAudioOutputStream
+				iTestAudioOutputStream->Open(NULL);
+				INFO_PRINTF1(_L("iTestAudioOutputStream->Open()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMaoscOpenComplete);
+				break;
+			case 5:
+				// iFile->Read()
+				err = iFile.Read(iBuf); //-synchronous
+				if (err != KErrNone)
+					{
+					INFO_PRINTF2(_L("Error reading iFile %d"), err);
+					User::Leave(err);
+					}
+				// iTestAudioOutputStream->WriteL()
+				INFO_PRINTF1(_L("iTestAudioOutputStream->WriteL()"));
+				iTestAudioOutputStream->WriteL(iBuf); //-Should get Play Error.
+				// Set ExpectedEvent & ExpectedError and change the State
+				StateChange(EMaoscBufferCopied, KErrInUse);
+				break;
+			case 6:
+				// Set ExpectedEvent & ExpectedError and change the State
+				StateChange(EMaoscPlayComplete, KErrInUse);
+				break;			
+			case 7:
+				// Wait for iTestAudioRecorder to complete playing
+				// Set ExpectedEvent and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EOpen);
+				break;
+			case 8:
+				// Timer to check if Notification Event Occurs.
+				iCallBackTimer->After(2000000);
+				// Set ExpectedEvent and change the State
+				StateChange(EMarncResourceAvailableOS);
+				break;
+			case 9:
+				iCallBackTimer->Cancel(); // in case something else stopped the AS
+				INFO_PRINTF1(_L("iTestAudioOutputStream->NotificationReceived"));
+#ifdef SYMBIAN_MULTIMEDIA_A3FDEVSOUND
+				StateChange(EMarncResourceAvailablePlayer);
+#else
+				iTestStepResult = EPass;
+				CActiveScheduler::Stop();
+#endif
+				break;
+#ifdef SYMBIAN_MULTIMEDIA_A3FDEVSOUND
+			case 10:
+				INFO_PRINTF1(_L("iTestAudioPlayer->NotificationReceived"));
+				err = iTestAudioPlayer->WillResumePlay();
+				INFO_PRINTF1(_L("iTestAudioPlayer->WillResumePlay()"));
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioPlayer->WillResumePlay() - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				iTestStepResult = EPass;
+				CActiveScheduler::Stop();
+				break;
+#endif
+			}
+		}
+	}
+
+/**
+ * PerformTestL
+ */
+TVerdict CTestMmfAclntARN9004::PerformTestL()
+	{
+	INFO_PRINTF1(_L("Receipt of Notification (chronological order for equal priority clients) of a Resource Available Event."));
+	iTestStepResult = EFail;
+	
+	// Initialise the state variables
+	StateInit();
+	
+	// Set the priorities
+	iTestAudioPlayer->SetPriority(EMdaPriorityMin, EMdaPriorityPreferenceTimeAndQuality);
+	INFO_PRINTF1(_L("Reset Priority for CMdaAudioPlayerUtility  : EMdaPriorityMin"));
+	iTestAudioOutputStream->SetPriority(EMdaPriorityMin, EMdaPriorityPreferenceTimeAndQuality);
+	INFO_PRINTF1(_L("Reset Priority for CMdaAudioOutputStream   : EMdaPriorityMin"));
+	
+	// Begin the process
+	FsmL(EIdleMulti, CMdaAudioClipUtility::ENotReady);
+	
+	// Start the scheduler - Done only once !
+	CActiveScheduler::Start();
+	
+	return iTestStepResult;
+	}
+
+//
+//CTestMmfAclntARN9005
+//
+
+/**
+ * Constructor
+ */
+CTestMmfAclntARN9005::CTestMmfAclntARN9005(const TDesC& aTestName, const TDesC& aSectName)
+	: CTestMmfAclntMultiClientARN(aTestName, aSectName)
+	{}
+
+/**
+ * NewL
+ */
+CTestMmfAclntARN9005* CTestMmfAclntARN9005::NewL(const TDesC& aTestName, const TDesC& aSectName)
+	{
+	CTestMmfAclntARN9005* self = new (ELeave) CTestMmfAclntARN9005(aTestName, aSectName);
+	return self;
+	}
+
+/**
+ * DoTestL
+ */
+TVerdict CTestMmfAclntARN9005::DoTestL()
+	{
+	return( PerformTestL() );
+	}
+
+void CTestMmfAclntARN9005::InitTest()
+	{
+	//Keep adding handlers
+	iStateHandlers[EStateApInitComplete] = &CTestMmfAclntARN9005::HandleStateApInitComplete;
+	iStateHandlers[EStateRecoderOpen] = &CTestMmfAclntARN9005::HandleStateRecorderOpen;
+	iStateHandlers[EStateRecoderPlaying] = &CTestMmfAclntARN9005::HandleStateRecorderPlaying;
+	iStateHandlers[EStateApPlayCompleteKErrInUse] = &CTestMmfAclntARN9005::HandleApPlayCompleteKErrInUse;
+	iStateHandlers[EStateAosOpenComplete] = &CTestMmfAclntARN9005::HandleStateAosOpenComplete;
+	iStateHandlers[EStateAosBufferCopiedKErrInUse] = &CTestMmfAclntARN9005::HandleStateAosBufferCopiedKErrInUse;
+	iStateHandlers[EStateAosPlayCompleteKErrInUse] = &CTestMmfAclntARN9005::HandleStateAosPlayCompleteKErrInUse;
+	iStateHandlers[EStateRecorderrelease] = &CTestMmfAclntARN9005::HandleStateRecorderrelease;
+	iStateHandlers[EStateApResourceAvailable] = &CTestMmfAclntARN9005::HandleStateApResourceAvailable;
+	iStateHandlers[EStateApPlayComplete] = &CTestMmfAclntARN9005::HandleStateApPlayComplete;
+	iStateHandlers[EStateAosResourceAvailable] = &CTestMmfAclntARN9005::HandleStateAosResourceAvailable;
+	}
+
+void CTestMmfAclntARN9005::DecideFsmState(TInt aClientNumber,CMultiEventChecker::TClientUtilityType aClientType, TInt aEventCode, TInt aError,CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (iEventChecker->CheckFsm(aClientNumber, aClientType, aEventCode, aError,aRecorderState))
+		{
+		iTestStepResult = (this->*(iStateHandlers[iEventChecker->NextState()]))();
+ 		if(iTestStepResult != EPass)
+ 			{
+ 			iEventChecker->StopTest();
+ 			}
+		}
+	}
+
+void CTestMmfAclntARN9005::FsmL(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (aEventCode == EMapcInitComplete || aEventCode == EMapcPlayComplete || aEventCode == EMarncResourceAvailablePlayer)
+		{
+			DecideFsmState(0,CMultiEventChecker::EAudioPlayer,aEventCode,aError);
+		}
+	if (aEventCode == EMoscoStateChangeEvent || aEventCode == EMarncResourceAvailableRecorder)
+		{
+			DecideFsmState(1,CMultiEventChecker::EAudioRecorder,aEventCode,aError,aRecorderState);
+		}
+	if (aEventCode == EMaoscOpenComplete || aEventCode == EMaoscBufferCopied || aEventCode == EMaoscPlayComplete || aEventCode == EMarncResourceAvailableOS)
+		{
+			DecideFsmState(2,CMultiEventChecker::EAudioStream,aEventCode,aError);
+		}
+	}
+
+void CTestMmfAclntARN9005::StartTestL()
+	{
+	// Open iTestAudioPlayer
+	iTestAudioPlayer->OpenFileL(iFilenamePlayer);
+	INFO_PRINTF1(_L("iTestAudioPlayer->OpenFileL()"));
+	iEventChecker->SetExpectedEvent(0,EMapcInitComplete,KErrNone);
+	iEventChecker->SetExpectedState(EStateApInitComplete);
+	}
+	
+TVerdict CTestMmfAclntARN9005::HandleStateApInitComplete()
+	{
+	iTestAudioPlayer->Play();
+	INFO_PRINTF1(_L("iTestAudioPlayer->Play()"));
+	// Open iTestAudioRecorder
+	iTestAudioRecorder->OpenFileL(iFilenameRecorder);
+	INFO_PRINTF1(_L("iTestAudioRecorder->OpenFileL()"));
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent, KErrNone,CMdaAudioClipUtility::EOpen);
+	iEventChecker->SetExpectedState(EStateRecoderOpen);
+	return EPass;
+	}	
+
+TVerdict CTestMmfAclntARN9005::HandleStateRecorderOpen()
+	{
+	iTestAudioRecorder->PlayL();
+	INFO_PRINTF1(_L("iTestAudioRecorder->PlayL()"));
+	// Set ExpectedEvent and change the State
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent,KErrNone,CMdaAudioClipUtility::EPlaying);
+	iEventChecker->SetExpectedState(EStateRecoderPlaying);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9005::HandleStateRecorderPlaying()
+	{
+	iEventChecker->SetExpectedEvent(0,EMapcPlayComplete,KErrInUse);
+	iEventChecker->SetExpectedState(EStateApPlayCompleteKErrInUse);
+	return EPass;
+	}
+	
+TVerdict CTestMmfAclntARN9005::HandleApPlayCompleteKErrInUse()
+	{
+	TInt err = iTestAudioPlayer->RegisterAudioResourceNotification(*iMdaAudioPlayerCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+	INFO_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification : Status - %d "), err);
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	// Register iTestAudioOutputStream for Notification
+	err = iTestAudioOutputStream->RegisterAudioResourceNotification(*iMdaAudioOutputStreamCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+	INFO_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification : Status - %d "), err);
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	// Open iTestAudioOutputStream
+	iTestAudioOutputStream->Open(NULL);
+	INFO_PRINTF1(_L("iTestAudioOutputStream->Open()"));
+	// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+	iEventChecker->SetExpectedEvent(2,EMaoscOpenComplete,KErrNone);
+	iEventChecker->SetExpectedState(EStateAosOpenComplete);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9005::HandleStateAosOpenComplete()
+	{
+	// iFile->Read()
+	TInt err = iFile.Read(iBuf); //-synchronous
+	if (err != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error reading iFile %d"), err);
+		User::Leave(err);
+		}
+	// iTestAudioOutputStream->WriteL()
+	INFO_PRINTF1(_L("iTestAudioOutputStream->WriteL()"));
+	iTestAudioOutputStream->WriteL(iBuf); //-Should get Play Error.
+	// Set ExpectedEvent & ExpectedError and change the State
+	iEventChecker->SetExpectedEvent(2,EMaoscBufferCopied,KErrInUse);
+	iEventChecker->SetExpectedState(EStateAosBufferCopiedKErrInUse);
+	return EPass;	
+	}
+
+TVerdict CTestMmfAclntARN9005::HandleStateAosBufferCopiedKErrInUse()
+	{
+	iEventChecker->SetExpectedEvent(2,EMaoscPlayComplete,KErrInUse);
+	iEventChecker->SetExpectedState(EStateAosPlayCompleteKErrInUse);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9005::HandleStateAosPlayCompleteKErrInUse()
+	{
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent,KErrNone,CMdaAudioClipUtility::EOpen);
+	iEventChecker->SetExpectedState(EStateRecorderrelease);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9005::HandleStateRecorderrelease()
+	{
+	// Timer to check if Notification Event Occurs.
+	iCallBackTimer->After(2000000);
+	// Set ExpectedEvent and change the State
+	iEventChecker->SetExpectedEvent(0,EMarncResourceAvailablePlayer,KErrNone);
+	iEventChecker->SetExpectedState(EStateApResourceAvailable);
+	return EPass;
+	}	
+	
+TVerdict CTestMmfAclntARN9005::HandleStateApResourceAvailable()
+	{
+	iCallBackTimer->Cancel(); // in case something else stopped the AS
+	INFO_PRINTF1(_L("iTestAudioPlayer->NotificationReceived"));
+	TInt err = iTestAudioPlayer->WillResumePlay();
+	INFO_PRINTF1(_L("iTestAudioPlayer->WillResumePlay()"));
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioPlayer->WillResumePlay() - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		return EFail;
+		}
+	iTestAudioPlayer->SetPosition(iPosition);
+	INFO_PRINTF1(_L("iTestAudioPlayer->SetPosition()"));
+	// Play iTestAudioPlayer
+	iTestAudioPlayer->Play();
+	// Set ExpectedEvent & ExpectedError and change the State
+	iEventChecker->RegisterClientEventToMonitor(0,EMapcPlayComplete,KErrNone,EStateApPlayComplete);
+	iEventChecker->RegisterClientEventToMonitor(2,EMarncResourceAvailableOS,KErrNone,EStateAosResourceAvailable);
+	iEventChecker->EnableMultipleEventMonitor();
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9005::HandleStateApPlayComplete()
+	{
+	INFO_PRINTF1(_L("AudioPlayer->PlayComplete"));
+	if(iEventChecker->IsMonitoringFinished())
+		{
+		iTestStepResult = EPass;
+		iCallBackTimer->Cancel();
+		iEventChecker->StopTest();
+		}
+	else
+		{
+		iEventChecker->EnableMultipleEventMonitor();
+		}
+	return EPass;		
+	}
+	
+TVerdict CTestMmfAclntARN9005::HandleStateAosResourceAvailable()
+	{
+	INFO_PRINTF1(_L("iTestAudioOutputStream->NotificationReceived"));
+	if(iEventChecker->IsMonitoringFinished())
+		{
+		iCallBackTimer->Cancel();
+		iTestStepResult = EPass;
+		iEventChecker->StopTest();
+		}
+	else
+		{
+		iEventChecker->EnableMultipleEventMonitor();
+		}
+	return EPass;	
+	}	
+	
+/**
+ * PerformTestL
+ */
+TVerdict CTestMmfAclntARN9005::PerformTestL()
+	{
+	INFO_PRINTF1(_L("Non Receipt of Notification (on calling WillResumePlay() of a notified client) of a Resource Available Event."));
+	iTestStepResult = EFail;
+	
+	// Initialise the state variables
+	InitTest();
+	
+	// Begin the process
+	StartTestL();
+	
+	// Start the scheduler - Done only once !
+	CActiveScheduler::Start();
+	
+	return iTestStepResult;
+	}
+
+//
+//CTestMmfAclntARN9006
+//
+
+/**
+ * Constructor
+ */
+CTestMmfAclntARN9006::CTestMmfAclntARN9006(const TDesC& aTestName, const TDesC& aSectName)
+	: CTestMmfAclntMultiClientARN(aTestName, aSectName)
+	{}
+
+/**
+ * NewL
+ */
+CTestMmfAclntARN9006* CTestMmfAclntARN9006::NewL(const TDesC& aTestName, const TDesC& aSectName)
+	{
+	CTestMmfAclntARN9006* self = new (ELeave) CTestMmfAclntARN9006(aTestName, aSectName);
+	return self;
+	}
+
+/**
+ * DoTestL
+ */
+TVerdict CTestMmfAclntARN9006::DoTestL()
+	{
+	return( PerformTestL() );
+	}
+
+void CTestMmfAclntARN9006::DecideFsmState(TInt aClientNumber,CMultiEventChecker::TClientUtilityType aClientType, TInt aEventCode, TInt aError,CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (iEventChecker->CheckFsm(aClientNumber, aClientType, aEventCode, aError,aRecorderState))
+		{
+		iTestStepResult = (this->*(iStateHandlers[iEventChecker->NextState()]))();
+ 		if(iTestStepResult != EPass)
+ 			{
+ 			iEventChecker->StopTest();
+ 			}
+		}
+	}
+
+void CTestMmfAclntARN9006::FsmL(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (aEventCode == EMapcInitComplete || aEventCode == EMapcPlayComplete || aEventCode == EMarncResourceAvailablePlayer)
+		{
+			DecideFsmState(0,CMultiEventChecker::EAudioPlayer,aEventCode,aError);
+		}
+	if (aEventCode == EMoscoStateChangeEvent || aEventCode == EMarncResourceAvailableRecorder)
+		{
+			DecideFsmState(1,CMultiEventChecker::EAudioRecorder,aEventCode,aError,aRecorderState);
+		}
+	if (aEventCode == EMaoscOpenComplete || aEventCode == EMaoscBufferCopied || aEventCode == EMaoscPlayComplete || aEventCode == EMarncResourceAvailableOS)
+		{
+			DecideFsmState(2,CMultiEventChecker::EAudioStream,aEventCode,aError);
+		}
+	}
+
+void CTestMmfAclntARN9006::InitTest()
+	{
+	//Keep adding handlers
+	iStateHandlers[EStateApInitComplete] = &CTestMmfAclntARN9006::HandleStateApInitComplete;
+	iStateHandlers[EStateRecoderOpen] = &CTestMmfAclntARN9006::HandleStateRecorderOpen;
+	iStateHandlers[EStateRecoderPlaying] = &CTestMmfAclntARN9006::HandleStateRecorderPlaying;
+	iStateHandlers[EStateApPlayCompleteKErrInUse] = &CTestMmfAclntARN9006::HandleApPlayCompleteKErrInUse;
+	iStateHandlers[EStateAosOpenComplete] = &CTestMmfAclntARN9006::HandleStateAosOpenComplete;
+	iStateHandlers[EStateAosBufferCopiedKErrInUse] = &CTestMmfAclntARN9006::HandleStateAosBufferCopiedKErrInUse;
+	iStateHandlers[EStateAosPlayCompleteKErrInUse] = &CTestMmfAclntARN9006::HandleStateAosPlayCompleteKErrInUse;
+	iStateHandlers[EStateRecorderrelease] = &CTestMmfAclntARN9006::HandleStateRecorderrelease;
+	iStateHandlers[EStateApResourceAvailable] = &CTestMmfAclntARN9006::HandleStateApResourceAvailable;
+	iStateHandlers[EStateAosResourceAvailable] = &CTestMmfAclntARN9006::HandleStateAosResourceAvailable;
+	}
+	
+void CTestMmfAclntARN9006::StartTestL()
+	{
+	// Open iTestAudioPlayer
+	iTestAudioPlayer->OpenFileL(iFilenamePlayer);
+	INFO_PRINTF1(_L("iTestAudioPlayer->OpenFileL()"));
+	iEventChecker->SetExpectedEvent(0,EMapcInitComplete,KErrNone);
+	iEventChecker->SetExpectedState(EStateApInitComplete);
+	}
+
+TVerdict CTestMmfAclntARN9006::HandleStateApInitComplete()
+	{
+	iTestAudioPlayer->Play();
+	INFO_PRINTF1(_L("iTestAudioPlayer->Play()"));
+	// Open iTestAudioRecorder
+	iTestAudioRecorder->OpenFileL(iFilenameRecorder);
+	INFO_PRINTF1(_L("iTestAudioRecorder->OpenFileL()"));
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent, KErrNone,CMdaAudioClipUtility::EOpen);
+	iEventChecker->SetExpectedState(EStateRecoderOpen);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9006::HandleStateRecorderOpen()
+	{
+	iTestAudioRecorder->PlayL();
+	INFO_PRINTF1(_L("iTestAudioRecorder->PlayL()"));
+	// Set ExpectedEvent and change the State
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent,KErrNone,CMdaAudioClipUtility::EPlaying);
+	iEventChecker->SetExpectedState(EStateRecoderPlaying);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9006::HandleStateRecorderPlaying()
+	{
+	iEventChecker->SetExpectedEvent(0,EMapcPlayComplete,KErrInUse);
+	iEventChecker->SetExpectedState(EStateApPlayCompleteKErrInUse);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9006::HandleApPlayCompleteKErrInUse()
+	{
+	TInt err = iTestAudioPlayer->RegisterAudioResourceNotification(*iMdaAudioPlayerCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+	INFO_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification : Status - %d "), err);
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		return EFail;
+		}
+	// Register iTestAudioOutputStream for Notification
+	err = iTestAudioOutputStream->RegisterAudioResourceNotification(*iMdaAudioOutputStreamCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+	INFO_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification : Status - %d "), err);
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		return EFail;
+		}
+	// Open iTestAudioOutputStream
+	iTestAudioOutputStream->Open(NULL);
+	INFO_PRINTF1(_L("iTestAudioOutputStream->Open()"));
+	// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+	iEventChecker->SetExpectedEvent(2,EMaoscOpenComplete,KErrNone);
+	iEventChecker->SetExpectedState(EStateAosOpenComplete);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9006::HandleStateAosOpenComplete()
+	{
+	// iFile->Read()
+	TInt err = iFile.Read(iBuf); //-synchronous
+	if (err != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error reading iFile %d"), err);
+		User::Leave(err);
+		}
+	// iTestAudioOutputStream->WriteL()
+	INFO_PRINTF1(_L("iTestAudioOutputStream->WriteL()"));
+	iTestAudioOutputStream->WriteL(iBuf); //-Should get Play Error.
+	// Set ExpectedEvent & ExpectedError and change the State
+	iEventChecker->SetExpectedEvent(2,EMaoscBufferCopied,KErrInUse);
+	iEventChecker->SetExpectedState(EStateAosBufferCopiedKErrInUse);
+	return EPass;	
+	}
+
+TVerdict CTestMmfAclntARN9006::HandleStateAosBufferCopiedKErrInUse()
+	{
+	iEventChecker->SetExpectedEvent(2,EMaoscPlayComplete,KErrInUse);
+	iEventChecker->SetExpectedState(EStateAosPlayCompleteKErrInUse);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9006::HandleStateAosPlayCompleteKErrInUse()
+	{
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent,KErrNone,CMdaAudioClipUtility::EOpen);
+	iEventChecker->SetExpectedState(EStateRecorderrelease);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9006::HandleStateRecorderrelease()
+	{
+	// Timer to check if Notification Event Occurs.
+	iCallBackTimer->After(2000000);
+	// Set ExpectedEvent and change the State
+	iEventChecker->SetExpectedEvent(0,EMarncResourceAvailablePlayer,KErrNone);
+	iEventChecker->SetExpectedState(EStateApResourceAvailable);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9006::HandleStateApResourceAvailable()
+	{
+	iCallBackTimer->Cancel(); // in case something else stopped the AS
+	INFO_PRINTF1(_L("iTestAudioPlayer->NotificationReceived"));
+	TInt err = iTestAudioPlayer->WillResumePlay();
+	INFO_PRINTF1(_L("iTestAudioPlayer->WillResumePlay()"));
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioPlayer->WillResumePlay() - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		return EFail;
+		}
+	iCallBackTimer->After(10000000);
+	// Set ExpectedEvent & ExpectedError and change the State
+	iEventChecker->SetExpectedEvent(2,EMarncResourceAvailableOS,KErrNone);
+	iEventChecker->SetExpectedState(EStateAosResourceAvailable);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9006::HandleStateAosResourceAvailable()
+	{
+	INFO_PRINTF1(_L("iTestAudioOutputStream->NotificationReceived"));
+	iCallBackTimer->Cancel();
+	iTestStepResult = EPass;
+	iEventChecker->StopTest();
+	return EPass;
+	}
+
+/**
+ * PerformTestL
+ */
+TVerdict CTestMmfAclntARN9006::PerformTestL()
+	{
+	INFO_PRINTF1(_L("Receipt of Notification (on timeout of a notified client, 1 sec assumed, call WillResumePlay() after 1 second) of a Resource Available Event."));
+	iTestStepResult = EFail;
+	
+	// Initialise the handler functions
+	InitTest();
+	
+	// Initiate the process
+	StartTestL();
+	
+	// Start the scheduler - Done only once !
+	CActiveScheduler::Start();
+	
+	return iTestStepResult;
+	}
+
+//
+//CTestMmfAclntARN9007
+//
+
+/**
+ * Constructor
+ */
+CTestMmfAclntARN9007::CTestMmfAclntARN9007(const TDesC& aTestName, const TDesC& aSectName)
+	: CTestMmfAclntMultiClientARN(aTestName, aSectName)
+	{}
+
+/**
+ * NewL
+ */
+CTestMmfAclntARN9007* CTestMmfAclntARN9007::NewL(const TDesC& aTestName, const TDesC& aSectName)
+	{
+	CTestMmfAclntARN9007* self = new (ELeave) CTestMmfAclntARN9007(aTestName, aSectName);
+	return self;
+	}
+
+/**
+ * DoTestL
+ */
+TVerdict CTestMmfAclntARN9007::DoTestL()
+	{
+	return( PerformTestL() );
+	}
+
+/**
+ * FsmCheck
+ */
+TBool CTestMmfAclntARN9007::FsmCheck(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	TBool retFsmCheck = EFalse;
+	if ((iExpectedError !=KErrUnderflow) && (aError == KErrUnderflow))
+		{
+		INFO_PRINTF1(_L("Underflow !"));
+		}
+	else if (iExpectedEvent != aEventCode)
+		{
+        if ((aEventCode == EMoscoStateChangeEvent))
+	        {
+	        retFsmCheck = ETrue;
+	        if (iEventOccured == EMarncResourceAvailableOS)
+	            {
+	            return retFsmCheck;
+	            }
+            else
+                {
+                iEventOccured = EMoscoStateChangeEvent;
+                }
+	        }
+        else if (aEventCode == EMarncResourceAvailableOS)
+            {
+            retFsmCheck = ETrue;
+            if (iEventOccured == EMoscoStateChangeEvent)
+                {
+                return retFsmCheck;
+                }
+            else
+                {
+                iEventOccured = EMarncResourceAvailableOS;
+                }
+            }
+        else
+            {
+    		ERR_PRINTF3(_L("ExpectedEvent : %d, ActualEvent : %d"), iExpectedEvent, aEventCode);
+    		iTestStepResult = EFail;
+    		CActiveScheduler::Stop();
+            }
+		}
+	else if (iExpectedError != aError)
+		{
+		ERR_PRINTF3(_L("ExpectedError : %d, ActualError : %d"), iExpectedError, aError);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	else if (iExpectedRecorderState != aRecorderState)
+		{
+		ERR_PRINTF3(_L("ExpectedRecorderState : %d, ActualRecorderState : %d"), iExpectedRecorderState, aRecorderState);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	else
+		{
+		retFsmCheck = ETrue;
+		}
+	return retFsmCheck;
+	}
+
+/**
+ * FsmL
+ */
+void CTestMmfAclntARN9007::FsmL(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (FsmCheck(aEventCode, aError, aRecorderState))
+		{
+		TInt err = KErrNone;
+		switch (iState)
+			{
+			case 0:
+				// Open iTestAudioPlayer
+				iTestAudioPlayer->OpenFileL(iFilenamePlayer);
+				INFO_PRINTF1(_L("iTestAudioPlayer->OpenFileL()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMapcInitComplete);
+				break;
+			case 1:
+				// Play iTestAudioPlayer
+				iTestAudioPlayer->Play();
+				INFO_PRINTF1(_L("iTestAudioPlayer->Play()"));
+				// Open iTestAudioRecorder
+				iTestAudioRecorder->OpenFileL(iFilenameRecorder);
+				INFO_PRINTF1(_L("iTestAudioRecorder->OpenFileL()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EOpen);
+				break;
+			case 2:
+				// Play iTestAudioRecorder
+				iTestAudioRecorder->PlayL();
+				INFO_PRINTF1(_L("iTestAudioRecorder->PlayL()"));
+				// Set ExpectedEvent and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EPlaying);
+				break;
+			case 3:
+				// iTestAudioPlayer gets PlayError.
+				StateChange(EMapcPlayComplete, KErrInUse);
+				break;
+			case 4:
+				// Register iTestAudioPlayer for Notification
+				err = iTestAudioPlayer->RegisterAudioResourceNotification(*iMdaAudioPlayerCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+				INFO_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification : Status - %d "), err);
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				// Register iTestAudioOutputStream for Notification
+				err = iTestAudioOutputStream->RegisterAudioResourceNotification(*iMdaAudioOutputStreamCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+				INFO_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification : Status - %d "), err);
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				// Open iTestAudioOutputStream
+				iTestAudioOutputStream->Open(NULL);
+				INFO_PRINTF1(_L("iTestAudioOutputStream->Open()"));
+				// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+				StateChange(EMaoscOpenComplete);
+				break;
+			case 5:
+				// iFile->Read()
+				err = iFile.Read(iBuf); //-synchronous
+				if (err != KErrNone)
+					{
+					INFO_PRINTF2(_L("Error reading iFile %d"), err);
+					User::Leave(err);
+					}
+				// iTestAudioOutputStream->WriteL()
+				INFO_PRINTF1(_L("iTestAudioOutputStream->WriteL()"));
+				iTestAudioOutputStream->WriteL(iBuf); //-Should get Play Error.
+				// Set ExpectedEvent & ExpectedError and change the State
+				StateChange(EMaoscBufferCopied, KErrInUse);
+				break;
+			case 6:
+				// Set ExpectedEvent & ExpectedError and change the State
+				StateChange(EMaoscPlayComplete, KErrInUse);
+				break;
+			case 7:
+				// Cancel the Notification request for iTestAudioPlayer
+				err = iTestAudioPlayer->CancelRegisterAudioResourceNotification(KMMFEventCategoryAudioResourceAvailable);
+				INFO_PRINTF2(_L("iTestAudioPlayer->CancelRegisterAudioResourceNotification : Return Code = %d"), err);
+				if( err != KErrNone )
+					{
+					ERR_PRINTF2(_L("iTestAudioPlayer->CancelRegisterAudioResourceNotification - Failed with Error : %d"), err);
+					iTestStepResult = EFail;
+					CActiveScheduler::Stop();
+					break;
+					}
+				// Wait for iTestAudioRecorder to complete playing
+				// Set ExpectedEvent and change the State
+				StateChange(EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EOpen);
+				break;
+			case 8:
+				// Timer to check if Notification Event Occurs.
+				iCallBackTimer->After(2000000);
+				// Set ExpectedEvent and change the State
+				StateChange(EMarncResourceAvailableOS);
+				break;
+			case 9:
+				iCallBackTimer->Cancel(); // in case something else stopped the AS
+				INFO_PRINTF1(_L("iTestAudioOutputStream->NotificationReceived"));
+				iTestStepResult = EPass;
+				CActiveScheduler::Stop();
+				break;
+			}
+		}
+	}
+
+/**
+ * PerformTestL
+ */
+TVerdict CTestMmfAclntARN9007::PerformTestL()
+	{
+	INFO_PRINTF1(_L("Receipt of Notification (on cancellation of the notification of a client that has requested for notification) of a Resource Available Event."));
+	INFO_PRINTF1(_L("[Cancel before receipt of Notification]"));
+	iTestStepResult = EFail;
+	
+	// Initialise the state variables
+	StateInit();
+	
+	// Begin the process
+	FsmL(EIdleMulti, CMdaAudioClipUtility::ENotReady);
+	
+	// Start the scheduler - Done only once !
+	CActiveScheduler::Start();
+	
+	return iTestStepResult;
+	}
+
+//
+//CTestMmfAclntARN9008
+//
+
+/**
+ * Constructor
+ */
+CTestMmfAclntARN9008::CTestMmfAclntARN9008(const TDesC& aTestName, const TDesC& aSectName)
+	: CTestMmfAclntMultiClientARN(aTestName, aSectName)
+	{}
+
+/**
+ * NewL
+ */
+CTestMmfAclntARN9008* CTestMmfAclntARN9008::NewL(const TDesC& aTestName, const TDesC& aSectName)
+	{
+	CTestMmfAclntARN9008* self = new (ELeave) CTestMmfAclntARN9008(aTestName, aSectName);
+	return self;
+	}
+
+/**
+ * DoTestL
+ */
+TVerdict CTestMmfAclntARN9008::DoTestL()
+	{
+	return( PerformTestL() );
+	}
+
+void CTestMmfAclntARN9008::DecideFsmState(TInt aClientNumber,CMultiEventChecker::TClientUtilityType aClientType, TInt aEventCode, TInt aError,CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (iEventChecker->CheckFsm(aClientNumber, aClientType, aEventCode, aError,aRecorderState))
+		{
+		iTestStepResult = (this->*(iStateHandlers[iEventChecker->NextState()]))();
+ 		if(iTestStepResult != EPass)
+ 			{
+ 			iEventChecker->StopTest();
+ 			}
+		}
+	}
+
+void CTestMmfAclntARN9008::FsmL(TMmfAudioMultiClientEvents aEventCode, TInt aError, CMdaAudioClipUtility::TState aRecorderState)
+	{
+	if (aEventCode == EMapcInitComplete || aEventCode == EMapcPlayComplete || aEventCode == EMarncResourceAvailablePlayer)
+		{
+			DecideFsmState(0,CMultiEventChecker::EAudioPlayer,aEventCode,aError);
+		}
+	if (aEventCode == EMoscoStateChangeEvent || aEventCode == EMarncResourceAvailableRecorder)
+		{
+			DecideFsmState(1,CMultiEventChecker::EAudioRecorder,aEventCode,aError,aRecorderState);
+		}
+	if (aEventCode == EMaoscOpenComplete || aEventCode == EMaoscBufferCopied || aEventCode == EMaoscPlayComplete || aEventCode == EMarncResourceAvailableOS)
+		{
+			DecideFsmState(2,CMultiEventChecker::EAudioStream,aEventCode,aError);
+		}
+	}
+
+void CTestMmfAclntARN9008::InitTest()
+	{
+	//Keep adding handlers
+	iStateHandlers[EStateApInitComplete] = &CTestMmfAclntARN9008::HandleStateApInitComplete;
+	iStateHandlers[EStateRecoderOpen] = &CTestMmfAclntARN9008::HandleStateRecorderOpen;
+	iStateHandlers[EStateRecoderPlaying] = &CTestMmfAclntARN9008::HandleStateRecorderPlaying;
+	iStateHandlers[EStateApPlayCompleteKErrInUse] = &CTestMmfAclntARN9008::HandleApPlayCompleteKErrInUse;
+	iStateHandlers[EStateAosOpenComplete] = &CTestMmfAclntARN9008::HandleStateAosOpenComplete;
+	iStateHandlers[EStateAosBufferCopiedKErrInUse] = &CTestMmfAclntARN9008::HandleStateAosBufferCopiedKErrInUse;
+	iStateHandlers[EStateAosPlayCompleteKErrInUse] = &CTestMmfAclntARN9008::HandleStateAosPlayCompleteKErrInUse;
+	iStateHandlers[EStateRecorderrelease] = &CTestMmfAclntARN9008::HandleStateRecorderrelease;
+	iStateHandlers[EStateApResourceAvailable] = &CTestMmfAclntARN9008::HandleStateApResourceAvailable;
+	iStateHandlers[EStateApPlayComplete] = &CTestMmfAclntARN9008::HandleStateApPlayComplete;
+	iStateHandlers[EStateAosResourceAvailable] = &CTestMmfAclntARN9008::HandleStateAosResourceAvailable;
+	iStateHandlers[EStateRecorderResumePlay] = &CTestMmfAclntARN9008::HandleStateRecorderResumePlay;
+	iStateHandlers[EStateRecorderPlayComplete]= &CTestMmfAclntARN9008::HandleStateRecorderPlayComplete;
+	}
+	
+void CTestMmfAclntARN9008::StartTestL()
+	{
+	// Open iTestAudioPlayer
+	iTestAudioPlayer->OpenFileL(iFilenamePlayer);
+	INFO_PRINTF1(_L("iTestAudioPlayer->OpenFileL()"));
+	iEventChecker->SetExpectedEvent(0,EMapcInitComplete,KErrNone);
+	iEventChecker->SetExpectedState(EStateApInitComplete);
+	}
+	
+TVerdict CTestMmfAclntARN9008::HandleStateApInitComplete()
+	{
+	iTestAudioPlayer->Play();
+	INFO_PRINTF1(_L("iTestAudioPlayer->Play()"));
+	// Open iTestAudioRecorder
+	iTestAudioRecorder->OpenFileL(iFilenameRecorder);
+	INFO_PRINTF1(_L("iTestAudioRecorder->OpenFileL()"));
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent, KErrNone,CMdaAudioClipUtility::EOpen);
+	iEventChecker->SetExpectedState(EStateRecoderOpen);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9008::HandleStateRecorderOpen()
+	{
+	iTestAudioRecorder->PlayL();
+	INFO_PRINTF1(_L("iTestAudioRecorder->PlayL()"));
+	// Set ExpectedEvent and change the State
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent,KErrNone,CMdaAudioClipUtility::EPlaying);
+	iEventChecker->SetExpectedState(EStateRecoderPlaying);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9008::HandleStateRecorderPlaying()
+	{
+	iEventChecker->SetExpectedEvent(0,EMapcPlayComplete,KErrInUse);
+	iEventChecker->SetExpectedState(EStateApPlayCompleteKErrInUse);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9008::HandleApPlayCompleteKErrInUse()
+	{
+	TInt err = iTestAudioPlayer->RegisterAudioResourceNotification(*iMdaAudioPlayerCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+	INFO_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification : Status - %d "), err);
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioPlayer->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	// Register iTestAudioOutputStream for Notification
+	err = iTestAudioOutputStream->RegisterAudioResourceNotification(*iMdaAudioOutputStreamCallbackSupport, KMMFEventCategoryAudioResourceAvailable);
+	INFO_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification : Status - %d "), err);
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioOutputStream->RegisterAudioResourceNotification - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		}
+	// Open iTestAudioOutputStream
+	iTestAudioOutputStream->Open(NULL);
+	INFO_PRINTF1(_L("iTestAudioOutputStream->Open()"));
+	// Set ExpectedEvent, ExpectedError, ExpectedRecorderState and change the State
+	iEventChecker->SetExpectedEvent(2,EMaoscOpenComplete,KErrNone);
+	iEventChecker->SetExpectedState(EStateAosOpenComplete);
+	return EPass;
+	}
+	
+TVerdict CTestMmfAclntARN9008::HandleStateAosOpenComplete()
+	{
+	// iFile->Read()
+	TInt err = iFile.Read(iBuf); //-synchronous
+	if (err != KErrNone)
+		{
+		INFO_PRINTF2(_L("Error reading iFile %d"), err);
+		User::Leave(err);
+		}
+	// iTestAudioOutputStream->WriteL()
+	INFO_PRINTF1(_L("iTestAudioOutputStream->WriteL()"));
+	iTestAudioOutputStream->WriteL(iBuf); //-Should get Play Error.
+	// Set ExpectedEvent & ExpectedError and change the State
+	iEventChecker->SetExpectedEvent(2,EMaoscBufferCopied,KErrInUse);
+	iEventChecker->SetExpectedState(EStateAosBufferCopiedKErrInUse);
+	return EPass;	
+	}
+
+TVerdict CTestMmfAclntARN9008::HandleStateAosBufferCopiedKErrInUse()
+	{
+	iEventChecker->SetExpectedEvent(2,EMaoscPlayComplete,KErrInUse);
+	iEventChecker->SetExpectedState(EStateAosPlayCompleteKErrInUse);
+	return EPass;
+	}
+	
+TVerdict CTestMmfAclntARN9008::HandleStateAosPlayCompleteKErrInUse()
+	{
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent,KErrNone,CMdaAudioClipUtility::EOpen);
+	iEventChecker->SetExpectedState(EStateRecorderrelease);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9008::HandleStateRecorderrelease()
+	{
+	// Set ExpectedEvent and change the State
+	iEventChecker->SetExpectedEvent(0,EMarncResourceAvailablePlayer,KErrNone);
+	iEventChecker->SetExpectedState(EStateApResourceAvailable);
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9008::HandleStateApResourceAvailable()
+	{
+	// iTestAudioPlayer resumes the playback.
+	iTestAudioPlayer->SetPosition(iPosition);
+	INFO_PRINTF1(_L("iTestAudioPlayer->SetPosition()"));
+	iTestAudioPlayer->Play();
+	INFO_PRINTF1(_L("iTestAudioPlayer->Play()"));
+	// Cancel the Notification request for iTestAudioPlayer
+	TInt err = iTestAudioPlayer->CancelRegisterAudioResourceNotification(KMMFEventCategoryAudioResourceAvailable);
+	INFO_PRINTF2(_L("iTestAudioPlayer->CancelRegisterAudioResourceNotification : Return Code = %d"), err);
+	if( err != KErrNone )
+		{
+		ERR_PRINTF2(_L("iTestAudioPlayer->CancelRegisterAudioResourceNotification - Failed with Error : %d"), err);
+		iTestStepResult = EFail;
+		CActiveScheduler::Stop();
+		return EFail;
+		}
+	// Play iTestAudioRecorder
+	iTestAudioRecorder->PlayL();
+	INFO_PRINTF1(_L("iTestAudioRecorder->PlayL()"));
+	// Set ExpectedEvent and change the State
+	iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent,KErrNone,CMdaAudioClipUtility::EPlaying);
+	iEventChecker->SetExpectedState(EStateRecorderResumePlay);
+	return EPass;
+	}
+TVerdict CTestMmfAclntARN9008::HandleStateRecorderResumePlay()
+	{
+	iEventChecker->RegisterClientEventToMonitor(0,EMapcPlayComplete,KErrInUse,EStateApPlayComplete);
+	iEventChecker->RegisterClientEventToMonitor(2,EMarncResourceAvailableOS,KErrNone,EStateAosResourceAvailable);
+	iEventChecker->EnableMultipleEventMonitor();
+	return EPass;
+	}
+TVerdict CTestMmfAclntARN9008::HandleStateApPlayComplete()
+	{
+	INFO_PRINTF1(_L("AudioPlayer->PlayComplete"));
+	if(iEventChecker->IsMonitoringFinished())
+		{
+		iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EOpen);
+		iEventChecker->SetExpectedState(EStateRecorderPlayComplete);
+		}
+	else
+		{
+		iEventChecker->EnableMultipleEventMonitor();
+		}
+	return EPass;		
+	}
+
+TVerdict CTestMmfAclntARN9008::HandleStateAosResourceAvailable()
+	{
+	INFO_PRINTF1(_L("AudioPlayer->PlayComplete"));
+	if(iEventChecker->IsMonitoringFinished())
+		{
+		iEventChecker->SetExpectedEvent(1,EMoscoStateChangeEvent, KErrNone, CMdaAudioClipUtility::EOpen);
+		iEventChecker->SetExpectedState(EStateRecorderPlayComplete);
+		}
+	else
+		{
+		iEventChecker->EnableMultipleEventMonitor();
+		}
+	return EPass;	
+	}
+
+TVerdict CTestMmfAclntARN9008::HandleStateRecorderPlayComplete()
+	{
+	INFO_PRINTF1(_L("AudioRecorder->Complete"));
+	iEventChecker->StopTest();
+	return EPass;
+	}
+
+TVerdict CTestMmfAclntARN9008::PerformTestL()
+	{
+	INFO_PRINTF1(_L("Receipt of Notification (on cancellation of notification of a client that has just received notification) of a Resource Available Event."));
+	INFO_PRINTF1(_L("[Cancel after receipt of Notification]"));
+	iTestStepResult = EFail;
+		
+	// Initialise the handler functions
+	InitTest();
+	
+	// Initiate the process
+	StartTestL();
+	
+	// Start the scheduler - Done only once !
+	CActiveScheduler::Start();
+	
+	return iTestStepResult;
+	}
+
+CMultiEventChecker* CMultiEventChecker::NewL()
+	{
+	CMultiEventChecker* s = new(ELeave) CMultiEventChecker();
+	CleanupStack::PushL(s);
+	s->ConstructL();
+	CleanupStack::Pop();
+	return s;
+	}
+
+CMultiEventChecker::CMultiEventChecker()
+	{		
+	}
+	
+void CMultiEventChecker::ConstructL()
+	{
+	iExpectedRecorderState = CMdaAudioClipUtility::ENotReady;	
+	iMonitorMultipleEvents = EFalse;
+	}
+
+void CMultiEventChecker::SetExpectedState(TInt aState)
+	{
+	iNextState = aState;
+	}
+	
+void CMultiEventChecker::StopTest()
+	{ 
+	CActiveScheduler::Stop();
+	}
+
+void CMultiEventChecker::SetExpectedEvent(TInt aClientNumber, TInt aExpectedEvent, TInt aExpectedError,CMdaAudioClipUtility::TState aRecorderState)
+	{
+	iClientEventsToMonitor[aClientNumber]= aExpectedEvent;
+	iClientError[aClientNumber] = aExpectedError;
+	iExpectedRecorderState = aRecorderState;
+	}
+	
+void CMultiEventChecker::RegisterClientEventToMonitor(TInt aClientNumber, TInt aEventCode, TInt aError, TInt aFsmState,CMdaAudioClipUtility::TState aRecorderState)
+	{
+	iClientsRegistered++;
+	iClientEventsToMonitor[aClientNumber] = aEventCode;
+	iClientError[aClientNumber] = aError;
+	iFsmStateforClient[aClientNumber] = aFsmState;
+	iExpectedRecorderState = aRecorderState;
+	}
+
+TBool CMultiEventChecker::IsMonitoringFinished()
+	{
+	 if(iClientsRegistered == 0)
+	 	{
+	 	return ETrue;
+	 	}
+	 else
+	 	{
+	 	return EFalse;
+	 	}
+	}
+	
+TBool CMultiEventChecker::CheckFsm(TInt aClientNumber,TClientUtilityType aClientType, TInt aEventCode, TInt aError,CMdaAudioClipUtility::TState aRecorderState)
+	{
+	TBool retFsmCheck = ETrue;
+	if (iMonitorMultipleEvents)
+		{
+		if(iClientEventsToMonitor[aClientNumber] == aEventCode && iClientError[aClientNumber] == aError )
+			{
+			SetExpectedState(iFsmStateforClient[aClientNumber]);
+			}
+		else
+			{
+			retFsmCheck = EFalse;
+			}
+		
+		if(retFsmCheck)
+			{
+			//Client event has finished
+			iClientsRegistered--;
+			}
+		iMonitorMultipleEvents = EFalse;
+		}
+	else
+		{
+		if(iClientEventsToMonitor[aClientNumber] != aEventCode)
+			{
+			retFsmCheck = EFalse;
+			}
+		else if(iClientError[aClientNumber] != aError)
+			{
+			retFsmCheck = EFalse;
+			} 
+		else if (aClientType == EAudioRecorder)
+			{
+			if (iExpectedRecorderState != aRecorderState)
+				{
+				retFsmCheck = EFalse;		
+				}
+			}
+		}
+	return retFsmCheck;
+	}