os/mm/devsound/a3fdevsound/src/mmfaudioserverproxy/mmfaudioserverproxy.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
sl@0
    17
sl@0
    18
#include <f32file.h>
sl@0
    19
#include <e32math.h>
sl@0
    20
#include <s32mem.h>
sl@0
    21
sl@0
    22
#include "mmfaudioserverproxy.h"
sl@0
    23
#include "mmfaudioserverdecs.h"
sl@0
    24
#include <a3f/mmfaudiosvruids.hrh>
sl@0
    25
sl@0
    26
sl@0
    27
static const TUid KUidAudioServer = {KUidA3fAudioServerUID};
sl@0
    28
const TInt KRetries = 5; 
sl@0
    29
const TInt KInitialTime = 100000;  //100ms
sl@0
    30
const TInt KTimeIncrement = 50000; // 50ms 
sl@0
    31
sl@0
    32
_LIT_SECURITY_POLICY_C1(KServerHasDRMRights, ECapabilityDRM);
sl@0
    33
sl@0
    34
// -----------------------------------------------------------------------------
sl@0
    35
// RMMFAudioServerProxy::OpenSessionToTrustedAudioServer
sl@0
    36
//
sl@0
    37
// -----------------------------------------------------------------------------
sl@0
    38
//	
sl@0
    39
TInt RMMFAudioServerProxy::OpenSessionToTrustedAudioServer()
sl@0
    40
	{
sl@0
    41
	return CreateSession(KAudioServerName,
sl@0
    42
                                TVersion(KMMFAudioServerVersion,
sl@0
    43
                                KMMFAudioServerMinorVersionNumber,
sl@0
    44
                                KMMFAudioServerBuildVersionNumber),
sl@0
    45
                                -1, // Global pool
sl@0
    46
                                EIpcSession_Unsharable,
sl@0
    47
                                &KServerHasDRMRights,
sl@0
    48
                                NULL); // NULL required for synchronous behaviour
sl@0
    49
	}	
sl@0
    50
sl@0
    51
// -----------------------------------------------------------------------------
sl@0
    52
// RMMFAudioServerProxy::Open
sl@0
    53
//
sl@0
    54
// -----------------------------------------------------------------------------
sl@0
    55
//
sl@0
    56
EXPORT_C TInt RMMFAudioServerProxy::Open()
sl@0
    57
	{
sl@0
    58
	const TUidType serverUid(KNullUid,KNullUid,KUidAudioServer);
sl@0
    59
	// Assume the server is already running and attempt to create a session
sl@0
    60
	TInt err = OpenSessionToTrustedAudioServer();
sl@0
    61
	
sl@0
    62
	if(err == KErrNotFound)
sl@0
    63
		{
sl@0
    64
		// Server not running
sl@0
    65
		// Construct the server binary name
sl@0
    66
		RProcess server;
sl@0
    67
sl@0
    68
		_LIT(KEmpty,"");
sl@0
    69
sl@0
    70
		err = server.Create(KAudioServerFileName, KEmpty, serverUid);
sl@0
    71
		if(err != KErrNone)
sl@0
    72
			{
sl@0
    73
			return err;
sl@0
    74
			}
sl@0
    75
		// Synchronise with the server
sl@0
    76
		TRequestStatus reqStatus;
sl@0
    77
		server.Rendezvous(reqStatus);
sl@0
    78
sl@0
    79
		if (reqStatus!=KRequestPending)
sl@0
    80
			{
sl@0
    81
			server.Kill(0);
sl@0
    82
			}
sl@0
    83
		else
sl@0
    84
			{
sl@0
    85
			// Start the test harness
sl@0
    86
			server.Resume();
sl@0
    87
			// Server will call the reciprocal static synchronise call
sl@0
    88
			}
sl@0
    89
sl@0
    90
		User::WaitForRequest(reqStatus); // wait for rendezvous or death
sl@0
    91
		server.Close();
sl@0
    92
		TInt reqStatusValue = reqStatus.Int();
sl@0
    93
sl@0
    94
		if(reqStatusValue != KErrNone)
sl@0
    95
			{
sl@0
    96
			if(reqStatusValue == KErrNoMemory || reqStatusValue == KErrNotFound)
sl@0
    97
				{
sl@0
    98
				// All error codes except KErrNoMemory and KErrNotFound are assumed
sl@0
    99
				// to be a duplicate server instance dying, then keep trying
sl@0
   100
				// connection to the server. This can happen when two servers
sl@0
   101
				// attempt to start at the same time.
sl@0
   102
				return reqStatusValue;
sl@0
   103
				}
sl@0
   104
			//Wait for sometime, then retry and creation session
sl@0
   105
			TInt waitTime = KInitialTime;
sl@0
   106
			for(TInt retries=0;retries<KRetries;retries++)
sl@0
   107
				{
sl@0
   108
				User::After(waitTime);
sl@0
   109
				waitTime+=KTimeIncrement;
sl@0
   110
				err = OpenSessionToTrustedAudioServer();				
sl@0
   111
				
sl@0
   112
				if(err==KErrNone)
sl@0
   113
					{
sl@0
   114
					//Session created successfully
sl@0
   115
					break;
sl@0
   116
					}	
sl@0
   117
				}			
sl@0
   118
			}
sl@0
   119
		else
sl@0
   120
			{
sl@0
   121
			// Create the root server session
sl@0
   122
            err = OpenSessionToTrustedAudioServer();
sl@0
   123
			}
sl@0
   124
		}
sl@0
   125
	return err;
sl@0
   126
	}
sl@0
   127
sl@0
   128
// -----------------------------------------------------------------------------
sl@0
   129
// RMMFAudioServerProxy::SetDevSoundInfo
sl@0
   130
//
sl@0
   131
// -----------------------------------------------------------------------------
sl@0
   132
//
sl@0
   133
EXPORT_C TInt RMMFAudioServerProxy::SetDevSoundInfo()
sl@0
   134
	{
sl@0
   135
	return SendReceive(EMMFAudioLaunchRequests);
sl@0
   136
	}
sl@0
   137
sl@0
   138
// -----------------------------------------------------------------------------
sl@0
   139
// RMMFAudioServerProxy::GetDevSoundSessionHandle
sl@0
   140
//
sl@0
   141
// -----------------------------------------------------------------------------
sl@0
   142
//
sl@0
   143
EXPORT_C TInt RMMFAudioServerProxy::GetDevSoundSessionHandle()
sl@0
   144
	{
sl@0
   145
	return SendReceive(EMMFDevSoundSessionHandle);
sl@0
   146
	}
sl@0
   147
sl@0
   148
// End of File