diff -r a2b50a479edf -r 6df133bd92e1 radioengine/utils/src/cradioaccessoryobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/radioengine/utils/src/cradioaccessoryobserver.cpp Fri Jun 04 10:21:36 2010 +0100 @@ -0,0 +1,357 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// User includes +#include "cradioaccessoryobserver.h" +#include "mradioheadseteventobserver.h" +#include "cradioenginelogger.h" + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CRadioAccessoryObserver::CRadioAccessoryObserver() + : CActive( CActive::EPriorityStandard ) + { + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CRadioAccessoryObserver::ConstructL() + { + LOG_METHOD_AUTO; + User::LeaveIfError( iAccessoryServer.Connect() ); + + // Creates a new sub-session within an existing session. + User::LeaveIfError( iAccessoryConn.CreateSubSession( iAccessoryServer ) ); + User::LeaveIfError( iAccessoryConn.GetAccessoryConnectionStatus( iAccPolGenIdArr ) ); + + TInt nroChangedAccessories( 0 ); + UpdateCurrentAccessoriesL( nroChangedAccessories ); + LOG_FORMAT( "CRadioAccessoryObserver::ConstructL() -- Found %d wired/BT accessories ( %d accessories in total ).", + nroChangedAccessories, iAccPolGenIdArr.Count() ); + CActiveScheduler::Add( this ); + // Accessory is always listened + iAccessoryConn.NotifyAccessoryConnectionStatusChanged( iStatus, iAccPolGenIdArr ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CRadioAccessoryObserver* CRadioAccessoryObserver::NewL() + { + CRadioAccessoryObserver* self = new( ELeave ) CRadioAccessoryObserver; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CRadioAccessoryObserver::~CRadioAccessoryObserver() + { + Cancel(); + iAccessoryConn.CloseSubSession(); + iAccessoryServer.Close(); + iSavedAccessories.Close(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CRadioAccessoryObserver::FindAccessoryL( TBool aAcceptOnlyHeadset, TAccAudioOutPutType& aOutputType ) const + { +#ifdef __WINS__ + TBool accessoryFound = ETrue; + aAcceptOnlyHeadset = ETrue; + aOutputType = EAccAudioOutPutTypePrivate; +#else + TBool accessoryFound = EFalse; + + LOG_FORMAT( "CRadioAccessoryObserver::FindAccessoryL - Connected accessories count = %d", iAccPolGenIdArr.Count()); + for ( TInt i = 0; i < iAccPolGenIdArr.Count() && !accessoryFound; i++ ) + { + TAccPolGenericID accPolGenId = iAccPolGenIdArr.GetGenericIDL( i ); + + //Check if physical connection is of acceptable type + TUint32 physicalConnectionCaps = accPolGenId.PhysicalConnectionCaps(); + if ( physicalConnectionCaps & KPCWired || physicalConnectionCaps & KPCBluetooth ) + { + LOG_FORMAT( "CRadioAccessoryObserver::FindAccessoryL - is wired or BT ( physicalConnectionCaps = %d )", physicalConnectionCaps ); + + if ( !aAcceptOnlyHeadset ) + { + accessoryFound = ETrue; + } + //Get device type ( check if is HeadSet ) + TUint32 deviceType = accPolGenId.DeviceTypeCaps(); + if ( deviceType & KDTHeadset ) + { + LOG_FORMAT( "CRadioAccessoryObserver::FindAccessoryL - is HeadSet( deviceType = %d )", deviceType ); + if ( !IsLineoutConnectedL( accPolGenId ) ) + { + LOG( "CRadioAccessoryObserver::FindAccessoryL - Is a normal headSet" ); + accessoryFound = ETrue; + } + } + else if ( deviceType & KDTLoopset ) + { + LOG_FORMAT( "CRadioAccessoryObserver::FindAccessoryL - is Loopset( deviceType = %d )", deviceType ); + accessoryFound = ETrue; + } + else + { + LOG_FORMAT( "CRadioAccessoryObserver::FindWiredAccessoryL - is NOT HeadSet or Loopset( deviceType = %d )", deviceType ); + } + + if ( accessoryFound ) + { + // get the public/private status + TAccPolNameRecord nameRecord; + nameRecord.SetNameL( KAccAudioOutputType ); + + TAccValueTypeTInt audioOutputTypeValue; + iAccessoryConn.GetValueL( accPolGenId, nameRecord, audioOutputTypeValue ); + + aOutputType = static_cast( audioOutputTypeValue.iValue ); + LOG_FORMAT( "CRadioAccessoryObserver::FindAccessoryL - AudioOutputType = %d", aOutputType ); + } + } + else + { + LOG_FORMAT( "CRadioAccessoryObserver::FindAccessoryL - is NOT wired or BT ( physicalConnectionCaps = %d )", physicalConnectionCaps ); + } + } +#endif + return accessoryFound; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CRadioAccessoryObserver::IsHeadsetConnectedL() const + { + TAccAudioOutPutType audioOutputType( EAccAudioOutPutTypePrivate ); + return FindAccessoryL( ETrue , audioOutputType ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CRadioAccessoryObserver::IsLineoutConnectedL( TAccPolGenericID& aAccPolGenId ) const + { + TBool isLineOut( EFalse ); + + CAccPolSubblockNameArray* nameArray = CAccPolSubblockNameArray::NewL(); + CleanupStack::PushL( nameArray ); + iAccessoryConn.GetSubblockNameArrayL( aAccPolGenId, *nameArray ); + + TBool isAudioOutValue = nameArray->HasName( KAccAudioOut ); + CleanupStack::PopAndDestroy( nameArray ); + if ( isAudioOutValue ) + { + LOG_FORMAT( "CRadioAccessoryObserver::IsLineoutConnectedL - isAudioOutValue = ( %d )", isAudioOutValue ); + + TAccPolNameRecord nameRecord; + nameRecord.SetNameL( KAccAudioOut ); + + //Check if connected accessory is LineOut + TAccValueTypeTInt audioOutValue; + iAccessoryConn.GetValueL( aAccPolGenId, nameRecord, audioOutValue ); + + LOG( "CRadioAccessoryObserver::IsLineoutConnectedL - GetValueL() - OK" ); + if ( TAccAudioOutLineout == audioOutValue.iValue ) + { + //is lineout + LOG_FORMAT( "CRadioAccessoryObserver::IsLineoutConnectedL - Accessory is LineOut( audioOutValue = %d )", audioOutValue.iValue ); + isLineOut = ETrue; + } + } + return isLineOut; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CRadioAccessoryObserver::UpdateCurrentAccessoriesL( TInt& aNroChangedAccessories ) + { + // first check, the removed accessories. + TInt removedAccessories = CountRemovedAccessoriesL(); + LOG_FORMAT( "CRadioAccessoryObserver::UpdateCurrentAccessoriesL() -- %d accessories removed.", removedAccessories ); + aNroChangedAccessories += removedAccessories; + TInt addedAccessories = CountAddedAccessoriesL(); + LOG_FORMAT( "CRadioAccessoryObserver::UpdateCurrentAccessoriesL() -- %d accessories added.", addedAccessories ); + aNroChangedAccessories += addedAccessories; + + iSavedAccessories.Reset(); + + for ( TInt i = 0; i < iAccPolGenIdArr.Count(); i++ ) + { + iSavedAccessories.AppendL( iAccPolGenIdArr.GetGenericIDL( i ) ); + LOG_FORMAT( "CRadioAccessoryObserver::UpdateCurrentAccessoriesL() -- accessory in slot %d: %d", + i, iAccPolGenIdArr.GetGenericIDL( i ).UniqueID() ); + } + LOG_FORMAT( "CRadioAccessoryObserver::UpdateCurrentAccessoriesL() -- %d accessories in total.", iSavedAccessories.Count() ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CRadioAccessoryObserver::CountRemovedAccessoriesL() const + { + TInt removedAccessories( 0 ); + + for ( TInt i = 0; i < iSavedAccessories.Count(); i++ ) + { + TAccPolGenericID savedAcc = iSavedAccessories[i]; + + TUint32 physicalConnectionCaps = savedAcc.PhysicalConnectionCaps(); + + if ( physicalConnectionCaps & KPCWired || physicalConnectionCaps & KPCBluetooth ) + { + TBool found( EFalse ); + + for ( TInt j = 0; j < iAccPolGenIdArr.Count() && !found; j++ ) + { + TAccPolGenericID freshAcc = iAccPolGenIdArr.GetGenericIDL( j ); + if ( freshAcc.UniqueID() == savedAcc.UniqueID() ) + { + LOG_FORMAT( "CRadioAccessoryObserver::CountRemovedAccessoriesL() -- Accessory with id = %d found.", savedAcc.UniqueID() ); + found = ETrue; + } + } + if ( !found ) + { + LOG_FORMAT( "CRadioAccessoryObserver::CountRemovedAccessoriesL() -- Accessory with id = %d removed.", savedAcc.UniqueID() ); + removedAccessories++; + } + } + } + return removedAccessories; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CRadioAccessoryObserver::CountAddedAccessoriesL() const + { + TInt addedAccessories( 0 ); + + for ( TInt i = 0; i < iAccPolGenIdArr.Count(); i++ ) + { + TAccPolGenericID freshAcc = iAccPolGenIdArr.GetGenericIDL( i ); + + TUint32 physicalConnectionCaps = freshAcc.PhysicalConnectionCaps(); + + if ( physicalConnectionCaps & KPCWired || physicalConnectionCaps & KPCBluetooth ) + { + TBool found( EFalse ); + + for ( TInt j = 0; j < iSavedAccessories.Count() && !found; j++ ) + { + TAccPolGenericID savedAcc = iSavedAccessories[j]; + if ( savedAcc.UniqueID() == freshAcc.UniqueID() ) + { + LOG_FORMAT( "CRadioAccessoryObserver::CountAddedAccessoriesL() -- Accessory with id = %d found.", freshAcc.UniqueID() ); + found = ETrue; + } + } + if ( !found ) + { + LOG_FORMAT( "CRadioAccessoryObserver::CountAddedAccessoriesL() -- Accessory with id = %d added.", freshAcc.UniqueID() ); + addedAccessories++; + } + } + } + return addedAccessories; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CRadioAccessoryObserver::SetObserver( MRadioHeadsetEventObserver* aObserver ) + { + iObserver = aObserver; + } + +// --------------------------------------------------------------------------- +// From class CActive +// +// --------------------------------------------------------------------------- +// +void CRadioAccessoryObserver::RunL() + { + TRequestStatus status = iStatus; + iAccessoryConn.NotifyAccessoryConnectionStatusChanged( iStatus, iAccPolGenIdArr ); + + SetActive(); + + TInt nroChangedAccessories( 0 ); + UpdateCurrentAccessoriesL( nroChangedAccessories ); + + if ( status == KErrNone && nroChangedAccessories != 0 ) + { + TAccAudioOutPutType audioOutputType( EAccAudioOutPutTypePrivate ); + + if ( FindAccessoryL( EFalse, audioOutputType ) ) + { + // Accessory mode may change when combined connection status changes + // or when audio routing status changes. + if ( audioOutputType == EAccAudioOutPutTypePrivate ) + { + LOG( "CRadioAccessoryObserver::RunL - Headset connected" ); + iObserver->HeadsetConnectedCallbackL(); + } + else + { + LOG( "CRadioAccessoryObserver::RunL - Public wired or BT accessory connected." ); + iObserver->HeadsetDisconnectedCallbackL(); + } + } + else + { + LOG( "CRadioAccessoryObserver::RunL - No wired or BT accessories available" ); + iObserver->HeadsetDisconnectedCallbackL(); + } + } + } + + +// --------------------------------------------------------------------------- +// From class CActive +// +// --------------------------------------------------------------------------- +// +void CRadioAccessoryObserver::DoCancel() + { + iAccessoryConn.CancelNotifyAccessoryConnectionStatusChanged(); + }