diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcecli/src/mceaudiostream.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcecli/src/mceaudiostream.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,494 @@ +/* +* 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 "mceaudiostream.h" +#include "mcemanager.h" +#include "mceaudiocodec.h" +#include "mcecomaudiostream.h" +#include "mceserial.h" +#include "mceevents.h" +#include "mcefilesource.h" +#include "mcecomfilesource.h" +#include "mcertpsource.h" +#include "mceclilogs.h" +#include "mcertpsink.h" +#include "cleanupresetanddestroy.h" + +#define _FLAT_DATA static_cast( iFlatData ) + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMceAudioStream::NewL +// ----------------------------------------------------------------------------- +// +EXPORT_C CMceAudioStream* CMceAudioStream::NewL() + { + CMceAudioStream* self = NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::NewLC +// ----------------------------------------------------------------------------- +// +EXPORT_C CMceAudioStream* CMceAudioStream::NewLC() + { + CMceAudioStream* self = new (ELeave) CMceAudioStream(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::~CMceAudioStream +// ----------------------------------------------------------------------------- +// +EXPORT_C CMceAudioStream::~CMceAudioStream() + { + iCodecs.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::Codecs +// ----------------------------------------------------------------------------- +// +EXPORT_C const RPointerArray& CMceAudioStream::Codecs() + { + return iCodecs; + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::AddCodecL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CMceAudioStream::AddCodecL(CMceAudioCodec* aCodec) + { + __ASSERT_ALWAYS(aCodec, User::Leave(KErrArgument)); + iCodecs.AppendL(aCodec); + aCodec->Attach( *this ); + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::RemoveCodecL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CMceAudioStream::RemoveCodecL(CMceAudioCodec& aCodec) + { + RemoveCodecL( aCodec, Binder() ); + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::ReplaceCodecsL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CMceAudioStream::ReplaceCodecsL( + RPointerArray* /*aCodecs*/ ) + { + User::Leave( KErrNotSupported ); + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::CMceAudioStream +// ----------------------------------------------------------------------------- +// +CMceAudioStream::CMceAudioStream() + :CMceMediaStream() + { + } + + +// ----------------------------------------------------------------------------- +// CMceAudioStream::ConstructL +// ----------------------------------------------------------------------------- +// +void CMceAudioStream::ConstructL() + { + CMceComAudioStream* stream = CMceComAudioStream::NewLC(); + CMceMediaStream::ConstructL( stream ); + CleanupStack::Pop( stream ); + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::InitializeL +// ----------------------------------------------------------------------------- +// +void CMceAudioStream::InitializeL( + CMceSession& aParent, + TBool aDiscardUnusedCodecs ) + { + CMceMediaStream::InitializeL( aParent, aDiscardUnusedCodecs ); + + for( TInt i = 0; i < iCodecs.Count(); i++ ) + { + iCodecs[i]->InitializeL( *this ); + } + } + + +// ----------------------------------------------------------------------------- +// CMceAudioStream::InitializeL +// ----------------------------------------------------------------------------- +// +void CMceAudioStream::InitializeL( CMceManager* aManager, CMceSession& aSession ) + { + + __ASSERT_ALWAYS( aManager, User::Leave( KErrArgument ) ); + + CMceMediaStream::InitializeL( aManager, aSession ); + + if ( iCodecs.Count() == 0 ) + { + const RPointerArray& supportedCodes = + aManager->SupportedAudioCodecs(); + + for( TInt i = 0; i < supportedCodes.Count(); i++ ) + { + CMceAudioCodec* codec = supportedCodes[i]->CloneL(); + CleanupStack::PushL( codec ); + AddCodecL( codec ); + CleanupStack::Pop( codec ); + MCECLI_DEBUG_SVALUE("CMceAudioStream::InitializeL, \ +Added supported codec", codec->SdpName() ); + } + + } + + } + + +// ----------------------------------------------------------------------------- +// CMceAudioStream::SynchronizeWithFileL +// ----------------------------------------------------------------------------- +// +void CMceAudioStream::SynchronizeWithFileL( CMceFileSource& aFile ) + { + MCECLI_DEBUG("CMceAudioStream::SynchronizeWithFileL, Entry"); + + const TDesC8& audioCodec = aFile.SupportedAudio(); + + TBool transcodingRequired( EFalse ); + + CMceManager* manager = aFile.Manager(); + + if ( iCodecs.Count() == 0 && manager ) + { + const RPointerArray& supportedCodecs = + manager->SupportedAudioCodecs(); + + CMceAudioCodec* codec = NULL; + + for( TInt j = 0; j < supportedCodecs.Count() && !codec; j++ ) + { + if ( audioCodec.CompareF( supportedCodecs[ j ]->SdpName() ) == 0 ) + { + codec = supportedCodecs[ j ]->CloneL(); + CleanupStack::PushL( codec ); + AddCodecL( codec ); + CleanupStack::Pop( codec ); + MCECLI_DEBUG_SVALUE("CMceAudioStream::SynchronizeWithFileL, \ +Added supported codec", codec->SdpName() ); + } + } + } + + for( TInt i = 0; i < iCodecs.Count(); i++ ) + { + CMceAudioCodec* codec = iCodecs[i]; + if ( audioCodec.CompareF( codec->SdpName() ) == 0 ) + { + const TMceFileInfo& info = aFile.FileInfo(); + + TUint allowedBitrates = 0; + TInt resolveError = + static_cast( codec->FlatData() )-> + ResolveAllowedBitrates( info.iAudioBitRate, allowedBitrates ); + + if ( resolveError ) + { + allowedBitrates = 0xFF; + } + + codec->SetAllowedBitrates( allowedBitrates ); + + TInt bitrateError = codec->SetBitrate( info.iAudioBitRate ); + + if ( resolveError || bitrateError ) + { + // Currently too high audio bitrate will not lead to transcoding + // needed state change + //transcodingRequired = ETrue; + } + } + else + { + delete iCodecs[ i ]; + iCodecs.Remove( i ); + i--; + } + } + + if ( iCodecs.Count() == 0 || transcodingRequired ) + { + MCECLI_DEBUG("CMceAudioStream::SynchronizeWithFileL, transcoding required" ); + SetState( CMceMediaStream::ETranscodingRequired ); + } + else + { + SetState( CMceMediaStream::EInitialized ); + } + TState state = State(); + MCECLI_DEBUG_MEDIASTATE("CMceAudioStream::SynchronizeWithFileL, state", state ); + MCECLI_DEBUG("CMceAudioStream::SynchronizeWithFileL, Exit"); + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::FindCodec +// ----------------------------------------------------------------------------- +// +CMceCodec* CMceAudioStream::FindCodec( CMceCodec& aCodec ) + { + const RPointerArray& codecs = + reinterpret_cast&>( Codecs() ); + return CMceMediaStream::FindCodec( codecs, aCodec ); + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::ReorderCodecsByPreferenceL +// ----------------------------------------------------------------------------- +// +void CMceAudioStream::ReorderCodecsByPreferenceL( TBool aDiscardUnusedCodecs ) + { + // First remove all disabled codecs + if ( aDiscardUnusedCodecs ) + { + TInt lastIndex( iCodecs.Count() - 1 ); + for( TInt i = lastIndex; i >= 0; i-- ) + { + if ( iCodecs[i]->State() == CMceCodec::EDisabled ) + { + RemoveCodecL( *iCodecs[ i ] ); + } + } + } + + // Then change order + TBool inPreferenceOrder = ETrue; + + for( TInt i = 0; i < iCodecs.Count() - 1 && inPreferenceOrder; i++ ) + { + if ( iCodecs[i]->Preference() > iCodecs[i+1]->Preference() ) + { + inPreferenceOrder = EFalse; + } + } + + if ( !inPreferenceOrder ) + { + RPointerArray updated; + + MceCleanupResetAndDestroyPushL( updated ); + + TLinearOrder order( CMceAudioCodec::ComparePreferences ); + + for( TInt i = iCodecs.Count() -1; i >= 0; i-- ) + { + CMceAudioCodec* codec = iCodecs[i]; + iCodecs.Remove( i ); + User::LeaveIfError( updated.InsertInOrderAllowRepeats( codec, order ) ); + } + + iCodecs.ResetAndDestroy(); + + for( TInt i = updated.Count() -1; i >= 0; i-- ) + { + CMceAudioCodec* newcodec = updated[i]; + updated.Remove( i ); + User::LeaveIfError( iCodecs.InsertInOrderAllowRepeats( newcodec, order ) ); + } + + CleanupStack::PopAndDestroy();//updated; + } + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::BaseCodecs +// ----------------------------------------------------------------------------- +// +const RPointerArray& CMceAudioStream::BaseCodecs() + { + const RPointerArray& codecs = + reinterpret_cast&>( Codecs() ); + return codecs; + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::FindDtmfRelatedComponents +// ----------------------------------------------------------------------------- +// +void CMceAudioStream::FindDtmfRelatedComponents( + TBool& aRtpSourceExists, + TBool& aRtpSinkExists, + TBool& aDtmfCodecExists, + TBool aBinderOriginated ) + { + if ( !aRtpSourceExists && Source() && Source()->Type() == KMceRTPSource ) + { + aRtpSourceExists = ETrue; + } + + for ( TInt i = 0; i < Sinks().Count() && !aRtpSinkExists; i++ ) + { + if ( Sinks()[ i ]->Type() == KMceRTPSink ) + { + aRtpSinkExists = ETrue; + } + } + + for ( TInt j = 0; j < Codecs().Count() && !aDtmfCodecExists; j++ ) + { + if ( Codecs()[ j ]->SdpName() == KMceSDPNameDtmf ) + { + aDtmfCodecExists = ETrue; + } + } + + TBool commandBound = aBinderOriginated ? ( Binder() ) : ( !Binder() ); + if ( iLinkedStream && commandBound ) + { + aBinderOriginated = EFalse; + static_cast( + iLinkedStream )->FindDtmfRelatedComponents( aRtpSourceExists, + aRtpSinkExists, + aDtmfCodecExists, + aBinderOriginated ); + } + } + + +// ----------------------------------------------------------------------------- +// CMceAudioStream::RemoveCodecL +// ----------------------------------------------------------------------------- +// +void CMceAudioStream::RemoveCodecL( CMceAudioCodec& aCodec, TBool aBinderOriginated ) + { + MCECLI_DEBUG_SVALUE( "CMceAudioStream::RemoveCodecL, sdp name:", aCodec.SdpName() ) + + TBool removed( EFalse ); + for(int i = 0; i < iCodecs.Count() && !removed; i++ ) + { + if( iCodecs[i] == &aCodec || + iCodecs[i]->SdpName().CompareF( aCodec.SdpName() ) == 0 ) + { + MCECLI_DEBUG( "CMceAudioStream::RemoveCodecL, removing" ) + + TBool commandBound = aBinderOriginated ? ( Binder() ) : ( !Binder() ); + if ( BoundStream() && commandBound ) + { + static_cast( + iLinkedStream )->RemoveCodecL( aCodec, aBinderOriginated ); + } + + delete iCodecs[i]; + iCodecs.Remove( i ); + removed = ETrue; + } + } + + MCECLI_DEBUG( "CMceAudioStream::RemoveCodecL, Exit" ) + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::InternalizeL +// ----------------------------------------------------------------------------- +// +void CMceAudioStream::InternalizeL( MMceComSerializationContext& aSerCtx ) + { + CMceMediaStream::InternalizeL( aSerCtx ); + + TMceAudioStreamSerializer serial( *this ); + serial.InternalizeL( aSerCtx ); + + } + +// ----------------------------------------------------------------------------- +// CMceAudioStream::ExternalizeL +// ----------------------------------------------------------------------------- +// +void CMceAudioStream::ExternalizeL( MMceComSerializationContext& aSerCtx ) + { + CMceMediaStream::ExternalizeL( aSerCtx ); + + TMceAudioStreamSerializer serial( *this ); + serial.ExternalizeL( aSerCtx ); + + } + + + + +// ----------------------------------------------------------------------------- +// CMceAudioStream::EventReceivedL +// ----------------------------------------------------------------------------- +// +TInt CMceAudioStream::EventReceivedL( TMceEvent& aEvent ) + { + + TInt status = CMceMediaStream::EventReceivedL( aEvent ); + if ( status != KMceEventNotConsumed ) + { + return status; + } + + //try codecs + if ( aEvent.Id().IsCodecId() ) + { + TInt codecStatus = status; + TInt j = 0; + while ( codecStatus != KMceEventConsumed && j < iCodecs.Count() ) + { + CMceAudioCodec* codec = iCodecs[j]; + codecStatus = codec->EventReceivedL( aEvent ); + if ( codecStatus == KMceEventUpdate ) + { + MCECLI_DEBUG("CMceAudioStream::EventReceivedL, \ +update codec by replacing old version with new one"); + CMceMsgObject* updateMsg = + static_cast*>( aEvent.Message() ); + CMceAudioCodec* updateCodec = updateMsg->Object(); + CleanupStack::PushL( updateCodec ); + iCodecs.Remove( j ); + delete codec; + updateCodec->InitializeL( *this ); + iCodecs.AppendL( updateCodec ); + CleanupStack::Pop( updateCodec ); + updateCodec->Updated(); + codecStatus = KMceEventConsumed; + } + j++; + } + status = codecStatus == KMceEventNotOwner ? KMceEventNotConsumed : codecStatus; + } + + return status; + + }