/*
* Copyright (c) 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:
*
*/
// INCLUDE FILES
#include <AudioPreference.h>
#include <mmcccodecinformationfactory.h>
#include <mmcccodecinformation.h>
#include <mmccinterface.h>
#include <sdpdocument.h>
#include <sdpcodecstringpool.h>
#include "mcemediasource.h"
#include "mcemediastream.h"
#include "mceaudiostream.h"
#include "mcemicsource.h"
#include "mcertpsource.h"
#include "mcertpsink.h"
#include "mcecamerasource.h"
#include "mcefilesource.h"
#include "mcedisplaysink.h"
#include "mceaudiocodec.h"
#include "mceamrcodec.h"
#include "mcenatpluginmanager.h"
#include "mcecssessionimplementation.h"
#include "mcemediamanager.h"
#include "mcemediaobserver.h"
#include "mcesdpsession.h"
#include "mcemediadefs.h"
#include "mcecommediastream.h"
#include "mcecomaudiostream.h"
#include "mcecomsession.h"
#include "mcecomaudiocodec.h"
#include "mcecomvideocodec.h"
#include "mcecommediasource.h"
#include "mcecommediasink.h"
#include "mcecomrtpsource.h"
#include "mcecomdisplaysink.h"
#include "mcecomcamerasource.h"
#include "mcecomrtpsink.h"
#include "mcecomspeakersink.h"
#include "mcemmlogs.h"
#include "mcecomfactory.h"
#include "mcesrvstreamiterator.h"
#include "mcesrvsink.h"
#include "mcesrvsource.h"
#include "mceevents.h"
#include "mcemediastate.h"
#include "mceaudiosdpcodec.h"
#include "mcevideosdpcodec.h"
#include "cleanupresetanddestroy.h"
#include "mcedtmfhandler.h"
#include "mcecomendpointproxy.h"
#define MCE_HEAP_CONSTRUCT_LC( type, variable ) \
type* variable = new ( ELeave ) type; \
CleanupStack::PushL( variable );
#define MCE_HEAP_CONSTRUCT_WITH_PARAM_LC( type, variable, param ) \
type* variable = new ( ELeave ) type( param ); \
CleanupStack::PushL( variable );
const TInt KMceMaxFileName8 = KMceMaxFileNameLength * 4;
// ================ MEMBER FUNCTIONS =======================
// ---------------------------------------------------------
// CMceMediaManager::CMceMediaManager
// ---------------------------------------------------------
CMceMediaManager::CMceMediaManager()
{
}
// ---------------------------------------------------------
// CMceMediaManager::ConstructL
// ---------------------------------------------------------
void CMceMediaManager::ConstructL( MMceMediaGeneralObserver& aObserver )
{
iObserver = &aObserver;
iMccInterface = CMccInterface::NewL( *this );
iMccSecureInterface = CMccSecureInterface::NewL( *iMccInterface );
SdpCodecStringPool::OpenL();
iNatPluginManager = CMceNatPluginManager::NewL();
CMceSdpCodec* sdpCodec = NULL;
//audio SDP codec
sdpCodec = CMceAudioSdpCodec::NewL();
CleanupStack::PushL( sdpCodec );
iSdpCodecs.AppendL( sdpCodec );
CleanupStack::Pop( sdpCodec );
//video SDP codec
sdpCodec = CMceVideoSdpCodec::NewL();
CleanupStack::PushL( sdpCodec );
iSdpCodecs.AppendL( sdpCodec );
CleanupStack::Pop( sdpCodec );
}
// ---------------------------------------------------------
// CMceMediaManager::SdpCodec
// ---------------------------------------------------------
CMceSdpCodec* CMceMediaManager::SdpCodec( const CSdpMediaField& aMedia )
{
CMceSdpCodec* sdpCodec = NULL;
TInt index = 0;
while( !sdpCodec && index < iSdpCodecs.Count() )
{
sdpCodec = iSdpCodecs[ index++ ];
sdpCodec = sdpCodec->Decodes( aMedia ) ? sdpCodec : NULL;
}
return sdpCodec;
}
// ---------------------------------------------------------
// CMceMediaManager::SdpCodec
// ---------------------------------------------------------
CMceSdpCodec* CMceMediaManager::SdpCodec( CMceComMediaStream& aStream )
{
CMceSdpCodec* sdpCodec = NULL;
TInt index = 0;
while( !sdpCodec && index < iSdpCodecs.Count() )
{
sdpCodec = iSdpCodecs[ index++ ];
sdpCodec = sdpCodec->Encodes( aStream ) ? sdpCodec : NULL;
}
return sdpCodec;
}
// ---------------------------------------------------------
// CMceMediaManager::NewL
// ---------------------------------------------------------
CMceMediaManager* CMceMediaManager::NewL(
MMceMediaGeneralObserver& aObserver )
{
CMceMediaManager* self = NewLC( aObserver );
CleanupStack::Pop( self );
return self;
}
// ---------------------------------------------------------
// CMceMediaManager::NewLC
// ---------------------------------------------------------
CMceMediaManager* CMceMediaManager::NewLC(
MMceMediaGeneralObserver& aObserver )
{
CMceMediaManager* self = new ( ELeave ) CMceMediaManager;
CleanupStack::PushL( self );
self->ConstructL( aObserver );
return self;
}
// ---------------------------------------------------------
// CMceMediaManager::~CMceMediaManager
// ---------------------------------------------------------
CMceMediaManager::~CMceMediaManager()
{
MCEMM_DEBUG("CMceMediaManager::~CMceMediaManager(), Entry ");
delete iMccSecureInterface;
iMccSecureInterface=NULL;
delete iNatPluginManager;
iNatPluginManager = NULL;
delete iMccInterface;
iMccInterface = NULL;
iMceSdpSessions.ResetAndDestroy();
iSdpCodecs.ResetAndDestroy();
iTranscodeSessions.ResetAndDestroy();
SdpCodecStringPool::Close();
MCEMM_DEBUG("CMceMediaManager::~CMceMediaManager(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::CreateSessionL
// ---------------------------------------------------------
CMceSdpSession& CMceMediaManager::CreateSessionL( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::CreateSessionL(), Entry ");
CMceSdpSession* sdpSession = CMceSdpSession::NewL( aSession, *this );
CleanupStack::PushL( sdpSession );
aSession.AttachSDPSessionL( *sdpSession );
User::LeaveIfError (iMceSdpSessions.Append( sdpSession ));
CleanupStack::Pop( sdpSession );
MCEMM_DEBUG("CMceMediaManager::CreateSessionL(), Exit ");
return *sdpSession;
}
// ---------------------------------------------------------
// CMceMediaManager::NatMediaManager
// ---------------------------------------------------------
CMceNatPluginManager& CMceMediaManager::NatPluginManager()
{
return *iNatPluginManager;
}
// ---------------------------------------------------------
// CMceMediaManager::EncodeL
// ---------------------------------------------------------
CSdpDocument* CMceMediaManager::EncodeL( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::EncodeL(), Entry ");
if ( !SdpSession( aSession ) )
{
CreateSessionL( aSession );
}
TMceMMState negotationStateId = aSession.NegotiationState().Id();
MCEMM_DEBUG_STATE( "current state",
negotationStateId );
CSdpDocument* sdp = aSession.NegotiationState().EncodeL();
MCEMM_DEBUG("CMceMediaManager::EncodeL(), Exit ");
return sdp;
}
// ---------------------------------------------------------
// CMceMediaManager::DecodeL
// ---------------------------------------------------------
TMceSipWarningCode CMceMediaManager::DecodeL(
CMceComSession& aSession,
CSdpDocument& aSdpDocument )
{
MCEMM_DEBUG("CMceMediaManager::DecodeL(), Entry ");
if ( !SdpSession( aSession ) )
{
CreateSessionL( aSession );
}
TMceMMState negotationStateId = aSession.NegotiationState().Id();
MCEMM_DEBUG_STATE( "CMceMediaManager::DecodeL(): current state",
negotationStateId );
TMceSipWarningCode result =
aSession.NegotiationState().DecodeL( aSdpDocument );
MCEMM_DEBUG("CMceMediaManager::DecodeL(), Exit ");
return result;
}
// ---------------------------------------------------------
// CMceMediaManager::UpdateL
// ---------------------------------------------------------
TMceReturnStatus CMceMediaManager::UpdateL( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::UpdateL(), Entry ");
TMceReturnStatus status = KMceAsync;
if ( !SdpSession( aSession ) )
{
CreateSessionL( aSession );
}
TMceMMState negotationStateId = aSession.NegotiationState().Id();
MCEMM_DEBUG_STATE( "CMceMediaManager::UpdateL(): current state",
negotationStateId );
aSession.NegotiationState().UpdateL();
status = !aSession.NegotiationState().CallbackAllowed() ?
KMceReady : KMceAsync;
if( status==KMceReady && aSession.SecureSession()
&& negotationStateId!=KMceMediaIdle )
{
aSession.SecureSession()->BindStreamCrypto();
}
MCEMM_DEBUG("CMceMediaManager::UpdateL(), Exit ");
return status;
}
// ---------------------------------------------------------
// CMceMediaManager::ReserveL
// ---------------------------------------------------------
TMceReturnStatus CMceMediaManager::ReserveL( CMceComSession& aSession,
const TDesC8& /*aToken*/ )
{
MCEMM_DEBUG("CMceMediaManager::ReserveL(), Entry ");
TMceReturnStatus status = KMceReady;
CMceSdpSession* sdpSession = SdpSession( aSession );
__ASSERT_ALWAYS( sdpSession, User::Leave( KErrNotFound ) );
MCEMM_DEBUG_STATE_1( "CMceMediaManager::ReserveL(): current state",
aSession );
if ( sdpSession )
{
status = aSession.NegotiationState().ReserveL();
}
MCEMM_DEBUG("CMceMediaManager::ReserveL(), Exit ");
return status;
}
// ---------------------------------------------------------
// CMceMediaManager::ReservationNeeded
// ---------------------------------------------------------
TBool CMceMediaManager::ReservationNeeded( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::ReservationNeeded(), Entry ");
TBool reservationNeeded = EFalse;
CMceSdpSession* sdpSession = SdpSession( aSession );
MCEMM_DEBUG_STATE_1( "CMceMediaManager::ReservationNeeded(): current state",
aSession );
if ( sdpSession )
{
reservationNeeded = aSession.NegotiationState().ReservationNeeded();
}
MCEMM_DEBUG("CMceMediaManager::ReservationNeeded(), Exit ");
return reservationNeeded;
}
// ---------------------------------------------------------
// CMceMediaManager::NeedToNegotiate
// ---------------------------------------------------------
TBool CMceMediaManager::NeedToNegotiate( CMceComSession& aSession,
CSdpDocument* aSdpDocument )
{
MCEMM_DEBUG("CMceMediaManager::NeedToNegotiate(), Entry ");
TBool needToNegotiate = EFalse;
CMceSdpSession* sdpSession = SdpSession( aSession );
MCEMM_DEBUG_STATE_1( "CMceMediaManager::NeedToNegotiate(): current state",
aSession );
if ( sdpSession )
{
needToNegotiate = aSession.NegotiationState().NeedToNegotiate( aSdpDocument );
}
MCEMM_DEBUG("CMceMediaManager::NeedToNegotiate(), Exit ");
return needToNegotiate;
}
// ---------------------------------------------------------
// CMceMediaManager::ConfirmationNeeded
// ---------------------------------------------------------
//
TBool CMceMediaManager::ConfirmationNeeded( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::ConfirmationNeeded(), Entry ");
TBool needToNegotiate = EFalse;
CMceSdpSession* sdpSession = SdpSession( aSession );
MCEMM_DEBUG_STATE_1( "CMceMediaManager::ConfirmationNeeded(): current state",
aSession);
if ( sdpSession )
{
needToNegotiate = aSession.NegotiationState().ConfirmationNeeded();
}
MCEMM_DEBUG("CMceMediaManager::ConfirmationNeeded(), Exit ");
return needToNegotiate;
}
// ---------------------------------------------------------
// CMceMediaManager::GetRole
// ---------------------------------------------------------
//
TMceNegotiationRole CMceMediaManager::GetRole( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::GetRole()");
return aSession.NegotiationState().Role();
}
// ---------------------------------------------------------
// CMceMediaManager::CreateRejectedAnswer
// ---------------------------------------------------------
//
void CMceMediaManager::CreateRejectedAnswer( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::CreateRejectedAnswer(), Entry ");
CMceSdpSession* sdpSession = SdpSession( aSession );
if( !sdpSession )
{
return;
}
TRAPD( err, sdpSession->CreateAnswerL( aSession, ETrue ) );
if( err != KErrNone )
{
MCEMM_DEBUG_DVALUE( "CMceMediaManager::CreateRejectedAnswer(): \
ERROR: Creating rejected answer", err );
iObserver->MediaError( err );
}
MCEMM_DEBUG("CMceMediaManager::CreateRejectedAnswer(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::PauseL
// ---------------------------------------------------------
//
void CMceMediaManager::PauseL( CMceComMediaSink& aSink )
{
MCEMM_DEBUG("CMceMediaManager::PauseL() - sink, Entry ");
CMceComSession* session = aSink.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aSink );
CMceSrvStream* stream = NULL;
while( streams.Next( stream ) )
{
if ( !stream->Sink().DisableL( *stream ) )
{
SynchronizeMccStreamL( *stream, 0, stream->Sink().Id() );
}
}
MCEMM_DEBUG("CMceMediaManager::PauseL() - sink, Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::PauseL
// ---------------------------------------------------------
//
void CMceMediaManager::PauseL( CMceComMediaSource& aSource )
{
MCEMM_DEBUG("CMceMediaManager::PauseL() - source, Entry ");
CMceComSession* session = aSource.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aSource );
CMceSrvStream* stream = NULL;
while( streams.Next( stream ) )
{
if ( !stream->Source().DisableL( *stream ) )
{
SynchronizeMccStreamL( *stream, 0, stream->Source().Id() );
}
}
MCEMM_DEBUG("CMceMediaManager::PauseL() - source, Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::ResumeL
// ---------------------------------------------------------
//
void CMceMediaManager::ResumeL( CMceComMediaSink& aSink )
{
MCEMM_DEBUG("CMceMediaManager::ResumeL() - sink, Entry ");
CMceComSession* session = aSink.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aSink );
CMceSrvStream* stream = NULL;
while( streams.Next( stream ) )
{
if ( !stream->Sink().EnableL( *stream ) )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::ResumeL() - sink: \
synchronize stream", *stream );
SynchronizeMccStreamL( *stream, stream->Sink().Id(), 0 );
}
}
MCEMM_DEBUG("CMceMediaManager::ResumeL() - sink, Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::ResumeL
// ---------------------------------------------------------
//
void CMceMediaManager::ResumeL( CMceComMediaSource& aSource )
{
MCEMM_DEBUG("CMceMediaManager::ResumeL() - source, Entry ");
CMceComSession* session = aSource.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aSource );
CMceSrvStream* stream = NULL;
while( streams.Next( stream ) )
{
if ( !stream->Source().EnableL( *stream ) )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::ResumeL() - source: \
synchronize stream", *stream );
SynchronizeMccStreamL( *stream, stream->Source().Id(), 0 );
}
}
MCEMM_DEBUG("CMceMediaManager::ResumeL() - source, Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::StartInactivityTimerL
// ---------------------------------------------------------
//
void CMceMediaManager::StartInactivityTimerL(
const CMceComRtpSource& aRtpSource,
TUint32 aInactivityTimeout )
{
MCEMM_DEBUG("CMceMediaManager::StartInactivityTimerL(), Entry ");
CMceComSession* session = aRtpSource.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aRtpSource );
CMceSrvStream* stream = NULL;
while( streams.Next( stream ) )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::StartInactivityTimerL(): \
start inactivity timer for stream", *stream );
User::LeaveIfError(
iMccInterface->StartInactivityTimer(
stream->SessionId(),
stream->LinkId(),
stream->Id(),
aInactivityTimeout ) );
}
MCEMM_DEBUG("CMceMediaManager::StartInactivityTimerL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::StopInactivityTimerL
// ---------------------------------------------------------
//
void CMceMediaManager::StopInactivityTimerL(
const CMceComRtpSource& aRtpSource )
{
MCEMM_DEBUG("CMceMediaManager::StopInactivityTimerL(), Entry ");
CMceComSession* session = aRtpSource.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aRtpSource );
CMceSrvStream* stream = NULL;
while( streams.Next( stream ) )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::StopInactivityTimerL(): \
stop inactivity timer for stream", *stream );
User::LeaveIfError(
iMccInterface->StopInactivityTimer(
stream->SessionId(),
stream->LinkId(),
stream->Id() ) );
}
MCEMM_DEBUG("CMceMediaManager::StopInactivityTimerL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SendRTCPAnyDataL
// ---------------------------------------------------------
//
void CMceMediaManager::SendRTCPAnyDataL( const CMceComMediaStream& aMediaStream,
const TDesC8& aData )
{
MCEMM_DEBUG("CMceMediaManager::SendRTCPAnyDataL(), Entry ");
CMceComMediaSink* rtpSink = NULL;
TInt index = 0;
while( !rtpSink && index < aMediaStream.iSinks.Count() )
{
rtpSink = aMediaStream.iSinks[ index++ ];
rtpSink = rtpSink->iType != KMceRTPSink ? NULL : rtpSink;
}
if ( !rtpSink )
{
MCEMM_DEBUG("No target!");
return;
}
CMceComSession* session = aMediaStream.Session();
TMceSrvStreamIterator streams( session->MccStreams(), *rtpSink );
CMceSrvStream* stream = NULL;
// Taking some precautions to avoid stack memory overuse
//
TMccEvent* event = new ( ELeave ) TMccEvent;
CleanupStack::PushL( event );
event->iEventCategory = KMccEventCategoryRtcp;
event->iEventType = KMccRtcpControl;
{
TMccRtcpEventData eventData;
eventData.iRtcpPacketType = KRtcpAnyPacket;
eventData.iRtcpPacketData.Copy( aData );
TMccRtcpEventDataPackage eventDataBuf( eventData );
event->iEventData.Copy( eventDataBuf );
}
while( streams.Next( stream ) )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::SendRTCPAnyDataL(): \
send rtcp any data to stream", *stream );
event->iSessionId = stream->SessionId();
event->iLinkId = stream->LinkId();
event->iStreamId = stream->Id();
event->iEndpointId = stream->Sink().Id();
iMccInterface->SendMediaSignalL( *event );
}
CleanupStack::PopAndDestroy( event );
MCEMM_DEBUG("CMceMediaManager::SendRTCPAnyDataL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SendRTCPReceiverReportL
// ---------------------------------------------------------
//
void CMceMediaManager::SendRTCPReceiverReportL(
const CMceComRtpSource& aRtpSource )
{
MCEMM_DEBUG("CMceMediaManager::SendRTCPReceiverReportL(), Entry ");
CMceComSession* session = aRtpSource.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aRtpSource );
CMceSrvStream* stream = NULL;
// Taking some precautions to avoid stack memory overuse
//
TMccEvent* event = new ( ELeave ) TMccEvent;
CleanupStack::PushL( event );
event->iEventCategory = KMccEventCategoryRtcp;
event->iEventType = KMccRtcpControl;
{
TMccRtcpEventData eventData;
eventData.iRtcpPacketType = KRtcpRrPacket;
TMccRtcpEventDataPackage eventDataBuf( eventData );
event->iEventData.Copy( eventDataBuf );
}
while( streams.Next( stream ) )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::SendRTCPReceiverReportL(): \
send rtcp receiver report to stream", *stream );
event->iSessionId = stream->SessionId();
event->iLinkId = stream->LinkId();
event->iStreamId = stream->Id();
event->iEndpointId = stream->Source().Id();
iMccInterface->SendMediaSignalL( *event );
}
CleanupStack::PopAndDestroy( event );
MCEMM_DEBUG("CMceMediaManager::SendRTCPReceiverReportL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SendRTCPSenderReportL
// ---------------------------------------------------------
//
void CMceMediaManager::SendRTCPSenderReportL(
const CMceComRtpSink& aRtpSink )
{
MCEMM_DEBUG("CMceMediaManager::SendRTCPSenderReportL(), Entry ");
CMceComSession* session = aRtpSink.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aRtpSink );
CMceSrvStream* stream = NULL;
// Taking some precautions to avoid stack memory overuse
//
TMccEvent* event = new ( ELeave ) TMccEvent;
CleanupStack::PushL( event );
event->iEventCategory = KMccEventCategoryRtcp;
event->iEventType = KMccRtcpControl;
{
TMccRtcpEventData eventData;
eventData.iRtcpPacketType = KRtcpSrPacket;
TMccRtcpEventDataPackage eventDataBuf( eventData );
event->iEventData.Copy( eventDataBuf );
}
while( streams.Next( stream ) )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::SendRTCPSenderReportL(): \
send rtcp sender report to stream", *stream );
event->iSessionId = stream->SessionId();
event->iLinkId = stream->LinkId();
event->iStreamId = stream->Id();
event->iEndpointId = stream->Sink().Id();
iMccInterface->SendMediaSignalL( *event );
}
CleanupStack::PopAndDestroy( event );
MCEMM_DEBUG("CMceMediaManager::SendRTCPSenderReportL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetMaxVolumeL
// ---------------------------------------------------------
//
void CMceMediaManager::GetMaxVolumeL( TInt& aMaxVolume )
{
MCEMM_DEBUG("CMceMediaManager::GetMaxVolumeL(), Entry ");
TPckgBuf<TInt> maxVolume( aMaxVolume );
// Max volume can be asked always after MCC creation
User::LeaveIfError( iMccInterface->GetParameter(
0, 0, 0, 0, KMccSpeakerMaxVolume, maxVolume ) );
aMaxVolume = maxVolume();
MCEMM_DEBUG("CMceMediaManager::GetMaxVolumeL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetVolumeL
// ---------------------------------------------------------
//
void CMceMediaManager::GetVolumeL( const CMceComMediaSink& aSink,
TInt& aVolume )
{
MCEMM_DEBUG("CMceMediaManager::GetVolumeL(), Entry ");
TPckgBuf<TInt> volume( aVolume );
GetMccParameterL( aSink, KMccSpeakerVolume, volume );
aVolume = volume();
MCEMM_DEBUG("CMceMediaManager::GetVolumeL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetVolumeL
// ---------------------------------------------------------
//
void CMceMediaManager::SetVolumeL( const CMceComMediaSink& aSink,
TInt aVolume )
{
MCEMM_DEBUG("CMceMediaManager::SetVolumeL(), Entry ");
TPckgBuf<TInt> volume( aVolume );
if ( aSink.EndpointProxy() )
{
aSink.EndpointProxy()->SetParameterL( aSink, KMccSpeakerVolume, volume );
}
else
{
SetMccParameterL( aSink, KMccSpeakerVolume, volume );
}
MCEMM_DEBUG("CMceMediaManager::SetVolumeL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetAudioRoutingL
// ---------------------------------------------------------
//
void CMceMediaManager::GetAudioRoutingL(
const CMceComSpeakerSink& aSpeaker,
TInt& aRoutingDestination )
{
MCEMM_DEBUG("CMceMediaManager::GetAudioRoutingL(), Entry ");
TPckgBuf<TInt> routingDestination( aRoutingDestination );
GetMccParameterL( aSpeaker, KMccSpeakerRouting,
routingDestination );
aRoutingDestination = routingDestination();
MCEMM_DEBUG("CMceMediaManager::GetAudioRoutingL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetAudioRoutingL
// ---------------------------------------------------------
//
void CMceMediaManager::SetAudioRoutingL(
const CMceComSpeakerSink& aSpeaker,
TInt aRoutingDestination )
{
MCEMM_DEBUG("CMceMediaManager::SetAudioRoutingL(), Entry ");
TPckgBuf<TInt> routingDestination( aRoutingDestination );
SetMccParameterL( aSpeaker, KMccSpeakerRouting,
routingDestination );
MCEMM_DEBUG("CMceMediaManager::SetAudioRoutingL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetBalanceL
// ---------------------------------------------------------
//
void CMceMediaManager::SetBalanceL(
const CMceComMediaSink& aSink,
TInt aBalance )
{
MCEMM_DEBUG("CMceMediaManager::SetBalanceL(), Entry ");
TPckgBuf<TInt> balance( aBalance );
SetMccParameterL( aSink, KMccSpeakerBalance, balance );
MCEMM_DEBUG("CMceMediaManager::SetBalanceL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetBalanceL
// ---------------------------------------------------------
//
void CMceMediaManager::SetBalanceL(
const CMceComMediaSource& aSource,
TInt aBalance )
{
MCEMM_DEBUG("CMceMediaManager::SetBalanceL(), Entry ");
TPckgBuf<TInt> balance( aBalance );
SetMccParameterL( aSource, KMccMicBalance, balance );
MCEMM_DEBUG("CMceMediaManager::SetBalanceL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetGainL
// ---------------------------------------------------------
//
void CMceMediaManager::GetGainL(
const CMceComMediaSource& aSource,
TInt& aGain )
{
MCEMM_DEBUG("CMceMediaManager::GetGainL(), Entry ");
TPckgBuf<TInt> gain( aGain );
GetMccParameterL( aSource, KMccMicGain, gain );
aGain = gain();
MCEMM_DEBUG("CMceMediaManager::GetGainL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetMaxGainL
// ---------------------------------------------------------
//
void CMceMediaManager::GetMaxGainL( TInt& aMaxGain )
{
MCEMM_DEBUG("CMceMediaManager::GetMaxGainL(), Entry ");
TPckgBuf<TInt> maxGain( aMaxGain );
// Max gain can be asked always after MCC creation
User::LeaveIfError( iMccInterface->GetParameter(
0, 0, 0, 0, KMccMicMaxGain, maxGain ) );
aMaxGain = maxGain();
MCEMM_DEBUG("CMceMediaManager::GetMaxGainL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetGainL
// ---------------------------------------------------------
//
void CMceMediaManager::SetGainL(
const CMceComMediaSource& aSource,
TInt aGain )
{
MCEMM_DEBUG("CMceMediaManager::SetGainL(), Entry ");
TPckgBuf<TInt> gain( aGain );
SetMccParameterL( aSource, KMccMicGain, gain );
MCEMM_DEBUG("CMceMediaManager::SetGainL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetDisplaysAvailableL
// ---------------------------------------------------------
//
void CMceMediaManager::GetDisplaysAvailableL(
TInt& aDisplaysAvailable )
{
MCEMM_DEBUG("CMceMediaManager::GetDisplaysAvailableL(), Entry ");
const TInt KMceDefDisplaysAvailable = 1;
aDisplaysAvailable = KMceDefDisplaysAvailable;
MCEMM_DEBUG_DVALUE("Default value", aDisplaysAvailable );
MCEMM_DEBUG("CMceMediaManager::GetDisplaysAvailableL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetDisplayRectL
// ---------------------------------------------------------
//
void CMceMediaManager::GetDisplayRectL( CMceComDisplaySink& aSink,
TRect& aDisplayRect )
{
MCEMM_DEBUG("CMceMediaManager::GetDisplayRectL(), Entry ");
TMccVideoSinkSetting display;
TMccVideoSinkSettingBuf displayBuf( display );
GetMccParameterL( aSink, aSink.MccParameterName(),
displayBuf );
display = displayBuf();
aDisplayRect = TRect( display.iLocation, display.iSize );
aSink.SetDisplayRect( aDisplayRect );
MCEMM_DEBUG("CMceMediaManager::GetDisplayRectL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetDisplayRectL
// ---------------------------------------------------------
//
void CMceMediaManager::SetDisplayRectL( CMceComDisplaySink& aSink,
TRect aDisplayRect )
{
MCEMM_DEBUG("CMceMediaManager::SetDisplayRectL(), Entry ");
aSink.SetDisplayRect( aDisplayRect );
TMccVideoSinkSetting display;
TMccVideoSinkSettingBuf displayBuf( display );
GetMccParameterL( aSink, aSink.MccParameterName(),
displayBuf );
display = displayBuf();
CMceComDisplaySink::ToPointAndSize( aDisplayRect,
display.iLocation,
display.iSize );
TMccVideoSinkSettingBuf updateBuf( display );
SetMccParameterL( aSink, aSink.MccParameterName(),
updateBuf );
MCEMM_DEBUG("CMceMediaManager::SetDisplayRectL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetDisplayPriorityL
// ---------------------------------------------------------
//
void CMceMediaManager::GetDisplayPriorityL( CMceComDisplaySink& aSink,
TInt& aDisplayPriority )
{
MCEMM_DEBUG("CMceMediaManager::GetDisplayPriorityL(), Entry ");
TMccVideoSinkSetting display;
TMccVideoSinkSettingBuf displayBuf( display );
GetMccParameterL( aSink, aSink.MccParameterName(),
displayBuf );
display = displayBuf();
aDisplayPriority = display.iPriority.iPriority;
aSink.iPriority = aDisplayPriority;
MCEMM_DEBUG("CMceMediaManager::GetDisplayPriorityL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetDisplayPriorityL
// ---------------------------------------------------------
//
void CMceMediaManager::SetDisplayPriorityL( CMceComDisplaySink& aSink,
TInt aDisplayPriority )
{
MCEMM_DEBUG("CMceMediaManager::SetDisplayPriorityL(), Entry ");
aSink.iPriority = aDisplayPriority;
TMccVideoSinkSetting display;
TMccVideoSinkSettingBuf displayBuf( display );
GetMccParameterL( aSink, aSink.MccParameterName(),
displayBuf );
display = displayBuf();
display.iPriority.iPriority = aSink.iPriority;
SetMccParameterL( aSink, aSink.MccParameterName(),
displayBuf );
MCEMM_DEBUG("CMceMediaManager::SetDisplayPriorityL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetDisplayRotationL
// ---------------------------------------------------------
//
void CMceMediaManager::GetDisplayRotationL( CMceComDisplaySink& aSink,
TInt& aDisplayRotation )
{
MCEMM_DEBUG("CMceMediaManager::GetDisplayRotationL(), Entry ");
User::LeaveIfError( aSink.MccParameterName() == KMccCamLocalVideo
? KErrNotSupported : KErrNone );
TMccVideoSinkSetting display;
TMccVideoSinkSettingBuf displayBuf( display );
GetMccParameterL( aSink, aSink.MccParameterName(),
displayBuf );
display = displayBuf();
aDisplayRotation = display.iRotation;
aSink.iRotation =
static_cast<CMceDisplaySink::TRotation>( aDisplayRotation );
MCEMM_DEBUG("CMceMediaManager::GetDisplayRotationL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetDisplayRotationL
// ---------------------------------------------------------
//
void CMceMediaManager::SetDisplayRotationL( CMceComDisplaySink& aSink,
TInt aDisplayRotation )
{
MCEMM_DEBUG("CMceMediaManager::SetDisplayRotationL(), Entry ");
User::LeaveIfError( aSink.MccParameterName() == KMccCamLocalVideo
? KErrNotSupported : KErrNone );
aSink.iRotation =
static_cast<CMceDisplaySink::TRotation>( aDisplayRotation );
TMccVideoSinkSetting display;
TMccVideoSinkSettingBuf displayBuf( display );
GetMccParameterL( aSink, aSink.MccParameterName(),
displayBuf );
display = displayBuf();
display.iRotation = static_cast<TMccVideoRotation>( aSink.iRotation );
displayBuf = display;
SetMccParameterL( aSink, aSink.MccParameterName(),
displayBuf );
MCEMM_DEBUG("CMceMediaManager::SetDisplayRotationL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetDisplayIndexL
// ---------------------------------------------------------
//
void CMceMediaManager::SetDisplayIndexL( CMceComDisplaySink& aSink,
TInt aDisplayIndex )
{
MCEMM_DEBUG("CMceMediaManager::SetDisplayIndexL(), Entry ");
aSink.iDisplayIndex = aDisplayIndex;
TMccVideoSinkSetting display;
TMccVideoSinkSettingBuf displayBuf( display );
GetMccParameterL( aSink, aSink.MccParameterName(),
displayBuf );
display = displayBuf();
display.iDeviceIndex = static_cast<TUint>( aSink.iDisplayIndex );
SetMccParameterL( aSink, aSink.MccParameterName(),
displayBuf );
MCEMM_DEBUG("CMceMediaManager::SetDisplayIndexL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetCameraInfoL
// ---------------------------------------------------------
//
void CMceMediaManager::GetCameraInfoL( TInt aCameraIndex,
TCameraInfo& aCameraInfo )
{
MCEMM_DEBUG("CMceMediaManager::GetCameraInfoL(), Entry ");
TMccVideoInfo2 info;
info.iCameraIndex = aCameraIndex;
TMccVideoInfoBuf2 videoInfo( info );
GetMccParameterL( KMccCamInfo, videoInfo );
aCameraInfo = videoInfo().iInfo;
MCEMM_DEBUG("CMceMediaManager::GetCameraInfoL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetCamerasAvailableL
// ---------------------------------------------------------
//
void CMceMediaManager::GetCamerasAvailableL( TInt& aCamerasAvailable )
{
MCEMM_DEBUG("CMceMediaManager::GetCamerasAvailableL(), Entry ");
TPckgBuf<TInt> camerasAvailable( aCamerasAvailable );
GetMccParameterL( KMccCamCount, camerasAvailable );
aCamerasAvailable = camerasAvailable();
MCEMM_DEBUG("CMceMediaManager::GetCamerasAvailableL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetZoomFactorL
// ---------------------------------------------------------
//
void CMceMediaManager::GetZoomFactorL( CMceComCameraSource& aSource,
TInt& aZoomFactor )
{
MCEMM_DEBUG("CMceMediaManager::GetZoomFactorL(), Entry ");
TPckgBuf<TInt> zoomFactor( aZoomFactor );
GetMccParameterL( aSource, KMccCamZoomFactor, zoomFactor );
aZoomFactor = zoomFactor();
aSource.iZoomFactor = aZoomFactor;
MCEMM_DEBUG("CMceMediaManager::GetZoomFactorL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetDigitalZoomFactorL
// ---------------------------------------------------------
//
void CMceMediaManager::GetDigitalZoomFactorL( CMceComCameraSource& aSource,
TInt& aDigitalZoomFactor )
{
MCEMM_DEBUG("CMceMediaManager::GetDigitalZoomFactorL(), Entry ");
TPckgBuf<TInt> digitalZoomFactor( aDigitalZoomFactor );
GetMccParameterL( aSource, KMccCamDigitZoomFactor,
digitalZoomFactor );
aDigitalZoomFactor = digitalZoomFactor();
aSource.iDigitalZoomFactor = aDigitalZoomFactor;
MCEMM_DEBUG("CMceMediaManager::GetDigitalZoomFactorL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetContrastL
// ---------------------------------------------------------
//
void CMceMediaManager::GetContrastL( CMceComCameraSource& aSource,
TInt& aContrast )
{
MCEMM_DEBUG("CMceMediaManager::GetContrastL(), Entry ");
TPckgBuf<TInt> contrast( aContrast );
GetMccParameterL( aSource, KMccCamContrast, contrast );
aContrast = contrast();
aSource.iContrast = aContrast;
MCEMM_DEBUG("CMceMediaManager::GetContrastL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetBrightnessL
// ---------------------------------------------------------
//
void CMceMediaManager::GetBrightnessL( CMceComCameraSource& aSource,
TInt& aBrightness )
{
MCEMM_DEBUG("CMceMediaManager::GetBrightnessL(), Entry ");
TPckgBuf<TInt> brightness( aBrightness );
GetMccParameterL( aSource, KMccCamBrightness,
brightness );
aBrightness = brightness();
aSource.iBrightness = aBrightness;
MCEMM_DEBUG("CMceMediaManager::GetBrightnessL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetExposureL
// ---------------------------------------------------------
//
void CMceMediaManager::GetExposureL(
CMceComCameraSource& aSource,
TInt& aExposure )
{
MCEMM_DEBUG("CMceMediaManager::GetExposureL(), Entry ");
TPckgBuf<TInt> exposure( aExposure );
GetMccParameterL( aSource, KMccCamExposure,
exposure );
aExposure = exposure();
aSource.iExposure = aExposure;
MCEMM_DEBUG("CMceMediaManager::GetExposureL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetWhiteBalanceL
// ---------------------------------------------------------
//
void CMceMediaManager::GetWhiteBalanceL( CMceComCameraSource& aSource,
TInt& aWhiteBalance )
{
MCEMM_DEBUG("CMceMediaManager::GetWhiteBalanceL(), Entry ");
TPckgBuf<TInt> whiteBalance( aWhiteBalance );
GetMccParameterL( aSource, KMccCamWhiteBalance,
whiteBalance );
aWhiteBalance = whiteBalance();
aSource.iWhiteBalance = aWhiteBalance;
MCEMM_DEBUG("CMceMediaManager::GetWhiteBalanceL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetCameraIndexL
// ---------------------------------------------------------
//
void CMceMediaManager::SetCameraIndexL( CMceComCameraSource& aSource,
TInt aCameraIndex,
TCameraInfo& aCameraInfo )
{
MCEMM_DEBUG("CMceMediaManager::SetCameraIndexL(), Entry ");
aSource.iCameraIndex = aCameraIndex;
UpdateMccSourceL( aSource );
GetCameraInfoL( aCameraIndex, aCameraInfo );
MCEMM_DEBUG("CMceMediaManager::SetCameraIndexL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetZoomFactorL
// ---------------------------------------------------------
//
void CMceMediaManager::SetZoomFactorL( CMceComCameraSource& aSource,
TInt aZoomFactor )
{
MCEMM_DEBUG("CMceMediaManager::SetZoomFactorL(), Entry ");
aSource.iZoomFactor = aZoomFactor;
TPckgBuf<TInt> zoomFactor( aSource.iZoomFactor );
SetMccParameterL( aSource, KMccCamZoomFactor,
zoomFactor );
MCEMM_DEBUG("CMceMediaManager::SetZoomFactorL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetDigitalZoomFactorL
// ---------------------------------------------------------
//
void CMceMediaManager::SetDigitalZoomFactorL( CMceComCameraSource& aSource,
TInt aDigitalZoomFactor )
{
MCEMM_DEBUG("CMceMediaManager::SetDigitalZoomFactorL(), Entry ");
aSource.iDigitalZoomFactor = aDigitalZoomFactor;
TPckgBuf<TInt> digitalZoomFactor( aSource.iDigitalZoomFactor );
SetMccParameterL( aSource, KMccCamDigitZoomFactor,
digitalZoomFactor );
MCEMM_DEBUG("CMceMediaManager::SetDigitalZoomFactorL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetContrastL
// ---------------------------------------------------------
//
void CMceMediaManager::SetContrastL( CMceComCameraSource& aSource,
TInt aContrast )
{
MCEMM_DEBUG("CMceMediaManager::SetContrastL(), Entry ");
aSource.iContrast = aContrast;
TPckgBuf<TInt> contrast( aSource.iContrast );
SetMccParameterL( aSource, KMccCamContrast,
contrast );
MCEMM_DEBUG("CMceMediaManager::SetContrastL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetBrightnessL
// ---------------------------------------------------------
//
void CMceMediaManager::SetBrightnessL( CMceComCameraSource& aSource,
TInt aBrightness )
{
MCEMM_DEBUG("CMceMediaManager::SetBrightnessL(), Entry ");
aSource.iBrightness = aBrightness;
TPckgBuf<TInt> brightness( aSource.iBrightness );
SetMccParameterL( aSource, KMccCamBrightness,
brightness );
MCEMM_DEBUG("CMceMediaManager::SetBrightnessL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetExposureL
// ---------------------------------------------------------
//
void CMceMediaManager::SetExposureL(
CMceComCameraSource& aSource,
TInt aExposure)
{
MCEMM_DEBUG("CMceMediaManager::SetExposureL(), Entry ");
aSource.iExposure = aExposure;
TPckgBuf<TInt> exposure( aSource.iExposure );
SetMccParameterL( aSource, KMccCamExposure,
exposure );
MCEMM_DEBUG("CMceMediaManager::SetExposureL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetWhiteBalanceL
// ---------------------------------------------------------
//
void CMceMediaManager::SetWhiteBalanceL( CMceComCameraSource& aSource,
TInt aWhiteBalance )
{
MCEMM_DEBUG("CMceMediaManager::SetWhiteBalanceL(), Entry ");
aSource.iWhiteBalance = aWhiteBalance;
TPckgBuf<TInt> whiteBalance( aSource.iWhiteBalance );
SetMccParameterL( aSource, KMccCamWhiteBalance,
whiteBalance );
MCEMM_DEBUG("CMceMediaManager::SetWhiteBalanceL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetFileInfoL
// ---------------------------------------------------------
//
void CMceMediaManager::GetFileInfoL( CMceComFileSource& aSource,
TMceFileInfo& aFileInfo )
{
MCEMM_DEBUG("CMceMediaManager::GetFileInfoL(), Entry ");
if ( aSource.MediaStream() )
{
MCE_HEAP_CONSTRUCT_LC( TMccFileSourceSetting, fileInfo );
MCE_HEAP_CONSTRUCT_WITH_PARAM_LC( TMccFileSourceSettingBuf, fileInfoBuf, *fileInfo );
GetMccParameterL( aSource, KMccFileInfo, *fileInfoBuf );
FillMceFileInfoL( (*fileInfoBuf)(), aFileInfo );
aSource.iFileInfo = aFileInfo;
CleanupStack::PopAndDestroy( fileInfoBuf );
CleanupStack::PopAndDestroy( fileInfo );
}
else
{
GetFileInfoL( aFileInfo );
}
MCEMM_DEBUG("CMceMediaManager::GetFileInfoL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetFileInfoL
// ---------------------------------------------------------
//
void CMceMediaManager::SetFileInfoL( CMceComFileSource& aSource,
TMceFileInfo& aFileInfo )
{
MCEMM_DEBUG("CMceMediaManager::SetFileInfoL(), Entry ");
MCE_HEAP_CONSTRUCT_LC( TMccFileSourceSetting, fileInfo );
fileInfo->iFileName = aFileInfo.iFileName;
MCE_HEAP_CONSTRUCT_WITH_PARAM_LC( TMccFileSourceSettingBuf, fileInfoBuf, *fileInfo );
SetMccParameterL( aSource, KMccFileName,
*fileInfoBuf );
CleanupStack::PopAndDestroy( fileInfoBuf );
CleanupStack::PopAndDestroy( fileInfo );
MCEMM_DEBUG("CMceMediaManager::SetFileInfoL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetFileInfoL
// ---------------------------------------------------------
//
void CMceMediaManager::GetFileInfoL( TMceFileInfo& aFileInfo )
{
MCEMM_DEBUG("CMceMediaManager::GetFileInfoL(), Entry ");
MCE_HEAP_CONSTRUCT_LC( TMccFileSourceSetting, fileInfo );
fileInfo->iFileName = aFileInfo.iFileName;
MCE_HEAP_CONSTRUCT_WITH_PARAM_LC( TMccFileSourceSettingBuf, fileInfoBuf, *fileInfo );
GetMccParameterL( KMccFileInfo, *fileInfoBuf );
FillMceFileInfoL( (*fileInfoBuf)(), aFileInfo );
CleanupStack::PopAndDestroy( fileInfoBuf );
CleanupStack::PopAndDestroy( fileInfo );
MCEMM_DEBUG("CMceMediaManager::GetFileInfoL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetFilePositionL
// ---------------------------------------------------------
//
void CMceMediaManager::GetFilePositionL( CMceComFileSource& aSource,
TTimeIntervalMicroSeconds& aFilePosition )
{
MCEMM_DEBUG("CMceMediaManager::GetFilePositionL(), Entry ");
MCE_HEAP_CONSTRUCT_LC( TMccFileSourceSetting, fileInfo );
MCE_HEAP_CONSTRUCT_WITH_PARAM_LC( TMccFileSourceSettingBuf, fileInfoBuf, *fileInfo );
GetMccParameterL( aSource, KMccFilePosition,
*fileInfoBuf );
aFilePosition = (*fileInfoBuf)().iPosition;
CleanupStack::PopAndDestroy( fileInfoBuf );
CleanupStack::PopAndDestroy( fileInfo );
MCEMM_DEBUG("CMceMediaManager::GetFilePositionL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetFilePositionL
// ---------------------------------------------------------
//
void CMceMediaManager::SetFilePositionL( CMceComFileSource& aSource,
TTimeIntervalMicroSeconds& aFilePosition )
{
MCEMM_DEBUG("CMceMediaManager::SetFilePositionL(), Entry ");
MCE_HEAP_CONSTRUCT_LC( TMccFileSourceSetting, fileInfo );
fileInfo->iPosition = aFilePosition;
MCE_HEAP_CONSTRUCT_WITH_PARAM_LC( TMccFileSourceSettingBuf, fileInfoBuf, *fileInfo );
SetMccParameterL( aSource, KMccFilePosition,
*fileInfoBuf );
CleanupStack::PopAndDestroy( fileInfoBuf );
CleanupStack::PopAndDestroy( fileInfo );
MCEMM_DEBUG("CMceMediaManager::SetFilePositionL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::FastForwardL
// ---------------------------------------------------------
//
void CMceMediaManager::FastForwardL( CMceComFileSource& /*aSource*/,
TBool& /*aOnOff*/ )
{
MCEMM_DEBUG("CMceMediaManager::FastForwardL(), Entry ");
/*
TMceFileInfo fileInfo;
TTimeIntervalMicroSeconds position;
GetFileInfoL( aSource, fileInfo );
GetFilePositionL( aSource, position );
TTimeIntervalMicroSeconds newPosition(
position.Int64() +
(TInt64)( KMceOneSecondAsMicros *
KMceFastForwardMultiplier ) );
if ( newPosition < fileInfo.iDuration )
{
SetFilePositionL( aSource, newPosition );
aSource.iPosition = newPosition;
}
else
{
MCEMM_DEBUG("At the end. No forward");
}
*/
MCEMM_DEBUG("CMceMediaManager::FastForwardL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::FastRewindL
// ---------------------------------------------------------
//
void CMceMediaManager::FastRewindL( CMceComFileSource& /*aSource*/,
TBool& /*aOnOff*/ )
{
MCEMM_DEBUG("CMceMediaManager::FastRewindL(), Entry ");
/*
TMceFileInfo fileInfo;
TTimeIntervalMicroSeconds position;
GetFileInfoL( aSource, fileInfo );
GetFilePositionL( aSource, position );
TTimeIntervalMicroSeconds newPosition(
position.Int64() -
(TInt64)( KMceOneSecondAsMicros *
KMceFastForwardMultiplier ) );
if ( newPosition > 0 )
{
SetFilePositionL( aSource, newPosition );
aSource.iPosition = newPosition;
}
else
{
MCEMM_DEBUG("At the beginning. No rewind");
}
*/
MCEMM_DEBUG("CMceMediaManager::FastRewindL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::TranscodeFileL
// ---------------------------------------------------------
//
TUint32 CMceMediaManager::TranscodeFileL( CMceComFileSource* aFile )
{
MCEMM_DEBUG("CMceMediaManager::TranscodeFileL(), Entry ");
__ASSERT_ALWAYS( aFile, User::Leave( KErrArgument ) );
MCEMM_DEBUG_SVALUE(" from", aFile->iFileInfo.iFileName );
MCEMM_DEBUG_SVALUE(" to", aFile->iTranscodeInfo.iFileName );
HBufC8* sourceFileBuf = HBufC8::NewLC( KMceMaxFileName8 );
TPtr8 sourceFile = sourceFileBuf->Des();
HBufC8* destFileBuf = HBufC8::NewLC( KMceMaxFileName8 );
TPtr8 destFile = destFileBuf->Des();
TInt cnvRet =
CnvUtfConverter::ConvertFromUnicodeToUtf8( sourceFile,
aFile->iFileInfo.iFileName );
MCEMM_DEBUG_DVALUE( "CMceMediaManager::TranscodeFileL(), source name converted: ",
cnvRet )
__ASSERT_ALWAYS( !cnvRet, User::Leave( KErrGeneral ) );
cnvRet = CnvUtfConverter::ConvertFromUnicodeToUtf8( destFile,
aFile->iTranscodeInfo.iFileName );
MCEMM_DEBUG_DVALUE( "CMceMediaManager::TranscodeFileL(), dest name converted: ",
cnvRet )
__ASSERT_ALWAYS( !cnvRet, User::Leave( KErrGeneral ) );
CMccCodecInformation* audioCodec = NULL;
CMccCodecInformation* videoCodec = NULL;
if ( aFile->MediaStream() && aFile->MediaStream()->Session() )
{
CreateTranscodingOutputCodecsL( &audioCodec,&videoCodec,aFile );
}
if ( audioCodec )
{
CleanupStack::PushL( audioCodec );
}
if ( videoCodec )
{
CleanupStack::PushL( videoCodec );
}
User::LeaveIfError ( iMccInterface->TranscodeFile(
sourceFile,
destFile,
aFile->iTranscodeInfo.iQuality,
aFile->iTranscodeInfo.iTranscodeSessionId,
videoCodec,
audioCodec ) );
if ( videoCodec )
{
CleanupStack::PopAndDestroy();
}
if ( audioCodec )
{
CleanupStack::PopAndDestroy();
}
CleanupStack::PopAndDestroy( destFileBuf );
CleanupStack::PopAndDestroy( sourceFileBuf );
iTranscodeSessions.AppendL( aFile );
MCEMM_DEBUG_DVALUE(" sessionid", aFile->iTranscodeInfo.iTranscodeSessionId );
MCEMM_DEBUG("CMceMediaManager::TranscodeFileL(), Exit ");
return aFile->iTranscodeInfo.iTranscodeSessionId;
}
// ---------------------------------------------------------
// CMceMediaManager::CreateTranscodingOutputCodecsL
// ---------------------------------------------------------
//
void CMceMediaManager::CreateTranscodingOutputCodecsL(
CMccCodecInformation** aAudioCodec ,
CMccCodecInformation** aVideoCodec ,
CMceComFileSource* aFile )
{
MCEMM_DEBUG("CMceMediaManager::CreateTranscodingOutputCodecsL(),entry ");
CMceComSession* tempSession = aFile->MediaStream()->Session();
RPointerArray<CMceComMediaStream>& streams = tempSession->Streams();
CMceSrvStream* audioSrvStream = NULL;
CMceSrvStream* videoSrvStream = NULL;
TInt cleanitems = 0;
CMceComAudioStream* audioStream = NULL;
CMceComVideoStream* videoStream = NULL;
for ( int i = 0; i < streams.Count();i++ )
{
if ( streams[i]->iType == KMceAudio && !audioSrvStream )
{
audioStream = static_cast<CMceComAudioStream*>(
tempSession->Streams()[ i ] );
if ( audioStream->Codecs().Count() )
{
audioSrvStream = CMceSrvStream::NewL( *this, *aFile->MediaStream(),
*aFile->MediaStream()->Source(),
*aFile->MediaStream()->Sinks()[0],
*(audioStream->Codecs()[0]) );
CleanupStack::PushL( audioSrvStream );
cleanitems++;
MCEMM_DEBUG("CMceMediaManager::CreateTranscodingOutputCodecsL(), AudioCodec found ");
}
}
if ( streams[i]->iType == KMceVideo && !videoSrvStream )
{
videoStream = static_cast<CMceComVideoStream*>(
tempSession->Streams()[ i ] );
if ( videoStream->Codecs().Count() )
{
videoSrvStream = CMceSrvStream::NewL( *this, *aFile->MediaStream(),
*aFile->MediaStream()->Source(),
*aFile->MediaStream()->Sinks()[0],
*(videoStream->Codecs()[0]) );
CleanupStack::PushL( videoSrvStream );
cleanitems++;
MCEMM_DEBUG("CMceMediaManager::CreateTranscodingOutputCodecsL(), VideoCodec found ");
}
}
}
if ( audioSrvStream )
{
*aAudioCodec = CreateMccCodecLC( *audioSrvStream, EMceRoleOfferer );
cleanitems++;
}
if ( videoSrvStream )
{
*aVideoCodec = CreateMccCodecLC( *videoSrvStream, EMceRoleOfferer );
cleanitems++;
}
CleanupStack::Pop( cleanitems );
delete audioSrvStream;
audioSrvStream = NULL;
delete videoSrvStream;
videoSrvStream = NULL;
MCEMM_DEBUG("CMceMediaManager::CreateTranscodingOutputCodecsL(),exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::CancelTranscodeFileL
// ---------------------------------------------------------
//
void CMceMediaManager::CancelTranscodeFileL( TUint32 aSessionId )
{
MCEMM_DEBUG("CMceMediaManager::CancelTranscodeFileL(), Entry ");
MCEMM_DEBUG_DVALUE(" sessionid", aSessionId );
CMceComFileSource* session = TranscodingSession( aSessionId );
if ( session )
{
MCEMM_DEBUG("CMceMediaManager::CancelTranscodeFileL(), cancelling ");
User::LeaveIfError (
iMccInterface->CancelTranscodeFile(
session->iTranscodeInfo.iTranscodeSessionId ) );
TInt index = iTranscodeSessions.Find( session );
iTranscodeSessions.Remove( index );
delete session;
}
MCEMM_DEBUG("CMceMediaManager::CancelTranscodeFileL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::TranscodingSession
// ---------------------------------------------------------
//
CMceComFileSource* CMceMediaManager::TranscodingSession(
const CMceComFileSource& aFile ) const
{
CMceComFileSource* session = NULL;
TInt index = 0;
while( !session && index < iTranscodeSessions.Count() )
{
session = iTranscodeSessions[ index++ ];
session = session->Id() == aFile.Id() ? session : NULL;
}
return session;
}
// ---------------------------------------------------------
// CMceMediaManager::TranscodingSession
// ---------------------------------------------------------
//
CMceComFileSource* CMceMediaManager::TranscodingSession(
TUint32 aTcSessionId ) const
{
CMceComFileSource* session = NULL;
TInt index = 0;
while( !session && index < iTranscodeSessions.Count() )
{
session = iTranscodeSessions[ index++ ];
session =
session->iTranscodeInfo.iTranscodeSessionId ==
aTcSessionId ? session : NULL;
}
return session;
}
// ---------------------------------------------------------
// CMceMediaManager::GetSupportedCodecs
// ---------------------------------------------------------
//
TInt CMceMediaManager::GetSupportedCodecs( RArray<TFourCC>& /*aCodecs*/ )
{
MCEMM_DEBUG("CMceMediaManager::GetSupportedCodecs(), Entry ");
/*
TInt err = iMccInterface->GetSupportedCodecs( aCodecs );
*/
MCEMM_DEBUG("NO IMPLEMENTATION");
TInt err = KErrNone;
MCEMM_DEBUG("CMceMediaManager::GetSupportedCodecs(), Exit ");
return err;
}
// ---------------------------------------------------------
// CMceMediaManager::GetCapabilities
// ---------------------------------------------------------
//
void CMceMediaManager::GetCapabilitiesL(
RPointerArray<CMceComAudioCodec>& aCapabilities )
{
MCEMM_DEBUG("CMceMediaManager::GetCapabilitiesL() - audio , Entry ");
RPointerArray<CMccCodecInformation> mccCapabilities;
TMceComAudioCodecFactory codecFactory;
RStringF audio = MCE_SDP_STRING_AUDIOL();
TInt index = 0;
CMceSdpCodec* audioSdpCodec = NULL;
while( !audioSdpCodec && index < iSdpCodecs.Count() )
{
audioSdpCodec = iSdpCodecs[ index++ ];
audioSdpCodec = audioSdpCodec->Media() == audio ? audioSdpCodec : NULL;
}
User::LeaveIfNull ( audioSdpCodec );
User::LeaveIfError ( iMccInterface->GetCapabilities( mccCapabilities ) );
MceCleanupResetAndDestroyPushL( mccCapabilities );
for( int i = 0; i < mccCapabilities.Count(); i++ )
{
CMccCodecInformation* mccCodec = mccCapabilities[i];
if ( mccCodec->Type() == KUidMediaTypeAudio )
{
CMceComAudioCodec* codec = codecFactory.CreateCodecLC( mccCodec->SdpName() );
if ( codec )
{
*codec = *mccCodec;
aCapabilities.AppendL( codec );
CleanupStack::Pop( codec );
MCEMM_DEBUG("audio capabilities");
MCEMM_DEBUG_SVALUE("codec", codec->iSdpName );
MCEMM_DEBUG_DVALUE("sampling freq", codec->iSamplingFreq )
MCEMM_DEBUG_DVALUE("payload type", codec->iPayloadType )
MCEMM_DEBUG_DVALUE("bitrate", codec->iBitrate )
MCEMM_DEBUG_DVALUE("max ptime", codec->iMaxPTime )
MCEMM_DEBUG_DVALUE("ptime", codec->iPTime )
MCEMM_DEBUG_DVALUE("VAD", codec->iEnableVAD )
MCEMM_DEBUG_DVALUE("codec mode",codec->iCodecMode )
MCEMM_DEBUG_DVALUE("fourCC", codec->iFourCC )
MCEMM_DEBUG_SVALUE("fmtp", *codec->iFmtpAttr )
audioSdpCodec->AddCapabilityL( mccCodec->SdpName() );
audioSdpCodec->AddCapabilityPayloadTypeL( mccCodec->PayloadType() );
}
else
{
MCEMM_DEBUG_SVALUE("Not supported codec",mccCodec->SdpName() );
}
}
}
CleanupStack::PopAndDestroy();//mccCapabilities
MCEMM_DEBUG("CMceMediaManager::GetCapabilitiesL() - audio , Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetCapabilities
// ---------------------------------------------------------
//
void CMceMediaManager::GetCapabilitiesL(
RPointerArray<CMceComVideoCodec>& aCapabilities )
{
MCEMM_DEBUG("CMceMediaManager::GetCapabilitiesL() - video, Entry ");
RPointerArray<CMccCodecInformation> mccCapabilities;
TMceComVideoCodecFactory codecFactory;
RStringF video = MCE_SDP_STRING_VIDEOL();
TInt index = 0;
CMceSdpCodec* videoSdpCodec = NULL;
while( !videoSdpCodec && index < iSdpCodecs.Count() )
{
videoSdpCodec = iSdpCodecs[ index++ ];
videoSdpCodec = videoSdpCodec->Media() == video ? videoSdpCodec : NULL;
}
User::LeaveIfNull ( videoSdpCodec );
User::LeaveIfError ( iMccInterface->GetCapabilities( mccCapabilities ) );
MceCleanupResetAndDestroyPushL( mccCapabilities );
for( int i = 0; i < mccCapabilities.Count(); i++ )
{
CMccCodecInformation* mccCodec = mccCapabilities[i];
if ( mccCodec->Type() == KUidMediaTypeVideo )
{
CMceComVideoCodec* codec = codecFactory.CreateCodecLC( mccCodec->SdpName() );
if ( codec )
{
*codec = *mccCodec;
aCapabilities.AppendL( codec );
CleanupStack::Pop( codec );
MCEMM_DEBUG("video capabilities");
MCEMM_DEBUG_SVALUE("codec", codec->iSdpName );
MCEMM_DEBUG_DVALUE("clock rate", codec->iClockRate )
MCEMM_DEBUG_DVALUE("payload type", codec->iPayloadType )
MCEMM_DEBUG_DVALUE("bitrate", codec->iBitrate )
MCEMM_DEBUG_DVALUE("framerate", (TInt)codec->iFrameRate )
MCEMM_DEBUG_DVALUE("max bitrate", codec->iMaxBitRate )
MCEMM_DEBUG_DVALUE("resolution width", codec->iResolutionWidth )
MCEMM_DEBUG_DVALUE("resolution height", codec->iResolutionHeight )
MCEMM_DEBUG_DVALUE("codec mode",codec->iCodecMode )
MCEMM_DEBUG_DVALUE("fourCC", codec->iFourCC )
MCEMM_DEBUG_SVALUE("fmtp", *codec->iFmtpAttr )
videoSdpCodec->AddCapabilityL( mccCodec->SdpName() );
videoSdpCodec->AddCapabilityPayloadTypeL(mccCodec->PayloadType());
}
else
{
MCEMM_DEBUG_SVALUE("Not supported codec",mccCodec->SdpName() );
}
}
}
CleanupStack::PopAndDestroy();//mccCapabilities
MCEMM_DEBUG("CMceMediaManager::GetCapabilitiesL() - video, Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::DtmfL
// ---------------------------------------------------------
//
void CMceMediaManager::DtmfL(
CMceComMediaSource& aSource,
TMceComEvent& aEvent,
const TDesC8& aSequence )
{
MCEMM_DEBUG("CMceMediaManager::DtmfL(), Entry ");
TBool handled = DoDtmfL( aSource, aEvent, aSequence );
if ( !handled && aSource.MediaStream()->BoundStream() )
{
handled = DoDtmfL( aSource, aEvent, aSequence, ETrue );
}
__ASSERT_ALWAYS( handled, User::Leave( KErrNotSupported ) );
MCEMM_DEBUG("CMceMediaManager::DtmfL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetCNameL
// ---------------------------------------------------------
//
void CMceMediaManager::SetCNameL(
const CMceComEndpoint& aEndpoint,
const TDesC8& aCName )
{
MCEMM_DEBUG_SVALUE("CMceMediaManager::SetCNameL(), cname:", aCName );
CMceComMediaStream* endpointMediaStream = aEndpoint.MediaStream();
if ( IS_RECEIVESTREAM( endpointMediaStream ) &&
aEndpoint.iType == KMceRTPSource )
{
SetMccParameterL( static_cast<const CMceComMediaSource&>( aEndpoint ),
KMccRtpCName,
aCName,
ETrue );
}
else if ( IS_SENDSTREAM( endpointMediaStream ) &&
aEndpoint.iType == KMceRTPSink )
{
SetMccParameterL( static_cast<const CMceComMediaSink&>( aEndpoint ),
KMccRtpCName,
aCName,
ETrue );
}
else
{
User::Leave( KErrNotSupported );
}
MCEMM_DEBUG("CMceMediaManager::SetCNameL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::UpdateConfigKeyL
// ---------------------------------------------------------
//
void CMceMediaManager::UpdateConfigKeyL( const CMceComMediaSource& aSource )
{
MCEMM_DEBUG("CMceMediaManager::UpdateConfigKeyL(), Entry ");
if ( aSource.MediaStream() &&
aSource.MediaStream()->iType == KMceVideo &&
( aSource.Type() == KMceCameraSource || aSource.Type() == KMceFileSource ) )
{
TInt err( KErrNone );
HBufC8* configKey = HBufC8::NewLC( KMaxConfigKeyLen );
TPtr8 configKeyPtr( configKey->Des() );
TMceSrvStreamIterator streams(
aSource.MediaStream()->Session()->MccStreams(), aSource );
CMceComMediaStream* mediaStream = NULL;
CMceSrvStream* stream = NULL;
while ( streams.Next( stream ) && !err )
{
mediaStream = &stream->Data();
if ( mediaStream->iType != KMceVideo )
{
// NOP
}
else if ( CMceComVideoCodec::IsConfigKeyValid( configKey ) )
{
DoConfigKeyUpdateL( *mediaStream, configKey );
}
else if ( stream->IsMccPrepared() )
{
err = iMccInterface->GetParameter( stream->SessionId(),
stream->LinkId(),
stream->Id(),
stream->Source().Id(),
KMccConfigKey,
configKeyPtr );
if ( !err && CMceComVideoCodec::IsConfigKeyValid( configKey ) )
{
streams.Reset();
}
}
else
{
// NOP
}
}
CleanupStack::PopAndDestroy( configKey );
}
MCEMM_DEBUG("CMceMediaManager::UpdateConfigKeyL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::GetSSRCL
// ---------------------------------------------------------
//
TUint32 CMceMediaManager::GetSSRCL( CMceSrvStream& aStream )
{
MCEMM_DEBUG("CMceMediaManager::GetSSRCL(), Entry ");
TUint32 ssrc = 0;
User::LeaveIfError( iMccInterface->GetSSRC(
aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
0,
ssrc ) );
MCEMM_DEBUG("CMceMediaManager::GetSSRCL(), Exit ");
return ssrc;
}
// ---------------------------------------------------------------------------
// CMceMediaManager::EnableViewFinderL
// ---------------------------------------------------------------------------
//
void CMceMediaManager::EnableViewFinderL( const CMceComMediaSink& /*aMediaSink*/,
const TDesC8& aParam )
{
MCEMM_DEBUG("CMceMediaManager::EnableViewFinderL(), Entry ");
SetMccParameterL( KMccCamLocalVideo, aParam );
MCEMM_DEBUG("CMceMediaManager::EnableViewFinderL(), Exit ");
}
// ---------------------------------------------------------------------------
// CMceMediaManager::DisableViewFinderL
// ---------------------------------------------------------------------------
//
void CMceMediaManager::DisableViewFinderL( const CMceComMediaSink& /*aMediaSink*/ )
{
MCEMM_DEBUG("CMceMediaManager::DisableViewFinderL(), Entry ");
SetMccParameterL( KMccCamLocalVideo, KNullDesC8 );
MCEMM_DEBUG("CMceMediaManager::DisableViewFinderL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::CreateMccSessionL
// ---------------------------------------------------------
//
void CMceMediaManager::CreateMccSessionL( CMceComSession& aSession )
{
User::LeaveIfError( iMccInterface->CreateSession( aSession.iMccID ) );
}
// ---------------------------------------------------------
// CMceMediaManager::CreateMccLinkL
// ---------------------------------------------------------
//
void CMceMediaManager::CreateMccLinkL( CMceSrvStream& aStream )
{
MCEMM_DEBUG("CMceMediaManager::CreateMccLinkL(), Entry ");
__ASSERT_ALWAYS( aStream.State() != CMceSrvStream::EAdopted,
User::Leave( KErrArgument ) );
__ASSERT_ALWAYS( aStream.State() == CMceSrvStream::ECreated,
User::Leave( KErrArgument ) );
TMccNetSettings netSettings;
netSettings.iIapId = aStream.IapId();
netSettings.iLocalAddress.SetPort( aStream.LocalMediaPort() );
netSettings.iMediaQosValue = aStream.Data().Session()->iServiceType;
TUint32 linkId = aStream.LinkId();
if ( linkId == KMceNotAssigned &&
!ReuseLink( aStream ) )
{
MCEMM_DEBUG("CMceMediaManager::CreateMccLinkL(): no link. creating link");
User::LeaveIfError(
iMccInterface->CreateLink( aStream.SessionId(),
aStream.LinkType(),
linkId,
netSettings ) );
aStream.SetLinkId( linkId );
SetPendingState( aStream, 0, CMceSrvStream::ECreatingLink );
if ( aStream.Data().Session()->SecureSession() )
{
aStream.Data().Session()->SecureSession()->iCryptoContextUpdate = ETrue;
}
}
else
{
TMceSrvStreamIterator creatingLink( aStream.Data().Session()->MccStreams() );
TMceMccComEvent event( KMccEventNone,
aStream.LinkId(),
0,
0 );
CMceSrvStream* stream = NULL;
TBool creatingLinkCurrently( EFalse );
while ( creatingLink.Next( stream, event ) && !creatingLinkCurrently )
{
if ( stream != &aStream && stream->State() == CMceSrvStream::ECreatingLink )
{
MCEMM_DEBUG("CMceMediaManager::CreateMccLinkL(): link not ready. waiting");
SetPendingState( aStream, 0, CMceSrvStream::ECreatingLink );
creatingLinkCurrently = ETrue;
}
}
if ( !creatingLinkCurrently )
{
MCEMM_DEBUG("CMceMediaManager::CreateMccLinkL(): link exists");
SetPendingState( aStream, 0, CMceSrvStream::ELinkCreated );
}
}
MCEMM_DEBUG("CMceMediaManager::CreateMccLinkL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::InitializeMccStreamL
// ---------------------------------------------------------
//
void CMceMediaManager::InitializeMccStreamL( CMceSrvStream& aStream )
{
MCEMM_DEBUG("CMceMediaManager::InitializeMccStreamL(), Entry ");
__ASSERT_ALWAYS( aStream.State() != CMceSrvStream::EAdopted,
User::Leave( KErrArgument ) );
//create codec information
CMccCodecInformationFactory* codecFactory =
CMccCodecInformationFactory::NewL();
CleanupStack::PushL( codecFactory );
CMccCodecInformation* codec =
codecFactory->CreateCodecInformationL( aStream.Codec().iSdpName );
CleanupStack::PushL( codec );
aStream.Codec().MccDecodeL( *codec );
CleanupStack::PopAndDestroy( codec );
CleanupStack::PopAndDestroy( codecFactory );
MCEMM_DEBUG("CMceMediaManager::InitializeMccStreamL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::CreateMccCodecLC
// ---------------------------------------------------------
//
CMccCodecInformation* CMceMediaManager::CreateMccCodecLC(
CMceSrvStream& aStream,
TMceNegotiationRole aRole )
{
//create codec information
CMccCodecInformationFactory* codecFactory =
CMccCodecInformationFactory::NewL();
CleanupStack::PushL( codecFactory );
CMccCodecInformation* codec =
codecFactory->CreateCodecInformationL( aStream.Codec().iSdpName );
CleanupStack::PopAndDestroy( codecFactory );
CleanupStack::PushL( codec );
aStream.Codec().MccPopulateL( *codec, aStream, aRole );
return codec;
}
// ---------------------------------------------------------
// CMceMediaManager::CreateMccStreamL
// ---------------------------------------------------------
//
void CMceMediaManager::CreateMccStreamL(
CMceSrvStream& aStream,
TMceNegotiationRole aRole )
{
MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(), Entry ");
__ASSERT_ALWAYS( aStream.State() != CMceSrvStream::EAdopted,
User::Leave( KErrArgument ) );
// Create mcc codec even if mcc prepare is not needed in order to
// construct fmtp info also for local codecs. That information might
// be needed in some stream matching cases later on.
CMccCodecInformation* mccCodec = CreateMccCodecLC( aStream, aRole );
if ( !aStream.PrepareL() )
{
CMceComCodec& codec = aStream.Codec();
if ( ReuseSource( aStream ) )
{
MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(): resuing source ");
//reuse source
iMccInterface->Reuse( aStream.SessionId(),
aStream.Id(),
aStream.LinkId(),
aStream.Source().Id() );
}
else
{
MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(): adding source ");
//add source
iMccInterface->AddDataSource( aStream.Source().Type(),
aStream.Source().Data().InitParamL( codec ),
aStream.Source().Id() );
}
if ( ReuseSink( aStream ) )
{
MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(): resuing sink ");
//reuse sink
iMccInterface->Reuse( aStream.SessionId(),
aStream.Id(),
aStream.LinkId(),
aStream.Sink().Id() );
}
else
{
MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(): adding sink ");
//add sink
iMccInterface->AddDataSink( aStream.Sink().Type(),
aStream.Sink().Data().InitParamL( codec ),
aStream.Sink().Id() );
}
MCEMM_DEBUG_STREAM( "CMceMediaManager::CreateMccStreamL(): creating stream", aStream );
//create stream
User::LeaveIfError( iMccInterface->CreateStream(
aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
aStream.MccStreamType(),
*mccCodec ) );
aStream.Source().Data().InitializedL();
aStream.Sink().Data().InitializedL();
}
CleanupStack::PopAndDestroy( mccCodec );
MCEMM_DEBUG("CMceMediaManager::CreateMccStreamL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::PrepareMccStreamL
// ---------------------------------------------------------
//
void CMceMediaManager::PrepareMccStreamL(
CMceSrvStream& aStream,
TMceNegotiationRole /*aRole*/ )
{
MCEMM_DEBUG("CMceMediaManager::PrepareMccStreamL(), Entry ");
__ASSERT_ALWAYS( aStream.State() != CMceSrvStream::EAdopted,
User::Leave( KErrArgument ) );
if ( !aStream.PrepareL() )
{
//prepare stream
TUint32 endpointId = 0;
User::LeaveIfError( iMccInterface->PrepareStream(
aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
endpointId ) );
SetPendingState( aStream, endpointId, CMceSrvStream::EPreparing );
aStream.MccPrepareCalledL();
}
MCEMM_DEBUG_STREAM( "CMceMediaManager::PrepareMccStreamL(): after prepare", aStream );
MCEMM_DEBUG("CMceMediaManager::PrepareMccStreamL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SetRemoteAddressL
// ---------------------------------------------------------
//
void CMceMediaManager::SetRemoteAddressL( CMceSrvStream& aStream )
{
TInetAddr remoteIpAddress = aStream.RemoteIpAddress();
MCEMM_DEBUG_DVALUE( "CMceMediaManager::SetRemoteAddressL address",
remoteIpAddress.Address() )
MCEMM_DEBUG_DVALUE( "CMceMediaManager::SetRemoteAddressL port",
remoteIpAddress.Port() )
//for rtp
if ( !remoteIpAddress.IsUnspecified() &&
remoteIpAddress.Port() != 0 &&
aStream.IsMccPrepared() )
{
User::LeaveIfError(
iMccInterface->SetRemoteAddress(
aStream.SessionId(),
aStream.LinkId(),
remoteIpAddress ) );
// for rtcp
if ( aStream.Data().RemoteMediaPort() != 0 &&
aStream.Data().iRemoteRtcpPort != 0 )
{
if ( !aStream.Data().iRemoteRtcpAddress.IsUnspecified() )
{
//copy address
remoteIpAddress = aStream.Data().iRemoteRtcpAddress;
}
remoteIpAddress.SetPort(
aStream.Data().iRemoteRtcpPort );
User::LeaveIfError(
iMccInterface->SetRemoteAddress(
aStream.SessionId(),
aStream.LinkId(),
remoteIpAddress,
aStream.Data().iRemoteRtcpPort ) );
}
}
}
// ---------------------------------------------------------
// CMceMediaManager::StartMccStreamL
// ---------------------------------------------------------
//
void CMceMediaManager::StartMccStreamL( CMceSrvStream& aStream )
{
MCEMM_DEBUG("CMceMediaManager::StartMccStreamL(), Entry ");
__ASSERT_ALWAYS( aStream.State() != CMceSrvStream::EAdopted,
User::Leave( KErrArgument ) );
__ASSERT_ALWAYS( aStream.State() == CMceSrvStream::EPrepared,
User::Leave( KErrArgument ) );
if ( !aStream.StartL() )
{
//set remote address for link
SetRemoteAddressL( aStream );
if ( !DoStartEndpointsL( aStream, 0, 0 ) &&
aStream.Sink().State() == CMceSrvStream::EPrepared &&
aStream.Source().State() == CMceSrvStream::EPrepared )
{
SetPendingState( aStream, 0, CMceSrvStream::EPending );
}
}
MCEMM_DEBUG_STREAM( "CMceMediaManager::StartMccStreamL(): after start", aStream );
MCEMM_DEBUG("CMceMediaManager::StartMccStreamL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::StopMccStream
// ---------------------------------------------------------
//
void CMceMediaManager::StopMccStream( CMceSrvStream& aStream )
{
MCEMM_DEBUG("CMceMediaManager::StopMccStream(), Entry ");
if ( !aStream.Stop() )
{
TMccNetSettings netSettings;
netSettings.iIapId = aStream.IapId();
netSettings.iLocalAddress.SetPort( aStream.LocalMediaPort() );
TUint32 linkId = aStream.LinkId();
iMccInterface->StopStream( aStream.SessionId(),
linkId,
aStream.Id() );
aStream.Cleanup();
iMccInterface->DeleteStream( aStream.SessionId(),
linkId,
aStream.Id() );
if ( !iMccInterface->StreamsExists( aStream.SessionId(),
linkId ) )
{
MCEMM_DEBUG("CMceMediaManager::StopMccStream(): closing link ");
iMccInterface->CloseLink( aStream.SessionId(),
linkId );
aStream.SetLinkId( KMceNotAssigned );
}
}
aStream.Invalidate();
MCEMM_DEBUG_STREAM( "CMceMediaManager::StopMccStream(): after stop", aStream );
MCEMM_DEBUG("CMceMediaManager::StopMccStream(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::CanReleaseEndpoint
// ---------------------------------------------------------
//
TBool CMceMediaManager::CanReleaseEndpoint( CMceSrvStream& aStream,
TUint32 aEndpointId )
{
TBool remove = EFalse;
TUint referenceCount = 0;
if ( iMccInterface->ReferenceCount( aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
aEndpointId,
referenceCount ) == KErrNone )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::CanReleaseEndpoint(): \
reference count", referenceCount );
remove = referenceCount == 1;
}
return remove;
}
// ---------------------------------------------------------
// CMceMediaManager::ReleaseSink
// ---------------------------------------------------------
//
TInt CMceMediaManager::ReleaseSink( CMceSrvStream& aStream,
TUint32 aEndpointId )
{
MCEMM_DEBUG("CMceMediaManager::ReleaseSink(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aStream.SessionId() );
MCEMM_DEBUG_DVALUE(" LinkID", aStream.LinkId() );
MCEMM_DEBUG_DVALUE(" StreamID", aStream.Id() );
MCEMM_DEBUG_DVALUE(" EndpointID", aEndpointId );
TInt err =
iMccInterface->RemoveDataSink( aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
aEndpointId );
MCEMM_DEBUG_DVALUE("CMceMediaManager::ReleaseSink(), Exit. ", err );
return err;
}
// ---------------------------------------------------------
// CMceMediaManager::ReleaseSource
// ---------------------------------------------------------
//
TInt CMceMediaManager::ReleaseSource( CMceSrvStream& aStream,
TUint32 aEndpointId )
{
MCEMM_DEBUG("CMceMediaManager::ReleaseSource(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aStream.SessionId() );
MCEMM_DEBUG_DVALUE(" LinkID", aStream.LinkId() );
MCEMM_DEBUG_DVALUE(" StreamID", aStream.Id() );
MCEMM_DEBUG_DVALUE(" EndpointID", aEndpointId );
TInt err =
iMccInterface->RemoveDataSource( aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
aEndpointId );
MCEMM_DEBUG_DVALUE("CMceMediaManager::ReleaseSource(), Exit. ", err );
return err;
}
// ---------------------------------------------------------
// CMceMediaManager::CleanupL
// ---------------------------------------------------------
//
void CMceMediaManager::CleanupL( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::CleanupL(), Entry ");
CMceSrvStream* stream = NULL;
if ( aSession.AnswerType() == KMceNegotiationAnswerTypeFinal )
{
// check if non-local media was rejected, if yes then stop the stream
TMceSrvStreamIterator rejects( aSession.MccStreams(),
TMceSrvStreamIterator::EReceive );
//stop all started downgraded receive streams, which are downgraded by the answer
while( rejects.Next( stream, CMceSrvStream::EStarted,
TMceSrvStreamIterator::GreaterOrEqualMatch ) )
{
if ( !stream->Data().IsEnabled() )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::CleanupL(): \
synchronizing downgraded stream", *stream );
SynchronizeMccStreamL( *stream, aSession.NegotiationState().Role() );
}
}
TMceSrvStreamIterator iterator( aSession.MccStreams(),
TMceSrvStreamIterator::ELocal );
//cleanup rejected media
while( iterator.Next( stream, TMceSrvStreamIterator::ExactReverseMatch ) )
{
if ( stream->Data().RemoteMediaPort() == 0 )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::CleanupL(): \
stream rejected. Disposing stream", *stream );
CMceComMediaStream* media = &stream->Data();
DisposeMediaStreamL( media );
iterator.Reset();
}
}
iterator.Reset();
//cleanup rejected codecs
while( iterator.Next( stream, TMceSrvStreamIterator::ExactReverseMatch ) )
{
if ( !stream->Codec().iIsNegotiated )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::CleanupL(): \
codec rejected. Disposing codec", *stream );
CMceComCodec* codec = &stream->Codec();
DisposeCodecL( codec );
iterator.Reset();
}
}
}
for ( TInt i = 0; i < aSession.Streams().Count(); i++ )
{
// First codec of send streams is always enabled automatically,
// if such codec is removed/changed because of negotiation, first
// one of the selected codecs is enabled.
//
MCEMM_DEBUG("CMceMediaManager::CleanupL(), updating default codecs ");
CMceComMediaStream* sendStream = aSession.Streams()[ i ]->SendStream();
if ( sendStream )
{
sendStream->UpdateDefaultCodecL();
}
}
MCEMM_DEBUG("CMceMediaManager::CleanupL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::DisposeMediaStreamL
// ---------------------------------------------------------
//
void CMceMediaManager::DisposeMediaStreamL( CMceComMediaStream* aStream )
{
__ASSERT_ALWAYS( aStream, User::Leave( KErrArgument ) );
CMceSrvStream* stream = NULL;
CMceComSession& session = *aStream->Session();
//find all mcc streams related to stream and
//and remove mcc streams
TMceSrvStreamIterator removed( session.MccStreams(),
*aStream );
while( removed.Next( stream ) )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::DisposeMediaStreamL(): \
stopping and removing stream", stream->Id() );
StopMccStream( *stream );
removed.Remove( session.MccStreams() );
delete stream;
stream = NULL;
}
//make it inactive
aStream->Enable( EFalse, ETrue );
//if not found strem is bounded stream
TInt streamIndex = session.Streams().Find( aStream );
if ( streamIndex >= 0 && !aStream->iLinkedStream )
{
session.Streams().Remove( streamIndex );
delete aStream;
}
}
// ---------------------------------------------------------
// CMceMediaManager::DisposeCodecL
// ---------------------------------------------------------
//
void CMceMediaManager::DisposeCodecL( CMceComCodec* aCodec )
{
if ( aCodec )
{
CMceSrvStream* stream = NULL;
CMceComSession& session = *aCodec->Stream()->Session();
MCEMM_DEBUG_SVALUE("CMceMediaManager::DisposeCodecL(): \
about to remove codec", aCodec->iSdpName );
//find all mcc streams related to stream and
//and remove mcc streams
TMceSrvStreamIterator removed( session.MccStreams(),
*aCodec );
while( removed.Next( stream ) )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::DisposeCodecL(): \
stopping and removing stream", *stream );
StopMccStream( *stream );
removed.Remove( session.MccStreams() );
// dispose also associated local streams
TMceSrvStreamIterator associatedLocalStreams(
session.MccStreams(), stream->Source().Data(),
ETrue, TMceSrvStreamIterator::ELocal, aCodec );
CMceSrvStream* associatedLocalStream = NULL;
while( associatedLocalStreams.Next( associatedLocalStream ) )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::DisposeCodecL(): \
stopping and removing associated local stream", *associatedLocalStream );
StopMccStream( *associatedLocalStream );
associatedLocalStreams.Remove( session.MccStreams() );
delete associatedLocalStream;
associatedLocalStream = NULL;
}
delete stream;
stream = NULL;
}
MCEMM_DEBUG_SVALUE("CMceMediaManager::DisposeCodecL(): \
removing codec", aCodec->iSdpName );
CMceComCodec* boundCodec = NULL;
if ( aCodec->Stream()->BoundStream() )
{
boundCodec = aCodec->Stream()->BoundStreamL().FindCodecL( *aCodec );
}
aCodec->Stream()->RemoveCodecL( aCodec );
DisposeCodecL( boundCodec );
MCEMM_DEBUG("CMceMediaManager::DisposeCodecL(), done ");
}
}
// ---------------------------------------------------------
// CMceMediaManager::AdjustMccStreamL
// ---------------------------------------------------------
//
void CMceMediaManager::AdjustMccStreamL( CMceSrvStream& aStream )
{
MCEMM_DEBUG("CMceMediaManager::AdjustMccStreamL(), Entry ");
CMceComCodec* bidirectional = DoAdjustMccStreamL( aStream );
if ( bidirectional )
{
CMceSrvStream* stream = NULL;
TMceSrvStreamIterator streams( aStream.Codec().Stream()->Session()->MccStreams(),
*bidirectional );
while( streams.Next( stream ) )
{
DoAdjustMccStreamL( *stream );
}
}
MCEMM_DEBUG("CMceMediaManager::AdjustMccStreamL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::ValidateMccStreamL
// ---------------------------------------------------------
//
void CMceMediaManager::ValidateMccStreamL( CMceSrvStream& aStream )
{
MCEMM_DEBUG("CMceMediaManager::ValidateMccStreamL(), Entry ");
__ASSERT_ALWAYS( aStream.State() != CMceSrvStream::EAdopted,
User::Leave( KErrArgument ) );
//if valid
if ( aStream.Validate() )
{
return;
}
TMceNegotiationRole role = EMceRoleOfferer;
CMccCodecInformation* codec = NULL;
if ( !aStream.IsMccPrepared() )
{
role = EMceRoleAnswerer;
//create codec information
CMccCodecInformationFactory* codecFactory =
CMccCodecInformationFactory::NewL();
CleanupStack::PushL( codecFactory );
codec =
codecFactory->CreateCodecInformationL( aStream.Codec().iSdpName );
CleanupStack::PopAndDestroy( codecFactory );
}
else
{
//get codec
codec =
iMccInterface->CodecL(
aStream.SessionId(),
aStream.LinkId(),
aStream.Id() );
}
CleanupStack::PushL( codec );
//validate codec
aStream.Codec().MccValidateL( *codec, aStream, role );
CleanupStack::PopAndDestroy( codec );
MCEMM_DEBUG("CMceMediaManager::ValidateMccStreamL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::PrepareUpdateL
// ---------------------------------------------------------
//
void CMceMediaManager::PrepareUpdateL( CMceSdpSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::PrepareUpdateL(), Entry ");
CMceComSession* session = aSession.MediaSession();
CMceComSession* backup = aSession.Backup();
TInt action = RequireSignallingL( *session, *backup );
//do local update
if ( action != KMceRequiresSignalling )
{
MCEMM_DEBUG("CMceMediaManager::PrepareUpdateL(): \
no need for new mcc session. Doing merge");
session->Merge( *backup );
}
else if( session )
{
if( session->iCodecSelection == KMceCodecSelectionMerge )
{
session->Merge( *backup );
}
}
aSession.SignallingRequired() = action;
MCEMM_DEBUG("CMceMediaManager::PrepareUpdateL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::RequireSignallingL
// ---------------------------------------------------------
//
TInt CMceMediaManager::RequireSignallingL(
CMceComSession& aSession,
CMceComSession& aBackup )
{
MCEMM_DEBUG("CMceMediaManager::RequireSignallingL(), Entry ");
TInt action = KMceNoSignalling;
TMceSrvStreamIterator streams(
aBackup.MccStreams(),
TMceSrvStreamIterator::ESendOrReceive );
TMceSrvStreamIterator updates(
aSession.MccStreams(),
TMceSrvStreamIterator::ESendOrReceive );
CMceSrvStream* update = NULL;
CMceSrvStream* stream = NULL;
//intersection i.e. streams both in update and original
while( !action &&
updates.NextIntersect( update, streams, stream ) )
{
//current codec
if ( stream->IsMccPrepared() )
{
CMccCodecInformation* codec =
iMccInterface->CodecL( stream->SessionId(),
stream->LinkId(),
stream->Id() );
CleanupStack::PushL( codec );
//updated codec
CMccCodecInformation* codecUpdate =
CreateMccCodecLC( *update, EMceRoleOfferer );
action = update->RequireSignalling( *stream,
*codec,
*codecUpdate );
CleanupStack::PopAndDestroy( codecUpdate );
CleanupStack::PopAndDestroy( codec );
}
else
{
action = stream->RequireSignalling( aSession.MccStreams() );
}
}
updates.Reset();
//added to update
while( !action &&
updates.NextComplement( update, streams ) )
{
action = update->RequireSignalling( aSession.MccStreams() );
}
streams.Reset();
//removed from update
while( !action &&
streams.NextComplement( stream, updates ) )
{
action = stream->RequireSignalling( aSession.MccStreams() );
}
MCEMM_DEBUG("CMceMediaManager::RequireSignallingL(), Exit ");
return action;
}
// ---------------------------------------------------------
// CMceMediaManager::SynchronizeMccStreamL
// ---------------------------------------------------------
//
void CMceMediaManager::SynchronizeMccStreamL(
CMceSrvStream& aStream,
TMceNegotiationRole aRole,
TBool aSyncCodecOnly )
{
MCEMM_DEBUG("CMceMediaManager::SynchronizeMccStreamL(), Entry ");
if ( !aStream.SynchronizeL() )
{
CMccCodecInformation* codec =
iMccInterface->CodecL( aStream.SessionId(),
aStream.LinkId(),
aStream.Id() );
CleanupStack::PushL( codec );
//re-populate codec with updated values
aStream.Codec().MccPopulateL( *codec, aStream, aRole );
MCEMM_DEBUG("CMceMediaManager::SynchronizeMccStreamL(): \
re-setting codec");
User::LeaveIfError(
iMccInterface->SetCodec(
aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
*codec ) );
CleanupStack::PopAndDestroy( codec );
if ( !aSyncCodecOnly )
{
SynchronizeMccStreamL( aStream );
}
}
MCEMM_DEBUG("CMceMediaManager::SynchronizeMccStreamL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::SynchronizeMccStreamL
// ---------------------------------------------------------
//
void CMceMediaManager::SynchronizeMccStreamL(
CMceSrvStream& aStream,
TUint32 aForceEnableEndpoint,
TUint32 aForceDisableEndpoint )
{
MCEMM_DEBUG("CMceMediaManager::SynchronizeMccStreamL() two, Entry ");
if ( !DoStartEndpointsL( aStream, aForceEnableEndpoint, aForceDisableEndpoint ) )
{
if ( !DoResumeEndpointsL( aStream, aForceEnableEndpoint ) )
{
DoPauseEndpointsL( aStream, aForceDisableEndpoint );
}
}
MCEMM_DEBUG_STREAM( "CMceMediaManager::SynchronizeMccStreamL() two: \
syncronized stream", aStream );
MCEMM_DEBUG("CMceMediaManager::SynchronizeMccStreamL() two, Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::ReuseLink
// ---------------------------------------------------------
//
TBool CMceMediaManager::ReuseLink( CMceSrvStream& aStream )
{
TBool inUse = EFalse;
CMceComSession* session = aStream.Data().Session();
CMceSrvStream* stream = NULL;
TMceSrvStreamIterator
sourceMatchStreams( session->MccStreams(),
aStream.Source().Data(),
KMceComUseProxyMatch );
TMceSrvStreamIterator
sinkMatchStreams( session->MccStreams(),
aStream.Sink().Data(),
KMceComUseProxyMatch );
while( !inUse && sourceMatchStreams.Next( stream ) )
{
if ( ( aStream.Data().iStreamType == CMceComMediaStream::ELocalStream ||
aStream.Source().Data().Type() == KMceRTPSource ) &&
stream->Data().iLinkId != KMceNotAssigned )
{
inUse = ETrue;
aStream.Data().iLinkId = stream->Data().iLinkId;
}
}
while( !inUse && sinkMatchStreams.Next( stream ) )
{
if ( ( aStream.Data().iStreamType == CMceComMediaStream::ELocalStream ||
aStream.Sink().Data().Type() == KMceRTPSink ) &&
stream->Data().iLinkId != KMceNotAssigned )
{
inUse = ETrue;
aStream.Data().iLinkId = stream->Data().iLinkId;
}
}
return inUse;
}
// ---------------------------------------------------------
// CMceMediaManager::ReuseSource
// ---------------------------------------------------------
//
TBool CMceMediaManager::ReuseSource( CMceSrvStream& aStream )
{
TBool inUse = EFalse;
if ( aStream.Source().Reusable( aStream ) )
{
CMceComSession* session = aStream.Data().Session();
CMceSrvStream* stream = NULL;
TMceSrvStreamIterator streams( session->MccStreams(),
aStream.Source().Data(),
KMceComUseProxyMatch );
while( !inUse && streams.Next( stream ) )
{
if ( stream->Source().Id() != KMceNotAssigned )
{
inUse = ETrue;
aStream.Id() = stream->Id();
aStream.Source().Id() = stream->Source().Id();
}
}
}
return inUse;
}
// ---------------------------------------------------------
// CMceMediaManager::ReuseSink
// ---------------------------------------------------------
//
TBool CMceMediaManager::ReuseSink( CMceSrvStream& aStream )
{
TBool inUse = EFalse;
if ( aStream.Sink().Reusable( aStream ) )
{
CMceComSession* session = aStream.Data().Session();
CMceSrvStream* stream = NULL;
TMceSrvStreamIterator streams( session->MccStreams(),
aStream.Sink().Data(),
KMceComUseProxyMatch );
while( !inUse && streams.Next( stream ) )
{
if ( stream->Sink().Id() != KMceNotAssigned )
{
inUse = ETrue;
aStream.Id() = stream->Id();
aStream.Sink().Id() = stream->Sink().Id();
}
}
}
return inUse;
}
// ---------------------------------------------------------
// CMceMediaManager::SetMccParameterL
// ---------------------------------------------------------
//
void CMceMediaManager::SetMccParameterL( TUint32 aParam,
const TDesC8& aValue ) const
{
User::LeaveIfError(
iMccInterface->SetParameter( 0, 0, 0, 0, aParam, aValue ) );
}
// ---------------------------------------------------------
// CMceMediaManager::GetMccParameterL
// ---------------------------------------------------------
//
void CMceMediaManager::GetMccParameterL( TUint32 aParam,
TDes8& aValue ) const
{
User::LeaveIfError(
iMccInterface->GetParameter( 0, 0, 0, 0, aParam, aValue ) );
}
// ---------------------------------------------------------
// CMceMediaManager::SetMccParameterL
// ---------------------------------------------------------
//
void CMceMediaManager::SetMccParameterL( const CMceComMediaSink& aMediaSink,
TUint32 aParam,
const TDesC8& aValue,
TBool aAllowNonPrepared ) const
{
CMceComSession* session = aMediaSink.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aMediaSink );
CMceSrvStream* stream = NULL;
TBool done = EFalse;
while( !done && streams.Next( stream ) )
{
if ( stream->IsMccPrepared() || aAllowNonPrepared )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::SetMccParameterL(): \
setting parameter of stream", *stream );
User::LeaveIfError(
iMccInterface->SetParameter( stream->SessionId(),
stream->LinkId(),
stream->Id(),
stream->Sink().Id(),
aParam,
aValue ) );
}
else
{
SetMccParameterL( aParam, aValue );
}
done = ETrue;
}
}
// ---------------------------------------------------------
// CMceMediaManager::SetMccParameterL
// ---------------------------------------------------------
//
void CMceMediaManager::SetMccParameterL( const CMceComMediaSource& aMediaSource,
TUint32 aParam,
const TDesC8& aValue,
TBool aAllowNonPrepared ) const
{
CMceComSession* session = aMediaSource.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aMediaSource );
CMceSrvStream* stream = NULL;
TBool done = EFalse;
while( !done && streams.Next( stream ) )
{
if ( stream->IsMccPrepared() || aAllowNonPrepared )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::SetMccParameterL(): \
setting parameter of stream", *stream );
User::LeaveIfError(
iMccInterface->SetParameter( stream->SessionId(),
stream->LinkId(),
stream->Id(),
stream->Source().Id(),
aParam,
aValue ) );
}
else
{
SetMccParameterL( aParam, aValue );
}
done = ETrue;
}
}
// ---------------------------------------------------------
// CMceMediaManager::GetMccParameterL
// ---------------------------------------------------------
//
void CMceMediaManager::GetMccParameterL( const CMceComMediaSink& aMediaSink,
TUint32 aParam,
TDes8& aValue,
TBool aAllowNonPrepared ) const
{
CMceComSession* session = aMediaSink.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aMediaSink );
CMceSrvStream* stream = NULL;
TBool done = EFalse;
while( !done && streams.Next( stream ) )
{
if ( stream->IsMccPrepared() || aAllowNonPrepared )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::GetMccParameterL(): \
getting parameter of stream", *stream );
User::LeaveIfError(
iMccInterface->GetParameter( stream->SessionId(),
stream->LinkId(),
stream->Id(),
stream->Sink().Id(),
aParam,
aValue ) );
}
else
{
GetMccParameterL( aParam, aValue );
}
done = ETrue;
}
}
// ---------------------------------------------------------
// CMceMediaManager::GetMccParameterL
// ---------------------------------------------------------
//
void CMceMediaManager::GetMccParameterL( const CMceComMediaSource& aMediaSource,
TUint32 aParam,
TDes8& aValue,
TBool aAllowNonPrepared ) const
{
CMceComSession* session = aMediaSource.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aMediaSource );
CMceSrvStream* stream = NULL;
TBool done = EFalse;
while( !done && streams.Next( stream ) )
{
if ( stream->IsMccPrepared() || aAllowNonPrepared )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::GetMccParameterL(): \
getting parameter of stream", *stream );
User::LeaveIfError(
iMccInterface->GetParameter( stream->SessionId(),
stream->LinkId(),
stream->Id(),
stream->Source().Id(),
aParam,
aValue ) );
}
else
{
GetMccParameterL( aParam, aValue );
}
done = ETrue;
}
}
// ---------------------------------------------------------
// CMceMediaManager::UpdateMccSourceL
// ---------------------------------------------------------
//
void CMceMediaManager::UpdateMccSourceL( CMceComCameraSource& aMediaSource )
{
CMceComSession* session = aMediaSource.MediaStream()->Session();
TMceSrvStreamIterator streams( session->MccStreams(), aMediaSource );
CMceSrvStream* stream = NULL;
TBool done = EFalse;
while( !done && streams.Next( stream ) )
{
CMceComCodec& codec = stream->Codec();
if ( stream->IsMccPrepared() )
{
MCEMM_DEBUG_STREAM( "CMceMediaManager::UpdateMccSourceL(): \
updating data source of stream", *stream );
User::LeaveIfError(
iMccInterface->UpdateDataSource( stream->SessionId(),
stream->LinkId(),
stream->Id(),
stream->Source().Id(),
aMediaSource.InitParamL( codec ) ) );
done = ETrue;
}
}
}
/*
** From MMccCtrlObserver ***
*/
// ---------------------------------------------------------
// CMceMediaManager::MccMediaLinkCreated
// ---------------------------------------------------------
//
void CMceMediaManager::MccMediaLinkCreated( TUint32 aSessionId,
TUint32 aLinkId,
const TDesC8& aNetSettings )
{
MCEMM_DEBUG("CMceMediaManager::MccMediaLinkCreated(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aSessionId );
MCEMM_DEBUG_DVALUE(" LinkID", aLinkId );
CMceComSession* session = Session( aSessionId );
if ( session )
{
TMceMccComEvent event( KMccLinkCreated,
aLinkId,
0,
0 );
event.SetDataDesC( aNetSettings );
TRAPD( err,
session->NegotiationState().MccLinkCreatedL( event ) );
if( err != KErrNone )
{
MCEMM_DEBUG_DVALUE("Error occured!, error", err );
session->NegotiationState().MccError( err, event );
}
}
else
{
MCEMM_DEBUG("No Session!");
iObserver->MediaError( KErrGeneral );
}
MCEMM_DEBUG("CMceMediaManager::MccMediaLinkCreated(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::MccMediaPrepared
// ---------------------------------------------------------
//
void CMceMediaManager::MccMediaPrepared( TUint32 aSessionId,
TUint32 aLinkId,
TUint32 aStreamId,
TUint32 aSinkSourceId )
{
MCEMM_DEBUG("CMceMediaManager::MccMediaPrepared(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aSessionId );
MCEMM_DEBUG_DVALUE(" LinkID", aLinkId );
MCEMM_DEBUG_DVALUE(" StreamID", aStreamId );
MCEMM_DEBUG_DVALUE(" EndpointID", aSinkSourceId );
CMceComSession* session = Session( aSessionId );
if ( session )
{
TMceMccComEvent event( KMccStreamPrepared,
aLinkId,
aStreamId,
aSinkSourceId );
TRAPD( err,
session->NegotiationState().MccMediaPreparedL( event ) );
if( err != KErrNone )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::MccMediaPrepared(): \
Error occured!, error", err );
session->NegotiationState().MccError( err, event );
}
}
else
{
MCEMM_DEBUG("No Session!");
iObserver->MediaError( KErrGeneral );
}
MCEMM_DEBUG("CMceMediaManager::MccMediaPrepared(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::MccMediaStarted
// ---------------------------------------------------------
//
void CMceMediaManager::MccMediaStarted( TUint32 aSessionId,
TUint32 aLinkId,
TUint32 aStreamId,
TUint32 aSinkSourceId )
{
MCEMM_DEBUG("CMceMediaManager::MccMediaStarted(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aSessionId );
MCEMM_DEBUG_DVALUE(" LinkID", aLinkId );
MCEMM_DEBUG_DVALUE(" StreamID", aStreamId );
MCEMM_DEBUG_DVALUE(" EndpointID", aSinkSourceId );
CMceComSession* session = Session( aSessionId );
if ( session )
{
TMceMccComEvent event( KMccStreamStarted,
aLinkId,
aStreamId,
aSinkSourceId );
TRAPD( err,
session->NegotiationState().MccMediaStartedL( event ) );
if( err != KErrNone )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::MccMediaStarted(): \
Error occured!, error", err );
session->NegotiationState().MccError( err, event );
}
}
else
{
MCEMM_DEBUG("No Session!");
iObserver->MediaError( KErrGeneral );
}
MCEMM_DEBUG("CMceMediaManager::MccMediaStarted(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::MccMediaStopped
// ---------------------------------------------------------
//
void CMceMediaManager::MccMediaStopped( TUint32 aSessionId,
TUint32 aLinkId,
TUint32 aStreamId,
TUint32 aSinkSourceId )
{
MCEMM_DEBUG("CMceMediaManager::MccMediaStopped(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aSessionId );
MCEMM_DEBUG_DVALUE(" LinkID", aLinkId );
MCEMM_DEBUG_DVALUE(" StreamID", aStreamId );
MCEMM_DEBUG_DVALUE(" EndpointID", aSinkSourceId );
CMceComSession* session = Session( aSessionId );
if ( session )
{
TMceMccComEvent event( KMccStreamStopped,
aLinkId,
aStreamId,
aSinkSourceId );
CMceSrvStream::EventReceived( session->MccStreams(), event );
}
else
{
MCEMM_DEBUG("No Session!");
iObserver->MediaError( KErrGeneral );
}
MCEMM_DEBUG("CMceMediaManager::MccMediaStopped(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::MccMediaPaused
// ---------------------------------------------------------
//
void CMceMediaManager::MccMediaPaused( TUint32 aSessionId,
TUint32 aLinkId,
TUint32 aStreamId,
TUint32 aSinkSourceId )
{
MCEMM_DEBUG("CMceMediaManager::MccMediaPaused(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aSessionId );
MCEMM_DEBUG_DVALUE(" LinkID", aLinkId );
MCEMM_DEBUG_DVALUE(" StreamID", aStreamId );
MCEMM_DEBUG_DVALUE(" EndpointID", aSinkSourceId );
CMceComSession* session = Session( aSessionId );
if ( session )
{
TMceMccComEvent event( KMccStreamPaused,
aLinkId,
aStreamId,
aSinkSourceId );
TRAPD( err,
session->NegotiationState().MccMediaPausedL( event ) );
if( err != KErrNone )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::MccMediaPaused(): \
Error occured!, error", err );
session->NegotiationState().MccError( err, event );
}
}
else
{
MCEMM_DEBUG("No Session!");
iObserver->MediaError( KErrGeneral );
}
MCEMM_DEBUG("CMceMediaManager::MccMediaPaused(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::MccMediaResumed
// ---------------------------------------------------------
//
void CMceMediaManager::MccMediaResumed( TUint32 aSessionId,
TUint32 aLinkId,
TUint32 aStreamId,
TUint32 aSinkSourceId )
{
MCEMM_DEBUG("CMceMediaManager::MccMediaResumed(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aSessionId );
MCEMM_DEBUG_DVALUE(" LinkID", aLinkId );
MCEMM_DEBUG_DVALUE(" StreamID", aStreamId );
MCEMM_DEBUG_DVALUE(" EndpointID", aSinkSourceId );
CMceComSession* session = Session( aSessionId );
if ( session )
{
TMceMccComEvent event( KMccStreamResumed,
aLinkId,
aStreamId,
aSinkSourceId );
TRAPD( err,
session->NegotiationState().MccMediaResumedL( event ) );
if( err != KErrNone )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::MccMediaResumed(): \
Error occured!, error", err );
session->NegotiationState().MccError( err, event );
}
}
else
{
MCEMM_DEBUG("No Session!");
iObserver->MediaError( KErrGeneral );
}
MCEMM_DEBUG("CMceMediaManager::MccMediaResumed(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::MccMediaInactive
// ---------------------------------------------------------
//
void CMceMediaManager::MccMediaInactive( TUint32 aSessionId,
TUint32 aLinkId,
TUint32 aStreamId,
TUint32 aSinkSourceId )
{
MCEMM_DEBUG("CMceMediaManager::MccMediaInactive(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aSessionId );
MCEMM_DEBUG_DVALUE(" LinkID", aLinkId );
MCEMM_DEBUG_DVALUE(" StreamID", aStreamId );
MCEMM_DEBUG_DVALUE(" EndpointID", aSinkSourceId );
CMceComSession* session = Session( aSessionId );
if ( session )
{
TMceMccComEvent event( KMccInactivityEvent,
aLinkId,
aStreamId,
aSinkSourceId );
CMceSrvStream::EventReceived( session->MccStreams(), event );
}
else
{
MCEMM_DEBUG("No Session!");
iObserver->MediaError( KErrGeneral );
}
MCEMM_DEBUG("CMceMediaManager::MccMediaInactive(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::MccMediaActive
// ---------------------------------------------------------
//
void CMceMediaManager::MccMediaActive( TUint32 aSessionId,
TUint32 aLinkId,
TUint32 aStreamId,
TUint32 aSinkSourceId )
{
MCEMM_DEBUG("CMceMediaManager::MccMediaActive(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aSessionId );
MCEMM_DEBUG_DVALUE(" LinkID", aLinkId );
MCEMM_DEBUG_DVALUE(" StreamID", aStreamId );
MCEMM_DEBUG_DVALUE(" EndpointID", aSinkSourceId );
CMceComSession* session = Session( aSessionId );
if ( session )
{
TMceMccComEvent event( KMccActivityEvent,
aLinkId,
aStreamId,
aSinkSourceId );
CMceSrvStream* stream =
CMceSrvStream::EventReceived( session->MccStreams(), event );
CMceSrvStream* adopted = session->RemoveAdoptedStream( *stream );
if ( adopted )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::MccMediaActive(): \
stopping adopted stream. id", adopted->Id() );
StopMccStream( *adopted );
if ( !session->IsMerged() && session->AdoptedMccStreams().Count() == 0 )
{
MCEMM_DEBUG_DVALUE("Closing session. id", adopted->SessionId() );
iMccInterface->CloseSession( adopted->SessionId() );
}
delete adopted;
}
}
else
{
MCEMM_DEBUG("No Session!");
iObserver->MediaError( KErrGeneral );
}
MCEMM_DEBUG("CMceMediaManager::MccMediaActive(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::MccCtrlError
// ---------------------------------------------------------
//
/*void CMceMediaManager::MccCtrlError( TInt aError )
{
MCEMM_DEBUG("CMceMediaManager::MccCtrlError(), Entry ");
MCEMM_DEBUG_DVALUE(" aError", aError );
iObserver->MediaError( aError );
MCEMM_DEBUG("CMceMediaManager::MccCtrlError(), Exit ");
}*/
// ---------------------------------------------------------
// CMceMediaManager::MccCtrlError
// ---------------------------------------------------------
//
void CMceMediaManager::MccCtrlError( TInt aError,
TUint32 aSessionId,
TUint32 aLinkId,
TUint32 aStreamId,
TUint32 aSinkSourceId )
{
MCEMM_DEBUG("CMceMediaManager::MccCtrlError(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aSessionId );
MCEMM_DEBUG_DVALUE(" LinkID", aLinkId );
MCEMM_DEBUG_DVALUE(" StreamID", aStreamId );
MCEMM_DEBUG_DVALUE(" EndpointID", aSinkSourceId );
MCEMM_DEBUG_DVALUE(" error", aError );
CMceComSession* session = Session( aSessionId );
if ( session )
{
TMceMccComEvent event( KMccStreamError,
aLinkId,
aStreamId,
aSinkSourceId );
session->NegotiationState().MccError( aError, event );
}
else
{
MCEMM_DEBUG("No Session!");
iObserver->MediaError( KErrGeneral );
}
MCEMM_DEBUG("CMceMediaManager::MccCtrlError(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::MccEventReceived
// ---------------------------------------------------------
//
void CMceMediaManager::MccEventReceived( const TMccEvent& aEvent )
{
MCEMM_DEBUG("CMceMediaManager::MccEventReceived(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aEvent.iSessionId );
MCEMM_DEBUG_DVALUE(" LinkID", aEvent.iLinkId );
MCEMM_DEBUG_DVALUE(" StreamID", aEvent.iStreamId );
MCEMM_DEBUG_DVALUE(" EndpointID", aEvent.iEndpointId );
MCEMM_DEBUG_DVALUE(" Event category", aEvent.iEventCategory );
MCEMM_DEBUG_DVALUE(" Event type", aEvent.iEventType );
if ( aEvent.iEventCategory == KMccEventCategoryTranscode )
{
MccTranscodeEventReceived( aEvent );
}
else if ( aEvent.iEventType == KMccLinkCreated ||
aEvent.iEventType == KMccLinkSecure ||
aEvent.iEventType == KMccLinkSecureVideo )
{
MccMediaLinkCreated( aEvent.iSessionId, aEvent.iLinkId,
aEvent.iEventData );
}
else
{
CMceComSession* session = Session( aEvent.iSessionId );
if ( !session )
{
MCEMM_DEBUG("no session");
MCEMM_DEBUG("CMceMediaManager::MccEventReceived(), Exit ");
return;
}
TMceMccComEvent event( aEvent.iEventType,
aEvent.iLinkId,
aEvent.iStreamId,
aEvent.iEndpointId );
event.SetDataDesC( aEvent.iEventData );
TMceSrvStreamIterator iterator( session->MccStreams() );
CMceSrvStream* stream = NULL;
if ( iterator.Next( stream, event ) )
{
if ( aEvent.iEventCategory == KMccEventCategoryDtmf )
{
// CodeScanner can't see properly inside to TRAP
// and in some cases it report Problem:
// Leaving functions called in non-leaving functions.
TRAP_IGNORE( \
stream->DtmfHandlerL( *iMccInterface ).DtmfReceivedL( \
aEvent, event ) );
// Event destination might have been modified
}
else if( aEvent.iEventType == KMccMasterKeyStaled )
{
if ( aEvent.iEventNumData > 0 &&
session->SecureSession() )
{
// set up in the session
session->SecureSession()->ContextNeedUpdated( aEvent.iEventNumData );
}
}
else if ( aEvent.iEventCategory == KMccEventCategoryRtcp )
{
const TMccRtcpEventData& rtcpEvent =
(*reinterpret_cast<const TMccRtcpEventDataPackage*>(
&aEvent.iEventData ))();
event.iEventSubType = rtcpEvent.iRtcpPacketType;
event.SetDataDesC( rtcpEvent.iRtcpPacketData );
}
else
{
// NOP
}
// Event might contain only link id (e.g. rtcp rr) but
// we do not want to propagate it to all streams of that link.
CMceSrvStream::EventReceived( session->MccStreams(), event, ETrue );
}
else
{
MCEMM_DEBUG("CMceMediaManager::MccEventReceived(): \
ERROR: Unknown stream" );
}
}
MCEMM_DEBUG("CMceMediaManager::MccEventReceived(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::MccTranscodeEventReceived
// ---------------------------------------------------------
//
void CMceMediaManager::MccTranscodeEventReceived( const TMccEvent& aEvent )
{
MCEMM_DEBUG("CMceMediaManager::MccTranscodeEventReceived(), Entry ");
MCEMM_DEBUG_DVALUE(" SessionID", aEvent.iSessionId );
CMceComFileSource* session = TranscodingSession( aEvent.iSessionId );
if ( !session )
{
MCEMM_DEBUG("no session");
MCEMM_DEBUG("CMceMediaManager::MccTranscodeEventReceived(), Exit ");
return;
}
TMceMccComEvent event( aEvent.iEventType, 0, 0, 0 );
event.iSource = session;
event.iItcEvent = aEvent.iEventType == KMccTranscodeCompleted ?
EMceItcTranscodingCompleted : EMceItcTranscodingInProgress;
event.iItcData = aEvent.iEventNumData;
event.iError = aEvent.iErrorCode;
session->iClient->EventReceived( event );
if ( aEvent.iEventType == KMccTranscodeCompleted )
{
TInt index = iTranscodeSessions.Find( session );
if ( index >= 0 )
{
iTranscodeSessions.Remove( index );
delete session;
}
}
MCEMM_DEBUG("CMceMediaManager::MccTranscodeEventReceived(), Exit ");
}
/*
* Private functions for internal use
*/
// ---------------------------------------------------------
// CMceMediaManager::Session
// ---------------------------------------------------------
//
CMceComSession* CMceMediaManager::Session( TUint32 aSessionId )
{
MCEMM_DEBUG("CMceMediaManager::Session(), Entry ");
CMceComSession* session = NULL;
for ( TInt i=0; i < iMceSdpSessions.Count() && !session; i++ )
{
CMceSdpSession* sdpSession = iMceSdpSessions[ i ];
if ( sdpSession->IsMaster() )
{
session = sdpSession->Consumes( aSessionId );
}
}
if ( !session )
{
MCEMM_DEBUG_DVALUE("Session not found! id", aSessionId )
iObserver->MediaError( KErrNotFound );
}
MCEMM_DEBUG("CMceMediaManager::Session(), Exit ");
return session;
}
// ---------------------------------------------------------
// CMceMediaManager::SdpSession
// ---------------------------------------------------------
//
CMceSdpSession* CMceMediaManager::SdpSession( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::SdpSession(), Entry ");
TInt error = KErrNone;
CMceSdpSession* sdpSession = &aSession.SdpSession();
if ( !sdpSession ) //possible clone
{
sdpSession = aSession.iCloneOrigin ? &aSession.iCloneOrigin->SdpSession() : NULL;
if ( sdpSession )
{
sdpSession->SetMediaSession( aSession.iCloneOrigin );
}
}
if ( sdpSession )
{
if ( &aSession != sdpSession->MediaSession() &&
&aSession != sdpSession->Backup() )
{
TRAP( error, aSession.AttachSDPSessionL( *sdpSession ) );
}
if ( MCE_IS_NULL_PTR( sdpSession->Backup() ) && //is not update
!sdpSession->IsMaster() && //is not master
sdpSession->Context() ) // has context
{
sdpSession->ContextSwitch();
}
}
if ( error != KErrNone )
{
sdpSession = NULL;
}
MCEMM_DEBUG("CMceMediaManager::SdpSession(), Exit ");
return sdpSession;
}
// ---------------------------------------------------------
// CMceMediaManager::CloseSession
// Closes MCC session and removes the internal sdp session
// Status : Draft
// ---------------------------------------------------------
TInt CMceMediaManager::CloseSession( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::CloseSession(), Entry ");
TInt error = KErrNone;
CMceSdpSession* sdpSession = SdpSession( aSession );
if ( !sdpSession )
{
MCEMM_DEBUG("No session!");
MCEMM_DEBUG("CMceMediaManager::CloseSession(), Exit ");
return KErrNotFound;
}
CMceComSession* backup = aSession.Backup();
if ( !backup )
//no backup => close session
{
if ( sdpSession->IsMaster() )
{
TRAP( error, CleanupSessionL( aSession ) );
iMccInterface->CloseSession( aSession.iMccID );
}
RemoveSession( sdpSession );
}
else if ( &aSession == backup )
//update accepted => close backup
{
TRAP( error, UpdateAcceptedL( *sdpSession ) );
}
else
//update rejected => rollback
{
TRAP( error, UpdateRejectedL( *sdpSession ) );
}
MCEMM_DEBUG("CMceMediaManager::CloseSession(), Exit ");
return error;
}
// ---------------------------------------------------------
// CMceMediaManager::UpdateAcceptedL
// ---------------------------------------------------------
void CMceMediaManager::UpdateAcceptedL( CMceSdpSession& aSdpSession )
{
MCEMM_DEBUG("CMceMediaManager::UpdateAcceptedL(), Entry ");
CMceComSession* session = aSdpSession.MediaSession();
CMceComSession* backup = aSdpSession.Backup();
__ASSERT_ALWAYS( session && backup, User::Leave( KErrNotFound ) );
if ( !session->IsMerged() )
//if not merged session
{
MCEMM_DEBUG("CMceMediaManager::UpdateAcceptedL(): \
session is not merged");
//stop backup's all send streams.
//No local streams or receive streams
TMceSrvStreamIterator
sendStreams( backup->MccStreams(),
TMceSrvStreamIterator::ESend );
CMceSrvStream* sendStream = NULL;
while( sendStreams.Next(
sendStream,
CMceSrvStream::EPrepared,
TMceSrvStreamIterator::GreaterOrEqualMatch ) )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::UpdateAcceptedL(): \
Stopping send stream. id", sendStream->Id() );
StopMccStream( *sendStream );
}
//adopt backup's all active receive streams to session
TMceSrvStreamIterator
receiveStreams( backup->MccStreams(),
TMceSrvStreamIterator::EReceive );
CMceSrvStream* receiveStream = NULL;
TBool canClose = ETrue;
while( receiveStreams.Next(
receiveStream,
CMceSrvStream::EPrepared,
TMceSrvStreamIterator::GreaterOrEqualMatch ) )
{
if ( receiveStream->Data().IsEnabled() )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::UpdateAcceptedL(): \
adopting receive stream. id", receiveStream->Id() );
session->AdoptStreamL( *receiveStream );
canClose = EFalse;
}
else
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::UpdateAcceptedL(): \
stopping receive stream. Id", receiveStream->Id() );
StopMccStream( *receiveStream );
}
}
//if no receive streams were adopted, backup can be closed
if ( canClose )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::UpdateAcceptedL(): \
closing session. Id", backup->iMccID );
iMccInterface->CloseSession( backup->iMccID );
}
}
else
{
MCEMM_DEBUG("CMceMediaManager::UpdateAcceptedL(): \
session is merged");
CleanupSessionL( *backup );
session->UnMerge();
}
backup->DetachSDPSession();
aSdpSession.SetBackup( NULL );
}
// ---------------------------------------------------------
// CMceMediaManager::UpdateRejectedL
// ---------------------------------------------------------
void CMceMediaManager::UpdateRejectedL( CMceSdpSession& aSdpSession )
{
MCEMM_DEBUG("CMceMediaManager::UpdateRejected(), Entry ");
CMceComSession* session = aSdpSession.MediaSession();
CMceComSession* backup = aSdpSession.Backup();
__ASSERT_ALWAYS( session && backup, User::Leave( KErrNotFound ) );
CleanupSessionL( *session );
if ( !session->IsMerged() )
//if not merged session
{
MCEMM_DEBUG_DVALUE("Closing session. Id", session->iMccID );
iMccInterface->CloseSession( session->iMccID );
}
else
{
MCEMM_DEBUG_DVALUE("Unmerging session. Id", backup->iMccID );
backup->UnMergeL( *session );
}
session->DetachSDPSession();
aSdpSession.SetMediaSession( backup );
aSdpSession.SetBackup( NULL );
MCEMM_DEBUG("CMceMediaManager::UpdateRejected(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::CleanupSessionL
// ---------------------------------------------------------
void CMceMediaManager::CleanupSessionL( CMceComSession& aSession )
{
MCEMM_DEBUG("CMceMediaManager::CleanupSessionL(), Entry ");
CMceComSession* session = aSession.SdpSession().MediaSession();
CMceComSession* backup = aSession.SdpSession().Backup();
//close all started unmerged streams
TMceSrvStreamIterator streams( aSession.MccStreams() );
CMceSrvStream* stream= NULL;
while( streams.Next(
stream,
CMceSrvStream::EPrepared,
TMceSrvStreamIterator::GreaterOrEqualMatch ) )
{
if ( !stream->IsMerged() )//added or removed
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::CleanupSessionL(): \
stopping unmerged stream. Id", stream->Id() );
StopMccStream( *stream );
}
}
//close all adopted streams
TUint32 sessionId = KMceNotAssigned;
TMceSrvStreamIterator adopts( aSession.AdoptedMccStreams() );
CMceSrvStream* adopted = NULL;
while( adopts.Next( adopted ) )
{
if ( backup && &aSession == backup )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::CleanupSessionL(): \
re-adopting adopted stream. Id", adopted->Id() );
adopted = aSession.RemoveAdoptedStream( *adopted );
CleanupStack::PushL( adopted );
session->AdoptedMccStreams().AppendL( adopted );
CleanupStack::Pop( adopted );
}
else
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::CleanupSessionL(): \
stopping adopted stream. Id", adopted->Id() );
sessionId = adopted->SessionId();
StopMccStream( *adopted );
}
if ( sessionId != KMceNotAssigned )
{
MCEMM_DEBUG_DVALUE("CMceMediaManager::CleanupSessionL(): \
closing session. Id", sessionId );
iMccInterface->CloseSession( sessionId );
}
}
MCEMM_DEBUG("CMceMediaManager::CleanupSessionL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::RemoveSession
// ---------------------------------------------------------
//
void CMceMediaManager::RemoveSession( CMceSdpSession* aSdpSession )
{
MCEMM_DEBUG("CMceMediaManager::RemoveSession(), Entry ");
TUint32 sessionId = aSdpSession->MediaSession()->iMccID;
TBool isMaster = aSdpSession->IsMaster();
CMceSdpSession* sdpSession = NULL;
CMceSdpSession::TIterator sdpSessions( iMceSdpSessions );
TBool loop = ETrue;
// remove all sessions, which does not have media session
while( loop && sdpSessions.Next( sdpSession ) )
{
if ( sdpSession == aSdpSession ||
!sdpSession->MediaSession() ||
sdpSession->Consumes( sessionId ) )
{
if ( isMaster || sdpSession == aSdpSession )
{
sdpSessions.Remove();
delete sdpSession;
MCEMM_DEBUG("SDP session removed");
}
loop = isMaster;
}
}
MCEMM_DEBUG("CMceMediaManager::RemoveSession(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::UseRtcp
// ---------------------------------------------------------
//
TBool CMceMediaManager::UseRtcp( CMceSrvStream& aStream )
{
MCEMM_DEBUG("CMceMediaManager::UseRtcp(), Entry ")
TBool useRtcp( ETrue );
TMceSrvStreamIterator streams( aStream.Data().Session()->MccStreams() );
CMceSrvStream* stream = NULL;
while( streams.Next( stream ) && useRtcp )
{
if ( aStream.LinkId() == stream->LinkId() )
{
useRtcp = useRtcp && aStream.Data().Session()->UseRtcp();
}
}
MCEMM_DEBUG_DVALUE( "CMceMediaManager::UseRtcp() stream id:", aStream.Id() )
MCEMM_DEBUG_DVALUE( "CMceMediaManager::UseRtcp() use rtcp:", useRtcp )
return useRtcp;
}
// ---------------------------------------------------------
// CMceMediaManager::FillMceFileInfoL
// ---------------------------------------------------------
//
void CMceMediaManager::FillMceFileInfoL(
TMccFileSourceSetting& aMccFileInfo,
TMceFileInfo& aMceFileInfo ) const
{
CMccCodecInformationFactory* codecFactory =
CMccCodecInformationFactory::NewL();
CleanupStack::PushL( codecFactory );
aMceFileInfo.iAudioCodec = KNullDesC8;
aMceFileInfo.iAudioElementCount = 0;
if ( aMccFileInfo.iAudioFourCC != KMMFFourCCCodeNULL )
{
// File might contain unsupported audio, ignore leave
CMccCodecInformation* codec = NULL;
TRAP_IGNORE(
(codec = codecFactory->CreateCodecInformationL( aMccFileInfo.iAudioFourCC ) ))
if ( codec )
{
aMceFileInfo.iAudioCodec = codec->SdpName();
aMceFileInfo.iAudioBitRate = aMccFileInfo.iAudioBitRate;
}
delete codec;
aMceFileInfo.iAudioElementCount = 1;
}
aMceFileInfo.iVideoCodec = KNullDesC8;
aMceFileInfo.iVideoElementCount = 0;
if ( aMccFileInfo.iVideoFourCC != KMMFFourCCCodeNULL )
{
// File might contain unsupported video, ignore leave
CMccCodecInformation* codec = NULL;
TRAP_IGNORE(
(codec = codecFactory->CreateCodecInformationL( aMccFileInfo.iVideoFourCC ) ))
if ( codec )
{
aMceFileInfo.iVideoCodec = codec->SdpName();
aMceFileInfo.iVideoFrameRate = aMccFileInfo.iVideoFrameRate;
aMceFileInfo.iVideoBitRate = aMccFileInfo.iVideoBitRate;
aMceFileInfo.iVideoFrameSize = aMccFileInfo.iVideoFrameSize;
}
delete codec;
aMceFileInfo.iVideoElementCount = 1;
}
aMceFileInfo.iDuration = aMccFileInfo.iDuration;
CleanupStack::PopAndDestroy( codecFactory );
}
// ---------------------------------------------------------
// CMceMediaManager::DoStartEndpointsL
// ---------------------------------------------------------
//
TBool CMceMediaManager::DoStartEndpointsL(
CMceSrvStream& aStream,
TUint32 aForceEnableEndpoint,
TUint32 aForceDisableEndpoint )
{
MCEMM_DEBUG("CMceMediaManager::DoStartEndpointsL(), Entry ");
if ( aForceDisableEndpoint )
{
// No need to start if explicitly disabling
MCEMM_DEBUG("CMceMediaManager::DoStartEndpointsL(), Exit ");
return EFalse;
}
TBool sinkForced( aStream.Sink().Id() == aForceEnableEndpoint );
TBool sourceForced( aStream.Source().Id() == aForceEnableEndpoint );
TBool sinkNeedsStart(
aStream.Codec().iIsEnabled &&
( aStream.Sink().State() < CMceSrvStream::EStarted &&
aStream.Sink().State() != CMceSrvStream::EStarting ) &&
( aStream.Sink().Data().IsEnabled( KMceEnabledE2e ) ||
sinkForced ) &&
( aStream.Sink().State() == CMceSrvStream::EPrepared ||
aStream.Sink().State() == CMceSrvStream::EPending ) );
TBool sourceNeedsStart(
aStream.Codec().iIsEnabled &&
( aStream.Source().State() < CMceSrvStream::EStarted &&
aStream.Source().State() != CMceSrvStream::EStarting ) &&
( aStream.Source().Data().IsEnabled( KMceEnabledE2e ) ||
sourceForced ) &&
( aStream.Source().State() == CMceSrvStream::EPrepared ||
aStream.Source().State() == CMceSrvStream::EPending ) );
MCEMM_DEBUG_DVALUE(" forced (0 means no) endpoint ", aForceEnableEndpoint );
MCEMM_DEBUG_DVALUE(" start sink", sinkNeedsStart );
MCEMM_DEBUG_DVALUE(" start source", sourceNeedsStart );
TBool startNeeded( sinkNeedsStart || sourceNeedsStart );
TUint32 startEndpointId = 0;
// Resolve resumed endpoints
//
if ( sinkNeedsStart ^ sourceNeedsStart )
{
startEndpointId = sinkNeedsStart ? aStream.Sink().Id() :
aStream.Source().Id();
}
if ( startNeeded )
{
MCEMM_DEBUG_DVALUE("starting (0 means all) endpoint(s) ", startEndpointId );
User::LeaveIfError(
iMccInterface->StartStream(
aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
startEndpointId,
EFalse,
UseRtcp( aStream ) ) );
SetPendingState( aStream, startEndpointId, CMceSrvStream::EStarting );
}
else
{
MCEMM_DEBUG("no need to start");
}
aStream.UpdateEndpointStates( sinkForced, sourceForced, ETrue );
MCEMM_DEBUG("CMceMediaManager::DoStartEndpointsL(), Exit ");
return startNeeded;
}
// ---------------------------------------------------------
// CMceMediaManager::DoResumeEndpointsL
// ---------------------------------------------------------
//
TBool CMceMediaManager::DoResumeEndpointsL(
CMceSrvStream& aStream,
TUint32 aForceEnableEndpoint )
{
MCEMM_DEBUG("CMceMediaManager::DoResumeEndpointsL(), Entry ");
TBool sinkForced( aStream.Sink().Id() == aForceEnableEndpoint );
TBool sourceForced( aStream.Source().Id() == aForceEnableEndpoint );
// Do not allow resuming streams which have disabled codec
//
TBool sinkNeedsResume(
aStream.Codec().iIsEnabled &&
( aStream.Sink().Data().IsEnabled( KMceEnabledE2e ) || sinkForced ) &&
( aStream.Sink().State() == CMceSrvStream::EPaused ||
aStream.Sink().State() == CMceSrvStream::EPausing ) );
TBool sourceNeedsResume(
aStream.Codec().iIsEnabled &&
( aStream.Source().Data().IsEnabled( KMceEnabledE2e ) || sourceForced ) &&
( aStream.Source().State() == CMceSrvStream::EPaused ||
aStream.Source().State() == CMceSrvStream::EPausing ) );
MCEMM_DEBUG_DVALUE(" forced (0 means no) endpoint ", aForceEnableEndpoint );
MCEMM_DEBUG_DVALUE(" resume sink", sinkNeedsResume );
MCEMM_DEBUG_DVALUE(" resume source", sourceNeedsResume );
TBool resumeNeeded( sinkNeedsResume || sourceNeedsResume );
TUint32 resumeEndpointId = 0;
// Resolve resumed endpoints
//
if ( sinkNeedsResume ^ sourceNeedsResume )
{
resumeEndpointId = sinkNeedsResume ? aStream.Sink().Id() :
aStream.Source().Id();
}
if ( resumeNeeded )
{
MCEMM_DEBUG_DVALUE("resuming (0 means all) endpoint(s) ", resumeEndpointId );
User::LeaveIfError(
iMccInterface->ResumeStream(
aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
resumeEndpointId,
UseRtcp( aStream ) ) );
SetPendingState( aStream, resumeEndpointId, CMceSrvStream::EStarting );
}
else
{
MCEMM_DEBUG("no need to resume");
}
aStream.UpdateEndpointStates( sinkForced, sourceForced, ETrue );
MCEMM_DEBUG("CMceMediaManager::DoResumeEndpointsL(), Exit ");
return resumeNeeded;
}
// ---------------------------------------------------------
// CMceMediaManager::DoPauseEndpointsL
// ---------------------------------------------------------
//
TBool CMceMediaManager::DoPauseEndpointsL(
CMceSrvStream& aStream,
TUint32 aForceDisableEndpoint )
{
MCEMM_DEBUG("CMceMediaManager::DoPauseEndpointsL(), Entry ");
TBool sinkForced( aStream.Sink().Id() == aForceDisableEndpoint );
TBool sourceForced( aStream.Source().Id() == aForceDisableEndpoint );
// Do not allow streams with disabled codec to run
//
TBool sinkNeedsPause(
( !aStream.Codec().iIsEnabled ||
!aStream.Sink().Data().IsEnabled( KMceEnabledE2e ) ||
sinkForced ) &&
( aStream.Sink().State() == CMceSrvStream::EStarted ||
aStream.Sink().State() == CMceSrvStream::EStarting ) );
TBool sourceNeedsPause(
( !aStream.Codec().iIsEnabled ||
!aStream.Source().Data().IsEnabled( KMceEnabledE2e ) ||
sourceForced ) &&
( aStream.Source().State() == CMceSrvStream::EStarted ||
aStream.Source().State() == CMceSrvStream::EStarting ) );
MCEMM_DEBUG_DVALUE(" forced (0 means no) endpoint ", aForceDisableEndpoint );
MCEMM_DEBUG_DVALUE(" pause sink", sinkNeedsPause );
MCEMM_DEBUG_DVALUE(" pasue source", sourceNeedsPause );
TBool pauseNeeded( sinkNeedsPause || sourceNeedsPause );
TUint32 pauseEndpointId = 0;
// Resolve paused endpoints
//
if ( sinkNeedsPause ^ sourceNeedsPause )
{
pauseEndpointId = sinkNeedsPause ? aStream.Sink().Id() :
aStream.Source().Id();
}
if ( pauseNeeded )
{
MCEMM_DEBUG_DVALUE("pausing (0 means all) endpoint(s) ", pauseEndpointId );
User::LeaveIfError(
iMccInterface->PauseStream(
aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
pauseEndpointId,
UseRtcp( aStream ) ) );
SetPendingState( aStream, pauseEndpointId, CMceSrvStream::EPausing );
}
else
{
MCEMM_DEBUG("no need to pause");
}
aStream.UpdateEndpointStates( sinkForced, sourceForced, EFalse );
MCEMM_DEBUG("CMceMediaManager::DoPauseEndpointsL(), Exit ");
return pauseNeeded;
}
// ---------------------------------------------------------
// CMceMediaManager::SetPendingState
// ---------------------------------------------------------
//
void CMceMediaManager::SetPendingState(
CMceSrvStream& aStream,
TUint32 aEndpointId,
CMceSrvStream::TState aState )
{
if ( aEndpointId == 0 || aStream.Source().Id() == aEndpointId )
{
aStream.Source().SetState( aState );
}
if ( aEndpointId == 0 || aStream.Sink().Id() == aEndpointId )
{
aStream.Sink().SetState( aState );
}
}
// ---------------------------------------------------------
// CMceMediaManager::DoDtmfL
// ---------------------------------------------------------
//
TBool CMceMediaManager::DoDtmfL(
CMceComMediaSource& aSource,
TMceComEvent& aEvent,
const TDesC8& aSequence,
TBool aUseBoundStream )
{
CMceComSession* session = aSource.MediaStream()->Session();
__ASSERT_ALWAYS( session, User::Leave( KErrNotReady ) );
CMceComMediaStream* comStream = aSource.MediaStream();
if ( aUseBoundStream )
{
comStream = &( comStream->BoundStreamL() );
__ASSERT_ALWAYS( comStream, User::Leave( KErrNotSupported ) );
}
// Sending dtmf signals is only possible through dtmf uplink
TBool handled( EFalse );
if ( IS_RECEIVESTREAM( comStream ) )
{
return handled;
}
TMceSrvStreamIterator streams( session->MccStreams(), *comStream );
CMceSrvStream* stream = NULL;
while( streams.Next( stream ) && !handled )
{
if ( stream->MccStreamType() == KMccDtmfStream )
{
stream->DtmfHandlerL( *iMccInterface ).DtmfL( aSource,
aEvent,
aSequence );
handled = ETrue;
}
}
return handled;
}
// ---------------------------------------------------------
// CMceMediaManager::DoAdjustMccStreamL
// ---------------------------------------------------------
//
CMceComCodec* CMceMediaManager::DoAdjustMccStreamL( CMceSrvStream& aStream )
{
MCEMM_DEBUG("CMceMediaManager::DoAdjustMccStreamL(), Entry ")
__ASSERT_ALWAYS( aStream.State() != CMceSrvStream::EAdopted,
User::Leave( KErrArgument ) );
__ASSERT_ALWAYS( aStream.State() >= CMceSrvStream::EPrepared,
User::Leave( KErrArgument ) );
//get codec
CMccCodecInformation* codec =
iMccInterface->CodecL(
aStream.SessionId(),
aStream.LinkId(),
aStream.Id() );
CleanupStack::PushL( codec );
//adjust codec
CMceComCodec* bidirectional =
aStream.Codec().MccValidateL( *codec, aStream, EMceRoleOfferer );
aStream.Codec().MccAdjustL( *codec, aStream );
User::LeaveIfError(
iMccInterface->SetCodec(
aStream.SessionId(),
aStream.LinkId(),
aStream.Id(),
*codec ) );
CleanupStack::PopAndDestroy( codec );
MCEMM_DEBUG("CMceMediaManager::DoAdjustMccStreamL(), Exit ")
return bidirectional;
}
// ---------------------------------------------------------
// CMceMediaManager::DoConfigKeyUpdateL
// ---------------------------------------------------------
//
void CMceMediaManager::DoConfigKeyUpdateL(
CMceComMediaStream& aStream,
HBufC8* aConfigKey )
{
MCEMM_DEBUG("CMceMediaManager::DoConfigKeyUpdateL(), Entry ");
__ASSERT_ALWAYS( aStream.iType == KMceVideo, User::Leave( KErrArgument ) );
__ASSERT_ALWAYS( aConfigKey, User::Leave( KErrArgument ) );
RPointerArray<CMceComMediaSink>& sinks = aStream.Sinks();
for ( TInt i = 0; i < sinks.Count(); i++ )
{
TMceSrvStreamIterator streams(
aStream.Session()->MccStreams(), aStream );
CMceSrvStream* stream = NULL;
while( streams.Next( stream ) )
{
CMceComVideoCodec& videoCodec =
reinterpret_cast<CMceComVideoCodec&>( stream->Codec() );
MCEMM_DEBUG_STREAM( "updating config key", *stream );
if ( videoCodec.SetConfigKeyL( aConfigKey ) )
{
// Synchronize codec only
SynchronizeMccStreamL( *stream,
aStream.Session()->NegotiationState().Role(),
ETrue );
}
}
}
MCEMM_DEBUG("CMceMediaManager::DoConfigKeyUpdateL(), Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::UpDateStreamStateL
// ---------------------------------------------------------
//
void CMceMediaManager::UpDateStreamStateL(CMceComSession& currentSession,
CMceComSession& forkSession )
{
MCEMM_DEBUG("CMceMediaManager::UpDateStreamState, Entry ");
CMceSrvStream* stream = NULL;
RPointerArray<CMceSrvStream> currentStreams;
TMceSrvStreamIterator sendStreams( currentSession.MccStreams(),
TMceSrvStreamIterator::ESend );
while( sendStreams.Next( stream, CMceSrvStream::EStopped,
TMceSrvStreamIterator::ExactReverseMatch ) )
{
if ( stream->State() != CMceSrvStream::EInactive &&
stream->Codec().iIsNegotiated )
{
currentStreams.Append( stream );
}
}
TMceSrvStreamIterator forkSendStreams( forkSession.MccStreams(),
TMceSrvStreamIterator::ESend );
while( forkSendStreams.Next( stream, CMceSrvStream::EStopped,
TMceSrvStreamIterator::ExactReverseMatch ) )
{
if ( stream->State() != CMceSrvStream::EInactive &&
stream->Codec().iIsNegotiated )
{
CMccCodecInformation* codec =
iMccInterface->CodecL( stream->SessionId(),
stream->LinkId(),
stream->Id() );
CleanupStack::PushL( codec );
stream->Codec().MccPopulateL( *codec, *stream, EMceRoleOfferer );
User::LeaveIfError( iMccInterface->SetCodec( stream->SessionId(),
stream->LinkId(), stream->Id(), *codec ) );
CleanupStack::PopAndDestroy( codec );
TBool IsMatch = EFalse;
for( TInt count = 0; count < currentStreams.Count() && !IsMatch; count++ )
{
if( currentStreams[count]->Codec().iSdpName ==
stream->Codec().iSdpName )
{
IsMatch = ETrue;
}
}
if( !IsMatch )
{
SetPendingState( *stream, 0, CMceSrvStream::EPaused );
}
}
}
MCEMM_DEBUG("CMceMediaManager::UpDateStreamState, Exit ");
}
// ---------------------------------------------------------
// CMceMediaManager::ForceEnableSinkState
// ---------------------------------------------------------
//
void CMceMediaManager::ForceEnableSinkState(CMceComSession& aSession )
{
CMceSrvStream* stream = NULL;
TBool IsSet = EFalse;
TMceSrvStreamIterator sendStreams( aSession.MccStreams(), TMceSrvStreamIterator::ESend );
while( !IsSet && sendStreams.Next( stream, CMceSrvStream::EStopped,
TMceSrvStreamIterator::ExactReverseMatch ) )
{
if ( stream->State() != CMceSrvStream::EInactive &&
stream->Codec().iIsNegotiated )
{
SetPendingState( *stream, stream->Sink().Id(), CMceSrvStream::EPaused );
IsSet = ETrue;
}
}
}
// End of File