devsound/devsoundrefplugin/src/server/Policy/MmfAudioPolicy.cpp
author hgs
Fri, 08 Oct 2010 19:40:43 +0100
changeset 0 79dd3e2336a0
permissions -rw-r--r--
2010wk36_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2001-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 "MmfAudioPolicy.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    17
#include "MmfAudioPolicySession.h"	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    18
#include "MmfAudioPolicyServer.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    19
#include "MdaHwInfo.h"	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    20
#include "MmfAudioPolicyRequest.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    21
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    22
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    23
*@internalTechnology
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    24
*@return if a client owns or wish to own audio resource
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    25
*/
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    26
inline TBool IsActiveState(TMMFAudioPolicyState aState)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    27
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    28
	return (aState < EMMFStateStopped || aState==EMMFStateNotified || aState==EMMFStatePlayDualTone);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    29
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    30
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    31
CAudioPolicy::~CAudioPolicy()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    32
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    33
	delete iMdaHwInfo;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    34
	delete iAudioPolicyRequestArray;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    35
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    36
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    37
void CAudioPolicy::ConstructL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    38
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    39
	// Create dynamic array for sessions list
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    40
	iAudioPolicyRequestArray = new(ELeave) CPolicyReqPtrArray(CAudioPolicy::EGranularity);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    41
	iMdaHwInfo = CMdaHwInfo::NewL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    42
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    43
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    44
EXPORT_C CAudioPolicy* CAudioPolicy::NewL(CMMFAudioPolicyServer* aAudioPolicyServer)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    45
	{	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    46
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    47
	CAudioPolicy* self = new(ELeave)CAudioPolicy(aAudioPolicyServer);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    48
	CleanupStack::PushL(self);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    49
	self->ConstructL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    50
	CleanupStack::Pop();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    51
	return(self);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    52
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    53
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    54
CAudioPolicy::CAudioPolicy(CMMFAudioPolicyServer* aAudioPolicyServer) :
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    55
	iAudioPolicyServer(aAudioPolicyServer),
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    56
	iNotifiedSessionId(KErrNotFound),
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    57
	iSessionIdAwaitingForDevsound(KErrNotFound),
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    58
	iStopHandledFromSessId(KErrNotFound)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    59
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    60
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    61
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    62
void CAudioPolicy::MakeRequest(CMMFAudioPolicyRequest* aAudioPolicyRequest)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    63
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    64
// since we have a FIFO q, then remove request and re-add it.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    65
	RemoveFromList(aAudioPolicyRequest->PolicySessionId(), EFalse); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    66
	if (iStopHandledFromSessId==aAudioPolicyRequest->PolicySessionId())
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    67
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    68
		iStopHandledFromSessId=KErrNotFound;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    69
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    70
// Process Request by looking at priorities, preferences, special states...
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    71
	TPolicyResponse responseValue = ProcessRequest(aAudioPolicyRequest);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    72
#if defined(ALLOW_POLICY_DEBUG)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    73
	RDebug::Print(_L("Sess ID=%d, Priority=%d"),aAudioPolicyRequest->PolicySessionId(),aAudioPolicyRequest->Priority());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    74
#endif	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    75
	switch (responseValue)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    76
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    77
		case EDenied:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    78
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    79
			TMMFAudioPolicyEvent responseEvent(TMMFAudioPolicyEvent::EMMFAudioPolicyPriorityTooLow, KErrInUse,EMMFStateWaitingForResource);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    80
			// the client won't be notified until he has request so, so we can set its state anyway
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    81
			aAudioPolicyRequest->SetState( EMMFStateWaitingForResource ); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    82
			iAudioPolicyServer->SendEventToClient(aAudioPolicyRequest->PolicySessionId(), responseEvent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    83
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    84
			break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    85
		case EProceed:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    86
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    87
			iAudioPolicyServer->StopNotificationTimer();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    88
			TMMFAudioPolicyEvent responseEvent(TMMFAudioPolicyEvent::EMMFAudioPolicyNoEvent, KErrNone, aAudioPolicyRequest->State());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    89
			iAudioPolicyServer->SendEventToClient(aAudioPolicyRequest->PolicySessionId(), responseEvent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    90
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    91
			break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    92
		case EStopThenProceed:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    93
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    94
			iAudioPolicyServer->StopNotificationTimer(); 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    95
			iSessionIdAwaitingForDevsound=aAudioPolicyRequest->PolicySessionId();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    96
			// we have to wait for devsound to stop client(s), then notify that one
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    97
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    98
			break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    99
		case EResume:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   100
		case EMix:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   101
		default:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   102
			ASSERT(EFalse);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   103
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   104
	TRAPD(err, iAudioPolicyRequestArray->AppendL(aAudioPolicyRequest) );
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   105
	__ASSERT_ALWAYS(err==KErrNone, Panic(EMMFAudioPolicyRequestArrayOverflow) ); // we reserved space, so shouldn't hit this
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   106
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   107
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   108
TPolicyResponse CAudioPolicy::ProcessRequest(CMMFAudioPolicyRequest* aAudioPolicyRequest)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   109
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   110
	// If there is no other item on list, return with proceed
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   111
	if (iAudioPolicyRequestArray->Count()==0)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   112
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   113
		return EProceed;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   114
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   115
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   116
	TPolicyResponse responseValue(EProceed);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   117
	TInt requestPriority = aAudioPolicyRequest->Priority();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   118
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   119
	TBool requestCaps = aAudioPolicyRequest->Capabilities();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   120
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   121
	// Iterate through list and compare priorities:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   122
	// QUEST: state checking shall be done as well?
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   123
	for (TInt index = 0; index < iAudioPolicyRequestArray->Count(); index++)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   124
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   125
		CMMFAudioPolicyRequest& currentReq=*(*iAudioPolicyRequestArray)[index];
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   126
		if (!IsActiveState(currentReq.State()) ) // this request is inactive
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   127
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   128
			continue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   129
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   130
			// If there's even one on the list w/ a higher priority deny request and leave:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   131
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   132
		if (currentReq.Capabilities() > requestCaps)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   133
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   134
			responseValue = EDenied;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   135
			break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   136
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   137
		else if(currentReq.Capabilities() == requestCaps) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   138
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   139
			if(currentReq.Priority() >= requestPriority)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   140
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   141
				responseValue = EDenied;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   142
				break;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   143
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   144
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   145
		if (currentReq.State()==EMMFStateWaitingForResource || currentReq.State()==EMMFStatePreempted)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   146
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   147
			continue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   148
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   149
		// we need to stop active client since new request is of higher priority
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   150
		TMMFAudioPolicyEvent freezeEvent(TMMFAudioPolicyEvent::EMMFAudioPolicyPriorityTooLow, KErrInUse, EMMFStatePaused);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   151
#if defined(ALLOW_POLICY_DEBUG)	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   152
		RDebug::Print(_L("Sess ID=%d, State=%d Has been preempted"),currentReq.PolicySessionId(),currentReq.State());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   153
#endif			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   154
		currentReq.SetState( EMMFStatePreempted );
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   155
		currentReq.SetEventFlag(EFalse);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   156
		iAudioPolicyServer->SendEventToClient(currentReq.PolicySessionId(), freezeEvent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   157
		responseValue = EStopThenProceed;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   158
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   159
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   160
	return responseValue;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   161
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   162
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   163
void CAudioPolicy::ModifyEntry(TInt aPolicySessionId,const TMMFAudioPolicyState aNewState)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   164
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   165
	CMMFAudioPolicyRequest* sessionEntry=FindPolicyRequestById(aPolicySessionId);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   166
#if defined(ALLOW_POLICY_DEBUG)	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   167
	RDebug::Print(_L("Sess ID=%d, Old State=%d New State=%d"),aPolicySessionId,sessionEntry?sessionEntry->State():-1, aNewState);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   168
#endif	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   169
	// some client took over resource, so update its state and cancel timer
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   170
	if (IsActiveState(aNewState))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   171
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   172
		if (sessionEntry)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   173
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   174
			sessionEntry->SetState(aNewState);	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   175
			sessionEntry->SetEventFlag(EFalse);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   176
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   177
		iAudioPolicyServer->StopNotificationTimer();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   178
		iNotifiedSessionId	=KErrNotFound;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   179
		ASSERT(iSessionIdAwaitingForDevsound==KErrNotFound); // we shouldn't have a client waiting to be notified
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   180
		if (iStopHandledFromSessId==aPolicySessionId)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   181
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   182
			iStopHandledFromSessId=KErrNotFound;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   183
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   184
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   185
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   186
	if (iNotifiedSessionId==aPolicySessionId) // if client that was notified, then stop timer.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   187
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   188
		iAudioPolicyServer->StopNotificationTimer();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   189
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   190
	if (sessionEntry==NULL) // to cope with erroneous behaviour of devsound
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   191
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   192
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   193
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   194
	// we have update from the client, if we have other clients waiting we should notify them
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   195
	if ( (aNewState == EMMFStatePaused || (aNewState == EMMFStateStopped && iStopHandledFromSessId!=aPolicySessionId) )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   196
			&& sessionEntry->State()!=EMMFStateStopped && sessionEntry->State()!=EMMFStateWaitingForResource)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   197
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   198
		if (aNewState == EMMFStateStopped) // to eliminate duplicate stop events
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   199
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   200
			iStopHandledFromSessId=aPolicySessionId;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   201
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   202
		if (sessionEntry->State()==EMMFStatePreempted)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   203
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   204
			sessionEntry->SetState(EMMFStateWaitingForResource);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   205
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   206
			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   207
		if (iSessionIdAwaitingForDevsound==aPolicySessionId)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   208
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   209
			iSessionIdAwaitingForDevsound=KErrNotFound;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   210
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   211
			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   212
		if (aNewState == EMMFStatePaused || aNewState == EMMFStateStopped) // devsound should free, so notify waiting client
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   213
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   214
			if (iSessionIdAwaitingForDevsound!=KErrNotFound) // we have a client waiting for Devsound, so notify it
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   215
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   216
				NotifySessionWithTimeout(iSessionIdAwaitingForDevsound, TMMFAudioPolicyEvent::EMMFAudioPolicyNoEvent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   217
				iSessionIdAwaitingForDevsound=KErrNotFound;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   218
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   219
			else if (!iAudioPolicyServer->IsTimerActive()) // do not try to notify if we're still waiting for response
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   220
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   221
				const TInt sessionIdToNotify = CheckSessionToNotify();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   222
				if(sessionIdToNotify != KErrNotFound)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   223
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   224
					// set the state as notified
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   225
					NotifySessionWithTimeout(sessionIdToNotify, TMMFAudioPolicyEvent::EMMFAudioPolicyResourceNotification);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   226
					}				
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   227
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   228
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   229
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   230
	// we update state to passive only if the client hasn't been stopped by us, so as not loose its waiting indication
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   231
	if (sessionEntry->State()!=EMMFStateWaitingForResource)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   232
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   233
		sessionEntry->SetState(aNewState);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   234
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   235
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   236
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   237
void CAudioPolicy::NotifySessionWithTimeout(TInt aPolicySessionId, TMMFAudioPolicyEvent::TAudioPolicyEventType aEvent)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   238
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   239
	CMMFAudioPolicyRequest* sessionEntry=FindPolicyRequestById(aPolicySessionId);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   240
	ASSERT(sessionEntry);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   241
#if defined(ALLOW_POLICY_DEBUG)	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   242
	RDebug::Print(_L("Sending timed not. ID=%d, State=%d Event=%d"),aPolicySessionId,sessionEntry->State(), aEvent);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   243
#endif
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   244
	const TMMFAudioPolicyEvent eventToSend(aEvent, KErrNone, sessionEntry->State());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   245
	sessionEntry->SetEventFlag(ETrue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   246
	iAudioPolicyServer->StartNotificationTimer();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   247
	iNotifiedSessionId 	= aPolicySessionId;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   248
	iAudioPolicyServer->SendEventToClient(aPolicySessionId, eventToSend);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   249
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   250
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   251
void CAudioPolicy::RemoveFromList(TInt aPolicySessionId, TBool aAllowTimerRestart)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   252
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   253
	if (aPolicySessionId==KErrNotFound)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   254
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   255
		return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   256
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   257
	for (TInt index = iAudioPolicyRequestArray->Count(); index-- ;)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   258
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   259
		// Find correct entry to remove	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   260
		if ( (*iAudioPolicyRequestArray)[index]->PolicySessionId() == aPolicySessionId)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   261
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   262
			if (iSessionIdAwaitingForDevsound==aPolicySessionId)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   263
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   264
				iSessionIdAwaitingForDevsound=KErrNotFound;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   265
				}			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   266
			if (iNotifiedSessionId==aPolicySessionId && iAudioPolicyServer->IsTimerActive()) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   267
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   268
				iNotifiedSessionId=KErrNotFound;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   269
				// the session we were waiting for disconnected so try to immediately notify another one
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   270
				iAudioPolicyServer->StopNotificationTimer();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   271
				if (iAudioPolicyRequestArray->Count() > 1 && aAllowTimerRestart)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   272
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   273
					iAudioPolicyServer->StartNotificationTimer(ETrue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   274
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   275
				}			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   276
			else if(!iAudioPolicyServer->IsTimerActive())
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   277
				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   278
				if (iAudioPolicyRequestArray->Count() > 1 && aAllowTimerRestart)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   279
					{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   280
					iAudioPolicyServer->StartNotificationTimer(ETrue);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   281
					}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   282
				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   283
			iAudioPolicyRequestArray->Delete(index);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   284
			return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   285
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   286
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   287
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   288
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   289
void CAudioPolicy::HandlePreferences(CMMFAudioPolicyRequest* /*aAudioPolicyRequest*/, TInt /*aPref*/, TPolicyResponse& /*aResponse*/)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   290
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   291
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   292
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   293
// this is weird, but devsound 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   294
// does Stop() if a client is denied access to resource
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   295
// then calls this routine to indicate that resource became available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   296
void CAudioPolicy::LaunchRequest(TInt aSessionId)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   297
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   298
	ASSERT(iSessionIdAwaitingForDevsound!=aSessionId);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   299
	ModifyEntry(aSessionId, EMMFStateStopped);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   300
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   301
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   302
void CAudioPolicy::ReserveClientNumL(TInt aNum)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   303
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   304
	iAudioPolicyRequestArray->SetReserveL(aNum);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   305
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   306
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   307
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   308
@internalTechnology
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   309
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   310
This function raises a panic
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   311
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   312
@param	aError
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   313
		one of the several panics codes that may be raised by this dll
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   314
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   315
@panic	EMMFAudioPolicyRequestArrayOverflow is raised when policyrequest array is full
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   316
*/
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   317
GLDEF_C void Panic(TMMFAudioPolicyPanicCodes aPanicCode)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   318
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   319
	User::Panic(KMMFAudioPolicyPanicCategory, aPanicCode);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   320
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   321
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   322
// checks based on the session ,Is the session is registered for Notification 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   323
TBool CAudioPolicy::IsRegisteredNotification(TInt aSessionId) const
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   324
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   325
	TUid event;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   326
 	for (TInt index = 0; index < iAudioPolicyRequestArray->Count(); index++)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   327
 		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   328
 		if((*iAudioPolicyRequestArray)[index]->PolicySessionId() == aSessionId)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   329
 			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   330
 			event = (*iAudioPolicyRequestArray)[index]->NotificationEvent();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   331
 			if (event  == KMMFEventCategoryAudioResourceAvailable)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   332
 				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   333
 				// only when the client is registered for KMMFEventCategoryAudioResourceAvailable event
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   334
 				return ETrue; 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   335
 				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   336
 			break;	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   337
 			} 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   338
 		} 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   339
 	return EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   340
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   341
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   342
// get the next highest priority of the client to notify 	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   343
TInt CAudioPolicy::CheckSessionToNotify()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   344
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   345
	TInt nextHighestPriority= -100;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   346
	TInt sessionToNotify = KErrNotFound;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   347
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   348
	// get the max priority and set the Index
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   349
	for (TInt attempt=2; attempt-- && sessionToNotify==KErrNotFound;)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   350
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   351
		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   352
		for (TInt index = 0; index < iAudioPolicyRequestArray->Count(); ++index)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   353
	 		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   354
	 		CMMFAudioPolicyRequest& currentReq=*(*iAudioPolicyRequestArray)[index];
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   355
	 		if((nextHighestPriority <= currentReq.Priority())
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   356
	 					&& (currentReq.NotificationEvent() == KMMFEventCategoryAudioResourceAvailable) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   357
	 					&& (!currentReq.IsEventNotified())
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   358
	 					&& currentReq.State()==EMMFStateWaitingForResource)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   359
	 			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   360
	 			nextHighestPriority = currentReq.Priority();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   361
	 			sessionToNotify = currentReq.PolicySessionId();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   362
	 			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   363
	 		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   364
	 	// we tried to notify every session once, so reset flag and try again.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   365
	 	if (sessionToNotify==KErrNotFound)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   366
	 		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   367
	 		for (TInt i=iAudioPolicyRequestArray->Count(); i--;)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   368
	 			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   369
	 			(*iAudioPolicyRequestArray)[i]->SetEventFlag(EFalse);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   370
	 			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   371
	 		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   372
 		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   373
  	return sessionToNotify;	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   374
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   375
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   376
// send the message to the server 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   377
void CAudioPolicy::NotifyNextClient()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   378
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   379
	const TInt sessionIdToNotify = CheckSessionToNotify();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   380
#if defined(ALLOW_POLICY_DEBUG)	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   381
	RDebug::Print(_L("Sess ID %d didn't continue within timeout, Next ID=%d"), iNotifiedSessionId, sessionIdToNotify);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   382
#endif	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   383
	iNotifiedSessionId = KErrNotFound;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   384
	if(sessionIdToNotify != KErrNotFound)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   385
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   386
		NotifySessionWithTimeout(sessionIdToNotify, TMMFAudioPolicyEvent::EMMFAudioPolicyResourceNotification);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   387
		}	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   388
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   389
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   390
// Set in the AudiopolicyRequestArray the uid registered
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   391
TInt CAudioPolicy::SetNotification(TInt aSessionId, TUid aEventType)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   392
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   393
	if (KMMFEventCategoryAudioResourceAvailable!=aEventType)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   394
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   395
		return EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   396
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   397
	for (TInt index = iAudioPolicyRequestArray->Count(); index-- ; )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   398
 		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   399
 		CMMFAudioPolicyRequest& currentReq=*(*iAudioPolicyRequestArray)[index];
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   400
 		if(currentReq.PolicySessionId() == aSessionId)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   401
 			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   402
 			currentReq.SetNotificationEvent(aEventType);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   403
#if defined(ALLOW_POLICY_DEBUG)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   404
			RDebug::Print(_L("Sess ID %d state=%d requested resource notification"), aSessionId, currentReq.State());
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   405
#endif			 			 			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   406
 			if (!IsActiveState(currentReq.State()))
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   407
 				{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   408
 				currentReq.SetState(EMMFStateWaitingForResource);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   409
 				}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   410
 			return ETrue;	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   411
 			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   412
 		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   413
 	return EFalse;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   414
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   415
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   416
CMMFAudioPolicyRequest* CAudioPolicy::FindPolicyRequestById(TInt aSessionId) const
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   417
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   418
	for (TInt index = iAudioPolicyRequestArray->Count(); index-- ; )
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   419
 		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   420
 		if((*iAudioPolicyRequestArray)[index]->PolicySessionId() == aSessionId)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   421
 			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   422
 			return (*iAudioPolicyRequestArray)[index];
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   423
 			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   424
 		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   425
	return NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   426
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   427
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   428
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   429