devsound/sounddevbt/src/SoundDevice/MmfBtDevSoundEventHandler.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devsound/sounddevbt/src/SoundDevice/MmfBtDevSoundEventHandler.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,141 @@
+// 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:
+//
+
+#include "MmfBtDevSoundEventHandler.h"
+#include "MmfBtAudioPolicyProxy.h"
+
+#include "MmfBtDevSoundSessionXtnd.h"
+
+CMMFDevSoundEventHandler* CMMFDevSoundEventHandler::NewL(RMMFAudioPolicyProxy* aAudioPolicyProxy)
+	{
+	CMMFDevSoundEventHandler* self = new(ELeave) CMMFDevSoundEventHandler(aAudioPolicyProxy);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CMMFDevSoundEventHandler::CMMFDevSoundEventHandler(RMMFAudioPolicyProxy* aAudioPolicyProxy) :
+	CActive(EPriorityLow), iAudioPolicyProxy(aAudioPolicyProxy)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CMMFDevSoundEventHandler::ConstructL()
+	{
+	}
+
+void CMMFDevSoundEventHandler::SetDevSoundInfo(CMMFDevSoundSessionXtnd* aDevSound)
+	{
+	iDevSound = aDevSound;
+	iDevSoundId++;
+	aDevSound->SetDevSoundId(iDevSoundId);
+	}
+
+CMMFDevSoundEventHandler::~CMMFDevSoundEventHandler()
+	{
+	Cancel();
+	}
+
+void CMMFDevSoundEventHandler::ReceiveEvents()
+	{
+	iAudioPolicyProxy->ReceiveEvents(iAudioPolicyEventPckg, iStatus);
+	SetActive();
+	}
+
+void CMMFDevSoundEventHandler::CancelReceiveEvents()
+	{
+	Cancel();
+	}
+
+void CMMFDevSoundEventHandler::RunL()
+	{
+	TMMFAudioPolicyEvent aEvent;
+	aEvent.iEventType = iAudioPolicyEventPckg().iEventType;
+	aEvent.iErrorCode = iAudioPolicyEventPckg().iErrorCode;
+	aEvent.iState = iAudioPolicyEventPckg().iState;
+
+	// Determine whether or not to call on client to send event or call on other
+	// SoundDevice's to start play/record functions:
+	if ( (aEvent.iEventType == TMMFAudioPolicyEvent::EMMFAudioPolicySwitchToIdle)
+		 || (aEvent.iEventType == TMMFAudioPolicyEvent::EMMFAudioPolicyNoEvent) )
+		{
+		// Determine what to do, based on state:
+		switch (aEvent.iState)
+			{
+		case EMMFStatePlayData:
+			iDevSound->StartPlayDataL();
+			break;
+		case EMMFStateRecordData:
+			iDevSound->StartRecordDataL();
+			break;
+		case EMMFStatePlayTone:
+			iDevSound->StartPlayToneL();
+			break;
+		case EMMFStatePlayDualTone:
+			iDevSound->StartPlayDualToneL();
+			break;
+		case EMMFStatePlayDTMFString:
+			iDevSound->StartPlayDTMFStringL();
+			break;
+		case EMMFStatePlayToneSequence:
+			iDevSound->StartPlayToneSequenceL();
+			break;
+		default:
+			break;
+			}  // End switch
+		// Set self up to receive more events:
+		iAudioPolicyProxy->ReceiveEvents(iAudioPolicyEventPckg, iStatus);
+		SetActive();
+		}
+	else if(aEvent.iEventType == TMMFAudioPolicyEvent::EMMFAudioPolicyResourceNotification)	
+		{
+		TMMFEvent event;
+		event.iErrorCode = aEvent.iErrorCode;
+		event.iEventType = KMMFEventCategoryAudioResourceAvailable;
+		iDevSound->SendEvent(event);
+		}
+	else
+		{
+		//Create a TMMFEvent element for client:
+		//NB KErrInUse, KErrDied OR KErrAccessDenied may be returned by the 
+		//policy server to indicate that the sound device is in use by another 
+		//higher priority client.
+		TMMFEvent event;
+		event.iErrorCode = aEvent.iErrorCode;
+		iDevSound->SendEvent(event);
+		if(!iAudioPolicyProxy->IsRegisteredResourceNotification(KMMFEventCategoryAudioResourceAvailable))
+			{
+			iAudioPolicyEventPckg().iEventType = TMMFAudioPolicyEvent::EMMFAudioPolicyResourceNotification;
+			iAudioPolicyEventPckg().iErrorCode = 0;
+			iAudioPolicyEventPckg().iState = EMMFStateNotified;
+			iAudioPolicyProxy->ReceiveEvents(iAudioPolicyEventPckg, iStatus);
+			SetActive();
+			}
+		}
+	}
+
+void CMMFDevSoundEventHandler::DoCancel()
+	{
+	iAudioPolicyProxy->CancelReceiveEvents();
+	}
+
+TInt CMMFDevSoundEventHandler::RunError(TInt aError)
+	{
+	TMMFEvent event;
+	event.iErrorCode = aError;//should probably have an appropriate event type here too?
+	iDevSound->SendEventToClient(event);
+	return KErrNone;
+	}