devsound/a3fdevsound/src/mmfaudioserver/mmfaudioserver.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
//mmfaudioserver.cpp
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
// All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
// This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
// under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
// which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
// Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
// Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
// Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
// Description:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
// Portions Copyright Nokia-Symbian * Nokia Core OS *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
// INCLUDE FILES
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
#include <e32math.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
#include <mmf/common/mmfbase.hrh>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
#include "mmfaudioserver.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
#include "mmfaudioserverdecs.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
#include "mmfdevsoundsession.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
#include "mmfaudioserversession.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
#include "mmfdevsoundserver.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
#include "mmfdevsoundserverstart.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
#include "mmfaudioserverfactory.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
#include "devsoundsvrthreadpriorityconsts.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
#ifdef _DEBUG
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
#include "e32debug.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
#define SYMBIAN_DEBPRN0(str)    RDebug::Print(str, this)
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    35
#define SYMBIAN_DEBPRN1(str, val1)          RDebug::Print(str, this, val1)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    36
#define SYMBIAN_DEBPRN2(str, val1, val2)    RDebug::Print(str, this, val1, val2)
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
#else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
#define SYMBIAN_DEBPRN0(str)
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    39
#define SYMBIAN_DEBPRN1(str, val1)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    40
#define SYMBIAN_DEBPRN2(str, val1, val2)
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
#endif //_DEBUG
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
// Time delay that the audio server wait before shutdown itself when is detected that the last DevSoundSession is closed
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
const TInt KAudioServerShutDownDelay = 50000000; //50 sec
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
// ======== LOCAL FUNCTIONS ========
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
void Panic(TInt aPanicCode)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
	_LIT(KAudioServerPanicCategory, "mmfaudioserver");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
	User::Panic(KAudioServerPanicCategory, aPanicCode);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
// ============================ MEMBER FUNCTIONS ===============================
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    57
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
// CMMFAudioServer::NewL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
// Two-phased constructor.
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    61
// @param aStayOpen whether or not the server should stay open permanently
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
//
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    64
CMMFAudioServer* CMMFAudioServer::NewL(TBool aStayOpen)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    65
    {
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    66
    
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    67
    CMMFAudioServer* self = new(ELeave) CMMFAudioServer(aStayOpen);
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    68
    CleanupStack::PushL(self);
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    69
    self->ConstructL();
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    70
    CleanupStack::Pop(self);
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    71
    return self;
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    72
    }
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
// CMMFAudioServer::CMMFAudioServer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
// C++ default constructor can NOT contain any code, that
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
// might leave.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
//
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    80
CMMFAudioServer::CMMFAudioServer(TBool aStayOpen)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    81
	: CMmfIpcServer(EPriorityStandard), iStayOpen (aStayOpen)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    82
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
// CMMFAudioServer::ConstructL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
// Symbian 2nd phase constructor can leave.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
void CMMFAudioServer::ConstructL()
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    92
 	{
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
	SYMBIAN_DEBPRN0(_L("CMMFAudioServer[0x%x]::ConstructL - enter"));
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
    94
	
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
	SetPinClientDescriptors(ETrue);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
	// Call base class to Start server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
	StartL(KAudioServerName);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
	iFourCCConvertor = CFourCCConvertor::NewL();
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   100
	
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   101
	if(!iStayOpen)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   102
	    {
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   103
	    iDelayAudioServerShutDown = CDelayAudioServerShutDown::NewL();
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   104
	    }
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
	iFactory = CMMFAudioServerFactory::NewL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
	iFactory->StartL(*this);	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
	SYMBIAN_DEBPRN0(_L("CMMFAudioServer[0x%x]::ConstructL - exit"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
// CMMFAudioServer::~CMMFAudioServer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
// Destructor
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
CMMFAudioServer::~CMMFAudioServer()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
	if (iDelayAudioServerShutDown)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
		iDelayAudioServerShutDown->Cancel();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
		delete iDelayAudioServerShutDown;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
		iDelayAudioServerShutDown = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
	for(TInt i=(iDevSoundServList.Count()-1); i >=0 ; i--)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
		CStartAndMonitorDevSoundThread* devSoundMonitorThread = iDevSoundServList[i];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
		iDevSoundServList.Remove(i);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
		delete devSoundMonitorThread;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
	iDevSoundServList.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
	delete iFourCCConvertor;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
	if (iFactory)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
		iFactory->Stop(*this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
		delete iFactory;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
// CMMFAudioServer::NewSessionL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
// Creates a new session to handle requests by the client and returns it to the
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
// client server framework.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
CMmfIpcSession* CMMFAudioServer::NewSessionL(const TVersion& aVersion) const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
	SYMBIAN_DEBPRN0(_L("CMMFAudioServer[0x%x]::NewSessionL - enter"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
	TVersion v(KMMFAudioServerVersion,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
			KMMFAudioServerMinorVersionNumber,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
			KMMFAudioServerBuildVersionNumber);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
	if(!User::QueryVersionSupported(v, aVersion))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
		User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
	for(TInt i=(iDevSoundServList.Count()-1); i >=0 ; i--)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
		CStartAndMonitorDevSoundThread* devSoundMonitorThread = iDevSoundServList[i];
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
		if(!devSoundMonitorThread->IsActive())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
			iDevSoundServList.Remove(i);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
			delete devSoundMonitorThread;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
		iDevSoundServList.Compress();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
	RMMFDevSoundServerProxy devSoundSessionHandle;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
	User::LeaveIfError(StartDevSoundServer(devSoundSessionHandle));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
	CMMFAudioServerSession* audioServerSession = CMMFAudioServerSession::NewL(devSoundSessionHandle);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
	SYMBIAN_DEBPRN0(_L("CMMFAudioServer[0x%x]::NewSessionL - session created"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
	return audioServerSession;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
// CMMFAudioServer::IncrementSessionId
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
// Increment the session Id.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
void CMMFAudioServer::IncrementSessionId()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
	iAudioServerSessionId++;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
// CMMFAudioServer::DecrementSessionId
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
// Decrement the session Id.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
void CMMFAudioServer::DecrementSessionId()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
	iAudioServerSessionId--;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
// CMMFAudioServer::IncrementDevSoundCount
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
// Increment the DevSound server counter. If there is atleast one DevSound
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
// server, it will cancel its shutdown timer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
void CMMFAudioServer::IncrementDevSoundCount()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
	{
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   205
    if(!iStayOpen)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   206
        {
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   207
        iDevSoundCount++;
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   208
        //in the case we started the shutdown due to no more DevSound
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   209
        if(iDevSoundCount)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   210
            {
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   211
            ASSERT(iDelayAudioServerShutDown);
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   212
            if (iDelayAudioServerShutDown)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   213
                {
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   214
                iDelayAudioServerShutDown->Cancel();
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   215
                }
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   216
            }
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   217
        }
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
// CMMFAudioServer::DecrementDevSoundCount
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
// Decrement the DevSound server counter. Once the number of DevSound server's
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
// instances becomes zero, Audio Server will start its shutdown routine.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
void CMMFAudioServer::DecrementDevSoundCount()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
	{
6
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   228
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   229
    if(!iStayOpen)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   230
        {
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   231
        iDevSoundCount--;
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   232
        //dont shut down if iStayOpen is set
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   233
        if (iDevSoundCount == 0)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   234
            {
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   235
            
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   236
            ASSERT(iDelayAudioServerShutDown);
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   237
            if (iDelayAudioServerShutDown)
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   238
                {
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   239
                SYMBIAN_DEBPRN0(_L("CMMFAudioServer[0x%x]::DecrementDevSoundCount - shutting down server"));
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   240
                iDelayAudioServerShutDown->SetDelay(TTimeIntervalMicroSeconds32(KAudioServerShutDownDelay));
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   241
                }
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   242
            }
fe9d1bf55678 2010wk46_02
hgs
parents: 0
diff changeset
   243
        }
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
// CMMFAudioServer::SendEventToClient
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
// Sends Event to DevSound client.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
void CMMFAudioServer::SendEventToClient(TInt aSessionToAlert, TInt /*aSessionToBeLaunched*/)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
	// For the session requested, send event to client
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
	iSessionIter.SetToFirst();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
	CMMFAudioServerSession* session = static_cast<CMMFAudioServerSession*>(iSessionIter++);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
	while (session)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
		if (session->AudioServerSessionId() == aSessionToAlert)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
			break;  // Finished
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
		session = static_cast<CMMFAudioServerSession*>(iSessionIter++);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
// CMMFAudioServer::LaunchRequest
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
// Launches the DevSound servers waiting for Audio Policy.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
void CMMFAudioServer::LaunchRequest(TInt aSessionId)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
	iSessionIter.SetToFirst();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
	CMMFAudioServerSession* session = static_cast<CMMFAudioServerSession*>(iSessionIter++);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
	while (session)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
		if (session->AudioServerSessionId() == aSessionId)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
			break;  // Finished
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
		session = static_cast<CMMFAudioServerSession*>(iSessionIter++);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
// CMMFAudioServer::StartDevSoundServer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
// Starts a new DevSound server instance.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
TInt CMMFAudioServer::StartDevSoundServer(RMMFDevSoundServerProxy& aDevSoundSessionHandle) const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
	SYMBIAN_DEBPRN0(_L("CMMFAudioServer[0x%x]::StartDevSoundServer - enter"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
	RMessage2 message(Message());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   297
	CStartAndMonitorDevSoundThread* monitorDevSound = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   298
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   299
	TRAPD(err, monitorDevSound = CStartAndMonitorDevSoundThread::NewL(const_cast<CMMFAudioServer*>(this)));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   300
	if(err != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   301
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   302
		delete monitorDevSound;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   303
		return err;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   304
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   305
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   306
	err = iDevSoundServList.Append(monitorDevSound);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   307
	if(err != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   308
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   309
		delete monitorDevSound;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   310
		return err;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   311
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   312
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   313
	SYMBIAN_DEBPRN0(_L("CMMFAudioServer[0x%x]::StartDevSoundServer - exit"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   314
	return monitorDevSound->StartDevSoundServer(message, aDevSoundSessionHandle);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   315
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   316
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   317
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   318
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   319
// CMMFAudioServer::CDelayAudioServerShutDown::NewL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   320
// Two-phased constructor.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   321
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   322
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   323
CMMFAudioServer::CDelayAudioServerShutDown*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   324
CMMFAudioServer::CDelayAudioServerShutDown::NewL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   325
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   326
	CDelayAudioServerShutDown* self = new(ELeave) CDelayAudioServerShutDown;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   327
	CleanupStack::PushL(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   328
	self->ConstructL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   329
	CleanupStack::Pop(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   330
	return self;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   331
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   332
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   333
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   334
// Constructor.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   335
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   336
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   337
CMMFAudioServer::CDelayAudioServerShutDown::CDelayAudioServerShutDown()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   338
	: CActive(0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   339
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   340
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   341
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   342
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   343
// CMMFAudioServer::CDelayAudioServerShutDown::ConstructL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   344
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   345
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   346
void CMMFAudioServer::CDelayAudioServerShutDown::ConstructL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   347
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   348
	User::LeaveIfError(iShutDownTimer.CreateLocal());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   349
	CActiveScheduler::Add(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   350
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   351
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   352
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   353
// CMMFAudioServer::CDelayAudioServerShutDown::~CDelayAudioServerShutDown
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   354
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   355
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   356
CMMFAudioServer::CDelayAudioServerShutDown::~CDelayAudioServerShutDown()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   357
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   358
	Cancel();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   359
	iShutDownTimer.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   360
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   361
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   362
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   363
// CMMFAudioServer::CDelayAudioServerShutDown::SetDelay
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   364
// Request a timeout after aDelay
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   365
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   366
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   367
void CMMFAudioServer::CDelayAudioServerShutDown::SetDelay(
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   368
	TTimeIntervalMicroSeconds32 aDelay)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   369
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   370
	__ASSERT_ALWAYS(!IsActive(), Panic(EMMFAudioServerIsActive));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   371
	iShutDownTimer.After(iStatus, aDelay);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   372
	SetActive();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   373
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   374
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   375
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   376
// CMMFAudioServer::CDelayAudioServerShutDown::RunL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   377
// Called by Active object framework when timer times out.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   378
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   379
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   380
void CMMFAudioServer::CDelayAudioServerShutDown::RunL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   381
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   382
	CActiveScheduler::Stop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   383
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   384
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   385
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   386
// CMMFAudioServer::CDelayAudioServerShutDown::DoCancel
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   387
// Called by the Active object framework when user cancels active object.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   388
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   389
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   390
void CMMFAudioServer::CDelayAudioServerShutDown::DoCancel()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   391
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   392
	iShutDownTimer.Cancel();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   393
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   394
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   395
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   396
// CStartAndMonitorDevSoundThread::NewL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   397
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   398
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   399
CStartAndMonitorDevSoundThread* CStartAndMonitorDevSoundThread::NewL(
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   400
	CMMFAudioServer* aAudioServer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   401
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   402
	CStartAndMonitorDevSoundThread* self = new(ELeave) CStartAndMonitorDevSoundThread(aAudioServer);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   403
	CleanupStack::PushL(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   404
	self->ConstructL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   405
	CleanupStack::Pop(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   406
	return self;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   407
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   408
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   409
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   410
// CStartAndMonitorDevSoundThread::ConstructL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   411
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   412
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   413
void CStartAndMonitorDevSoundThread::ConstructL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   414
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   415
	CActiveScheduler::Add(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   416
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   417
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   418
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   419
// CStartAndMonitorDevSoundThread::StartDevSoundServer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   420
// Starts a new DevSound server.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   421
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   422
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   423
TInt CStartAndMonitorDevSoundThread::StartDevSoundServer(
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   424
	RMessage2& aMessage,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   425
	RMMFDevSoundServerProxy& aDevSoundSessionHandle)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   426
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   427
	SYMBIAN_DEBPRN0(_L("CStartAndMonitorDevSoundThread[0x%x]::StartDevSoundServer - enter"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   428
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   429
	RThread clientThread;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   430
	TInt err(KErrNone);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   431
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   432
	// Open handle to client thread
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   433
	err = aMessage.Client(clientThread);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   434
	if (err != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   435
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   436
		clientThread.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   437
		return err;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   438
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   439
	// Open a process-relative handle to the process which owns clientThread.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   440
	RProcess clientProcess;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   441
	err = clientThread.Process(clientProcess);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   442
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   443
	if (err != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   444
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   445
		// Close client thread handle and return error
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   446
		clientThread.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   447
		return err;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   448
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   449
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   450
	// Get the client process id
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   451
	TProcessId clientProcessId(clientProcess.Id());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   452
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   453
	// Close client thread and client process handles
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   454
	clientThread.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   455
	clientProcess.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   456
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   457
	RServer2 devSoundServerHandle;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   458
	devSoundServerHandle.SetReturnedHandle(0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   459
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   460
	//Pass to DevSoundServer the clien't process ID
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   461
	TDevSoundServerStart start(iAudioServer,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   462
								clientProcessId,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   463
								devSoundServerHandle);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   464
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   465
	TThreadFunction serverFunc=CMMFDevSoundServer::StartThread;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   466
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   467
	// To deal with the unique thread (+semaphore!) naming in EPOC,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   468
	// and that we may be trying to restart a server that has just
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   469
	// exited we attempt to create a unique thread name for the server.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   470
#ifdef SYMBIAN_USE_SEPARATE_HEAPS
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   471
	err = iServer.Create(KNullDesC,serverFunc,KDevSoundServerStackSize*2,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   472
						KDevSoundServerInitHeapSize,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   473
						KDevSoundServerMaxHeapSize,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   474
						&start,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   475
						EOwnerProcess);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   476
#else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   477
	err = iServer.Create(KNullDesC,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   478
						serverFunc,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   479
						(KDevSoundServerStackSize*2),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   480
						NULL,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   481
						&start,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   482
						EOwnerProcess);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   483
#endif // SYMBIAN_USE_SEPARATE_HEAPS
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   484
	if(err != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   485
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   486
		return err;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   487
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   488
	iServer.SetPriority(KDevsoundSvrPriority);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   489
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   490
	// Synchronise with the server
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   491
	TRequestStatus reqStatus;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   492
	iServer.Rendezvous(reqStatus);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   493
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   494
	if (reqStatus!=KRequestPending)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   495
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   496
		iServer.Kill(0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   497
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   498
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   499
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   500
		// Start the test harness
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   501
		iServer.Resume();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   502
		// Server will call the reciprocal static synchronise call
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   503
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   504
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   505
	// note devSoundServerHandle really "owned" by client thread - just copied here
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   506
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   507
	User::WaitForRequest(reqStatus); // wait for start or death
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   508
	if(reqStatus.Int() != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   509
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   510
		// close our handle to the thread. If we reach here, the thread should have
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   511
		// closed anyway as continue Rendezvous is always KErrNone() 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   512
		iServer.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   513
		return reqStatus.Int();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   514
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   515
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   516
	err = aDevSoundSessionHandle.Open(devSoundServerHandle);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   517
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   518
	if(err != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   519
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   520
		// close our handle to the thread. If we reach here, this means that NewSessionL() failed
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   521
		// on server, and that action itself will asynchronously stop the thread
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   522
		iServer.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   523
		return err;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   524
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   525
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   526
	aDevSoundSessionHandle.ShareProtected();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   527
	iServer.Logon(iStatus);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   528
	SetActive();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   529
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   530
	iAudioServer->IncrementDevSoundCount();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   531
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   532
	SYMBIAN_DEBPRN0(_L("CStartAndMonitorDevSoundThread[0x%x]::StartDevSoundServer - exit"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   533
	return KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   534
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   535
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   536
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   537
// CStartAndMonitorDevSoundThread::CStartAndMonitorDevSoundThread
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   538
// Constructor
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   539
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   540
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   541
CStartAndMonitorDevSoundThread::CStartAndMonitorDevSoundThread(
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   542
	CMMFAudioServer* aAudioServer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   543
	: CActive(EPriorityStandard),iAudioServer(aAudioServer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   544
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   545
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   546
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   547
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   548
// Desctructor
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   549
CStartAndMonitorDevSoundThread::~CStartAndMonitorDevSoundThread()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   550
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   551
	Cancel();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   552
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   553
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   554
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   555
// CStartAndMonitorDevSoundThread::RunL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   556
// Called by Active Object framework when DevSound server is destroyed.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   557
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   558
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   559
void CStartAndMonitorDevSoundThread::RunL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   560
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   561
	iServer.Close();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   562
	iAudioServer->DecrementDevSoundCount();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   563
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   564
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   565
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   566
// CStartAndMonitorDevSoundThread::DoCancel
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   567
// Called by Active Object framework when client cancels active object.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   568
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   569
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   570
void CStartAndMonitorDevSoundThread::DoCancel()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   571
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   572
	iServer.LogonCancel(iStatus);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   573
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   574
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   575
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   576
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   577
// RMMFDevSoundServerProxy::Open
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   578
// Creates new audio server session for the devsound server.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   579
// -----------------------------------------------------------------------------
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   580
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   581
TInt RMMFDevSoundServerProxy::Open(RServer2& aDevSoundServerHandle)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   582
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   583
	SYMBIAN_DEBPRN0(_L("RMMFDevSoundServerProxy[0x%x]::Open - enter"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   584
	TInt err = CreateSession(aDevSoundServerHandle, TVersion(KMMFDevSoundServerVersion,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   585
							KMMFDevSoundServerMinorVersionNumber,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   586
							KMMFDevSoundServerBuildVersionNumber),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   587
							-1, EIpcSession_GlobalSharable);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   588
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   589
	SYMBIAN_DEBPRN0(_L("RMMFDevSoundServerProxy[0x%x]::Open - exit"));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   590
	return err;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   591
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   592
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   593
//  End of File