diff -r 65a3ef1d5bd0 -r f742655b05bf sipvoipprovider/svphold/src/svpholdmediahandler.cpp --- a/sipvoipprovider/svphold/src/svpholdmediahandler.cpp Thu Aug 19 09:45:22 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,491 +0,0 @@ -/* -* Copyright (c) 2006-2008 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: Pauses and resumes audio stream. -* -*/ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "svpholdcontext.h" -#include "svpholdmediahandler.h" -#include "svplogger.h" -#include "svpaudioutility.h" - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::CSVPHoldMediaHandler -// --------------------------------------------------------------------------- -// -CSVPHoldMediaHandler::CSVPHoldMediaHandler() - { - } - - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::NewL -// --------------------------------------------------------------------------- -// -CSVPHoldMediaHandler* CSVPHoldMediaHandler::NewL() - { - CSVPHoldMediaHandler* self = new ( ELeave ) CSVPHoldMediaHandler; - return self; - } - - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::~CSVPHoldMediaHandler -// --------------------------------------------------------------------------- -// -CSVPHoldMediaHandler::~CSVPHoldMediaHandler() - { - } - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::PerformMediaActionL -// --------------------------------------------------------------------------- -// -void CSVPHoldMediaHandler::PerformMediaActionL( CMceMediaStream& aMediaStream, - TSVPHoldRequestType aRequest ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::PerformMediaActionL - IN" ); - - CMceMediaStream& boundStream = aMediaStream.BoundStreamL(); - - // Always set the priorites because MCE/MCC must have those correctly - // all the time. This is due to the fact that we may do session update - // later and then the priority settings need to be correct. - SVPAudioUtility::SetAudioStreamPrioritiesL( aMediaStream, boundStream ); - - switch ( aRequest ) - { - case ESVPLocalHold: - case ESVPLocalDoubleHold: - { - HandleLocalHoldingL( aMediaStream, boundStream ); - break; - } - - case ESVPLocalResume: - case ESVPLocalDoubleHoldResume: - { - HandleLocalResumingL( aMediaStream, boundStream, aRequest ); - break; - } - - case ESVPRemoteHold: - case ESVPRemoteDoubleHold: - { - HandleRemoteHoldingL( aMediaStream, boundStream, aRequest ); - break; - } - - case ESVPRemoteResume: - case ESVPRemoteDoubleHoldResume: - { - HandleRemoteResumingL( aMediaStream, boundStream, aRequest ); - break; - } - - default: - { - SVPDEBUG1( "CSVPHoldMediaHandler::PerformMediaActionL: Leave" ); - User::Leave( KErrNotFound ); - } - } - SVPDEBUG1( "CSVPHoldMediaHandler::PerformMediaActionL - Out" ); - } - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::HandleLocalHoldingL -// --------------------------------------------------------------------------- -// -void CSVPHoldMediaHandler:: -HandleLocalHoldingL( CMceMediaStream& aMediaStream, - CMceMediaStream& aBoundStream ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::HandleLocalHoldingL - In" ); - - // In case of local hold RTP source must be disabled - if ( aMediaStream.Source() && - KMceRTPSource == aMediaStream.Source()->Type() ) - { - aMediaStream.DisableL(); - } - else if ( aBoundStream.Source() && - KMceRTPSource == aBoundStream.Source()->Type() ) - { - aBoundStream.DisableL(); - } - else - { - SVPDEBUG1( "CSVPHoldMediaHandler::HandleLocalHoldingL:" ); - SVPDEBUG1( "Local hold: No stream - User::Leave" ); - User::Leave( KErrNotFound ); - } - - SVPDEBUG1( "CSVPHoldMediaHandler::HandleLocalHoldingL - Out" ); - } - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::HandleLocalResumingL -// --------------------------------------------------------------------------- -// -void CSVPHoldMediaHandler:: -HandleLocalResumingL( CMceMediaStream& aMediaStream, - CMceMediaStream& aBoundStream, - TSVPHoldRequestType aRequest ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::HandleLocalResumingL - In" ); - - switch ( aRequest ) - { - case ESVPLocalResume: - { - // In case of local resume disabled stream must be enabled - SVPDEBUG1( "CSVPHoldMediaHandler::HandleLocalResumingL - LocalResume" ); - if ( !aBoundStream.IsEnabled() ) - { - aBoundStream.EnableL(); - } - - if ( !aMediaStream.IsEnabled() ) - { - aMediaStream.EnableL(); - } - - break; - } - - case ESVPLocalDoubleHoldResume: - { - // In case of localDH resume RTP source must be enabled - if ( KMceRTPSource == aMediaStream.Source()->Type() ) - { - aMediaStream.EnableL(); - } - - else if ( KMceRTPSource == aBoundStream.Source()->Type() ) - { - aBoundStream.EnableL(); - } - - else - { - SVPDEBUG1( "CSVPHoldMediaHandler::HandleLocalResumingL:" ); - SVPDEBUG1( "Local DH resume: No stream - User::Leave" ); - User::Leave( KErrNotFound ); - } - - break; - } - - default: - { - User::Leave( KErrNotFound ); - } - } - - SVPDEBUG1( "CSVPHoldMediaHandler::HandleLocalResumingL - Out" ); - } - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::HandleRemoteHoldingL -// --------------------------------------------------------------------------- -// -void CSVPHoldMediaHandler:: -HandleRemoteHoldingL( CMceMediaStream& aMediaStream, - CMceMediaStream& aBoundStream, - TSVPHoldRequestType aRequest ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::HandleRemoteHoldingL - In" ); - - // In case of remote hold RTP sink must be disabled - if ( KMceRTPSource == aMediaStream.Source()->Type() ) - { - aBoundStream.DisableL(); - if ( ESVPRemoteDoubleHold == aRequest ) - { - aMediaStream.DisableL(); - } - } - - else if ( KMceRTPSource == aBoundStream.Source()->Type() ) - { - aMediaStream.DisableL(); - if ( ESVPRemoteDoubleHold == aRequest ) - { - aBoundStream.DisableL(); - } - } - - else - { - SVPDEBUG1( "CSVPHoldMediaHandler::HandleRemoteHoldingL:" ); - SVPDEBUG1( "Remote hold: No stream - User::Leave" ); - User::Leave( KErrNotFound ); - } - - SVPDEBUG1( "CSVPHoldMediaHandler::HandleRemoteHoldingL - Out" ); - } - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::HandleRemoteResumingL -// --------------------------------------------------------------------------- -// -void CSVPHoldMediaHandler:: -HandleRemoteResumingL( CMceMediaStream& aMediaStream, - CMceMediaStream& aBoundStream, - TSVPHoldRequestType aRequest ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::HandleRemoteResumingL - In" ) - - switch ( aRequest ) - { - case ESVPRemoteResume: - { - SVPDEBUG2( "CSVPHoldMediaHandler::HandleRemoteResumingL aBound ena: %d", - aBoundStream.IsEnabled() ) - - SVPDEBUG2( "CSVPHoldMediaHandler::HandleRemoteResumingL aMedia ena: %d", - aMediaStream.IsEnabled() ) - - // In case of remote resume disabled stream(s) must be enabled - if ( !aBoundStream.IsEnabled() ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::HandleRemoteResumingL RR 1st ena/dis" ) - - aBoundStream.EnableL(); - aMediaStream.DisableL(); - } - - if ( !aMediaStream.IsEnabled() ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::HandleRemoteResumingL RR 2nd ena/dis" ) - - aMediaStream.EnableL(); - aBoundStream.DisableL(); - } - - break; - } - - case ESVPRemoteDoubleHoldResume: - { - // In case of remoteDH resume RTP sink must be enabled - if ( KMceRTPSource == aMediaStream.Source()->Type() ) - { - aBoundStream.EnableL(); - aMediaStream.DisableL(); - } - - else if ( KMceRTPSource == aBoundStream.Source()->Type() ) - { - aMediaStream.EnableL(); - aBoundStream.DisableL(); - } - - else - { - SVPDEBUG1( "CSVPHoldMediaHandler::HandleRemoteResumingL:" ); - SVPDEBUG1( "Remote DH resume: No stream - User::Leave" ); - User::Leave( KErrNotFound ); - } - - break; - } - - default: - { - User::Leave( KErrNotFound ); - } - } - - SVPDEBUG1( "CSVPHoldMediaHandler::HandleRemoteResumingL - Out" ) - } - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::DisableAudioL -// --------------------------------------------------------------------------- -// -void CSVPHoldMediaHandler::DisableAudioL( CSVPHoldContext& aContext, - TBool aLeaveSpeakerEnabled ) - { - if ( aContext.AudioHandlingAllowed() ) - { - // Disable speaker & microphone - SVPDEBUG1( "CSVPHoldMediaHandler::DisableAudioL - Disabling audio..." ); - CMceSession* session = aContext.SessionObject(); - const RPointerArray< CMceMediaStream >& streams = session->Streams(); - TInt streamCount = streams.Count(); - for ( TInt i = 0; i < streamCount; i++ ) - { - CMceMediaStream* mediaStream = streams[ i ]; - TMceMediaType mediaType = mediaStream->Type(); - if ( KMceAudio == mediaType ) - { - TSVPHoldRequestType request = aContext.HoldRequest(); - - CMceMediaStream& boundStream = mediaStream->BoundStreamL(); - DisableAudioStreamL( boundStream, aLeaveSpeakerEnabled ); - DisableAudioStreamL( *mediaStream, aLeaveSpeakerEnabled ); - SVPDEBUG1( "CSVPHoldMediaHandler::DisableAudioL - Audio disabled" ); - } - } - } - } - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::DisableAudioStreamL -// --------------------------------------------------------------------------- -// -void CSVPHoldMediaHandler::DisableAudioStreamL( CMceMediaStream& aAudioStream, - TBool aLeaveSpeakerEnabled ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::DisableAudioL - In" ); - - SVPAudioUtility::DisableMicSourceL( aAudioStream ); - if ( !aLeaveSpeakerEnabled ) - { - SVPAudioUtility::DisableSpeakerSinkL( aAudioStream.Sinks() ); - } - - SVPDEBUG1( "CSVPHoldMediaHandler::DisableAudioL - Out" ); - } - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::EnableAudioL -// --------------------------------------------------------------------------- -// -void CSVPHoldMediaHandler::EnableAudioL( CSVPHoldContext& aContext ) - { - if ( aContext.AudioHandlingAllowed() ) - { - // Enable speaker & microphone - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioL - Enabling audio..." ); - - const RPointerArray< CMceMediaStream >& streams = - aContext.SessionObject()->Streams(); - const TInt streamCount = streams.Count(); - for ( TInt i = 0; i < streamCount; i++ ) - { - CMceMediaStream* mediaStream = streams[ i ]; - if ( KMceAudio == mediaStream->Type() ) - { - EnableAudioL( *mediaStream, aContext ); - } - } - } - } - - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::EnableAudioL (private) -// --------------------------------------------------------------------------- -// -void CSVPHoldMediaHandler::EnableAudioL( CMceMediaStream& aMediaStream, - CSVPHoldContext& aContext ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioL - Audio enabled In" ); - - TBool muted = aContext.Muted(); - TBool mobileOriginated = aContext.IsMobileOriginated(); - - // Now enable the audio streams. - if ( !muted ) - { - // Normal case, audio not muted - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioL - no mute" ); - EnableAudioStreamL( aMediaStream.BoundStreamL() ); - EnableAudioStreamL( aMediaStream ); - } - - else - { - // Enabling depends on the direction of muted stream - if ( mobileOriginated || aContext.IsRemoteRequest() ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioL - Bound" ); - EnableAudioStreamL( aMediaStream.BoundStreamL(), EFalse ); - EnableAudioStreamL( aMediaStream, EFalse ); - // Make sure that mic is disabled - SVPAudioUtility::DisableMicSourceL( *( aMediaStream.Source() ) ); - SVPAudioUtility::DisableMicSourceL( *( aMediaStream.BoundStreamL(). - Source() ) ); - } - else - { - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioL - Main" ); - EnableAudioStreamL( aMediaStream, EFalse ); - EnableAudioStreamL( aMediaStream.BoundStreamL(), EFalse ); - // Make sure that mic is disabled - SVPAudioUtility::DisableMicSourceL( aMediaStream ); - SVPAudioUtility::DisableMicSourceL( aMediaStream.BoundStreamL() ); - } - } - - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioL - Audio enabled Out" ); - } - - -// --------------------------------------------------------------------------- -// CSVPHoldMediaHandler::EnableAudioStreamL -// --------------------------------------------------------------------------- -// -void CSVPHoldMediaHandler::EnableAudioStreamL( CMceMediaStream& aAudioStream, - TBool aAllowMicEnable ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioStreamL - In" ); - - - const RPointerArray< CMceMediaSink >& sinks = aAudioStream.Sinks(); - TInt snkCount( sinks.Count() ); - - // Go throug every sink that is associated to that stream - for ( TInt i = 0; i < snkCount; i++ ) - { - SVPDEBUG2( "CSVPHoldMediaHandler::EnableAudioStreamL - Check sink # %d", i ); - if ( !sinks[ i ]->IsEnabled() ) - { - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioStreamL - disabled" ) - sinks[ i ]->EnableL(); - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioStreamL - ENABLED" ) - } - } - - if ( aAudioStream.Source() && - ( KMceMicSource == aAudioStream.Source()->Type() || - KMceRTPSource == aAudioStream.Source()->Type() ) ) - { - CMceMediaSource* source = aAudioStream.Source(); - if ( !source->IsEnabled() && aAllowMicEnable ) - { - // Enable source - source->EnableL(); - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioStreamL - Source" ); - } - } - - SVPDEBUG1( "CSVPHoldMediaHandler::EnableAudioStreamL - Out" ); - } - -