os/mm/devsound/devsoundrefplugin/src/platsec/server/AudioServer/MmfDevSoundServer.cpp
First public contribution.
1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
17 #include "MmfDevSoundServer.h"
18 #include "MmfDevSoundServerStart.h"
19 #include "MmfDevSoundSession.h"
21 const TInt KDevSoundShutDownDelay = 0; //0 sec
22 _LIT(KMMFDevSoundServerName, "MMFDevSoundServer-");
26 EXPORT_C CMMFDevSoundServer* CMMFDevSoundServer::NewL(CMMFAudioServer* aAudioServer, TProcessId& aClientPID)
28 CMMFDevSoundServer* s = new(ELeave) CMMFDevSoundServer(aAudioServer, aClientPID);
29 CleanupStack::PushL(s);
35 CMMFDevSoundServer::CMMFDevSoundServer(CMMFAudioServer* aAudioServer, TProcessId& aClientPID) :
36 CMmfIpcServer(EPriorityStandard, EGlobalSharableSessions), iClientPID(aClientPID)
38 iAudioServer = aAudioServer;
41 void CMMFDevSoundServer::ConstructL()
44 User::LeaveIfError(client.Open(iClientPID));
45 iClientHasCaps = client.HasCapability(ECapabilityMultimediaDD, KSuppressPlatSecDiagnostic);
48 iDelayDevSoundShutDown = CDelayDevSoundShutDown::NewL();
50 // Call base class to Start server
54 CMMFDevSoundServer::~CMMFDevSoundServer()
56 if (iDelayDevSoundShutDown)
58 iDelayDevSoundShutDown->Cancel();
59 delete iDelayDevSoundShutDown;
63 CMmfIpcSession* CMMFDevSoundServer::NewSessionL(const TVersion& aVersion) const
65 TVersion v(KMMFDevSoundServerVersion,KMMFDevSoundServerMinorVersionNumber,KMMFDevSoundServerBuildVersionNumber);
66 if(!User::QueryVersionSupported(v, aVersion))
67 User::Leave(KErrNotSupported);
69 CMMFDevSoundSession* devSoundSession = CMMFDevSoundSession::NewL(iAudioServer->PolicyServerHandle());
70 return devSoundSession;
73 void CMMFDevSoundServer::IncrementSessionId()
76 if(iDevSoundSessionId)
77 iDelayDevSoundShutDown->Cancel();
81 void CMMFDevSoundServer::DecrementSessionId()
84 if ( iDevSoundSessionId == 0 )
86 iDelayDevSoundShutDown->SetDelay(TTimeIntervalMicroSeconds32(KDevSoundShutDownDelay));
90 void CMMFDevSoundServer::SendEventToClient(TInt aSessionToAlert, TInt /*aSessionToBeLaunched*/)
92 // For the session requested, send event to client
93 iSessionIter.SetToFirst();
94 CMMFDevSoundSession* session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
95 while (session != NULL)
97 if (session->DevSoundSessionId() == aSessionToAlert)
101 session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
105 void CMMFDevSoundServer::LaunchRequest(TInt aSessionId)
107 iSessionIter.SetToFirst();
108 CMMFDevSoundSession* session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
109 while (session != NULL)
111 if (session->DevSoundSessionId() == aSessionId)
115 session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
119 TBool CMMFDevSoundServer::CheckClientCapabilities()
121 return iClientHasCaps;
124 void CMMFDevSoundServer::SetClientCapabilitiesL(TThreadId aTid)
126 RThread clientThread;
127 User::LeaveIfError(clientThread.Open(aTid));
128 CleanupClosePushL(clientThread);
130 RProcess clientProcess;
131 User::LeaveIfError(clientThread.Process(clientProcess));
132 CleanupClosePushL(clientProcess);
134 iClientHasCaps = clientProcess.HasCapability(ECapabilityMultimediaDD, KSuppressPlatSecDiagnostic);
136 CleanupStack::PopAndDestroy(2, &clientThread); // clientProcess, clientThread
139 void CMMFDevSoundServer::RenamePrioritizeServer()
141 //Rename devsound server name
142 RThread devsoundServerThread;
145 name.Append(KMMFDevSoundServerName);
146 threadId = devsoundServerThread.Id();
147 name.AppendNum(threadId.Id(),EHex);
148 //We are ignoring the error code returned from User::RenameThread
149 //as it is not important here, may be for profiling
150 User::RenameThread(name);
152 //Set the devsound priority
153 TThreadPriority devsoundServerPriority = static_cast<TThreadPriority>(KDevsoundServerPriority);
154 devsoundServerThread.SetPriority(devsoundServerPriority);
157 CMMFDevSoundServer::CDelayDevSoundShutDown* CMMFDevSoundServer::CDelayDevSoundShutDown::NewL()
159 CDelayDevSoundShutDown* self = new(ELeave) CDelayDevSoundShutDown;
160 CleanupStack::PushL(self);
166 CMMFDevSoundServer::CDelayDevSoundShutDown::CDelayDevSoundShutDown() : CActive(0)
170 void CMMFDevSoundServer::CDelayDevSoundShutDown::ConstructL()
172 User::LeaveIfError(iTimer.CreateLocal());
173 CActiveScheduler::Add(this);
176 CMMFDevSoundServer::CDelayDevSoundShutDown::~CDelayDevSoundShutDown()
183 void CMMFDevSoundServer::CDelayDevSoundShutDown::SetDelay(TTimeIntervalMicroSeconds32 aDelay)
185 __ASSERT_ALWAYS(!IsActive(),
186 User::Panic(_L("CDelayedShutDown"), 1));
187 iTimer.After(iStatus, aDelay);
191 void CMMFDevSoundServer::CDelayDevSoundShutDown::RunL()
193 CActiveScheduler::Stop();
196 void CMMFDevSoundServer::CDelayDevSoundShutDown::DoCancel()
204 This function raises a panic on the client of the devsoundserver
207 one of the several panic codes that may be raised by this dll on the client
209 @panic EMMFDevSoundPlayDataWithoutInitialize is raised when playdata is called without initialization
210 @panic EMMFDevSoundRecordDataWithoutInitialize is raised when recorddata is called without initialization
212 GLDEF_C void PanicClient(const RMmfIpcMessage& aMessage, TMMFDevSoundClientPanicCodes aPanicCode)
214 aMessage.Panic(KMMFDevSoundClientPanicCategory, aPanicCode);