sl@0: // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include "MmfAudioPolicyServer.h" sl@0: #include "MmfAudioPolicyStart.h" sl@0: #include "MmfAudioPolicySession.h" sl@0: sl@0: sl@0: #if defined(_DEBUG) && defined(__WINS__) sl@0: const TInt KTimeOutInterval =2*1000000; // 2 seconds sl@0: #else sl@0: const TInt KTimeOutInterval =1000000; // 1 second sl@0: #endif sl@0: sl@0: CMMFAudioPolicyServer* CMMFAudioPolicyServer::NewL() sl@0: { sl@0: CMMFAudioPolicyServer* s = new(ELeave) CMMFAudioPolicyServer(); sl@0: CleanupStack::PushL(s); sl@0: s->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return s; sl@0: } sl@0: sl@0: CMMFAudioPolicyServer::CMMFAudioPolicyServer() : sl@0: CMmfIpcServer(EPriorityStandard) sl@0: { sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::ConstructL() sl@0: { sl@0: // Create AudioPolicy singleton sl@0: iAudioPolicy = CAudioPolicy::NewL(this); sl@0: TCallBack callBack(SendNotification,this); sl@0: iNotificationTimer = CNotificationTimer::NewL(callBack); sl@0: // Call base class to Start server sl@0: StartL(KNullDesC); sl@0: } sl@0: sl@0: CMMFAudioPolicyServer::~CMMFAudioPolicyServer() sl@0: { sl@0: if(iNotificationTimer != NULL) sl@0: { sl@0: StopNotificationTimer(); sl@0: } sl@0: delete iAudioPolicy; sl@0: delete iNotificationTimer; sl@0: } sl@0: sl@0: CMmfIpcSession* CMMFAudioPolicyServer::NewSessionL(const TVersion& aVersion) const sl@0: { sl@0: TVersion v(KMMFAudioPolicyVersion,KMMFAudioPolicyMinorVersionNumber,KMMFAudioPolicyBuildVersionNumber); sl@0: if(!User::QueryVersionSupported(v, aVersion)) sl@0: User::Leave(KErrNotSupported); sl@0: sl@0: CMMFAudioPolicySession* aAudioPolicySession = CMMFAudioPolicySession::NewL(); sl@0: return aAudioPolicySession; sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::IncrementSessionId() sl@0: { sl@0: iPolicySessionId++; sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::SendEventToClient(TInt aSessionToAlert, const TMMFAudioPolicyEvent& aEvent) sl@0: { sl@0: // For the session requested, send event to client sl@0: iSessionIter.SetToFirst(); sl@0: CMMFAudioPolicySession* session = static_cast(iSessionIter++); sl@0: ASSERT(session != NULL); sl@0: do sl@0: { sl@0: if (session->PolicySessionId() == aSessionToAlert) sl@0: { sl@0: session->SendEventToClient(aEvent); sl@0: return; // Finished sl@0: } sl@0: session = static_cast(iSessionIter++); sl@0: } while (session != NULL); sl@0: ASSERT(EFalse); // invalid session Id sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::LaunchRequest(TInt aSessionId,const TMMFAudioPolicyEvent& aEvent) sl@0: { sl@0: SendEventToClient(aSessionId, aEvent); sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::IncrementSessionCount() sl@0: { sl@0: iPolicySessionCount++; sl@0: } sl@0: sl@0: CMMFAudioPolicyServer::CNotificationTimer *CMMFAudioPolicyServer::CNotificationTimer::NewL(TCallBack aCallBack) sl@0: { sl@0: CNotificationTimer* self = new(ELeave) CNotificationTimer(aCallBack); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(); // self sl@0: return self; sl@0: } sl@0: sl@0: CMMFAudioPolicyServer::CNotificationTimer::CNotificationTimer(TCallBack aCallBack) sl@0: : CTimer(EPriorityHigh),iCallBack(aCallBack) sl@0: { sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::CNotificationTimer::RunL() sl@0: { sl@0: iCallBack.CallBack(); sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::DecrementSessionCount() sl@0: { sl@0: iPolicySessionCount--; sl@0: } sl@0: sl@0: TInt CMMFAudioPolicyServer::PolicySessionCount() sl@0: { sl@0: return iPolicySessionCount; sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::StartNotificationTimer(TBool aZeroDelay) sl@0: { sl@0: iNotificationTimer->After(aZeroDelay? 0 : KTimeOutInterval); sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::StopNotificationTimer() sl@0: { sl@0: iNotificationTimer->Cancel(); sl@0: } sl@0: sl@0: TInt CMMFAudioPolicyServer::SendNotification(TAny* aAny) sl@0: { sl@0: CMMFAudioPolicyServer* policyServer = reinterpret_cast(aAny); sl@0: policyServer->iAudioPolicy->NotifyNextClient(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicyServer::IsTimerActive() const sl@0: { sl@0: return iNotificationTimer->IsActive(); sl@0: }