--- /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" )
+ }
+