diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/tsrc/componenttests/src/test_interface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/tsrc/componenttests/src/test_interface.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,1927 @@ +/* +* Copyright (c) 2006 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: +* +*/ + + + + +// INCLUDES +#include "test_interface.h" +#include "mmcccodecinformation.h" +#include "mccteststubs.h" +#include "mmccinterface.h" +#include "testdefinitions.hrh" + +// ======== MEMBER FUNCTIONS ================================================= + +// --------------------------------------------------------------------------- +// CTestInterfaceInterface::CTestInterfaceInterface +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CTestInterface::CTestInterface( CConsoleBase& aConsole, + const TMccNetSettings& aSettings, CMccInterface& aIF, CMccInterfaceStub& aIFStub ) + : + iConsole( aConsole ), iNetsettings( aSettings ), iInterface( aIF ), + iIfStub( aIFStub ) + { + } + +// --------------------------------------------------------------------------- +// CTestInterface::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CTestInterface::ConstructL() + { + } + +// --------------------------------------------------------------------------- +// CTestInterface::NewL +// Static constructor. +// --------------------------------------------------------------------------- +// +CTestInterface* CTestInterface::NewL( CConsoleBase& aConsole, + const TMccNetSettings& aSettings, CMccInterface& aIF, CMccInterfaceStub& aIFStub ) + { + CTestInterface* self + = new ( ELeave ) CTestInterface( aConsole, aSettings, aIF, aIFStub ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CTestInterface::~CTestInterface +// Destructor. +// --------------------------------------------------------------------------- +// +CTestInterface::~CTestInterface() + { + } + +// --------------------------------------------------------------------------- +// CTestInterface::DoRunInterfaceTestsL +// +// --------------------------------------------------------------------------- +// +void CTestInterface::DoRunInterfaceTestsL() + { + iConsole.ClearScreen(); + iConsole.Printf( _L("\n*** INTERFACE TESTS ***\n") ); + + TInt err( KErrNone ); + iConsole.Printf( _L("GET CAPABILITIES\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestGetCapabilitiesL") ); + __UHEAP_MARK; + TRAP( err, TestGetCapabilitiesL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestGetCapabilitiesL, ERR: %d"), err ); + + + iConsole.Printf( _L("CREATE SINGLE SESSION\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestSingleSessionCreationL") ); + __UHEAP_MARK; + TRAP( err, TestSingleSessionCreationL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestSingleSessionCreationL, ERR: %d"), err ); + + + iConsole.Printf( _L("CREATE SINGLE LINK\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestSingleLinkCreationL") ); + __UHEAP_MARK; + TRAP( err, TestSingleLinkCreationL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestSingleLinkCreationL, ERR: %d"), err ); + + + iConsole.Printf( _L("CREATE SINGLE STREAM\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestSingleStreamCreationL") ); + //__UHEAP_MARK; + TRAP( err, TestSingleStreamCreationL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestSingleStreamCreationL, ERR: %d"), err ); + + + iConsole.Printf( _L("PREPARE SINGLE STREAM\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestSingleStreamPreparingL") ); + __UHEAP_MARK; + iConsole.Printf( _L("Audio uplink\n") ); + TRAP( err, TestSingleStreamPreparingL( KMccLinkGeneral, KMccAudioUplinkStream, + KUidMmfAudioInput, KMccRtpSinkUid, KAMRSdpName ) ); + __UHEAP_MARKEND; + + + iConsole.Printf( _L("Audio downlink\n") ); + __UHEAP_MARK; + TRAP( err, TestSingleStreamPreparingL( KMccLinkGeneral, KMccAudioDownlinkStream, + KMccRtpSourceUid, KUidMmfAudioOutput, KAMRSdpName ) ); + __UHEAP_MARKEND; + //TestSingleStreamPreparingL( KPCMUSdpName ); + //TestSingleStreamPreparingL( KPCMASdpName ); + //TestSingleStreamPreparingL( KILBCSdpName ); + //TestSingleStreamPreparingL( KG729SdpName ); + __UHEAP_MARK; + iConsole.Printf( _L("Invalid source/sink 1\n") ); + // INVALID SOUCE/SINK, SHOULD NOT PASS TEST + TRAP( err, TestSingleStreamPreparingL( KMccLinkGeneral, KMccAudioUplinkStream, + KMccRtpSourceUid, KUidMmfAudioOutput, KAMRSdpName ) ); + __UHEAP_MARKEND; + __UHEAP_MARK; + iConsole.Printf( _L("Invalid source/sink 2\n") ); + // INVALID SOUCE/SINK, SHOULD NOT PASS TEST + TRAP( err, TestSingleStreamPreparingL( KMccLinkGeneral, KMccAudioDownlinkStream, + KUidMmfAudioInput, KMccRtpSinkUid, KAMRSdpName ) ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestSingleStreamPreparingL, ERR: %d"), err ); + + + iConsole.Printf( _L("PLAY SINGLE STREAM\n") ); + iConsole.Printf( _L("Audio uplink\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestSingleStreamPlayingL") ); + __UHEAP_MARK; + TRAP( err, TestSingleStreamPlayingL( KMccLinkGeneral, KMccAudioUplinkStream, + KUidMmfAudioInput, KMccRtpSinkUid, KAMRSdpName ) ); + __UHEAP_MARKEND; + __UHEAP_MARK; + iConsole.Printf( _L("Audio downlink\n") ); + TRAP( err, TestSingleStreamPlayingL( KMccLinkGeneral, KMccAudioDownlinkStream, + KMccRtpSourceUid, KUidMmfAudioOutput, KAMRSdpName ) ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestSingleStreamPlayingL, ERR: %d"), err ); + + + iConsole.Printf( _L("PAUSE SINGLE STREAM\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestSingleStreamPausingL") ); + __UHEAP_MARK; + iConsole.Printf( _L("Audio uplink\n") ); + TRAP( err, TestSingleStreamPausingL( KMccLinkGeneral, KMccAudioUplinkStream, + KUidMmfAudioInput, KMccRtpSinkUid, KAMRSdpName ) ); + __UHEAP_MARKEND; + __UHEAP_MARK; + iConsole.Printf( _L("Audio downlink\n") ); + TRAP( err, TestSingleStreamPausingL( KMccLinkGeneral, KMccAudioDownlinkStream, + KMccRtpSourceUid, KUidMmfAudioOutput, KAMRSdpName ) ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestSingleStreamPausingL, ERR: %d"), err ); + + iConsole.Printf( _L("MUTE AUDIO\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestAudioMuteL") ); + //__UHEAP_MARK; + TRAP( err, TestAudioMuteL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestAudioMuteL, ERR: %d"), err ); + + iConsole.Printf( _L("SET CODEC\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestSetCodecL") ); + __UHEAP_MARK; + TRAP( err, TestSetCodecL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestSetCodecL, ERR: %d"), err ); + + + iConsole.Printf( _L("GET CODEC\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestGetCodecL") ); + //__UHEAP_MARK; + TRAP( err, TestGetCodecL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestGetCodecL, ERR: %d"), err ); + + + iConsole.Printf( _L("GET SSRC\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestGetSSRCL") ); + __UHEAP_MARK; + TRAP( err, TestGetSSRCL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestGetSSRCL, ERR: %d"), err ); + + + iConsole.Printf( _L("INACTIVITY TIMER\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestInactivityTimerL") ); + __UHEAP_MARK; + TRAP( err, TestInactivityTimerL() ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestInactivityTimerL, ERR: %d"), err ); + + + iConsole.Printf( _L("FAST SHUTDOWNS\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestFastShutdownsL") ); + //__UHEAP_MARK; + TRAP( err, TestFastShutdownsL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestFastShutdownsL, ERR: %d"), err ); + + + iConsole.Printf( _L("CREATE MULTI STREAM/LINK/SESSION\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestMultiStreamLinkSessionL") ); + //__UHEAP_MARK; + TRAP( err, TestMultiStreamLinkSessionL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestMultiStreamLinkSessionL, ERR: %d"), err ); + + + iConsole.Printf( _L("MULTI STREAM PREPARE\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestMultiStreamPreparingL") ); + //__UHEAP_MARK; + TRAP( err, TestMultiStreamPreparingL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestMultiStreamPreparingL, ERR: %d"), err ); + + + iConsole.Printf( _L("RESOURCE REUSE\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestResourceReuseL") ); + //__UHEAP_MARK; + TRAP( err, TestResourceReuseL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestResourceReuseL, ERR: %d"), err ); + +#ifndef __WINSCW__ + iConsole.Printf( _L("BASIC AUDIO STREAMING\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestAudioStreamingL") ); + //__UHEAP_MARK; + + TRAP( err, TestAudioStreamingL( KAMRSdpName ) ); + RDebug::Print( _L("AMR: %d"), err ); + + TRAP( err, TestAudioStreamingL( KILBCSdpName ) ); + RDebug::Print( _L("iLBC: %d"), err ); + TRAP( err, TestAudioStreamingL( KPCMUSdpName ) ); + RDebug::Print( _L("PCMU: %d"), err ); + TRAP( err, TestAudioStreamingL( KPCMASdpName ) ); + RDebug::Print( _L("PCMA: %d"), err ); + TRAP( err, TestAudioStreamingL( KG729SdpName ) ); + RDebug::Print( _L("G729: %d"), err ); + + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestAudioStreamingL, ERR: %d"), err ); + + iConsole.Printf( _L("UP/DOWNLINK PAUSE\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestMultiStreamPausingL") ); + //__UHEAP_MARK; + TRAP( err, TestMultiStreamPausingL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestMultiStreamPausingL, ERR: %d"), err ); + + + iConsole.Printf( _L("AMR-NB FEC\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestAmrFecL") ); + //__UHEAP_MARK; + TRAP( err, TestAmrFecL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestAmrFecL, ERR: %d"), err ); + + + iConsole.Printf( _L("2198 REDUNDANCY\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestRedundancyL") ); + //__UHEAP_MARK; + + TRAP( err, TestRedundancyL( KAMRSdpName ) ); + RDebug::Print( _L("AMR RED: %d"), err ); + + TRAP( err, TestRedundancyL( KPCMASdpName ) ); + RDebug::Print( _L("PCMU RED: %d"), err ); + + TRAP( err, TestRedundancyL( KPCMUSdpName ) ); + RDebug::Print( _L("PCMU RED: %d"), err ); + + TRAP( err, TestRedundancyL( KILBCSdpName ) ); + RDebug::Print( _L("iLBC RED: %d"), err ); + + TRAP( err, TestRedundancyL( KG729SdpName ) ); + RDebug::Print( _L("G729: %d"), err ); + + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestRedundancyL, ERR: %d"), err ); + + iConsole.Printf( _L("AUDIO ROUTING\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestAudioRoutingL") ); + //__UHEAP_MARK; + //TRAP( err, TestAudioRoutingL() ); + //__UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestAudioRoutingL, ERR: %d"), err ); + +#endif + } + +// --------------------------------------------------------------------------- +// CTestInterface::TestGetCapabilitiesL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestGetCapabilitiesL() const + { + RDebug::Print( _L("CTestInterface::TestGetCapabilitiesL") ); + + RPointerArray codecArray; + CleanupResetAndDestroy< RPointerArray >::PushL( codecArray ); + User::LeaveIfError( iInterface.GetCapabilities( codecArray ) ); + + if ( 0 == codecArray.Count() ) + { + RDebug::Print( _L("CTestInterface::TestGetCapabilitiesL - KErrUnknown") ); + User::Leave( KErrUnknown ); + } + + CleanupStack::PopAndDestroy( &codecArray ); + } + +// --------------------------------------------------------------------------- +// CTestInterface::TestSingleSessionCreationL +// Test explicit/implicit session creation and destruction. +// --------------------------------------------------------------------------- +// +void CTestInterface::TestSingleSessionCreationL() + { + RDebug::Print( _L("CTestInterface::TestSingleSessionCreationL") ); + + TUint32 sessionId1; + User::LeaveIfError( iInterface.CreateSession( sessionId1 ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId1 ) ); + + TUint32 sessionId2; + User::LeaveIfError( iInterface.CreateSession( sessionId2 ) ); + if ( KErrNone == iInterface.CloseSession( 0 ) ) + { + RDebug::Print( _L("CTestInterface::TestSingleSessionCreationL - KErrUnknown") ); + User::Leave( KErrUnknown ); + } + + User::LeaveIfError( iInterface.CloseSession( sessionId2 ) ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestSingleLinkCreationL +// +// --------------------------------------------------------------------------- +// +void CTestInterface::TestSingleLinkCreationL() + { + RDebug::Print( _L("CTestInterface::TestSingleLinkCreationL") ); + + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + + RDebug::Print( _L("CTestInterface::TestSingleLinkCreationL KMccLinkGeneral") ); + TUint32 linkId1; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId1, + iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId1, 0, KMccLinkCreated ); + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId1 ) ); + + RDebug::Print( _L( "CTestInterface::TestSingleLinkCreationL KMccLinkLocal" ) ); + TUint32 linkId2; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkLocal, linkId2, + iNetsettings ) ); + + iIfStub.WaitForEvent( sessionId, linkId2, 0, KMccLinkCreated ); + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId2 ) ); + + TInt err + = iInterface.CreateLink( sessionId + 10, KMccLinkLocal, linkId2, iNetsettings ); + + if ( KErrNotFound != err ) + { + User::Leave( KErrTotalLossOfPrecision ); + } + + TUint32 linkId3; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId3, + iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId3, 0, KMccLinkCreated ); + + if ( KErrNone == iInterface.CloseLink( 0, 0 ) ) + { + RDebug::Print( _L("CTestInterface::TestSingleLinkCreationL - KErrUnknown 1") ); + User::Leave( KErrUnknown ); + } + + if ( KErrNone == iInterface.CloseLink( sessionId, 0 ) ) + { + RDebug::Print( _L("CTestInterface::TestSingleLinkCreationL - KErrUnknown 2") ); + User::Leave( KErrUnknown ); + } + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId3 ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + } + +// --------------------------------------------------------------------------- +// CTestInterface::TestSingleStreamCreationL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestSingleStreamCreationL() + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + + RDebug::Print( _L( "CTestInterface::TestSingleStreamCreationL KMccLinkGeneral" ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, + iNetsettings ) ); + + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + // AUDIO UPLINK STREAM CREATION + RDebug::Print( _L("CTestInterface::TestSingleStreamCreationL ADD RSC AUDIO UL") ); + TUint32 rtpSinkId; + TUint32 audioSourceId; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, rtpSinkId ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, audioSourceId ) ); + + RDebug::Print( _L("CTestInterface::TestSingleStreamCreationL CREATE AUDIO UL") ); + TUint32 streamId1; + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId1, + KMccAudioUplinkStream, *codec ) ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId1 ) ); + iInterface.RemoveDataSource( sessionId, linkId, streamId1, audioSourceId ); + iInterface.RemoveDataSink( sessionId, linkId, streamId1, rtpSinkId ); + + // AUDIO DOWNLINK STREAM CREATION + RDebug::Print( _L("CTestInterface::TestSingleStreamCreationL ADD RSC AUDIO DL") ); + TUint32 audioSinkId; + TUint32 rtpSourceId; + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, audioSinkId ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, rtpSourceId ) ); + + RDebug::Print( _L("CTestInterface::TestSingleStreamCreationL CREATE AUDIO DL") ); + TUint32 streamId2; + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId2, + KMccAudioDownlinkStream, *codec ) ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId2 ) ); + iInterface.RemoveDataSink( sessionId, linkId, streamId2, audioSinkId ); + iInterface.RemoveDataSource( sessionId, linkId, streamId2, rtpSourceId ); + + // AUDIO LOCAL STREAM CREATION + + // AUDIO DOWNLINK STANDBY STREAM CREATION + + // VIDEO UPLINK STREAM CREATION + + // VIDEO DOWNLINK STREAM CREATION + + // VIDEO LOCAL STREAM CREATION + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestSingleStreamPreparingL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestSingleStreamPreparingL( TInt aLinkType, + TInt aStreamType, TUid aDataSource, TUid aDataSink, const TDesC8& aCodec ) + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, aLinkType, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + // STREAM PREPARING, IMPLICIT ENDPOINT PREPARE + RDebug::Print( _L( "CTestInterface::TestSingleStreamPreparingL AUDIO UL, CODEC: %S" ), &aCodec ); + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( aDataSink, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( aDataSource, KNullDesC8, dataSourceId1 ) ); + + TUint32 streamId1; + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, aCodec ); + CleanupStack::PushL( codec ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId1, + aStreamType, *codec ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.SetRemoteAddress( sessionId, linkId, + iNetsettings.iRemoteAddress, iNetsettings.iRemoteRtcpPort ) ); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStopped ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId1 ) ); + iInterface.RemoveDataSink( sessionId, linkId, streamId1, dataSinkId1 ); + iInterface.RemoveDataSource( sessionId, linkId, streamId1, dataSourceId1 ); + + // STREAM PREPARING, EXPLICIT ENDPOINT PREPARE + TUint32 streamId2; + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( + iInterface.AddDataSink( aDataSink, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( + iInterface.AddDataSource( aDataSource, KNullDesC8, dataSourceId2 ) ); + + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId2, + aStreamType, *codec ) ); + + // Network resources must be prepared first + TUint32 prepareId1 = ( KMccRtpSinkUid == aDataSink ) ? dataSinkId2 : dataSourceId2; + TUint32 prepareId2 = ( prepareId1 == dataSinkId2 ) ? dataSourceId2 : dataSinkId2; + User::LeaveIfError( + iInterface.PrepareStream( sessionId, linkId, streamId2, prepareId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId2, prepareId1, KMccStreamPrepared ); + + User::LeaveIfError( + iInterface.PrepareStream( sessionId, linkId, streamId2, prepareId2 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId2, prepareId2, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId2 ) ); + iInterface.RemoveDataSink( sessionId, linkId, streamId2, dataSinkId2 ); + iInterface.RemoveDataSource( sessionId, linkId, streamId2, dataSourceId2 ); + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestSingleStreamPlayingL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestSingleStreamPlayingL( TInt aLinkType, + TInt aStreamType, TUid aDataSource, TUid aDataSink, const TDesC8& aCodec ) + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, aLinkType, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + RDebug::Print( _L("CTestInterface::TestSingleStreamPlayingL: %S"), &aCodec ); + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( aDataSink, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( aDataSource, KNullDesC8, dataSourceId1 ) ); + + TUint32 streamId1; + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, aCodec ); + CleanupStack::PushL( codec ); + + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId1, + aStreamType, *codec ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStarted ); + + iConsole.Printf( _L( "Press a key to stop (1/4)\n" ) ); + iConsole.Getch(); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStopped ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId1 ) ); + iInterface.RemoveDataSink( sessionId, linkId, streamId1, dataSinkId1 ); + iInterface.RemoveDataSource( sessionId, linkId, streamId1, dataSourceId1 ); + // STREAM DESTRUCTION FROM PLAYING STATE +/* + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( + iInterface.AddDataSink( aDataSink, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( + iInterface.AddDataSource( aDataSource, KNullDesC8, dataSourceId2 ) ); + + TUint32 streamId2; + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId2, + aStreamType, *codec ) ); + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, streamId2 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId2, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, streamId2, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, streamId2 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId2, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, streamId2, KMccStreamStarted ); + + iConsole.Printf( _L( "Press a key to stop (2/4)\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId2 ) ); +*/ + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + +// --------------------------------------------------------------------------- +// CTestInterface::TestSingleStreamPausingL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestSingleStreamPausingL( TInt aLinkType, + TInt aStreamType, TUid aDataSource, TUid aDataSink, const TDesC8& aCodec ) + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, aLinkType, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + RDebug::Print( _L("CTestInterface::TestSingleStreamPausingL: %S"), &aCodec ); + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( aDataSink, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( aDataSource, KNullDesC8, dataSourceId1 ) ); + + TUint32 streamId1; + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, aCodec ); + CleanupStack::PushL( codec ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId1, + aStreamType, *codec ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStarted ); + + iConsole.Printf( _L( "Press a key to pause\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.PauseStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPaused ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPaused ); + + iConsole.Printf( _L( "Press a key to resume\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.ResumeStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamResumed ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamResumed ); + + iConsole.Printf( _L( "Press a key to stop\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStopped ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId1 ) ); + iInterface.RemoveDataSink( sessionId, linkId, streamId1, dataSinkId1 ); + iInterface.RemoveDataSource( sessionId, linkId, streamId1, dataSourceId1 ); + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + +// --------------------------------------------------------------------------- +// CTestInterface::TestAudioMuteL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestAudioMuteL() + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + + // Create link + TUint32 linkId; + User::LeaveIfError( iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + User::LeaveIfError( iInterface.SetRemoteAddress( sessionId, linkId, iNetsettings.iRemoteAddress ) ); + + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + + // Create upstream + TUint32 upStream; + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + codec->SetPriorityPreference( KAudioPrefVoipAudioUplink ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, upStream, + KMccAudioUplinkStream, *codec ) ); + + // Create downstream + TUint32 downStream; + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId2 ) ); + codec->SetPriorityPreference( KAudioPrefVoipAudioDownlink ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, downStream, + KMccAudioDownlinkStream, *codec ) ); + + // Prepare and start up and downstream + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStarted ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStarted ); + + // Pause upstream + iConsole.Printf( _L( "Press a key to mute audio\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.PauseStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPaused ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPaused ); + + // Resume upstream + iConsole.Printf( _L( "Press a key to unmute audio\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.ResumeStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamResumed ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamResumed ); + + iConsole.Printf( _L( "Press a key to stop\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStopped ); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStopped ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, upStream ) ); + iInterface.RemoveDataSink( sessionId, linkId, upStream, dataSinkId1 ); + iInterface.RemoveDataSource( sessionId, linkId, upStream, dataSourceId1 ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, downStream ) ); + iInterface.RemoveDataSink( sessionId, linkId, downStream, dataSinkId2 ); + iInterface.RemoveDataSource( sessionId, linkId, downStream, dataSourceId2 ); + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + +// --------------------------------------------------------------------------- +// CTestInterface::TestSetCodecL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestSetCodecL() + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + + TUint32 streamId1; + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId1, + KMccAudioUplinkStream, *codec ) ); + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStarted ); + + // CHANGING CODEC SHOULD CAUSE AN ERROR + /* + CMccCodecInformation* codec2 + = FetchCodecByMimeSubtypeNameL( iInterface, KPCMUSdpName ); + CleanupStack::PushL( codec2 ); + TInt err = iInterface.SetCodec( sessionId, linkId, streamId1, *codec2 ); + if ( KErrArgument != err ) + { + User::Leave( KErrTotalLossOfPrecision ); + } + */ + // TBD: TEST CHANGING OF CODEC PARAMETERS + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStopped ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId1 ) ); + iInterface.RemoveDataSink( sessionId, linkId, streamId1, dataSinkId1 ); + iInterface.RemoveDataSource( sessionId, linkId, streamId1, dataSourceId1 ); + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + //CleanupStack::PopAndDestroy( codec2 ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestGetCodecL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestGetCodecL() + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + + TUint32 streamId; + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId, + KMccAudioUplinkStream, *codec ) ); + + CMccCodecInformation* gotCodec + = iInterface.CodecL( sessionId, linkId, streamId ); + CleanupStack::PushL( gotCodec ); + + if ( gotCodec && gotCodec->FourCC() != codec->FourCC() ) + { + User::Leave( KErrTotalLossOfPrecision ); + } + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId ) ); + iInterface.RemoveDataSink( sessionId, linkId, streamId, dataSinkId1 ); + iInterface.RemoveDataSource( sessionId, linkId, streamId, dataSourceId1 ); + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( gotCodec ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestGetSSRCL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestGetSSRCL() + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + // UPLINK STREAM + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + + TUint32 streamId1; + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId1, + KMccAudioUplinkStream, *codec ) ); + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamPrepared ); + + TUint32 ssrc( 0 ); + User::LeaveIfError( + iInterface.GetSSRC( sessionId, linkId, streamId1, dataSinkId1, ssrc ) ); + if ( 0 == ssrc ) + { + User::Leave( KErrTotalLossOfPrecision ); + } + + // DOWNLINK STREAM + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId2 ) ); + + TUint32 streamId2; + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId2, + KMccAudioUplinkStream, *codec ) ); + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, streamId2 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId2, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, streamId2, KMccStreamPrepared ); + + User::LeaveIfError( + iInterface.GetSSRC ( sessionId, linkId, streamId2, dataSinkId1, ssrc ) ); + if ( 0 == ssrc ) + { + User::Leave( KErrTotalLossOfPrecision ); + } + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, streamId1 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, streamId1, KMccStreamStopped ); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, streamId2 ) ); + iIfStub.WaitForEvent( sessionId, linkId, streamId2, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, streamId2, KMccStreamStopped ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId1 ) ); + iInterface.RemoveDataSink( sessionId, linkId, streamId1, dataSinkId1 ); + iInterface.RemoveDataSource( sessionId, linkId, streamId1, dataSourceId1 ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId2 ) ); + iInterface.RemoveDataSink( sessionId, linkId, streamId2, dataSinkId1 ); + iInterface.RemoveDataSource( sessionId, linkId, streamId2, dataSourceId1 ); + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestInactivityTimerL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestInactivityTimerL() + { + const TUint KLongInactivityTimeout( 1000 ); // 1 second + + TUint32 session; + User::LeaveIfError( iInterface.CreateSession( session ) ); + + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + + TUint32 dataSinkId1; + TUint32 dataSourceId1; + + // Create downlink and stream + TUint32 linkId, downStream; + User::LeaveIfError( + iInterface.CreateLink( session, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( session, linkId, 0, KMccLinkCreated ); + + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId1 ) ); + User::LeaveIfError( iInterface.CreateStream( session, linkId, downStream, + KMccAudioDownlinkStream, *codec ) ); + + // Start, wait for inactivity event and stop timer + User::LeaveIfError( iInterface.StartInactivityTimer( session, linkId, downStream, + KLongInactivityTimeout, dataSourceId1 ) ); + iIfStub.WaitForEvent( session, linkId, downStream, KMccInactivityEvent ); + + /* + // Timer is automatically stopped after sending inactivity event + User::LeaveIfError( iInterface.StopInactivityTimer( session, linkId, downStream, + dataSourceId1 ) ); + */ + + // TRY TO USE INVALID TIMEOUT TIME + TInt err = iInterface.StartInactivityTimer( session, linkId, downStream, + 0, dataSourceId1 ); + if ( KErrArgument != err ) + { + RDebug::Print( _L("CTestInterface::TestInactivityTimerL ERR: %d" ), + err ); + RDebug::Print( _L("Timer should not work with timeout 0") ); + User::Leave( KErrTotalLossOfPrecision ); + } + + User::LeaveIfError( iInterface.DeleteStream( session, linkId, downStream ) ); + iInterface.RemoveDataSink( session, linkId, downStream, dataSinkId1 ); + iInterface.RemoveDataSource( session, linkId, downStream, dataSourceId1 ); + + // TRY TO USE TIMER WITH UL-STREAM + TUint32 upStream; + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId2 ) ); + User::LeaveIfError( iInterface.CreateStream( session, linkId, upStream, + KMccAudioUplinkStream, *codec ) ); + + err = iInterface.StartInactivityTimer( session, linkId, upStream, dataSinkId2, + KLongInactivityTimeout ); + if ( KErrNone == err ) + { + RDebug::Print( _L("Timer should not work on ul-stream") ); + User::Leave( KErrTotalLossOfPrecision ); + } + + User::LeaveIfError( iInterface.DeleteStream( session, linkId, upStream ) ); + iInterface.RemoveDataSink( session, linkId, upStream, dataSinkId2 ); + iInterface.RemoveDataSource( session, linkId, upStream, dataSourceId2 ); + + User::LeaveIfError( iInterface.CloseLink( session, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( session ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestMultiStreamLinkSessionL +// Tests stream creation to multiple links and sessions. +// --------------------------------------------------------------------------- +// +void CTestInterface::TestMultiStreamLinkSessionL() + { + RArray sessIds; + CleanupClosePushL( sessIds ); + RArray linkIds; + CleanupClosePushL( linkIds ); + RArray strmIds; + CleanupClosePushL( strmIds ); + RArray sourceIds; + CleanupClosePushL( sourceIds ); + RArray sinkIds; + CleanupClosePushL( sinkIds ); + + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + + for ( TInt sessCnt = 0; sessCnt < 3; sessCnt++ ) + { + TUint32 sessId; + User::LeaveIfError( iInterface.CreateSession( sessId ) ); + sessIds.Append( sessId ); + + for ( TInt linkCnt = 0; linkCnt < 3; linkCnt++ ) + { + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( + sessIds[sessCnt], KMccLinkGeneral, linkId, iNetsettings ) ); + + iIfStub.WaitForEvent( sessId, linkId, 0, KMccLinkCreated ); + linkIds.Append( linkId ); + + // UL-STREAM + TUint32 dataSinkId; + TUint32 dataSourceId; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId ) ); + sourceIds.Append( dataSourceId ); + sinkIds.Append( dataSinkId ); + + TUint32 ulStreamId; + User::LeaveIfError( + iInterface.CreateStream( sessIds[sessCnt], linkIds[sessCnt*3+linkCnt], ulStreamId, + KMccAudioUplinkStream, *codec ) ); + strmIds.Append( ulStreamId ); + + // DL-STREAM + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId ) ); + sourceIds.Append( dataSourceId ); + sinkIds.Append( dataSinkId ); + + TUint32 dlStreamId; + User::LeaveIfError( + iInterface.CreateStream( sessIds[sessCnt], linkIds[sessCnt*3+linkCnt], dlStreamId, + KMccAudioDownlinkStream, *codec ) ); + strmIds.Append( dlStreamId ); + } + } + + for ( TInt ind = 0; ind < sessIds.Count(); ind++ ) + { + // FAST SHUTDOWN + User::LeaveIfError( iInterface.CloseSession( sessIds[ind] ) ); + } + + // TBD: REMOVE DATASINK&SOURCE + CleanupStack::PopAndDestroy( codec ); + CleanupStack::PopAndDestroy( &sinkIds ); + CleanupStack::PopAndDestroy( &sourceIds ); + CleanupStack::PopAndDestroy( &strmIds ); + CleanupStack::PopAndDestroy( &linkIds ); + CleanupStack::PopAndDestroy( &sessIds ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestFastShutdownsL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestFastShutdownsL() + { + RDebug::Print( _L("CTestInterface::TestFastShutdownsL") ); + + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + + TUint32 linkId1; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId1, + iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId1, 0, KMccLinkCreated ); + + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId1 ) ); + + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + + // Add data sink and source + TUint32 endpointId1; + TUint32 endpointId2; + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, endpointId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, endpointId2 ) ); + + // Create downlink and stream 1 + TUint32 downLink1, downStream1; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, downLink1, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, downLink1, 0, KMccLinkCreated ); + + User::LeaveIfError( iInterface.CreateStream( sessionId, downLink1, downStream1, + KMccAudioDownlinkStream, *codec ) ); + + // Create uplink and stream 1 + TUint32 upLink1, upStream1; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, upLink1, iNetsettings ) ); + + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, endpointId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, endpointId2 ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, upLink1, upStream1, + KMccAudioUplinkStream, *codec ) ); + + // Create downlink and stream 2 + TUint32 downLink2, downStream2; + User::LeaveIfError( iInterface.CreateLink( sessionId, KMccLinkGeneral, downLink2, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, downLink2, 0, KMccLinkCreated ); + + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, endpointId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, endpointId2 ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, downLink2, downStream2, + KMccAudioDownlinkStream, *codec ) ); + + // Create uplink and stream 2 + TUint32 upLink2, upStream2; + User::LeaveIfError( iInterface.CreateLink( sessionId, KMccLinkGeneral, upLink2, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, upLink2, 0, KMccLinkCreated ); + + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, endpointId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, endpointId2 ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, upLink2, upStream2, + KMccAudioUplinkStream, *codec ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, upLink1, upStream1 ) ); + iIfStub.WaitForEvent( sessionId, upLink1, upStream1, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, upLink1, upStream1, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, upLink2, upStream2 ) ); + iIfStub.WaitForEvent( sessionId, upLink2, upStream2, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, upLink2, upStream2, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, downLink1, downStream1 ) ); + iIfStub.WaitForEvent( sessionId, downLink1, downStream1, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, downLink1, downStream1, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, downLink2, downStream2 ) ); + iIfStub.WaitForEvent( sessionId, downLink2, downStream2, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, downLink2, downStream2, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.StartStream( sessionId, upLink1, upStream1 ) ); + iIfStub.WaitForEvent( sessionId, upLink1, upStream1, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, upLink1, upStream1, KMccStreamStarted ); + + iConsole.Printf( _L( "Press a key to stop\n" ) ); + iConsole.Getch(); + + // TBD: REMOVE DATASINK&SOURCE + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestResourceReuseL +// +// --------------------------------------------------------------------------- +// +void CTestInterface::TestResourceReuseL() + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + TUint32 ulStreamId; + TUint32 rtpSinkId; + TUint32 micSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, rtpSinkId ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, micSourceId1 ) ); + + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, ulStreamId, + KMccAudioUplinkStream, *codec ) ); + + TUint32 dlStreamId; + TUint32 speakerSinkId1; + TUint32 rtpSourceId; + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, speakerSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, rtpSourceId ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, dlStreamId, + KMccAudioUplinkStream, *codec ) ); + + TUint32 ulStreamId2; + TUint32 micSourceId2; + User::LeaveIfError( + iInterface.Reuse( sessionId, linkId, ulStreamId, rtpSinkId ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, micSourceId2 ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, ulStreamId2, + KMccAudioUplinkStream, *codec ) ); + + TUint32 dlStreamId2; + TUint32 speakerSinkId2; + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, speakerSinkId2 ) ); + User::LeaveIfError( + iInterface.Reuse( sessionId, linkId, dlStreamId, rtpSourceId ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, dlStreamId2, + KMccAudioDownlinkStream, *codec ) ); + + User::LeaveIfError( + iInterface.PrepareStream( sessionId, linkId, dlStreamId, rtpSourceId ) ); + iIfStub.WaitForEvent( + sessionId, linkId, dlStreamId, rtpSourceId, KMccStreamPrepared ); + + User::LeaveIfError( + iInterface.PrepareStream( sessionId, linkId, dlStreamId2, rtpSourceId ) ); + iIfStub.WaitForEvent( + sessionId, linkId, dlStreamId2, rtpSourceId, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestMultiStreamPreparingL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestMultiStreamPreparingL() + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + + // CREATE UL-STREAM + TUint32 upStream; + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, upStream, + KMccAudioUplinkStream, *codec ) ); + + // CREATE DL-STREAM + TUint32 downStream; + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId2 ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, downStream, + KMccAudioDownlinkStream, *codec ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPrepared ); + + // CREATE SECOND LINK + TUint32 linkId2; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId2, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId2, 0, KMccLinkCreated ); + + // CREATE SECOND UL-STREAM + TUint32 upStream2; + TUint32 dataSinkId3; + TUint32 dataSourceId3; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId3 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId3 ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId2, upStream2, + KMccAudioUplinkStream, *codec ) ); + + // CREATE SECOND DL-STREAM + TUint32 downStream2; + TUint32 dataSinkId4; + TUint32 dataSourceId4; + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId4 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId4 ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId2, downStream2, + KMccAudioDownlinkStream, *codec ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId2, upStream2 ) ); + iIfStub.WaitForEvent( sessionId, linkId2, upStream2, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId2, upStream2, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId2, downStream2 ) ); + iIfStub.WaitForEvent( sessionId, linkId2, downStream2, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId2, downStream2, KMccStreamPrepared ); + + // TBD: REMOVE DATASINK&SOURCE + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, upStream ) ); + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, downStream ) ); + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId2, upStream2 ) ); + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId2, downStream2 ) ); + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId2 ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestAudioStreamingL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestAudioStreamingL( const TDesC8& aCodec ) + { + iNetsettings.iLocalAddress.SetPort( KDefaultRtpPort ); + + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + RDebug::Print( _L("CTestInterface::TestAudioStreaming: %S"), &aCodec ); + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + + TUint32 ulStreamId; + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, aCodec ); + CleanupStack::PushL( codec ); + + // SET VOIP PRIORITIES FOR THE CODEC + codec->SetPriority( EMdaPriorityMax ); + codec->SetPriorityPreference( KAudioPrefVoipAudioUplink ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, ulStreamId, + KMccAudioUplinkStream, *codec ) ); + + TUint32 dlStreamId; + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId2 ) ); + + codec->SetPriorityPreference( KAudioPrefVoipAudioDownlink ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, dlStreamId, + KMccAudioDownlinkStream, *codec ) ); + + // START UPLINK FIRST + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, ulStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.SetRemoteAddress( sessionId, linkId, + iNetsettings.iRemoteAddress, iNetsettings.iRemoteRtcpPort ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, dlStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, dlStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStarted ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, ulStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStarted ); + + iConsole.Printf( _L( "Press a key to stop 1\n" ) ); + iConsole.Getch(); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, ulStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStopped ); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, dlStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStopped ); + + // START DOWNLINK FIRST + /* + // PREPARING AFTER STOP DOES NOT WORK YET + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, ulStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, dlStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, ulStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStarted ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, dlStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStarted ); + + iConsole.Printf( _L( "Press a key to stop 2\n" ) ); + iConsole.Getch(); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, ulStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStopped ); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, dlStreamId ) ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStopped ); + */ + // TBD: REMOVE DATASINK&SOURCE + iInterface.DeleteStream( sessionId, linkId, ulStreamId ); + iInterface.DeleteStream( sessionId, linkId, dlStreamId ); + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestMultiStreamPausingL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestMultiStreamPausingL() + { + iNetsettings.iLocalAddress.SetPort( KDefaultRtpPort ); + + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + + TUint32 upStream; + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + + codec->SetPriority( EMdaPriorityMax ); + codec->SetPriorityPreference( KAudioPrefVoipAudioUplink ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, upStream, + KMccAudioUplinkStream, *codec ) ); + TUint32 downStream; + TUint32 dataSinkId2; + TUint32 dataSourceId2; + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, dataSinkId2 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, dataSourceId2 ) ); + + codec->SetPriorityPreference( KAudioPrefVoipAudioDownlink ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, downStream, + KMccAudioDownlinkStream, *codec ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.SetRemoteAddress( sessionId, linkId, + iNetsettings.iRemoteAddress, iNetsettings.iRemoteRtcpPort ) ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, upStream) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStarted ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, downStream) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStarted ); + + iConsole.Printf( _L( "Press a key to pause\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.PauseStream( sessionId, linkId, upStream) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPaused ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPaused ); + + User::LeaveIfError( iInterface.PauseStream( sessionId, linkId, downStream) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPaused ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPaused ); + + iConsole.Printf( _L( "Press a key to resume\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.ResumeStream( sessionId, linkId, upStream) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamResumed ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamResumed ); + + User::LeaveIfError( iInterface.ResumeStream( sessionId, linkId, downStream) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamResumed ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamResumed ); + + iConsole.Printf( _L( "Press a key to stop\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, upStream) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStopped ); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, downStream) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStopped ); + + // TBD: REMOVE DATASINK&SOURCE + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, upStream) ); + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, downStream) ); + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestAmrFecL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestAmrFecL() + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + + // Enable forward error correction + User::LeaveIfError( codec->SetAlgo( EAmrFecUsed ) ); + User::LeaveIfError( codec->SetRedCount( 2 ) ); + + // CREATE UL-SREAM + TUint32 upStream; + TUint32 rtpSinkId; + TUint32 micSourceId; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, rtpSinkId ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, micSourceId ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, upStream, + KMccAudioUplinkStream, *codec ) ); + + // CREATE DL-STREAM + TUint32 downStream; + TUint32 speakerSinkId; + TUint32 rtpSourceId; + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, speakerSinkId ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, rtpSourceId ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, downStream, + KMccAudioDownlinkStream, *codec ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.SetRemoteAddress( sessionId, linkId, + iNetsettings.iRemoteAddress, iNetsettings.iRemoteRtcpPort ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPrepared ); + + // Try the FEC algorithm + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStarted ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStarted ); + + iConsole.Printf( _L( "Press a key to stop\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStopped ); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStopped ); + + // TBD: REMOVE DATASINK&SOURCE + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, upStream ) ); + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, downStream ) ); + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + +// --------------------------------------------------------------------------- +// CTestInterface::TestRedundancyL +// --------------------------------------------------------------------------- +// +void CTestInterface::TestRedundancyL( const TDesC8& aCodec ) + { + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, + iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, aCodec ); + CleanupStack::PushL( codec ); + + // SET VOIP PRIORITIES FOR THE CODEC + codec->SetPriority( EMdaPriorityMax ); + codec->SetPriorityPreference( KAudioPrefVoipAudioUplink ); + codec->SetAlgo( EGenRedUsed ); + codec->SetRedundancyPT( 100 ); + + TInt err = codec->SetRedCount( 2 ); + if ( KErrArgument == err ) + { + User::LeaveIfError( codec->SetRedCount( 1 ) ); + } + else + { + User::Leave( KErrTotalLossOfPrecision ); + } + + TUint32 upStream; + TUint32 rtpSinkId; + TUint32 micSourceId; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, rtpSinkId ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, micSourceId ) ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, upStream, + KMccAudioUplinkStream, *codec ) ); + + TUint32 downStream; + TUint32 speakerSinkId; + TUint32 rtpSourceId; + User::LeaveIfError( + iInterface.AddDataSink( KUidMmfAudioOutput, KNullDesC8, speakerSinkId ) ); + User::LeaveIfError( + iInterface.AddDataSource( KMccRtpSourceUid, KNullDesC8, rtpSourceId ) ); + + codec->SetPriorityPreference( KAudioPrefVoipAudioDownlink ); + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, downStream, + KMccAudioDownlinkStream, *codec ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.SetRemoteAddress( sessionId, linkId, + iNetsettings.iRemoteAddress, iNetsettings.iRemoteRtcpPort ) ); + + User::LeaveIfError( iInterface.PrepareStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPrepared ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamPrepared ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStarted ); + + User::LeaveIfError( iInterface.StartStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStarted ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStarted ); + + iConsole.Printf( _L( "Press a key to stop\n" ) ); + iConsole.Getch(); + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, upStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, upStream, KMccStreamStopped ); + + User::LeaveIfError( iInterface.StopStream( sessionId, linkId, downStream ) ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStopped ); + iIfStub.WaitForEvent( sessionId, linkId, downStream, KMccStreamStopped ); + + // TBD: REMOVE DATASINK&SOURCE + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, upStream ) ); + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, downStream ) ); + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::TestAudioRoutingL +// TBD: Update to loopback test. +// --------------------------------------------------------------------------- +// +void CTestInterface::TestAudioRoutingL() + { + TInt err = iInterface.SetParameter( 6, 0, 0, 0, + KMccSpeakerRouting, TPckgBuf( KMccAudioToPrivate ) ); + if ( KErrNotFound != err ) + { + User::Leave( KErrTotalLossOfPrecision ); + } + + TUint32 audioRoute( 0 ); + TPckgBuf audioRoutePak( audioRoute ); + err = iInterface.GetParameter( 6, 0, 0, 0, + KMccSpeakerRouting, audioRoutePak ); + if ( KErrNotFound != err ) + { + User::Leave( KErrTotalLossOfPrecision ); + } + + CMccCodecInformation* codec + = FetchCodecByMimeSubtypeNameL( iInterface, KAMRSdpName ); + CleanupStack::PushL( codec ); + + TUint32 sessionId; + User::LeaveIfError( iInterface.CreateSession( sessionId ) ); + TUint32 linkId; + User::LeaveIfError( + iInterface.CreateLink( sessionId, KMccLinkGeneral, linkId, iNetsettings ) ); + iIfStub.WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + TUint32 dataSinkId1; + TUint32 dataSourceId1; + User::LeaveIfError( + iInterface.AddDataSink( KMccRtpSinkUid, KNullDesC8, dataSinkId1 ) ); + User::LeaveIfError( + iInterface.AddDataSource( KUidMmfAudioInput, KNullDesC8, dataSourceId1 ) ); + + TUint32 streamId; + User::LeaveIfError( iInterface.CreateStream( sessionId, linkId, streamId, + KMccAudioUplinkStream, *codec ) ); + + err = iInterface.SetParameter( sessionId, linkId, streamId, 0, + KMccSpeakerRouting, TPckgBuf( KMccAudioToPrivate ) ); + + User::LeaveIfError( iInterface.DeleteStream( sessionId, linkId, streamId ) ); + User::LeaveIfError( iInterface.CloseLink( sessionId, linkId ) ); + User::LeaveIfError( iInterface.CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( codec ); + } + + +// --------------------------------------------------------------------------- +// CTestInterface::FetchCodecByMimeSubtypeNameL +// --------------------------------------------------------------------------- +// +CMccCodecInformation* CTestInterface::FetchCodecByMimeSubtypeNameL( + const CMccInterface& aInterface, const TDesC8& aName ) const + { + RPointerArray codecArray; + CleanupResetAndDestroy< RPointerArray >::PushL( codecArray ); + User::LeaveIfError( aInterface.GetCapabilities( codecArray ) ); + + CMccCodecInformation* tmp = NULL; + TInt ind( codecArray.Count() ); + + while ( ( ind-- ) && ( NULL == tmp ) ) + { + if ( codecArray[ind]->SdpName().Compare( aName ) == 0 ) + { + tmp = codecArray[ind]->CloneDetailedL(); + } + } + + if ( NULL == tmp ) + { + User::Leave( KErrNotFound ); + } + + CleanupStack::PopAndDestroy( &codecArray ); + return tmp; + }