diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmcemediamanager/src/mcepreparingstreams.cpp --- /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& origStreams = iSession.MccStreams(); + RPointerArray 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" ) + } +