tsrc/musenginestub/src/musengtwowaysession.cpp
branchRCL_3
changeset 22 73a1feb507fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tsrc/musenginestub/src/musengtwowaysession.cpp	Tue Aug 31 15:12:07 2010 +0300
@@ -0,0 +1,476 @@
+/*
+* 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: 
+*
+*/
+
+
+// USER
+#include "musengtwowaysession.h"
+#include "musengsessionobserver.h"
+#include "musenglivesessionobserver.h"
+#include "musunittesting.h"
+#include "musengmceutils.h"
+#include "musenglogger.h"
+#include "musengtwowaysessionobserver.h"
+
+// SYSTEM
+#include <mcemanager.h>
+#include <mcecamerasource.h>
+#include <mcevideostream.h>
+#include <mcertpsink.h>
+#include <mcedisplaysink.h>
+#include <mcesession.h>
+#include <mcertpsource.h>
+
+const TInt KMusEngJitterBufferLength = 51; //Must be bigger than treshold
+// Using following value increases treshold buffer to 1 second from 
+// default 100 ms
+const TInt KMusEngJitterBufferTreshold = 50;
+
+const TUint32 KMusEngTwoWayReceivingActivityTimeout = 3000; // 3 seconds
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMusEngTwoWaySession* CMusEngTwoWaySession::NewL(
+                        const TRect& aRemoteRect,
+                        const TRect& aLocalRect,
+                        MMusEngSessionObserver& aSessionObserver,
+                        MMusEngOutSessionObserver& aOutSessionObserver,
+                        MMusEngLiveSessionObserver& aLiveSessionObserver,
+                        MMusEngTwoWaySessionObserver& aTwoWayObserver )
+    {
+    CMusEngTwoWaySession* self = new( ELeave ) CMusEngTwoWaySession( 
+                                                    aSessionObserver,
+                                                    aOutSessionObserver,
+                                                    aLiveSessionObserver, 
+                                                    aTwoWayObserver,
+                                                    aRemoteRect,
+                                                    aLocalRect );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMusEngTwoWaySession::~CMusEngTwoWaySession()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::~CMusEngTwoWaySession()" )
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::~CMusEngTwoWaySession()" )
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::EnableDisplayL( TBool aEnable )
+    {
+    MUS_LOG1( "mus: [ENGINE]     -> CMusEngTwoWaySession::EnableDisplayL() %d", 
+              aEnable )
+
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplay( *iSession );
+    if ( display )
+        {
+        MusEngMceUtils::DoEnableDisplayL( *display, aEnable );
+        }     
+    CMceDisplaySink* vfDisplay = MusEngMceUtils::GetDisplayL( *iSession, ETrue );
+    MusEngMceUtils::DoEnableDisplayL( *vfDisplay, aEnable );     
+        
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::EnableDisplayL()")
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//        
+void CMusEngTwoWaySession::SetOrientationL( TDisplayOrientation aOrientation )
+    {
+    MUS_LOG1( "mus: [ENGINE]  -> CMusEngTwoWaySession::SetOrientationL() %d", 
+              aOrientation )
+              
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+    
+    CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplay( *iSession );            
+    CMceDisplaySink* vfDisplay = MusEngMceUtils::GetDisplayL( *iSession, ETrue );
+
+    CMceDisplaySink::TRotation rotation = ( aOrientation == EPortrait ) ? 
+         CMceDisplaySink::ENone : CMceDisplaySink::EClockwise90Degree;
+     
+    vfDisplay->SetRotationL( rotation );
+    if ( display )
+        {
+        display->SetRotationL( rotation );
+        }
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::SetOrientationL()" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::RecordL( TBool aRecord )
+    {
+    MUS_LOG1( "mus: [ENGINE]  -> CMusEngTwoWaySession::RecordL( %d )", aRecord )
+
+    User::Leave( KErrNotSupported );
+
+    MUS_LOG1( "mus: [ENGINE]  <- CMusEngTwoWaySession::RecordL( %d )", aRecord ) 
+    }    
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMusEngTwoWaySession::IsRecording()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::IsRecording()" )    
+    
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngTwoWaySession::SetRectsL( 
+    const TRect& aRemoteRect,
+    const TRect& aLocalRect )
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::SetRectsL()" )  
+     
+    iLocalRect = aLocalRect;
+    iRect = aRemoteRect;
+    RectChangedL();
+    
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::SetRectsL()" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMusEngTwoWaySession::SetLocalRectL( const TRect& aLocalRect )
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::SetLocalRectL()" )
+    
+    iLocalRect = aLocalRect;
+    RectChangedL();
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::SetLocalRectL()" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TRect CMusEngTwoWaySession::LocalRect() const
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::LocalRect()" )
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::LocalRect()" )
+    return iLocalRect;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::RectChangedL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::RectChangedL()" )
+
+    // If session is not yet created, do nothing
+    if ( iSession && iSession->State() != CMceSession::ETerminated )
+        {
+        TRect remoteRect( Rect() );
+        MUS_LOG2( "mus: [ENGINE]  remote tl.ix=%d tl.iy=%d", 
+                  remoteRect.iTl.iX, remoteRect.iTl.iY )
+        MUS_LOG2( "mus: [ENGINE]  remote br.ix=%d br.iy=%d", 
+                  remoteRect.iBr.iX, remoteRect.iBr.iY )    
+        MUS_LOG2( "mus: [ENGINE]  local tl.ix=%d tl.iy=%d", 
+                  iLocalRect.iTl.iX, iLocalRect.iTl.iY )
+        MUS_LOG2( "mus: [ENGINE]  local br.ix=%d br.iy=%d", 
+                  iLocalRect.iBr.iX, iLocalRect.iBr.iY )
+            
+        CMceDisplaySink* display = MusEngMceUtils::GetReceivingDisplay( *iSession );
+        if ( display )
+            {
+            display->SetDisplayRectL( remoteRect );
+            }
+        CMceDisplaySink* vfDisplay = MusEngMceUtils::GetDisplayL( *iSession, ETrue );
+        vfDisplay->SetDisplayRectL( iLocalRect );
+        }
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::RectChangedL()" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::CompleteSessionStructureL( 
+                                            CMceStreamBundle& /*aLocalBundle*/ )
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::CompleteSessionStructureL()" )
+
+    __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+    iCameraHandler.SetSession( iSession );
+    
+    // Create outgoing video stream
+    CMceVideoStream* videoStream = CMceVideoStream::NewLC();
+    
+    CMceRtpSink* rtpsink = CMceRtpSink::NewLC();
+    videoStream->AddSinkL( rtpsink );
+    CleanupStack::Pop( rtpsink );
+
+    CMceCameraSource* camera = CMceCameraSource::NewLC( *iManager );
+    camera->DisableL(); // Start session in pause mode.
+    
+    iCameraHandler.InitializeL( *camera );
+
+    videoStream->SetSourceL( camera );
+    CleanupStack::Pop( camera );
+    
+    // Create incoming video stream
+    CMceVideoStream* videoInStream = CMceVideoStream::NewL();
+    CleanupStack::PushL( videoInStream );
+       
+    MusEngMceUtils::AddDisplayL( *videoInStream, *iManager, Rect() );
+
+    CMceRtpSource* rtpSource = CMceRtpSource::NewLC( KMusEngJitterBufferLength,
+                                                     KMusEngJitterBufferTreshold );
+    videoInStream->SetSourceL( rtpSource );
+    CleanupStack::Pop( rtpSource ); 
+
+    videoStream->BindL( videoInStream ); 
+    CleanupStack::Pop( videoInStream );
+
+    iSession->AddStreamL( videoStream );
+    CleanupStack::Pop( videoStream );    
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::CompleteSessionStructureL()" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::AddDisplayL( CMceMediaStream& aStream )
+    {
+    MusEngMceUtils::AddDisplayL( aStream, 
+                                 *iManager,
+                                 iLocalRect );
+    }
+ 
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::StreamStateChanged( CMceMediaStream& aStream )
+    {
+    MUS_LOG( "mus: [ENGINE] -> CMusEngTwoWaySession::StreamStateChanged()" )
+    if ( !iSession )
+        {
+        return;
+        }
+    
+    MUS_ENG_LOG_STREAM_STATE( aStream )
+    
+    if ( aStream.Type() == KMceVideo &&
+         aStream.Source() &&
+         aStream.Source()->Type() == KMceRTPSource )
+        {
+        if ( aStream.State() == CMceMediaStream::EStreaming )
+            {
+            ReceivingStarted();
+            }
+        else if ( aStream.State() == CMceMediaStream::EBuffering )
+            {
+            iBuffered = ETrue;
+            }
+        }
+    
+    CMusEngMceSession::StreamStateChanged( aStream );
+
+    MUS_LOG( "mus: [ENGINE] <- CMusEngTwoWaySession::StreamStateChanged()" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::InactivityTimeout( CMceMediaStream& aStream,
+                                              CMceRtpSource& /*aSource*/ )
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::InactivityTimeout()" )
+    
+    if ( aStream.Type() == KMceVideo )
+        {
+        ReceivingStopped();
+        }
+    
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::InactivityTimeout()" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::HandleSessionStateChanged( 
+                                                CMceSession& aSession,
+                                                TInt aStatusCode,
+                                                const TDesC8& aReasonPhrase )
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::HandleSessionStateChanged" )
+    
+    MUS_ENG_LOG_SESSION_STATE_AND_STATUS( aSession, aStatusCode, aReasonPhrase )
+    
+    TBool consumed( EFalse );
+    if ( iSession && 
+         iSession == &aSession && 
+         aSession.State() == CMceSession::EEstablished )
+        {   
+        // TODO: if receiving stream is disabled, inform ui with some callback
+        // that it can modify display rects accordingly and continue with 
+        // session.
+        CMceVideoStream* stream = NULL;
+        CMceVideoStream* streamout = NULL;
+        TRAPD( err, stream = MusEngMceUtils::GetVideoInStreamL( *iSession ) );
+        TRAPD( errout, streamout = MusEngMceUtils::GetVideoOutStreamL( *iSession ) );
+        if ( err == KErrNone && stream && stream->IsEnabled() )
+            {
+            if ( errout != KErrNone || !streamout || !streamout->IsEnabled() )
+                {
+                MUS_LOG( "mus: [ENGINE] sendrecv downgraded to recvonly, terminate!" )
+                consumed = ETrue;
+                iSessionObserver.SessionFailed();
+                }
+            }
+        else
+            {
+            if ( errout == KErrNone && streamout && streamout->IsEnabled() )
+                {
+                MUS_LOG( "mus: [ENGINE] sendrecv downgraded to sendonly, continue!" )
+                }
+            }
+        }
+    
+    if ( !consumed )
+        {
+        CMusEngLiveSession::HandleSessionStateChanged( aSession,
+                                                       aStatusCode, 
+                                                       aReasonPhrase );
+        }
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::HandleSessionStateChanged" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMusEngTwoWaySession::CMusEngTwoWaySession(
+                        MMusEngSessionObserver& aSessionObserver,
+                        MMusEngOutSessionObserver& aOutSessionObserver,
+                        MMusEngLiveSessionObserver& aLiveSessionObserver,
+                        MMusEngTwoWaySessionObserver& aTwoWayObserver,
+                        const TRect& aRemoteRect,
+                        const TRect& aLocalRect ) : 
+    CMusEngLiveSession( aSessionObserver,
+                        aOutSessionObserver,
+                        aLiveSessionObserver,
+                        aRemoteRect,
+                        KNullDesC ),
+    iTwoWayObserver( aTwoWayObserver ),                   
+    iLocalRect( aLocalRect )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::ConstructL()
+    {
+    MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::ConstructL()" )
+    
+    CMusEngLiveSession::ConstructL();
+
+    MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::ConstructL()" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::ReceivingStarted()
+    {
+    if ( iSession && !iReceiving && iBuffered )
+        {
+        MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::ReceivingStarted()" )
+        
+        TInt err( KErrNone );
+        CMceMediaSource* source = NULL;
+        TRAP( err, source = 
+            MusEngMceUtils::GetVideoInStreamL( *iSession )->Source() );
+        if ( source && source->Type() == KMceRTPSource )
+            {
+            CMceRtpSource* rtpSource = static_cast<CMceRtpSource*>( source );
+            TRAP( err, rtpSource->EnableInactivityTimerL( 
+                            KMusEngTwoWayReceivingActivityTimeout ) ) 
+            }
+        
+        if ( err != KErrNone )
+            {
+            MUS_LOG1("mus: [ENGINE] ReceivingStarted failed %d", err)
+            iSessionObserver.SessionFailed();   
+            }
+        else
+            {
+            iReceiving = ETrue;
+            iTwoWayObserver.ReceivingStateChanged( ETrue );
+            }
+        
+        MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::ReceivingStarted()" )
+        }
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusEngTwoWaySession::ReceivingStopped()
+    {
+    if ( iReceiving )
+        {
+        MUS_LOG( "mus: [ENGINE]  -> CMusEngTwoWaySession::ReceivingStopped()" )
+        
+        iReceiving = EFalse;
+        iTwoWayObserver.ReceivingStateChanged( EFalse );
+        
+        MUS_LOG( "mus: [ENGINE]  <- CMusEngTwoWaySession::ReceivingStopped()" )
+        }
+    }
+
+// End of file