--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devsound/devsoundrefplugin/src/server/Policy/MmfAudioPolicyServer.cpp Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,155 @@
+// 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 "MmfAudioPolicyServer.h"
+#include "MmfAudioPolicyStart.h"
+#include "MmfAudioPolicySession.h"
+
+
+#if defined(_DEBUG) && defined(__WINS__)
+ const TInt KTimeOutInterval =2*1000000; // 2 seconds
+#else
+ const TInt KTimeOutInterval =1000000; // 1 second
+#endif
+
+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, const TMMFAudioPolicyEvent& aEvent)
+ {
+// For the session requested, send event to client
+ iSessionIter.SetToFirst();
+ CMMFAudioPolicySession* session = static_cast<CMMFAudioPolicySession*>(iSessionIter++);
+ ASSERT(session != NULL);
+ do
+ {
+ if (session->PolicySessionId() == aSessionToAlert)
+ {
+ session->SendEventToClient(aEvent);
+ return; // Finished
+ }
+ session = static_cast<CMMFAudioPolicySession*>(iSessionIter++);
+ } while (session != NULL);
+ ASSERT(EFalse); // invalid session Id
+ }
+
+void CMMFAudioPolicyServer::LaunchRequest(TInt aSessionId,const TMMFAudioPolicyEvent& aEvent)
+ {
+ SendEventToClient(aSessionId, aEvent);
+ }
+
+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(TBool aZeroDelay)
+ {
+ iNotificationTimer->After(aZeroDelay? 0 : KTimeOutInterval);
+ }
+
+void CMMFAudioPolicyServer::StopNotificationTimer()
+ {
+ iNotificationTimer->Cancel();
+ }
+
+TInt CMMFAudioPolicyServer::SendNotification(TAny* aAny)
+ {
+ CMMFAudioPolicyServer* policyServer = reinterpret_cast<CMMFAudioPolicyServer*>(aAny);
+ policyServer->iAudioPolicy->NotifyNextClient();
+ return KErrNone;
+ }
+
+TBool CMMFAudioPolicyServer::IsTimerActive() const
+ {
+ return iNotificationTimer->IsActive();
+ }