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