--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devsound/sounddevbt/src/server/Policy/MmfBtAudioPolicyServer.cpp Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,163 @@
+// Copyright (c) 2000-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 <e32math.h>
+#include "MmfBtAudioPolicyServer.h"
+#include "MmfBtAudioPolicyStart.h"
+#include "MmfBtAudioPolicySession.h"
+
+const TInt KTimeOutInterval = 1000000;
+
+CMMFAudioPolicyServer* CMMFAudioPolicyServer::NewL()
+ {
+ CMMFAudioPolicyServer* s = new(ELeave) CMMFAudioPolicyServer();
+ CleanupStack::PushL(s);
+ s->ConstructL();
+ CleanupStack::Pop();
+ return s;
+ }
+
+CMMFAudioPolicyServer::CMMFAudioPolicyServer() :
+ CMmfIpcServer(EPriorityStandard)
+ {
+ }
+
+void CMMFAudioPolicyServer::ConstructL()
+ {
+ // Create AudioPolicy singleton
+ iAudioPolicy = CAudioPolicy::NewL(this);
+ TCallBack callBack(SendNotification,this);
+ iNotificationTimer = CNotificationTimer::NewL(callBack);
+ // Call base class to Start server
+ StartL(KNullDesC);
+ }
+
+CMMFAudioPolicyServer::~CMMFAudioPolicyServer()
+ {
+ if(iNotificationTimer != NULL)
+ {
+ StopNotificationTimer();
+ }
+ delete iAudioPolicy;
+ delete iNotificationTimer;
+ }
+
+CMmfIpcSession* CMMFAudioPolicyServer::NewSessionL(const TVersion& aVersion) const
+ {
+ TVersion v(KMMFAudioPolicyVersion,KMMFAudioPolicyMinorVersionNumber,KMMFAudioPolicyBuildVersionNumber);
+ if(!User::QueryVersionSupported(v, aVersion))
+ User::Leave(KErrNotSupported);
+
+ CMMFAudioPolicySession* aAudioPolicySession = CMMFAudioPolicySession::NewL();
+ return aAudioPolicySession;
+ }
+
+void CMMFAudioPolicyServer::IncrementSessionId()
+ {
+ iPolicySessionId++;
+ }
+
+void CMMFAudioPolicyServer::SendEventToClient(TInt aSessionToAlert, TInt /*aSessionToBeLaunched*/, TMMFAudioPolicyEvent& aEvent)
+ {
+ TMMFAudioPolicyEvent eventForClient;
+ eventForClient.iEventType = aEvent.iEventType;
+ eventForClient.iErrorCode = aEvent.iErrorCode;
+ eventForClient.iState = aEvent.iState;
+
+ // For the session requested, send event to client
+ iSessionIter.SetToFirst();
+ CMMFAudioPolicySession* session = STATIC_CAST(CMMFAudioPolicySession*, iSessionIter++);
+ while (session != NULL)
+ {
+ if (session->PolicySessionId() == aSessionToAlert)
+ {
+ session->SendEventToClient(eventForClient);
+ break; // Finished
+ }
+ session = STATIC_CAST(CMMFAudioPolicySession*, iSessionIter++);
+ }
+ }
+
+void CMMFAudioPolicyServer::LaunchRequest(TInt aSessionId, TMMFAudioPolicyEvent& aEvent)
+ {
+ iSessionIter.SetToFirst();
+ CMMFAudioPolicySession* session = STATIC_CAST(CMMFAudioPolicySession*, iSessionIter++);
+ while (session != NULL)
+ {
+ if (session->PolicySessionId() == aSessionId)
+ {
+ session->SendEventToClient(aEvent);
+ break; // Finished
+ }
+ session = STATIC_CAST(CMMFAudioPolicySession*, iSessionIter++);
+ }
+ }
+
+void CMMFAudioPolicyServer::IncrementSessionCount()
+ {
+ iPolicySessionCount++;
+ }
+
+CMMFAudioPolicyServer::CNotificationTimer *CMMFAudioPolicyServer::CNotificationTimer::NewL(TCallBack aCallBack)
+ {
+ CNotificationTimer* self = new(ELeave) CNotificationTimer(aCallBack);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+CMMFAudioPolicyServer::CNotificationTimer::CNotificationTimer(TCallBack aCallBack)
+: CTimer(EPriorityHigh),iCallBack(aCallBack)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CMMFAudioPolicyServer::CNotificationTimer::RunL()
+ {
+ iCallBack.CallBack();
+ }
+
+void CMMFAudioPolicyServer::DecrementSessionCount()
+ {
+ iPolicySessionCount--;
+ }
+
+TInt CMMFAudioPolicyServer::PolicySessionCount()
+ {
+ return iPolicySessionCount;
+ }
+
+void CMMFAudioPolicyServer::StartNotificationTimer()
+ {
+ iNotificationTimer->After(KTimeOutInterval);
+ }
+
+void CMMFAudioPolicyServer::StopNotificationTimer()
+ {
+ iNotificationTimer->Cancel();
+ }
+
+TInt CMMFAudioPolicyServer::SendNotification(TAny* aAny)
+ {
+ CMMFAudioPolicyServer* policyServer = reinterpret_cast<CMMFAudioPolicyServer*>(aAny);
+ policyServer->iAudioPolicy->DoSendNotification();
+ return KErrNone;
+ }
+
+TBool CMMFAudioPolicyServer::IsTimerActive() const
+ {
+ return iNotificationTimer->IsActive();
+ }