1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/mm/devsound/a3fdevsound/src/mmfaudioserverproxy/mmfaudioserverproxy.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,148 @@
1.4 +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +
1.20 +
1.21 +#include <f32file.h>
1.22 +#include <e32math.h>
1.23 +#include <s32mem.h>
1.24 +
1.25 +#include "mmfaudioserverproxy.h"
1.26 +#include "mmfaudioserverdecs.h"
1.27 +#include <a3f/mmfaudiosvruids.hrh>
1.28 +
1.29 +
1.30 +static const TUid KUidAudioServer = {KUidA3fAudioServerUID};
1.31 +const TInt KRetries = 5;
1.32 +const TInt KInitialTime = 100000; //100ms
1.33 +const TInt KTimeIncrement = 50000; // 50ms
1.34 +
1.35 +_LIT_SECURITY_POLICY_C1(KServerHasDRMRights, ECapabilityDRM);
1.36 +
1.37 +// -----------------------------------------------------------------------------
1.38 +// RMMFAudioServerProxy::OpenSessionToTrustedAudioServer
1.39 +//
1.40 +// -----------------------------------------------------------------------------
1.41 +//
1.42 +TInt RMMFAudioServerProxy::OpenSessionToTrustedAudioServer()
1.43 + {
1.44 + return CreateSession(KAudioServerName,
1.45 + TVersion(KMMFAudioServerVersion,
1.46 + KMMFAudioServerMinorVersionNumber,
1.47 + KMMFAudioServerBuildVersionNumber),
1.48 + -1, // Global pool
1.49 + EIpcSession_Unsharable,
1.50 + &KServerHasDRMRights,
1.51 + NULL); // NULL required for synchronous behaviour
1.52 + }
1.53 +
1.54 +// -----------------------------------------------------------------------------
1.55 +// RMMFAudioServerProxy::Open
1.56 +//
1.57 +// -----------------------------------------------------------------------------
1.58 +//
1.59 +EXPORT_C TInt RMMFAudioServerProxy::Open()
1.60 + {
1.61 + const TUidType serverUid(KNullUid,KNullUid,KUidAudioServer);
1.62 + // Assume the server is already running and attempt to create a session
1.63 + TInt err = OpenSessionToTrustedAudioServer();
1.64 +
1.65 + if(err == KErrNotFound)
1.66 + {
1.67 + // Server not running
1.68 + // Construct the server binary name
1.69 + RProcess server;
1.70 +
1.71 + _LIT(KEmpty,"");
1.72 +
1.73 + err = server.Create(KAudioServerFileName, KEmpty, serverUid);
1.74 + if(err != KErrNone)
1.75 + {
1.76 + return err;
1.77 + }
1.78 + // Synchronise with the server
1.79 + TRequestStatus reqStatus;
1.80 + server.Rendezvous(reqStatus);
1.81 +
1.82 + if (reqStatus!=KRequestPending)
1.83 + {
1.84 + server.Kill(0);
1.85 + }
1.86 + else
1.87 + {
1.88 + // Start the test harness
1.89 + server.Resume();
1.90 + // Server will call the reciprocal static synchronise call
1.91 + }
1.92 +
1.93 + User::WaitForRequest(reqStatus); // wait for rendezvous or death
1.94 + server.Close();
1.95 + TInt reqStatusValue = reqStatus.Int();
1.96 +
1.97 + if(reqStatusValue != KErrNone)
1.98 + {
1.99 + if(reqStatusValue == KErrNoMemory || reqStatusValue == KErrNotFound)
1.100 + {
1.101 + // All error codes except KErrNoMemory and KErrNotFound are assumed
1.102 + // to be a duplicate server instance dying, then keep trying
1.103 + // connection to the server. This can happen when two servers
1.104 + // attempt to start at the same time.
1.105 + return reqStatusValue;
1.106 + }
1.107 + //Wait for sometime, then retry and creation session
1.108 + TInt waitTime = KInitialTime;
1.109 + for(TInt retries=0;retries<KRetries;retries++)
1.110 + {
1.111 + User::After(waitTime);
1.112 + waitTime+=KTimeIncrement;
1.113 + err = OpenSessionToTrustedAudioServer();
1.114 +
1.115 + if(err==KErrNone)
1.116 + {
1.117 + //Session created successfully
1.118 + break;
1.119 + }
1.120 + }
1.121 + }
1.122 + else
1.123 + {
1.124 + // Create the root server session
1.125 + err = OpenSessionToTrustedAudioServer();
1.126 + }
1.127 + }
1.128 + return err;
1.129 + }
1.130 +
1.131 +// -----------------------------------------------------------------------------
1.132 +// RMMFAudioServerProxy::SetDevSoundInfo
1.133 +//
1.134 +// -----------------------------------------------------------------------------
1.135 +//
1.136 +EXPORT_C TInt RMMFAudioServerProxy::SetDevSoundInfo()
1.137 + {
1.138 + return SendReceive(EMMFAudioLaunchRequests);
1.139 + }
1.140 +
1.141 +// -----------------------------------------------------------------------------
1.142 +// RMMFAudioServerProxy::GetDevSoundSessionHandle
1.143 +//
1.144 +// -----------------------------------------------------------------------------
1.145 +//
1.146 +EXPORT_C TInt RMMFAudioServerProxy::GetDevSoundSessionHandle()
1.147 + {
1.148 + return SendReceive(EMMFDevSoundSessionHandle);
1.149 + }
1.150 +
1.151 +// End of File