diff -r 000000000000 -r f63038272f30 bluetoothengine/btsac/src/btsacStateSuspended.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btsac/src/btsacStateSuspended.cpp Mon Jan 18 20:28:57 2010 +0200 @@ -0,0 +1,259 @@ +/* +* Copyright (c) 2002-2005 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: In this state, BTSAC is waiting for open audio request. +* +*/ + + + + +// INCLUDE FILES +#include "btsacStateSuspended.h" +#include "btsacStateListening.h" +#include "btsacStateStreaming.h" +#include "btsacStateConnected.h" +#include "btsacStateAborting.h" +#include "btsacactive.h" +#include "btsacSEPManager.h" +#include "btsacStreamerController.h" +#include "btsacGavdp.h" +#include "debug.h" +#include +#include "btaudioremconpskeys.h" + +// A2DP codec-specific element definitions +// in bluetoothAV.h +using namespace SymbianBluetoothAV; + + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::NewL +// ----------------------------------------------------------------------------- +// +CBtsacSuspended* CBtsacSuspended::NewL(CBTSAController& aParent) + { + CBtsacSuspended* self = new( ELeave ) CBtsacSuspended(aParent); + return self; + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::CBtsacSuspended +// ----------------------------------------------------------------------------- +// +CBtsacSuspended::CBtsacSuspended(CBTSAController& aParent) +: CBtsacState(aParent, EStateSuspended), iOpenAudioReq(EFalse) + { + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::~CBtsacSuspended +// ----------------------------------------------------------------------------- +// +CBtsacSuspended::~CBtsacSuspended() + { + TRACE_FUNC + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::EnterL +// ----------------------------------------------------------------------------- +// +void CBtsacSuspended::EnterL() + { + TRACE_STATE(_L("[BTSAC State] Suspended")) + _LIT(KName, "CBtsacStateSuspended"); + const TDesC& Name = KName; + Parent().iGavdp->RegisterObserver(this, Name); + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::CancelActionL +// ----------------------------------------------------------------------------- +// +void CBtsacSuspended::CancelActionL(TInt aError, TBTSACGavdpResetReason aGavdpReset) + { + TRACE_FUNC + Parent().CompletePendingRequests(KOpenAudioReq, aError); + Parent().ChangeStateL(CBtsacListening::NewL(Parent(), aGavdpReset, aError)); + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::OpenAudioLinkL +// ----------------------------------------------------------------------------- +// +void CBtsacSuspended::OpenAudioLinkL(const TBTDevAddr& aAddr) + { + TRACE_FUNC + TAvdtpSEPInfo SEPInfo; + if (Parent().iRemoteSEPs->GetInfo(Parent().GetSEPIndex(), SEPInfo) || (aAddr != Parent().GetRemoteAddr())) + { + TRACE_INFO((_L("CBtsacSuspended::OpenAudioLinkL() Couldn't retrieve SEP Info!"))) + Parent().CompletePendingRequests(KOpenAudioReq, KErrGeneral); + return; + } + iOpenAudioReq = ETrue; + Parent().SetRemoteAddr(aAddr); + TSEID remoteSEPid = SEPInfo.SEID(); + Parent().iGavdp->StartStreams(remoteSEPid); + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::CancelOpenAudioL +// ----------------------------------------------------------------------------- +// +void CBtsacSuspended::CancelOpenAudioL(const TBTDevAddr& /*aAddr*/) + { + TRACE_FUNC + CancelActionL(KErrCancel, EGavdpResetReasonGeneral); + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::DisconnectL +// ----------------------------------------------------------------------------- +// +void CBtsacSuspended::DisconnectL() + { + TRACE_FUNC + Parent().CompletePendingRequests(KDisconnectReq, KErrNone); + CancelActionL(KErrCancel, EGavdpResetReasonGeneral); + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::GAVDP_StartStreamsConfirm() +// ----------------------------------------------------------------------------- +// +void CBtsacSuspended::GAVDP_StartStreamsConfirm() + { + TRACE_FUNC + if ( Parent().iStreamer->StartStream(Parent().iStreamingSockets[0], Parent().iStreamer->FrameLength()) != KErrNone ) + { + TRACE_INFO((_L("CBtsacSuspended::GAVDP_StartStreamsConfirm() [ERR] Could not start streaming!"))) + TInt err = Parent().AbortStream(); + if(err) + { + TRACE_INFO((_L("CBtsacSuspended::GAVDP_StartStreamsConfirm() Couldn't abort stream."))) + } + TRAP_IGNORE(CancelActionL(KErrCancel, EGavdpResetReasonGeneral)); + } + else + { + Parent().CompletePendingRequests(KOpenAudioReq, KErrNone); + TRAP_IGNORE(Parent().ChangeStateL(CBtsacStreaming::NewL(Parent(), EAudioOpenedByAFW, EFalse))); + } + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::GAVDP_StartIndication +// ----------------------------------------------------------------------------- +// +TInt CBtsacSuspended::GAVDP_StartIndication(TSEID aLocalSEID) + { + TRACE_INFO((_L("CBtsacSuspended::GAVDP_StartIndication() aLocalSEID: %d"), aLocalSEID.SEID())) + (void)aLocalSEID; + // Accessory has send this indication. + // TStateStreaming state can use this indication to start audio automatically then later. + RProperty::Set(KBTAudioRemCon, KBTAudioPlayerControl, EBTAudioResumePlayer); + TRAPD(err, Parent().ChangeStateL(CBtsacStreaming::NewL(Parent(), EAudioOpenedByAcc, EFalse))); + if(err) + { + return KErrNoMemory; + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::GAVDP_ReleaseIndication +// ----------------------------------------------------------------------------- +// +void CBtsacSuspended::GAVDP_ReleaseIndication(TSEID aSEID) + { + TRACE_INFO((_L("CBtsacSuspended::GAVDP_ReleaseIndication() aSEID:%d"), aSEID.SEID())) + (void)aSEID; + Parent().AccessoryClosedAudio(Parent().GetRemoteAddr()); + Parent().CleanSockets(); + Parent().CompletePendingRequests(KOpenAudioReq, KErrCancel); + TRAP_IGNORE(Parent().ChangeStateL(CBtsacConnected::NewL(Parent(), EConnExists))); + } + +// ----------------------------------------------------------------------------- +// CBtsacSuspended::HandleGavdpErrorL +// ----------------------------------------------------------------------------- +// +void CBtsacSuspended::HandleGavdpErrorL(TInt aError) + { + TRACE_FUNC + TInt err = KErrNone; + + switch (aError) + { + case KErrAvdtpRequestTimeout: // -18005 + { + TRACE_INFO((_L("CBtsacSuspended::HandleGavdpErrorL() Request TIMEOUT"))) + err = Parent().AbortStream(); + if(!err) + { + // Complete pending request(s) in Aborting state + Parent().ChangeStateL(CBtsacAborting::NewL(Parent())); + } + else + { + CancelActionL(KErrDisconnected, EGavdpResetReasonGeneral); + } + break; + } + case (KErrAvdtpSignallingErrorBase - EAvdtpBadState): // -18094 + { + if(iOpenAudioReq) + { + err = Parent().AbortStream(); + if(!err) + { + // Complete Audio request in Aborting state + Parent().ChangeStateL(CBtsacAborting::NewL(Parent())); + } + else + { + CancelActionL(KErrDisconnected, EGavdpResetReasonGeneral); + } + } + else + { + // For some reason remote rejected our suspend command (which was initiated in streaming state). + // According to the specification it is acceptor's responsibilty to cope with this situation, + // so we can stay in suspended state. + // For safety's sake complete close audio request if any. + Parent().CompletePendingRequests(KCloseAudioReq, KErrNone); + } + break; + } + case KErrHCILinkDisconnection: // -6305 + case KErrDisconnected: // -36 + { + TRACE_INFO((_L("CBtsacSuspended::HandleGavdpErrorL() Signalling disconnected."))) + CancelActionL(aError, EGavdpResetReasonNone); + break; + } + default: + { + // Unknown error. For safety's sake let's disconnect a2dp link and inform btaudioman + TRACE_INFO((_L("CBtsacSuspended::HandleGavdpErrorL() Unknown error, goes to listening"))) + CancelActionL(KErrDisconnected, EGavdpResetReasonGeneral); + break; + } + } + } + +// End of File