devsound/devsoundrefplugin/src/platsec/client/MmfAudioServerProxy.cpp
author hgs
Wed, 13 Oct 2010 12:08:48 +0100
changeset 3 28bdc4aca325
parent 0 79dd3e2336a0
permissions -rw-r--r--
2010wk42_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     2
// All rights reserved.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     7
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    10
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    11
// Contributors:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    12
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    13
// Description:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    14
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    15
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    16
#include <f32file.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    17
#include <e32math.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    18
#include <s32mem.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    19
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    20
#include "MmfAudioServerProxy.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    21
#include "MmfAudioServerStart.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    22
#include "MmfBase.hrh"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    23
#include "MmfAudioClientServer.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    24
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    25
#define KMaxServerNameLength 256
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    26
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    27
static const TUid KUidAudioServer = {KUidMmfAudioServerDllUnicodeDefine};
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    28
const TInt KRetries = 5; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    29
const TInt KInitialTime = 100000;  //100ms
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    30
const TInt KTimeIncrement = 50000; // 50ms 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    31
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    32
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    33
EXPORT_C TInt RMMFAudioServerProxy::Open()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    34
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    35
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    36
	const TUidType serverUid(KNullUid,KNullUid,KUidAudioServer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    37
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    38
	// Assume the server is already running and attempt to create a session
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    39
	// 4 message slots
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    40
	TInt err = CreateSession(KAudioServerName, TVersion(KMMFAudioServerVersion,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    41
														KMMFAudioServerMinorVersionNumber,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    42
														KMMFAudioServerBuildVersionNumber));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    43
	if(err == KErrNotFound)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    44
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    45
		// Server not running
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    46
		// Construct the server binary name
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    47
		TBuf<KMaxServerNameLength> serverFile;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    48
		RProcess server;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    49
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    50
		_LIT(KEmpty,"");
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    51
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    52
		err = server.Create(KAudioServerFileName, KEmpty, serverUid);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    53
		if(err != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    54
			return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    55
		// Synchronise with the server
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    56
		TRequestStatus reqStatus;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    57
		server.Rendezvous(reqStatus);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    58
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    59
		if (reqStatus!=KRequestPending)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    60
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    61
			server.Kill(0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    62
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    63
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    64
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    65
			// Start the test harness
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    66
			server.Resume();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    67
			// Server will call the reciprocal static synchronise call
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    68
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    69
		User::WaitForRequest(reqStatus); // wait for rendezvous or death
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    70
		server.Close();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    71
		TInt reqStatusValue = reqStatus.Int();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    72
		if(reqStatusValue != KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    73
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    74
			if(reqStatusValue == KErrNoMemory || reqStatusValue == KErrNotFound)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    75
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    76
				// All error codes except KErrNoMemory and KErrNotFound are assumed
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    77
				// to be a duplicate server instance dying, then keep trying connection
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    78
				// to the server. This can happen when two servers attempt to start
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    79
				// at the same time.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    80
				return reqStatusValue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    81
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    82
			//Wait for sometime, then retry and creation session
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    83
			TInt waitTime = KInitialTime;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    84
			for(TInt retries=0;retries<KRetries;retries++)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    85
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    86
				User::After(waitTime);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    87
				waitTime+=KTimeIncrement;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    88
				err = CreateSession(KAudioServerName, TVersion(KMMFAudioServerVersion,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    89
														KMMFAudioServerMinorVersionNumber,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    90
														KMMFAudioServerBuildVersionNumber));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    91
				if(err==KErrNone)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    92
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    93
					//Session created successfully
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    94
					break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    95
					}	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    96
				}			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    97
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    98
		else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    99
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   100
			//Create the root server session
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   101
			err = CreateSession(KAudioServerName, TVersion(KMMFAudioServerVersion,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   102
														KMMFAudioServerMinorVersionNumber,
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   103
														KMMFAudioServerBuildVersionNumber));	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   104
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   105
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   106
	return err;		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   107
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   108
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   109
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   110
EXPORT_C TInt RMMFAudioServerProxy::SetDevSoundInfo()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   111
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   112
	return SendReceive(EMMFAudioLaunchRequests);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   113
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   114
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   115
EXPORT_C TInt RMMFAudioServerProxy::GetDevSoundSessionHandle()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   116
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   117
	return SendReceive(EMMFDevSoundSessionHandle);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   118
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   119