multimediacommsengine/mmceshared/src/mcecomavsink.cpp
changeset 0 1bce908db942
--- /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 <mmccinterface.h>
+#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<CMceComAvSink&>( 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<CMceComDisplaySink*>( 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<CMceComSpeakerSink*>( 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<TInt> volBuf( iVolume );
+    manager.SetMccParameterL( 
+            static_cast<const CMceComMediaSink&>( 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<CMceComMediaSink&>( aClient ), iVolume );
+    
+    // No need to route command from mediamanager back to here
+    TPckgBuf<TInt> volBuf( 0 );
+    manager.SetMccParameterL( 
+            static_cast<const CMceComMediaSink&>( 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<TInt> volBuf;
+    volBuf.Copy( aValue );
+    
+    iVolume = volBuf();
+    
+    if ( aClient.IsEnabled() )
+        {
+        manager.SetMccParameterL( 
+            static_cast<const CMceComMediaSink&>( aClient ), aParam, aValue );
+        }
+        
+    return KMceSrvStreamAlternativeSequence;
+    }
+    
+#endif//MCE_COMMON_SERVER_SIDE
+