diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmceshared/src/mcecomavsink.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmceshared/src/mcecomavsink.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,379 @@ +/* +* Copyright (c) 2006 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 "mcecomavsink.h" +#include "mceavsink.h" +#include "mceevents.h" +#include "mcecomcodec.h" +#include "mcecommediastream.h" +#include "mcecomsession.h" +#include "mcedisplaysink.h" +#include "mcecomdisplaysink.h" +#include "mcespeakersink.h" +#include "mcecomspeakersink.h" + +#ifdef MCE_COMMON_SERVER_SIDE + +#include +#include "mcesdpsession.h" +#include "mcemediamanager.h" + +#endif//MCE_COMMON_SERVER_SIDE + +// ============================ MEMBER FUNCTIONS =============================== + + + +// ----------------------------------------------------------------------------- +// CMceComAvSink::NewL +// ----------------------------------------------------------------------------- +// +CMceComAvSink* CMceComAvSink::NewL() + { + CMceComAvSink* self = NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMceComAvSink::NewLC +// ----------------------------------------------------------------------------- +// +CMceComAvSink* CMceComAvSink::NewLC() + { + CMceComAvSink* self = new (ELeave) CMceComAvSink(); + CleanupStack::PushL( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMceComAvSink::~CMceComAvSink +// ----------------------------------------------------------------------------- +// +CMceComAvSink::~CMceComAvSink() + { + delete iSettings; + iProxyClients.Close(); + + } + +// ----------------------------------------------------------------------------- +// CMceComAvSink::ServesProxyClient +// ----------------------------------------------------------------------------- +// +TBool CMceComAvSink::ServesProxyClient( const CMceComEndpoint& aClient ) const + { + TBool found = EFalse; + TInt index = 0; + while ( !found && index < iProxyClients.Count() ) + { + found = iProxyClients[ index ++ ]->Id() == aClient.Id(); + } + + return found; + + } + + +// ----------------------------------------------------------------------------- +// CMceComAvSink::AddProxyClientL +// ----------------------------------------------------------------------------- +// +void CMceComAvSink::AddProxyClientL( CMceComEndpoint& aClient ) + { + iProxyClients.AppendL( &aClient ); + ReferenceCount()++; + } + +// ----------------------------------------------------------------------------- +// CMceComAvSink::RemoveProxyClient +// ----------------------------------------------------------------------------- +// +void CMceComAvSink::RemoveProxyClient( CMceComEndpoint& aClient ) + { + TInt index = iProxyClients.Find( &aClient ); + if ( index >= 0 ) + { + iProxyClients.Remove( index ); + ReferenceCount()--; + } + } + + +// ----------------------------------------------------------------------------- +// CMceComAvSink::CMceComAvSink +// ----------------------------------------------------------------------------- +// +CMceComAvSink::CMceComAvSink() + : CMceComMediaSink( KMceAvSink ) + { + } + +// ----------------------------------------------------------------------------- +// CMceComAvSink::CloneL +// ----------------------------------------------------------------------------- +// +CMceComMediaSink* CMceComAvSink::CloneL() + { + CMceComAvSink* copy = new (ELeave) CMceComAvSink(); + Mem::Copy( copy, this, sizeof(CMceComAvSink) ); + copy->Zero(); + copy->iSettings = 0; + return copy; + + } + + +// ----------------------------------------------------------------------------- +// CMceComAvSink::InternalizeFlatL +// ----------------------------------------------------------------------------- +// +void CMceComAvSink::InternalizeFlatL( RReadStream& aReadStream ) + { + CMceComMediaSink::InternalizeFlatL( aReadStream ); + } + + + +// ----------------------------------------------------------------------------- +// CMceComAvSink::ExternalizeFlatL +// ----------------------------------------------------------------------------- +// +void CMceComAvSink::ExternalizeFlatL( RWriteStream& aWriteStream ) + { + CMceComMediaSink::ExternalizeFlatL( aWriteStream ); + } + + + +// ----------------------------------------------------------------------------- +// CMceComAvSink::EventReceivedL +// ----------------------------------------------------------------------------- +// +TInt CMceComAvSink::EventReceivedL( TMceComEvent& aEvent ) + { + TInt status = CMceComMediaSink::EventReceivedL( aEvent ); + return status; + + } + + +// ----------------------------------------------------------------------------- +// CMceComAvSink::UpdateL +// ----------------------------------------------------------------------------- +// +void CMceComAvSink::UpdateL( CMceComMediaSink& aUpdate ) + { + CMceComMediaSink::UpdateL( aUpdate ); + //CMceComAvSink& update = static_cast( aUpdate ); + } + + +#ifdef MCE_COMMON_SERVER_SIDE + +// ----------------------------------------------------------------------------- +// CMceComAvSink::MccType +// ----------------------------------------------------------------------------- +// +const TUid CMceComAvSink::MccType() + { + return KUidMccVideoSink; + } + + + + +// ----------------------------------------------------------------------------- +// CMceComAvSink::InitParamL +// ----------------------------------------------------------------------------- +// +const TDesC8& CMceComAvSink::InitParamL( const CMceComCodec& aCodec ) + { + delete iSettings; + iSettings = NULL; + + CMceComDisplaySink* displaySink = NULL; + TInt index = 0; + while( index < iProxyClients.Count() && !displaySink ) + { + if ( iProxyClients[ index ]->iType == KMceDisplaySink ) + { + displaySink = static_cast( iProxyClients[ index ] ); + } + index++; + } + + if ( displaySink ) + { + return displaySink->DoInitParamL( aCodec ); + } + else + { + iSettings = KNullDesC8().AllocL(); + } + + return *iSettings; + + } + +// ----------------------------------------------------------------------------- +// CMceComAvSink::PrepareL +// ----------------------------------------------------------------------------- +// +void CMceComAvSink::PrepareL() + { + CMceComSpeakerSink* speakerSink = NULL; + TInt index = 0; + while( index < iProxyClients.Count() && !speakerSink ) + { + if ( iProxyClients[ index ]->iType == KMceSpeakerSink ) + { + speakerSink = static_cast( iProxyClients[ index ] ); + } + index++; + } + + if ( speakerSink ) + { + __ASSERT_ALWAYS( speakerSink->MediaStream() && + speakerSink->MediaStream()->Session(), + User::Leave( KErrNotFound ) ); + + CMceMediaManager& manager = + speakerSink->MediaStream()->Session()->SdpSession().Manager(); + + if ( speakerSink->iVolume != KMceNotAssignedInt ) + { + // Set initial volume + iVolume = speakerSink->iVolume; + manager.SetVolumeL( *speakerSink, iVolume ); + } + else + { + // Get initial volume + manager.GetVolumeL( *speakerSink, iVolume ); + } + } + } + +// ----------------------------------------------------------------------------- +// CMceComAvSink::ClientEnableL +// ----------------------------------------------------------------------------- +// +TBool CMceComAvSink::ClientEnableL( + CMceComEndpoint& aClient, + const CMceComCodec& /*aCodec*/ ) + { + if ( aClient.iType != KMceSpeakerSink ) + { + return KMceSrvStreamDefaultSequence; + } + + __ASSERT_ALWAYS( ServesProxyClient( aClient ), User::Leave( KErrNotFound ) ); + + __ASSERT_ALWAYS( aClient.MediaStream() && aClient.MediaStream()->Session(), + User::Leave( KErrNotFound ) ); + + CMceMediaManager& manager = + aClient.MediaStream()->Session()->SdpSession().Manager(); + + // No need to route command from mediamanager back to here + TPckgBuf volBuf( iVolume ); + manager.SetMccParameterL( + static_cast( aClient ), + KMccSpeakerVolume, + volBuf ); + + return KMceSrvStreamAlternativeSequence; + } + +// ----------------------------------------------------------------------------- +// CMceComAvSink::ClientDisableL +// ----------------------------------------------------------------------------- +// +TBool CMceComAvSink::ClientDisableL( CMceComEndpoint& aClient ) + { + if ( aClient.iType != KMceSpeakerSink ) + { + return KMceSrvStreamDefaultSequence; + } + + __ASSERT_ALWAYS( ServesProxyClient( aClient ), User::Leave( KErrNotFound ) ); + + __ASSERT_ALWAYS( aClient.MediaStream() && aClient.MediaStream()->Session(), + User::Leave( KErrNotFound ) ); + + CMceMediaManager& manager = + aClient.MediaStream()->Session()->SdpSession().Manager(); + + // Disable by setting volume to zero, remember the original volume + // + manager.GetVolumeL( static_cast( aClient ), iVolume ); + + // No need to route command from mediamanager back to here + TPckgBuf volBuf( 0 ); + manager.SetMccParameterL( + static_cast( aClient ), + KMccSpeakerVolume, + volBuf ); + + return KMceSrvStreamAlternativeSequence; + } + +// ----------------------------------------------------------------------------- +// CMceComAvSink::SetParameterL +// ----------------------------------------------------------------------------- +// +TBool CMceComAvSink::SetParameterL( + const CMceComEndpoint& aClient, + TUint32 aParam, + const TDesC8& aValue ) + { + // At the moment, only supported parameter is volume for speaker + // + if ( aClient.iType != KMceSpeakerSink || aParam != KMccSpeakerVolume ) + { + return KMceSrvStreamDefaultSequence; + } + + __ASSERT_ALWAYS( ServesProxyClient( aClient ), User::Leave( KErrNotFound ) ); + + __ASSERT_ALWAYS( aClient.MediaStream() && aClient.MediaStream()->Session(), + User::Leave( KErrNotFound ) ); + + CMceMediaManager& manager = + aClient.MediaStream()->Session()->SdpSession().Manager(); + + TPckgBuf volBuf; + volBuf.Copy( aValue ); + + iVolume = volBuf(); + + if ( aClient.IsEnabled() ) + { + manager.SetMccParameterL( + static_cast( aClient ), aParam, aValue ); + } + + return KMceSrvStreamAlternativeSequence; + } + +#endif//MCE_COMMON_SERVER_SIDE +