multimediacommsengine/mmcesrv/mmcemediamanager/src/mcepreparingstreams.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcesrv/mmcemediamanager/src/mcepreparingstreams.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,294 @@
+/*
+* 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 "mcepreparingstreams.h"
+#include "mcecomsession.h"
+#include "mcesdpsession.h"
+#include "mcesrvstream.h"
+#include "mceevents.h"
+#include "mcemmlogs.h"
+
+
+    
+    
+// -----------------------------------------------------------------------------
+// TMcePreparingStreams::TMcePreparingStreams
+// -----------------------------------------------------------------------------
+//
+TMcePreparingStreams::TMcePreparingStreams ( 
+                        CMceComSession& aSession,
+                        TMceNegotiationRole aRole,
+                        TMceSrvStreamIterator::TDirection aDirection )
+    : TMceMediaState( aSession ),
+      iIterator( TMceSrvStreamIterator( aSession.MccStreams(), aDirection ) )
+    {
+    SetRole( aRole );
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// TMcePreparingStreams::MccLinkCreatedL
+// -----------------------------------------------------------------------------
+//
+void TMcePreparingStreams::MccLinkCreatedL( TMceMccComEvent& aEvent )
+    {
+    MCEMM_DEBUG("TMcePreparingStreams::MccLinkCreatedL(), Entry ");
+    
+    CMceSrvStream::EventReceived( iSession.MccStreams(), aEvent );
+    CMceSrvStream* stream = NULL;
+    
+    iIterator.Reset();
+    
+    //try to find first stream, which is in state 'greater or equal' than link created
+    //if no stream => all streams are in state link created
+    //=> links are created
+    if ( !iIterator.Next( stream, CMceSrvStream::ECreatingLink, 
+                          TMceSrvStreamIterator::ExactMatch ) )
+        {
+        PrepareStreamsL();
+        }
+    else
+        {
+        MCEMM_DEBUG("TMcePreparingStreams::MccLinkCreatedL(): \
+waiting links to be created");
+        //just wait
+        }
+    
+    MCEMM_DEBUG("TMcePreparingStreams::MccLinkCreatedL(), Exit ");
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMcePreparingStreams::MccMediaPreparedL
+// -----------------------------------------------------------------------------
+//
+void TMcePreparingStreams::MccMediaPreparedL( TMceMccComEvent& aEvent )
+    {
+    MCEMM_DEBUG("TMcePreparingStreams::MccMediaPreparedL(), Entry ");
+    
+    CMceSrvStream::EventReceived( iSession.MccStreams(), aEvent );
+    CMceSrvStream* stream = NULL;
+    
+    iIterator.Reset();
+    
+    //try to find first stream, which is in state 'greater or equal' than prepared
+    //if no stream => all streams are in state prepared or stopped (or started, paused) 
+    //=> streams are prepared        
+    if ( !iIterator.Next( stream, CMceSrvStream::EPreparing, 
+                          TMceSrvStreamIterator::ExactMatch ) )
+        {
+        StreamsPreparedL();
+        }
+    else
+        {
+        MCEMM_DEBUG("TMcePreparingStreams::MccMediaPreparedL(): \
+waiting streams to be prepared");
+        //just wait
+        }
+    
+    MCEMM_DEBUG("TMcePreparingStreams::MccMediaPreparedL(), Exit ");
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMcePreparingStreams::MccMediaStartedL
+// -----------------------------------------------------------------------------
+//
+void TMcePreparingStreams::MccMediaStartedL( TMceMccComEvent& aEvent )
+    {
+    MCEMM_DEBUG("TMcePreparingStreams::MccMediaStartedL(), Entry ");
+
+    CMceSrvStream::EventReceived( iSession.MccStreams(), aEvent );
+    
+    CMceSrvStream* stream = NULL;
+    
+    iIterator.Reset();
+    
+    //try to find first stream, which is in state 'greater or equal' than stopped
+    //if no stream => all streams are in state stopped, started or paused
+    if ( !iIterator.Next( stream, CMceSrvStream::EStarting, 
+                          TMceSrvStreamIterator::ExactMatch ) )
+        {
+        StreamsStartedL();
+        }
+    else
+        {
+        MCEMM_DEBUG("TMcePreparingStreams::MccMediaStartedL(): \
+waiting streams to be started");
+        //just wait
+        }
+
+    MCEMM_DEBUG("TMcePreparingStreams::MccMediaStartedL(), Exit ");
+    }
+    
+// -----------------------------------------------------------------------------
+// TMcePreparingStreams::MccMediaPausedL
+// -----------------------------------------------------------------------------
+//
+void TMcePreparingStreams::MccMediaPausedL( TMceMccComEvent& aEvent )
+    {
+    MCEMM_DEBUG("TMcePreparingStreams::MccMediaPausedL(), Entry ");
+
+    MccMediaStartedL( aEvent );
+
+    MCEMM_DEBUG("TMcePreparingStreams::MccMediaPausedL(), Exit ");
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMcePreparingStreams::MccMediaResumedL
+// -----------------------------------------------------------------------------
+//
+void TMcePreparingStreams::MccMediaResumedL( TMceMccComEvent& aEvent )
+    {
+    MCEMM_DEBUG("TMcePreparingStreams::MccMediaResumedL(), Entry ");
+
+    MccMediaStartedL( aEvent );
+
+    MCEMM_DEBUG("TMcePreparingStreams::MccMediaResumedL(), Exit ");
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMcePreparingStreams::PrepareStreamsL
+// -----------------------------------------------------------------------------
+//
+
+void TMcePreparingStreams::PrepareStreamsL()
+    {
+    MCEMM_DEBUG("TMcePreparingStreams::PrepareStreamsL(), Entry ");
+    
+    CMceSrvStream* stream = NULL;
+    TBool wait = EFalse;
+    
+    iIterator.Reset();
+    while( iIterator.Next( stream, CMceSrvStream::ECreated ) )
+        {
+        MCEMM_DEBUG_STREAM( "TMcePreparingStreams::PrepareStreamsL(): \
+create link", *stream );
+        iSession.SdpSession().Manager().CreateMccLinkL( *stream );
+        wait = !wait ? stream->State() != CMceSrvStream::ELinkCreated : wait;
+        }
+
+    if ( !wait )
+        {
+            
+        iIterator.Reset();
+        wait = EFalse;
+        while( iIterator.Next( stream, CMceSrvStream::ELinkCreated ) )
+            {
+            MCEMM_DEBUG_STREAM( "TMcePreparingStreams::PrepareStreamsL(): \
+create stream", *stream );
+            iSession.SdpSession().Manager().CreateMccStreamL( *stream, iRole );
+            }
+
+        iIterator.Reset();
+        wait = EFalse;
+        while( iIterator.Next( stream, CMceSrvStream::ELinkCreated ) )
+            {
+            MCEMM_DEBUG_STREAM( "TMcePreparingStreams::PrepareStreamsL(): \
+prepare stream", *stream );
+            iSession.SdpSession().Manager().PrepareMccStreamL( *stream, iRole );
+            wait = !wait ? stream->State() != CMceSrvStream::EPrepared : wait;
+            }
+    
+        if (!wait)
+            {
+            MCEMM_DEBUG("TMcePreparingStreams::PrepareStreamsL(): streams prepared");
+            StreamsPreparedL();
+            }
+
+        }
+        
+    MCEMM_DEBUG("TMcePreparingStreams::PrepareStreamsL(), Exit ");
+        
+    }
+
+
+// -----------------------------------------------------------------------------
+// TMcePreparingStreams::StartStreamsL
+// -----------------------------------------------------------------------------
+//
+void TMcePreparingStreams::StartStreamsL( TBool aUpdateRemoteAddress )
+    {
+    MCEMM_DEBUG( "TMcePreparingStreams::StartStreamsL(), Entry" )
+    
+    // Hardware does not necessarily support two simulataneous mic users so
+    // it is more safe to do pausing of old send stream before starting the
+    // new one. This can be achieved by traversing streams in reverse order
+    // as they are in priority order and new send stream has higher priority.
+    //
+    RPointerArray<CMceSrvStream>& origStreams = iSession.MccStreams();
+    RPointerArray<CMceSrvStream> reverseOrderStream;
+    CleanupClosePushL( reverseOrderStream );
+    TInt lastIndex( origStreams.Count() - 1 );
+    for ( TInt i = lastIndex; i >= 0; i-- )
+        {
+        reverseOrderStream.AppendL( origStreams[ i ] );
+        }
+    
+    TMceSrvStreamIterator reversedIterator( reverseOrderStream, 
+        iIterator.Direction() );
+    
+    TBool wait = EFalse;
+    CMceSrvStream* stream = NULL;
+    
+    while( reversedIterator.Next( stream, CMceSrvStream::EPrepared, 
+                            TMceSrvStreamIterator::GreaterOrEqualMatch ) )
+        {
+        const CMceSrvStream::TState state = stream->State();
+        
+        if ( state == CMceSrvStream::EPrepared &&
+             stream->Codec().iIsEnabled )
+            {
+            MCEMM_DEBUG_STREAM( "TMcePreparingStreams::StartStreamsL() start stream",
+                *stream )
+			
+            iSession.SdpSession().Manager().StartMccStreamL( *stream );
+            wait = !wait ? stream->State() == CMceSrvStream::EStarting : wait;
+            }
+        else if ( aUpdateRemoteAddress )
+            {
+            MCEMM_DEBUG( "TMcePreparingStreams::StartStreamsL() remote address update" )
+            iSession.SdpSession().Manager().SetRemoteAddressL( *stream );
+            }
+        else
+            {
+            // NOP
+            }
+            
+        MCEMM_DEBUG_STREAM( "TMcePreparingStreams::StartStreamsL() synchronize stream",
+            *stream )
+        
+        iSession.SdpSession().Manager().SynchronizeMccStreamL( *stream, iRole );    
+        }
+    
+    if ( !wait )
+        {
+        MCEMM_DEBUG( "TMcePreparingStreams::StartStreamsL(): streams started" )
+        StreamsStartedL();
+        }
+    
+    CleanupStack::PopAndDestroy( &reverseOrderStream );
+    
+    MCEMM_DEBUG( "TMcePreparingStreams::StartStreamsL(), Exit" )
+    }
+