remotecontrol/avrcp/remconbeareravrcp/src/avrcpplayerinfomanager.cpp
author jontanne
Thu, 14 Oct 2010 11:16:56 +0100
changeset 52 321a10f609ef
parent 51 20ac952a623c
permissions -rw-r--r--
Add USB HCTL to bt package
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
20ac952a623c 201040_02
hgs
parents:
diff changeset
     1
// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
20ac952a623c 201040_02
hgs
parents:
diff changeset
     2
// All rights reserved.
20ac952a623c 201040_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
20ac952a623c 201040_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
20ac952a623c 201040_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
20ac952a623c 201040_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
20ac952a623c 201040_02
hgs
parents:
diff changeset
     7
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
20ac952a623c 201040_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    10
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    11
// Contributors:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    12
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    13
// Description:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    14
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    15
20ac952a623c 201040_02
hgs
parents:
diff changeset
    16
20ac952a623c 201040_02
hgs
parents:
diff changeset
    17
20ac952a623c 201040_02
hgs
parents:
diff changeset
    18
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    19
 @file
20ac952a623c 201040_02
hgs
parents:
diff changeset
    20
 @internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
    21
 @released
20ac952a623c 201040_02
hgs
parents:
diff changeset
    22
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    23
20ac952a623c 201040_02
hgs
parents:
diff changeset
    24
#include <avctpservices.h> // for AVCTP protocol version
20ac952a623c 201040_02
hgs
parents:
diff changeset
    25
#include <bt_sock.h> // for PSM values
20ac952a623c 201040_02
hgs
parents:
diff changeset
    26
#include <remcon/clientid.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    27
#include <absolutevolumeapi.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    28
#include <remcon/remconbearerbulkobserver.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    29
20ac952a623c 201040_02
hgs
parents:
diff changeset
    30
#include "avrcp.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    31
#include "avrcpplayerinfomanager.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    32
#include "avrcpsdputils.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    33
#include "playerbitmasks.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    34
#include "avrcputils.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    35
#include "avrcplog.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    36
#include "mediabrowse.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    37
#include "nowplaying.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    38
#include "playerinformation.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    39
#include "remcongroupnavigation.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    40
20ac952a623c 201040_02
hgs
parents:
diff changeset
    41
#ifdef _DEBUG
20ac952a623c 201040_02
hgs
parents:
diff changeset
    42
PANICCATEGORY("playerinfo");
20ac952a623c 201040_02
hgs
parents:
diff changeset
    43
#endif // _DEBUG
20ac952a623c 201040_02
hgs
parents:
diff changeset
    44
20ac952a623c 201040_02
hgs
parents:
diff changeset
    45
static TBool PlayerCompare(const TRemConClientId* aId, const TAvrcpMediaPlayerItem& aItem)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    46
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    47
	LOG_STATIC_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
    48
	return (aId && *aId == aItem.iId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    49
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    50
20ac952a623c 201040_02
hgs
parents:
diff changeset
    51
enum TFirstAbsVolSupport { EFirstAbsVolSupport };
20ac952a623c 201040_02
hgs
parents:
diff changeset
    52
static TBool FirstAbsVolSupport(const TFirstAbsVolSupport*, const TAvrcpMediaPlayerItem& aItem)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    53
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    54
	LOG_STATIC_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
    55
	return aItem.iId != KNullClientId && aItem.iAbsoluteVolumeSupport;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    56
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    57
20ac952a623c 201040_02
hgs
parents:
diff changeset
    58
enum TFirstBrowsingSupport { EFirstBrowsingSupport };
20ac952a623c 201040_02
hgs
parents:
diff changeset
    59
static TBool FirstBrowsingSupport(const TFirstBrowsingSupport*, const TAvrcpMediaPlayerItem& aItem)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    60
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    61
	LOG_STATIC_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
    62
	return aItem.iId != KNullClientId && (aItem.iSdpFeatures & AvrcpSdp::EBrowsing);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    63
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    64
20ac952a623c 201040_02
hgs
parents:
diff changeset
    65
CAvrcpPlayerInfoManager* CAvrcpPlayerInfoManager::NewL(MRemConBearerObserver& aObserver, MRemConCommandInterface& aCommandInterface)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    66
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    67
	LOG_STATIC_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
    68
	CAvrcpPlayerInfoManager* info = new(ELeave) CAvrcpPlayerInfoManager(aObserver);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    69
	CleanupStack::PushL(info);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    70
	info->ConstructL(aCommandInterface);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    71
	CleanupStack::Pop(info);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    72
	return info;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    73
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    74
20ac952a623c 201040_02
hgs
parents:
diff changeset
    75
void CAvrcpPlayerInfoManager::ConstructL(MRemConCommandInterface& aCommandInterface)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    76
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    77
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
    78
	LEAVEIFERRORL(iLock.CreateLocal());
20ac952a623c 201040_02
hgs
parents:
diff changeset
    79
	LEAVEIFERRORL(iSdp.Connect());
20ac952a623c 201040_02
hgs
parents:
diff changeset
    80
	LEAVEIFERRORL(iSdpDatabase.Open(iSdp));
20ac952a623c 201040_02
hgs
parents:
diff changeset
    81
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    82
	iPlayStatusWatcher = CPlayStatusWatcher::NewL(*this, aCommandInterface);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    83
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    84
	TCallBack cb(PlayerUpdateCallBack, this);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    85
	iControlThreadCallBack.Create(cb, CActive::EPriorityStandard);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    86
	iControlThreadCallBack.Start();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    87
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    88
20ac952a623c 201040_02
hgs
parents:
diff changeset
    89
CAvrcpPlayerInfoManager::~CAvrcpPlayerInfoManager()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    90
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    91
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
    92
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
    93
	iLock.Wait();// serialise access...
20ac952a623c 201040_02
hgs
parents:
diff changeset
    94
	iLock.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    95
	delete iPlayStatusWatcher;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    96
	ASSERT_DEBUG(!iUidWatcher); // created in bulk thread context...
20ac952a623c 201040_02
hgs
parents:
diff changeset
    97
	iControlThreadCallBack.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    98
	iObservers.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    99
	iPlayers.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   100
	iSdpDatabase.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   101
	iSdp.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   102
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   103
20ac952a623c 201040_02
hgs
parents:
diff changeset
   104
CAvrcpPlayerInfoManager::CAvrcpPlayerInfoManager(MRemConBearerObserver& aObserver)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   105
	: iControlBearerObserver(aObserver)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   106
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   107
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   108
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   109
20ac952a623c 201040_02
hgs
parents:
diff changeset
   110
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   111
This function sets up the handling in the bulk thread.  This involves creating the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   112
player state watcher, which maintains an up to date view of the UID counter values
20ac952a623c 201040_02
hgs
parents:
diff changeset
   113
for each player with a bulk interface.  It does this by acting as an internal
20ac952a623c 201040_02
hgs
parents:
diff changeset
   114
command handler.  The bulk bearer expects the player info manager to provide it
20ac952a623c 201040_02
hgs
parents:
diff changeset
   115
with a command handling interface for commands on internal interfaces, so we provide
20ac952a623c 201040_02
hgs
parents:
diff changeset
   116
it with the interface for the state watcher, which is where all our internal commands
20ac952a623c 201040_02
hgs
parents:
diff changeset
   117
come from.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   118
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   119
MIncomingCommandHandler* CAvrcpPlayerInfoManager::BulkStartedL(MRemConCommandInterface& aCommandInterface)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   120
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   121
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   122
	ASSERT_BULK_THREAD;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   123
20ac952a623c 201040_02
hgs
parents:
diff changeset
   124
	iUidWatcher = CUidWatcher::NewL(*this, aCommandInterface);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   125
	return iUidWatcher;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   126
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   127
20ac952a623c 201040_02
hgs
parents:
diff changeset
   128
void CAvrcpPlayerInfoManager::BulkStopped()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   129
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   130
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   131
	ASSERT_BULK_THREAD;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   132
	delete iUidWatcher;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   133
	iUidWatcher = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   134
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   135
20ac952a623c 201040_02
hgs
parents:
diff changeset
   136
// Helper function for ClientAvailable and TargetFeaturesUpdated
20ac952a623c 201040_02
hgs
parents:
diff changeset
   137
TInt CAvrcpPlayerInfoManager::SetItemDetails(TAvrcpMediaPlayerItem& aItem, TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aName)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   138
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   139
	aItem.iPlayerType = aPlayerType;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   140
	aItem.iPlayerSubType = aPlayerSubType;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   141
	aItem.iName.Set(aName);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   142
	aItem.iFeatureBitmask = TPlayerFeatureBitmask();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   143
	return SetPlayerFeatures(aItem.iId, aItem.iFeatureBitmask, aItem.iSdpFeatures, aItem.iAbsoluteVolumeSupport);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   144
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   145
20ac952a623c 201040_02
hgs
parents:
diff changeset
   146
// Helper function for ClientAvailable and TargetFeaturesUpdated
20ac952a623c 201040_02
hgs
parents:
diff changeset
   147
void CAvrcpPlayerInfoManager::UpdateTargetSdpRecord()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   148
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   149
	// Update SDP record, if this fails we carry on, it's non-fatal
20ac952a623c 201040_02
hgs
parents:
diff changeset
   150
	TInt sdpErr = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   151
	if(!iTargetRecord)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   152
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   153
		TRAP(sdpErr, AvrcpSdpUtils::CreateTargetServiceRecordL(iSdpDatabase, iTargetRecord));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   154
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   155
	if(sdpErr == KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   156
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   157
		TRAP_IGNORE(UpdateTgServiceRecordL());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   158
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   159
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   160
20ac952a623c 201040_02
hgs
parents:
diff changeset
   161
void CAvrcpPlayerInfoManager::ClientAvailable(const TRemConClientId& aId, TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aName)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   162
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   163
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   164
	ASSERT_CONTROL_THREAD;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   165
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   166
	// Add this to our client list, using any holes in the client id array
20ac952a623c 201040_02
hgs
parents:
diff changeset
   167
	TInt index = NextPlayerIndex();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   168
	if(index < 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   169
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   170
		// Couldn't allocate memory to store this player, remote will just
20ac952a623c 201040_02
hgs
parents:
diff changeset
   171
		// have to make do with the current set
20ac952a623c 201040_02
hgs
parents:
diff changeset
   172
		iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   173
		return;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   174
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   175
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   176
	TAvrcpMediaPlayerItem& item = iPlayers[index];
20ac952a623c 201040_02
hgs
parents:
diff changeset
   177
	item.iId = aId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   178
	item.iBulkClientAvailable = EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   179
	item.iUidCounter = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   180
	item.iLastUpdatedUidCounter = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   181
	item.iPlaybackStatus = MPlayerEventsObserver::EStopped;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   182
	TInt err = SetItemDetails(item, aPlayerType, aPlayerSubType, aName);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   183
20ac952a623c 201040_02
hgs
parents:
diff changeset
   184
	// Release lock before calling out of player info manager in case
20ac952a623c 201040_02
hgs
parents:
diff changeset
   185
	// anyone needs to call back in - we're finished updating the
20ac952a623c 201040_02
hgs
parents:
diff changeset
   186
	// info now.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   187
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   188
20ac952a623c 201040_02
hgs
parents:
diff changeset
   189
	if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   190
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   191
		TRAP(err, iPlayStatusWatcher->StartWatchingPlayerL(aId));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   192
		if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   193
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   194
			UpdateTargetSdpRecord();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   195
		     for(TInt i = 0; i<iObservers.Count(); i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   196
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   197
				iObservers[i]->MpcoAvailablePlayersChanged();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   198
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   199
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   200
		  else    
20ac952a623c 201040_02
hgs
parents:
diff changeset
   201
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   202
			iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   203
			// We know that the player array is only modified from the control thread
20ac952a623c 201040_02
hgs
parents:
diff changeset
   204
			// so it's valid to use index now even though coverity thinks its stale
20ac952a623c 201040_02
hgs
parents:
diff changeset
   205
			// coverity[use]
20ac952a623c 201040_02
hgs
parents:
diff changeset
   206
			iPlayers[index].iId = KNullClientId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   207
			iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   208
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   209
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   210
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   211
20ac952a623c 201040_02
hgs
parents:
diff changeset
   212
void CAvrcpPlayerInfoManager::ClientNotAvailable(const TRemConClientId& aId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   213
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   214
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   215
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   216
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   217
	TInt index = iPlayers.Find(aId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   218
	if(index < 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   219
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   220
		// May not be here if we couldn't allocate memory to store this
20ac952a623c 201040_02
hgs
parents:
diff changeset
   221
		// when we were first told about it
20ac952a623c 201040_02
hgs
parents:
diff changeset
   222
		iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   223
		return;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   224
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   225
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   226
	iPlayStatusWatcher->StopWatchingPlayer(aId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   227
	iPlayers[index].iId = KNullClientId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   228
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   229
	//Release lock as soon as we've stopped fiddling
20ac952a623c 201040_02
hgs
parents:
diff changeset
   230
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   231
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   232
	for(TInt i = 0; i<iObservers.Count(); i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   233
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   234
		iObservers[i]->MpcoAvailablePlayersChanged();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   235
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   236
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   237
	// Don't put requirement on ordering of ClientNotAvailable/ClientStatus calls
20ac952a623c 201040_02
hgs
parents:
diff changeset
   238
	if(iTargetRecord)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   239
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   240
		TRAP_IGNORE(UpdateTgServiceRecordL());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   241
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   242
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   243
20ac952a623c 201040_02
hgs
parents:
diff changeset
   244
void CAvrcpPlayerInfoManager::ClientStatus(TBool aControllerPresent, TBool aTargetPresent)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   245
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   246
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   247
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   248
	// SDP only used in the control thread
20ac952a623c 201040_02
hgs
parents:
diff changeset
   249
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   250
	//If we have gone from 1->0 on either of these we can remove the record now,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   251
	// otherwise wait for more detail on ClientAvailable or ControllerFeaturesUpdatedL
20ac952a623c 201040_02
hgs
parents:
diff changeset
   252
	if(!aControllerPresent && iControllerRecord)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   253
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   254
		iSdpDatabase.DeleteRecord(iControllerRecord);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   255
		iControllerRecord = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   256
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   257
			
20ac952a623c 201040_02
hgs
parents:
diff changeset
   258
	if(!aTargetPresent && iTargetRecord)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   259
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   260
		iSdpDatabase.DeleteRecord(iTargetRecord);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   261
		iTargetRecord = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   262
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   263
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   264
20ac952a623c 201040_02
hgs
parents:
diff changeset
   265
TInt CAvrcpPlayerInfoManager::SetLocalAddressedClient(const TRemConClientId& aId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   266
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   267
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   268
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   269
20ac952a623c 201040_02
hgs
parents:
diff changeset
   270
	TUint16 playerId = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   271
	TRAPD(err, playerId = PlayerL(aId));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   272
	static_cast<void>(playerId==playerId); // We only want to check if the bearer knows about the client.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   273
	if(err == KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   274
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   275
		for(TInt i = 0; i<iObservers.Count(); i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   276
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   277
			iObservers[i]->MpcoAddressedPlayerChangedLocally(aId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   278
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   279
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   280
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   281
	return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   282
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   283
20ac952a623c 201040_02
hgs
parents:
diff changeset
   284
void CAvrcpPlayerInfoManager::ControllerFeaturesUpdatedL(RArray<TUid>& aSupportedInterfaces)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   285
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   286
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   287
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   288
	// SDP only used in the control thread
20ac952a623c 201040_02
hgs
parents:
diff changeset
   289
20ac952a623c 201040_02
hgs
parents:
diff changeset
   290
	TUint16 avrcpVersion = AvrcpSdp::KAvrcpProfileVersion13; 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   291
	TUint16 avctpVersion = AvrcpSdp::KAvctpProtocolVersion12; 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   292
20ac952a623c 201040_02
hgs
parents:
diff changeset
   293
	if(aSupportedInterfaces.Find(TUid::Uid(KRemConAbsoluteVolumeControllerApiUid)) >= 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   294
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   295
		avrcpVersion = AvrcpSdp::KAvrcpProfileVersion14;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   296
		avctpVersion = AvrcpSdp::KAvctpProtocolVersion13;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   297
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   298
20ac952a623c 201040_02
hgs
parents:
diff changeset
   299
	if(!iControllerRecord)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   300
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   301
		AvrcpSdpUtils::CreateControllerServiceRecordL(iSdpDatabase, iControllerRecord, avrcpVersion);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   302
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   303
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   304
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   305
		AvrcpSdpUtils::UpdateControllerServiceClassListL(iSdpDatabase, iControllerRecord, avrcpVersion);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   306
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   307
20ac952a623c 201040_02
hgs
parents:
diff changeset
   308
	AvrcpSdpUtils::UpdateProtocolDescriptorListL(iSdpDatabase, iControllerRecord, avctpVersion);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   309
	AvrcpSdpUtils::UpdateProfileDescriptorListL(iSdpDatabase, iControllerRecord, avrcpVersion);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   310
	AvrcpSdpUtils::UpdateSupportedFeaturesL(iSdpDatabase, iControllerRecord, AvrcpSdp::ERemoteControl, AvrcpSdp::KAvrcpBaseCtFeatures);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   311
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   312
20ac952a623c 201040_02
hgs
parents:
diff changeset
   313
void CAvrcpPlayerInfoManager::TargetFeaturesUpdated(const TRemConClientId& aId, TPlayerType aPlayerType, TPlayerSubType aPlayerSubType, const TDesC8& aName)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   314
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   315
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   316
	ASSERT_CONTROL_THREAD;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   317
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   318
	// Find this client in our client list
20ac952a623c 201040_02
hgs
parents:
diff changeset
   319
	TInt index = iPlayers.Find(aId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   320
	if(index < 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   321
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   322
		// Couldn't find client in client list, maybe we removed it after an earlier failure
20ac952a623c 201040_02
hgs
parents:
diff changeset
   323
		iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   324
		return;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   325
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   326
20ac952a623c 201040_02
hgs
parents:
diff changeset
   327
	TAvrcpMediaPlayerItem& item = iPlayers[index];
20ac952a623c 201040_02
hgs
parents:
diff changeset
   328
	TInt err = SetItemDetails(item, aPlayerType, aPlayerSubType, aName);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   329
20ac952a623c 201040_02
hgs
parents:
diff changeset
   330
	if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   331
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   332
		UpdateTargetSdpRecord();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   333
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   334
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   335
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   336
		// There was an error updating the features so remove this client from the client list
20ac952a623c 201040_02
hgs
parents:
diff changeset
   337
		iPlayers[index].iId = KNullClientId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   338
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   339
20ac952a623c 201040_02
hgs
parents:
diff changeset
   340
	// Release lock before calling out of player info manager in case
20ac952a623c 201040_02
hgs
parents:
diff changeset
   341
	// anyone needs to call back in - we're finished updating the
20ac952a623c 201040_02
hgs
parents:
diff changeset
   342
	// info now.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   343
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   344
20ac952a623c 201040_02
hgs
parents:
diff changeset
   345
	for(TInt i = 0; i<iObservers.Count(); i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   346
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   347
		iObservers[i]->MpcoAvailablePlayersChanged();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   348
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   349
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   350
20ac952a623c 201040_02
hgs
parents:
diff changeset
   351
MIncomingCommandHandler& CAvrcpPlayerInfoManager::InternalCommandHandler()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   352
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   353
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   354
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   355
20ac952a623c 201040_02
hgs
parents:
diff changeset
   356
	return *iPlayStatusWatcher;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   357
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   358
20ac952a623c 201040_02
hgs
parents:
diff changeset
   359
void CAvrcpPlayerInfoManager::BulkClientAvailable(const TRemConClientId& aId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   360
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   361
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   362
	ASSERT_BULK_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   363
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   364
	TInt index = iPlayers.Find(aId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   365
	if(index < 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   366
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   367
		iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   368
		return;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   369
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   370
	ASSERT(!iPlayers[index].iBulkClientAvailable);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   371
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   372
	TRAPD(err, iUidWatcher->StartWatchingPlayerL(aId));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   373
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   374
	if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   375
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   376
		iPlayers[index].iBulkClientAvailable = ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   377
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   378
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   379
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   380
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   381
20ac952a623c 201040_02
hgs
parents:
diff changeset
   382
void CAvrcpPlayerInfoManager::BulkClientNotAvailable(const TRemConClientId& aId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   383
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   384
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   385
	ASSERT_BULK_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   386
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   387
	TInt index = iPlayers.Find(aId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   388
	if(index >= 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   389
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   390
		ASSERT(iPlayers[index].iBulkClientAvailable);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   391
		iPlayers[index].iBulkClientAvailable = EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   392
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   393
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   394
	iUidWatcher->StopWatchingPlayer(aId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   395
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   396
20ac952a623c 201040_02
hgs
parents:
diff changeset
   397
void CAvrcpPlayerInfoManager::AddObserverL(MPlayerChangeObserver& aObserver)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   398
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   399
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   400
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   401
	iObservers.AppendL(&aObserver);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   402
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   403
20ac952a623c 201040_02
hgs
parents:
diff changeset
   404
void CAvrcpPlayerInfoManager::RemoveObserver(MPlayerChangeObserver& aObserver)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   405
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   406
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   407
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   408
	TInt index = iObservers.Find(&aObserver);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   409
	if(index >= 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   410
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   411
		iObservers.Remove(index);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   412
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   413
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   414
20ac952a623c 201040_02
hgs
parents:
diff changeset
   415
TRemConClientId CAvrcpPlayerInfoManager::ClientL(TUint16 aAvrcpPlayerId) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
   416
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   417
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   418
	// THREAD - Bulk and Control
20ac952a623c 201040_02
hgs
parents:
diff changeset
   419
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   420
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   421
	CleanupSignalPushL(iLock);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   422
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   423
	TRemConClientId clientId = KNullClientId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   424
	if(ValidPlayer(aAvrcpPlayerId))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   425
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   426
		clientId = iPlayers[aAvrcpPlayerId].iId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   427
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   428
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   429
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   430
		LEAVEL(KErrNotFound);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   431
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   432
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   433
	CleanupStack::PopAndDestroy(&iLock);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   434
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   435
	return clientId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   436
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   437
20ac952a623c 201040_02
hgs
parents:
diff changeset
   438
TRemConClientId CAvrcpPlayerInfoManager::Client(TUint16 aAvrcpPlayerId) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
   439
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   440
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   441
	// THREAD - Bulk and Control
20ac952a623c 201040_02
hgs
parents:
diff changeset
   442
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   443
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   444
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   445
	TRemConClientId clientId = KNullClientId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   446
	__ASSERT_DEBUG(ValidPlayer(aAvrcpPlayerId), AvrcpUtils::Panic(EInvalidPlayerId));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   447
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   448
	clientId = iPlayers[aAvrcpPlayerId].iId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   449
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   450
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   451
	return clientId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   452
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   453
20ac952a623c 201040_02
hgs
parents:
diff changeset
   454
TUint16 CAvrcpPlayerInfoManager::PlayerL(const TRemConClientId& aClientId) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
   455
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   456
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   457
	// THREAD - Bulk and Control
20ac952a623c 201040_02
hgs
parents:
diff changeset
   458
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   459
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   460
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   461
	TUint16 player = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   462
	TBool found = EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   463
	for(TInt i = 0; i < iPlayers.Count(); i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   464
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   465
		if(PlayerCompare(&aClientId, iPlayers[i]))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   466
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   467
			player = i;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   468
			found = ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   469
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   470
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   471
20ac952a623c 201040_02
hgs
parents:
diff changeset
   472
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   473
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   474
	if(!found)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   475
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   476
		LEAVEL(KErrNotFound);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   477
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   478
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   479
	return player;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   480
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   481
20ac952a623c 201040_02
hgs
parents:
diff changeset
   482
TInt CAvrcpPlayerInfoManager::PlayerListing(TUint aStartItem, TUint aEndItem, RArray<TUint>& aPlayers)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   483
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   484
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   485
	ASSERT_BULK_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   486
20ac952a623c 201040_02
hgs
parents:
diff changeset
   487
	if(aStartItem > aEndItem)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   488
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   489
		return KErrArgument;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   490
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   491
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   492
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   493
	if(aStartItem >= iPlayers.Count())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   494
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   495
		iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   496
		return KErrArgument;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   497
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   498
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   499
	TInt err = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   500
	for(TUint i = aStartItem; i <= aEndItem && i < iPlayers.Count() && err == KErrNone; i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   501
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   502
		if(iPlayers[i].iId != KNullClientId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   503
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   504
			err = aPlayers.Append(i);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   505
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   506
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   507
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   508
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   509
	return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   510
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   511
20ac952a623c 201040_02
hgs
parents:
diff changeset
   512
TInt CAvrcpPlayerInfoManager::PlayerListing(RArray<TUint>& aPlayers)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   513
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   514
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   515
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   516
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   517
	TInt err = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   518
	for(TInt i = 0; i < iPlayers.Count() && err == KErrNone; i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   519
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   520
		if(iPlayers[i].iId != KNullClientId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   521
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   522
			err = aPlayers.Append(i);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   523
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   524
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   525
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   526
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   527
	return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   528
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   529
20ac952a623c 201040_02
hgs
parents:
diff changeset
   530
void CAvrcpPlayerInfoManager::MediaPlayerItemL(const TUint16& aAvrcpPlayerId, RMediaPlayerItem& aItem)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   531
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   532
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   533
	ASSERT_BULK_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   534
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   535
	CleanupSignalPushL(iLock);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   536
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   537
	if(ValidPlayer(aAvrcpPlayerId))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   538
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   539
		aItem.iType = AvrcpBrowsing::EMediaPlayer;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   540
		aItem.iPlayerId = aAvrcpPlayerId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   541
		aItem.iPlayerType = iPlayers[aAvrcpPlayerId].iPlayerType;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   542
		aItem.iPlayerSubType = iPlayers[aAvrcpPlayerId].iPlayerSubType;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   543
		aItem.iPlayStatus = iPlayers[aAvrcpPlayerId].iPlaybackStatus;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   544
		aItem.iFeatureBitmask = iPlayers[aAvrcpPlayerId].iFeatureBitmask.FeatureBitmask();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   545
		aItem.iCharset = KUtf8MibEnum;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   546
		aItem.iNameLength = iPlayers[aAvrcpPlayerId].iName.Length();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   547
		// Takes a copy of media player name
20ac952a623c 201040_02
hgs
parents:
diff changeset
   548
		aItem.iName.CreateL(iPlayers[aAvrcpPlayerId].iName);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   549
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   550
		aItem.iLength = 28 + aItem.iNameLength;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   551
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   552
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   553
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   554
		LEAVEL(KErrNotFound);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   555
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   556
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   557
	CleanupStack::PopAndDestroy(&iLock);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   558
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   559
20ac952a623c 201040_02
hgs
parents:
diff changeset
   560
TBool CAvrcpPlayerInfoManager::ValidPlayer(const TUint16& aAvrcpPlayerId) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
   561
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   562
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   563
20ac952a623c 201040_02
hgs
parents:
diff changeset
   564
	if(aAvrcpPlayerId >= iPlayers.Count() || iPlayers[aAvrcpPlayerId].iId == KNullClientId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   565
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   566
		return EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   567
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   568
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   569
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   570
		return ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   571
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   572
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   573
20ac952a623c 201040_02
hgs
parents:
diff changeset
   574
TInt CAvrcpPlayerInfoManager::NextPlayerIndex()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   575
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   576
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   577
20ac952a623c 201040_02
hgs
parents:
diff changeset
   578
	TRemConClientId nullId = KNullClientId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   579
	TInt index = iPlayers.Find(nullId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   580
20ac952a623c 201040_02
hgs
parents:
diff changeset
   581
	if(index < 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   582
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   583
		// No gaps to fill, add another item to the player list
20ac952a623c 201040_02
hgs
parents:
diff changeset
   584
		TAvrcpMediaPlayerItem item;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   585
		TInt err = iPlayers.Append(item);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   586
		if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   587
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   588
			index = iPlayers.Count() - 1;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   589
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   590
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   591
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   592
	return index;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   593
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   594
20ac952a623c 201040_02
hgs
parents:
diff changeset
   595
void CAvrcpPlayerInfoManager::MuoUidChanged(TRemConClientId aId, TUint16 aUidCounter)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   596
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   597
	LOG_FUNC;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   598
	ASSERT_BULK_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   599
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   600
	TInt index = iPlayers.Find(aId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   601
	if(index >= 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   602
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   603
		iPlayers[index].iUidCounter = aUidCounter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   604
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   605
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   606
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   607
	iControlThreadCallBack.CallBack();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   608
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   609
20ac952a623c 201040_02
hgs
parents:
diff changeset
   610
void CAvrcpPlayerInfoManager::MuoError(TRemConClientId aId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   611
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   612
	// Narg.  Tell everyone we can't use this player anymore
20ac952a623c 201040_02
hgs
parents:
diff changeset
   613
	BulkClientNotAvailable(aId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   614
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   615
20ac952a623c 201040_02
hgs
parents:
diff changeset
   616
void CAvrcpPlayerInfoManager::MpsoPlayStatusChanged(TRemConClientId aId, MPlayerEventsObserver::TPlaybackStatus aPlaybackStatus)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   617
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   618
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   619
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   620
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   621
	TInt index = iPlayers.Find(aId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   622
	if(index >= 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   623
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   624
		iPlayers[index].iPlaybackStatus = static_cast<MPlayerEventsObserver::TPlaybackStatus>(aPlaybackStatus);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   625
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   626
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   627
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   628
20ac952a623c 201040_02
hgs
parents:
diff changeset
   629
void CAvrcpPlayerInfoManager::MpsoError(TRemConClientId aId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   630
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   631
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   632
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   633
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   634
	TInt index = iPlayers.Find(aId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   635
	if(index >= 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   636
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   637
		iPlayers[index].iPlaybackStatus = MPlayerEventsObserver::EError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   638
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   639
	iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   640
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   641
20ac952a623c 201040_02
hgs
parents:
diff changeset
   642
TUint16 CAvrcpPlayerInfoManager::UidCounterL(const TRemConClientId& aClientId) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
   643
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   644
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   645
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   646
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   647
	CleanupSignalPushL(iLock);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   648
	TUint16 uidCounter = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   649
	TInt index = iPlayers.Find(aClientId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   650
	if(index < 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   651
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   652
		LEAVEL(KErrNotFound);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   653
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   654
	uidCounter = iPlayers[index].iUidCounter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   655
	CleanupStack::PopAndDestroy(&iLock);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   656
	return uidCounter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   657
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   658
20ac952a623c 201040_02
hgs
parents:
diff changeset
   659
TInt CAvrcpPlayerInfoManager::SetPlayerFeatures(const TRemConClientId& aId, TPlayerFeatureBitmask& aBitmask, TUint8& aSdpFeatures, TBool& aAbsoluteVolumeSupported)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   660
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   661
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   662
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   663
20ac952a623c 201040_02
hgs
parents:
diff changeset
   664
	TInt err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   665
	RArray<TUint> operations;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   666
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   667
	aAbsoluteVolumeSupported = EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   668
	aSdpFeatures = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   669
	err = iControlBearerObserver.SupportedOperations(aId, TUid::Uid(KRemConCoreApiUid), operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   670
	if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   671
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   672
		aBitmask.SetCoreApiFeatures(operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   673
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   674
	else if(err != KErrNotSupported)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   675
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   676
		operations.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   677
		return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   678
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   679
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   680
	err = iControlBearerObserver.SupportedOperations(aId, TUid::Uid(KRemConPlayerInformationUid), operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   681
	if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   682
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   683
		aSdpFeatures |= AvrcpSdp::EPlayer;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   684
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   685
	else if(err != KErrNotSupported)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   686
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   687
		operations.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   688
		return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   689
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   690
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   691
	err = iControlBearerObserver.SupportedOperations(aId, TUid::Uid(KRemConGroupNavigationApiUid), operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   692
	if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   693
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   694
		aSdpFeatures |= AvrcpSdp::EGroupNavigation;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   695
		aBitmask.SetGroupNavigationApiFeatures(operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   696
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   697
	else if(err != KErrNotSupported)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   698
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   699
		return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   700
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   701
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   702
	err = iControlBearerObserver.SupportedOperations(aId, TUid::Uid(KRemConAbsoluteVolumeTargetApiUid), operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   703
	if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   704
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   705
		aBitmask.SetAbsoluteVolumeApiFeatures(operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   706
		aAbsoluteVolumeSupported = ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   707
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   708
	else if(err != KErrNotSupported)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   709
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   710
		operations.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   711
		return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   712
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   713
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   714
	err = iControlBearerObserver.SupportedOperations(aId, TUid::Uid(KRemConNowPlayingApiUid), operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   715
	if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   716
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   717
		aBitmask.SetNowPlayingApiFeatures(operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   718
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   719
	else if(err != KErrNotSupported)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   720
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   721
		operations.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   722
		return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   723
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   724
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   725
	err = iControlBearerObserver.SupportedOperations(aId, TUid::Uid(KRemConMediaBrowseApiUid), operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   726
	if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   727
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   728
		aSdpFeatures |= AvrcpSdp::EBrowsing;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   729
		aBitmask.SetMediaBrowseApiFeatures(operations);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   730
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   731
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   732
	operations.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   733
	return err == KErrNotSupported ? KErrNone : err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   734
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   735
20ac952a623c 201040_02
hgs
parents:
diff changeset
   736
void CAvrcpPlayerInfoManager::UpdateTgServiceRecordL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   737
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   738
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   739
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   740
20ac952a623c 201040_02
hgs
parents:
diff changeset
   741
	TUint16 features, avrcpVersion, avctpVersion;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   742
	CurrentTargetVersionAndFeatures(avrcpVersion, avctpVersion, features);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   743
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   744
	AvrcpSdpUtils::UpdateProtocolDescriptorListL(iSdpDatabase, iTargetRecord, avctpVersion);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   745
	if(avrcpVersion == AvrcpSdp::KAvrcpProfileVersion14)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   746
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   747
		AvrcpSdpUtils::UpdateAdditionalProtocolDescriptorListL(iSdpDatabase, iTargetRecord);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   748
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   749
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   750
	AvrcpSdpUtils::UpdateProfileDescriptorListL(iSdpDatabase, iTargetRecord, avrcpVersion);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   751
	AvrcpSdpUtils::UpdateSupportedFeaturesL(iSdpDatabase, iTargetRecord, AvrcpSdp::ERemoteControlTarget, features);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   752
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   753
20ac952a623c 201040_02
hgs
parents:
diff changeset
   754
void CAvrcpPlayerInfoManager::CurrentTargetVersionAndFeatures(TUint16& aAvrcpVersion, TUint16& aAvctpVersion, TUint16& aSdpFeatures)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   755
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   756
	aSdpFeatures = AvrcpSdp::KAvrcpBaseTgFeatures;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   757
	for(TInt i=0; i<iPlayers.Count(); i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   758
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   759
		if(ValidPlayer(i))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   760
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   761
			aSdpFeatures |= iPlayers[i].iSdpFeatures;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   762
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   763
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   764
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   765
	aAvrcpVersion = (aSdpFeatures & AvrcpSdp::EBrowsing) ? AvrcpSdp::KAvrcpProfileVersion14 : AvrcpSdp::KAvrcpProfileVersion13;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   766
	aAvctpVersion = (aAvrcpVersion == AvrcpSdp::KAvrcpProfileVersion14) ? AvrcpSdp::KAvctpProtocolVersion13 : AvrcpSdp::KAvctpProtocolVersion12;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   767
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   768
	// Only indicate support for multiple players if advertising support for AVRCP 1.4
20ac952a623c 201040_02
hgs
parents:
diff changeset
   769
	if(aAvrcpVersion == AvrcpSdp::KAvrcpProfileVersion14)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   770
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   771
		aSdpFeatures |= AvrcpSdp::EMultiplePlayers;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   772
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   773
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   774
20ac952a623c 201040_02
hgs
parents:
diff changeset
   775
void CAvrcpPlayerInfoManager::UidCounterUpdate()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   776
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   777
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   778
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   779
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   780
	for(TInt i=0; i<iPlayers.Count(); i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   781
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   782
		if(ValidPlayer(i))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   783
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   784
			iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   785
			TUint16 currentUidCounter = iPlayers[i].iUidCounter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   786
			TUint16 lastUpdate = iPlayers[i].iLastUpdatedUidCounter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   787
			iPlayers[i].iLastUpdatedUidCounter = currentUidCounter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   788
			TRemConClientId clientId = iPlayers[i].iId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   789
			iLock.Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   790
			
20ac952a623c 201040_02
hgs
parents:
diff changeset
   791
			if(currentUidCounter != lastUpdate)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   792
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   793
				for(TInt j=0; j<iObservers.Count(); j++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   794
					{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   795
					// Observer can request most up to date value if it wants it
20ac952a623c 201040_02
hgs
parents:
diff changeset
   796
					iObservers[j]->MpcoUidCounterChanged(clientId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   797
					}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   798
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   799
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   800
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   801
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   802
20ac952a623c 201040_02
hgs
parents:
diff changeset
   803
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   804
If the client ID is set to a valid ID then we shall return the support
20ac952a623c 201040_02
hgs
parents:
diff changeset
   805
status for the specific player referenced by the ID.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   806
Otherwise we shall return generic support which will indicate support across
20ac952a623c 201040_02
hgs
parents:
diff changeset
   807
the device.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   808
@return whether absolute volume control is supported either by the specific player
20ac952a623c 201040_02
hgs
parents:
diff changeset
   809
associated with a client ID, or generally by the device if an invalid client ID is
20ac952a623c 201040_02
hgs
parents:
diff changeset
   810
provided.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   811
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   812
TBool CAvrcpPlayerInfoManager::AbsoluteVolumeSupportedL(const TRemConClientId& aClientId) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
   813
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   814
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   815
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   816
20ac952a623c 201040_02
hgs
parents:
diff changeset
   817
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   818
	CleanupSignalPushL(iLock);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   819
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   820
	TBool supported = EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   821
	// If we receive a "NULL" client ID then it means that we should 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   822
	// return whether abs vol is generically supported by the device.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   823
	if(aClientId == KNullClientId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   824
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   825
		// Try to find the first player supporting abs vol, if there is one then it is supported 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   826
		TInt index = iPlayers.Find(EFirstAbsVolSupport, FirstAbsVolSupport);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   827
		supported = (index >= 0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   828
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   829
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   830
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   831
		// The abs vol support for a specific player is required, so return that.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   832
		TInt index = iPlayers.Find(aClientId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   833
		if(index < 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   834
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   835
			LEAVEL(KErrNotFound);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   836
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   837
		supported = iPlayers[index].iAbsoluteVolumeSupport;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   838
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   839
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   840
	CleanupStack::PopAndDestroy(&iLock);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   841
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   842
	return supported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   843
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   844
20ac952a623c 201040_02
hgs
parents:
diff changeset
   845
TBool CAvrcpPlayerInfoManager::BrowsingSupportedL(const TRemConClientId& aClientId) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
   846
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   847
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   848
	ASSERT_CONTROL_THREAD
20ac952a623c 201040_02
hgs
parents:
diff changeset
   849
20ac952a623c 201040_02
hgs
parents:
diff changeset
   850
	iLock.Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   851
	CleanupSignalPushL(iLock);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   852
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   853
	TBool supported = EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   854
	// If we receive a "NULL" client ID then it means that we should 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   855
	// return whether browsing is generically supported by the device.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   856
	if(aClientId == KNullClientId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   857
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   858
		// Try to find the first player supporting browsing, if there is one then it is supported 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   859
		TInt index = iPlayers.Find(EFirstBrowsingSupport, FirstBrowsingSupport);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   860
		supported = (index >= 0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   861
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   862
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   863
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   864
		// The browsing support for a specific player is required, so return that.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   865
		TInt index = iPlayers.Find(aClientId, PlayerCompare);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   866
		if(index < 0)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   867
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   868
			LEAVEL(KErrNotFound);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   869
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   870
		supported = iPlayers[index].iSdpFeatures & AvrcpSdp::EBrowsing;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   871
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   872
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   873
	CleanupStack::PopAndDestroy(&iLock);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   874
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   875
	return supported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   876
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   877
20ac952a623c 201040_02
hgs
parents:
diff changeset
   878
TInt CAvrcpPlayerInfoManager::PlayerUpdateCallBack(TAny* aPlayerInfoMgr)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   879
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   880
	static_cast<CAvrcpPlayerInfoManager*>(aPlayerInfoMgr)->UidCounterUpdate();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   881
	return KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   882
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   883