multimediacommscontroller/tsrc/TestConsoles/McpConsole/Src/Testconsole.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/tsrc/TestConsoles/McpConsole/Src/Testconsole.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,2065 @@
+/*
+* Copyright (c) 2004 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:    Part of TestConsole application.
+**              Methods for the class CTestAppConsole
+**
+*/
+
+
+
+
+#include <e32std.h>
+#include <e32svr.h>
+#include <e32base.h>
+#include <AudioPreference.h>
+#include "TestConsole.h"
+#include "MccInternalCodecs.h"
+#include "MmccEvents.h"
+#include "MccDef.h"
+#include "MmccCodecAMR.h"
+
+
+_LIT( KTxtMainInstructions, "Please select one option:\n"
+ L"1. Session & Q. Stream creation\n"
+ L"2. Prepare & W. Start Stream\n"
+ L"3. Pause Stream\n"
+ L"4. Resume Stream\n"
+ L"5. Stop & d. Delete Stream\n"
+ L"6. Close Session\n"
+ L"7. Set volume & gain\n"
+ L"8. Get gain & maxgain & codec & volume\n"
+ L"\n"
+ L"c. Codec menu\n"
+ L"m. DTMF menu\n"
+ L"n. Network settings\n"
+ L"r. Send non-RTCP data\n"
+ L"t. Toggle inactivity timer on/off\n"
+ L"9. Quit\n" );
+
+_LIT( KTxtCodecInstructions, "Select option:\n"
+L"1. Supported Codecs\n"
+L"2. Change codec\n"
+L"3. Set Codec Settings\n"
+L"4. Toggle VAD/FW\n"
+L"5. Set Codec\n"
+L"6. Set FTMP attribute\n"
+L"9. Return main menu\n" );
+
+
+_LIT( KTxtDTMFInstructions, "Select option:\n "
+L"1. Start DTMF Tone\n"
+L"2. Stop DTMF Tone\n"
+L"3. Send DTMF Tones\n"
+L"4. Continue sending\n"
+L"9. Return main menu\n" );
+
+//*******************************************************************************
+// Method      : CTestAppConsole::NewL()
+// Purpose     : 
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+CTestAppConsole* CTestAppConsole::NewL()
+    {
+    CTestAppConsole* self = new( ELeave ) CTestAppConsole();
+    CleanupStack::PushL( self );
+
+    self->ConstructL();
+
+    CleanupStack::Pop();
+    return self;
+    }
+
+//*******************************************************************************
+// Method      : CTestAppConsole::CTestAppConsole()
+// Purpose     : Constructor
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+CTestAppConsole::CTestAppConsole()
+    :
+    CActive( EPriorityStandard ),
+    iDTMFSessionID( KNullId ),
+    iDTMFStreamID( 0 ),
+    iInactivityTimerActive( EFalse ),
+    iIapId( -1 ),
+    iNetSettingsDone( EFalse ),
+    iCurMenu( EMainMenu ),
+    iDtmfMode( EFalse ),
+    iSdesReported( EFalse ),
+    iSrReported( EFalse ),
+    iRrReported( EFalse ),
+    iNumOfNonRtcpDataSent( 0 )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+//*******************************************************************************
+// Method      : CTestAppConsole::ConstructL()
+// Purpose     : 
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+void CTestAppConsole::ConstructL()
+    {
+    _LIT( KTxtTitle, " Mcc Test " );
+    iConsole = Console::NewL( KTxtTitle, TSize( KConsFullScreen, KConsFullScreen ) );
+    DisplayConsoleMenu( KTxtMainInstructions );
+
+    //__KHEAP_MARK;
+    iMccInterface = CMccInterface::NewL( *this );
+
+    iCodecArray.Reset();
+    iMccInterface->GetCapabilities( iCodecArray/*iCodecInformation*/ ); // RPointerArray<TFourCC>& aCodecs
+
+    RunTestCodecFactory();
+    }
+
+//*******************************************************************************
+// Method      : CTestAppConsole::~CTestAppConsole()
+// Purpose     : Destructor
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+CTestAppConsole::~CTestAppConsole()
+    {    
+    Cancel(); // any outstanding request
+   
+    if ( iConsole )
+        {
+        delete iConsole;
+        }
+        
+    delete iInstruct;
+    
+    iCodecInformation.ResetAndDestroy();
+    iCodecInformation.Close();
+    
+    iCodecArray.ResetAndDestroy();
+    iCodecArray.Close();
+    
+    iMccInterface->Close();    
+    delete iMccInterface;
+
+
+    //__KHEAP_MARKEND;
+    }
+
+//*******************************************************************************
+// Method      : CTestAppConsole::StartTesting()
+// Purpose     : start this AO 
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+void CTestAppConsole::StartTesting()
+    {
+    DoRead();
+    }
+
+//*******************************************************************************
+// Method      : CTestAppConsole::DoRead()
+// Purpose     : get the user's option and send request to scheduler
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+void CTestAppConsole::DoRead()
+    {
+    //PrintOptions();
+
+    iConsole->Read( iStatus );
+    SetActive();
+    }
+
+//*******************************************************************************
+// Method      : CTestAppConsole::RunL()
+// Purpose     : 
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+void CTestAppConsole::RunL()
+    {    
+    // According to current test case and direct the user's command
+    // to proper command handler.
+    switch ( iCurMenu )    
+        {
+        case EMainMenu:
+            DisplayConsoleMenu( KTxtMainInstructions );
+            ProcessMainInput();
+            break;
+        case EDTMFTestMenu:
+            DisplayConsoleMenu( KTxtDTMFInstructions );
+            ProcessDTMFInput();
+            break;
+        case ECodecTestMenu:
+            DisplayConsoleMenu( KTxtCodecInstructions );
+            ProcessCodecInput();
+            break;
+        default:
+            break;
+        }
+
+        //ProcessKey( TChar( iConsole->KeyCode() ) );
+        //DoRead();
+
+    }
+
+//*******************************************************************************
+// Method      : CTestAppConsole::DoCancel()
+// Purpose     : 
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+void CTestAppConsole::DoCancel()
+    {
+    iConsole->ReadCancel();
+    }
+
+
+//*******************************************************************************
+// Method      : CTestAppConsole::DisplayConsoleMenu()
+// Purpose     : Display main or sub console menus for different test cases
+// Parameters  : TDesc &aInstructions
+// Return Value: void
+//*******************************************************************************
+void CTestAppConsole::DisplayConsoleMenu( const TDesC &aInstructions )
+    {
+    if ( iInstruct )
+        {
+        delete iInstruct;
+        iInstruct = NULL;
+        }
+    iInstruct = aInstructions.AllocL();
+    iConsole->ClearScreen();
+    iConsole->Write( *iInstruct );
+    }
+
+
+//*******************************************************************************
+// Method      : CTestAppConsole::ProcessMainInput()
+// Purpose     : Obtain user's option and decide which test case to run next.
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+void CTestAppConsole::ProcessMainInput()
+    {
+    TBuf<20> line;
+    GetStringFromConsole( line );
+    
+    if ( line.Length() > 0 )
+        {
+        TChar inputChar = line.Ptr()[0];
+        
+        switch( inputChar )
+            {
+            case '1':
+                RunTestCreateSession();
+                break;
+            case 'q':
+                RunTestCreateStreams();
+                break;
+
+            case 'z':
+                RunTest1c();
+                break;
+
+            case '2':
+                RunTestPrepareStreams();
+                break;
+            case 'p':
+                RunTest2p();
+                break;
+
+            case 'w':
+                RunTestStartStream();
+                break;
+            case '3':
+                RunTestPauseStreams();
+                break;
+            case '4':
+                RunTestResumeStreams();
+                break;
+            case '5':
+                RunTestStopStream();
+                break;
+            case 'd':
+                RunTestDeleteStreams();
+                break;
+            case '6':
+                RunTestCloseSession();
+                break;
+            case '7':
+                RunTest7();
+                break;
+            case '8':
+                RunTestGetCodecAndAudioSettings();
+                break;
+
+            case 'l':
+                SetRemoteAddr();
+                break;
+            case 'n':
+                SetNetSettings();
+                break;
+
+            case 'r':
+                SendNonRtcpData();
+                break;
+
+            case 't':
+                ToggleInactivityTimer();
+                break;
+
+            // Menus
+			case 'c':
+			    iCurMenu = ECodecTestMenu;
+			    DisplayConsoleMenu( KTxtCodecInstructions );
+			    break;
+            case 'm':
+                iCurMenu = EDTMFTestMenu;
+                DisplayConsoleMenu( KTxtDTMFInstructions );
+                break;
+
+            case '9':
+                iMccInterface->Close();
+                CActiveScheduler::Stop();
+                break;
+            default:
+                _LIT( KTxtWrongOption, "Wrong Option! Try Again." );
+                DisplayMsg( KTxtWrongOption );
+                break;        
+            }
+        }
+    // Ready to get next input option.
+    DoRead();
+    }
+
+
+//*******************************************************************************
+// Method      : CTestAppConsole::DisplayMsg()
+// Purpose     : Display testing message on screen
+// Parameters  : TDesC &
+// Return Value: 
+//*******************************************************************************
+void CTestAppConsole::DisplayMsg( const TDesC &aMsg )
+    {
+    iConsole->ClearScreen();
+    iConsole->Write( *iInstruct );
+    iConsole->Printf( KTxtLineBreak );
+    iConsole->Printf( aMsg );
+    iConsole->Printf( KTxtLineBreak );
+    }
+
+//*******************************************************************************
+// Method      : CTestAppConsole::GetAddrFromConsole()
+// Purpose     : 
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+TKeyCode CTestAppConsole::GetStringFromConsole( TDes &aAddr )
+    {
+    // Get a line from console
+    TKeyCode input = EKeyNull;
+    const TInt start_pos = iConsole->WhereX();
+    aAddr.Zero();
+
+    // loop until descriptor full or EKeyEnter or EKeyEscape entered
+    do {
+        // get one character
+        input = iConsole->Getch();
+        // process it
+        if( input == EKeyBackspace  ||  input == EKeyDelete )
+            {
+            // backspace or delete
+            if( iConsole->WhereX() > start_pos )
+                {
+                iConsole->SetPos( iConsole->WhereX() - 1 );
+                iConsole->ClearToEndOfLine();
+                if( aAddr.Length() > 0 ) 
+                    {
+                    aAddr.SetLength( aAddr.Length() - 1 );
+                    }
+                }
+            }
+        else
+            {
+            // other than backspace or delete
+            TChar ch( input );
+            if( ch.IsPrint() )
+                {
+                aAddr.Append( ch );
+                iConsole->Printf( _L( "%c" ), input );
+                }
+            }   
+        } 
+    while( aAddr.Length() < aAddr.MaxLength()  &&  input != EKeyEnter  &&  input != EKeyEscape );
+
+    DisplayMsg( KTxtLineBreak );
+    return input;
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::SetNetSettings
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::SetNetSettings()
+    {
+    TBuf<20> line;
+    TUint port;
+    TUint rport;
+    TUint iapid;
+
+    iConsole->Printf( _L( "\nEnter Iap Id: " ) );
+    GetIntegerFromConsole( iapid );
+
+    iNetSettings.iIapId = iapid;
+    iNetSettings.iMediaQosValue = 46;  
+
+	iConsole->Printf( _L( "\nEnter the Remote IP address " ) );
+	
+	GetStringFromConsole( line );
+
+    iRemoteAddr.Input( line );
+
+    iConsole->Printf( _L( "\nEnter the Remote port: " ) );
+	GetIntegerFromConsole( rport );
+
+    RDebug::Print( _L("RemotePort: %d"), rport );
+	
+	iRemoteAddr.SetPort( rport );
+
+    iConsole->Printf( _L( "\nEnter the Local port: " ) );
+
+	GetIntegerFromConsole( port );
+    
+    RDebug::Print( _L( "LocalPort: %d" ), port );
+
+	iConsole->Printf( _L( "Addr: %d\n"), iRemoteAddr.Address() );
+    RDebug::Print( _L( "RemoteAddr: %d"), iRemoteAddr.Address() );
+    
+    iNetSettings.iRemoteAddress.SetAddress( iRemoteAddr.Address() );
+    iNetSettings.iRemoteAddress.SetPort( rport );
+    iNetSettings.iLocalPort = port;
+
+    DisplayMsg( _L( "Create DTMF session <y/n>: " ) );
+    GetStringFromConsole( line );
+    TChar inputChar = line.Ptr()[0];
+
+    if ( inputChar == 'y' )
+        {
+        iDtmfMode = ETrue;
+        }
+
+    // RTCP is not available in DTMF sessions
+    if ( !iDtmfMode )
+        {
+        iConsole->Printf( _L( "\nEnable RTCP? <y/n>: " ) );
+    	GetStringFromConsole( line );
+    	TChar inputChar = line.Ptr()[0];
+
+    	if ( inputChar == 'y' )
+    	    {
+    		iNetSettings.iMediaSignalling = ESignalRtcp;
+    		iConsole->Printf( _L( "\nRTCP enabled\n" ) );
+    	    }    
+        }
+
+    iNetSettingsDone = ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestCreateSession
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestCreateSession()
+    {
+    TBuf<20> line;
+
+    if ( !iNetSettingsDone )
+        {
+        SetNetSettings();
+        }
+
+    if ( iDtmfMode )
+        {
+        DisplayMsg( _L( "Enable inband DTMF <y/n>: " ) );
+        GetStringFromConsole( line );
+        TChar inputChar = line.Ptr()[0];
+        if ( inputChar == 'y' )
+            {
+            iNetSettings.iMediaSignalling 
+                = TMCCMediaSignalingType( iNetSettings.iMediaSignalling | KSignalInbandDtmf );
+            DisplayMsg( _L( "Inband DTMF enabled" ) );
+            }
+
+        DisplayMsg( _L( "Enable outband DTMF <y/n>: " ) );
+        GetStringFromConsole( line );
+        inputChar = line.Ptr()[0];
+
+        if ( inputChar == 'y' )
+            {
+            iNetSettings.iMediaSignalling 
+                = TMCCMediaSignalingType( iNetSettings.iMediaSignalling | KSignalOutbandDtmf );
+            DisplayMsg( _L( "Outband DTMF enabled" ) );
+            }
+
+        TInt err = iMccInterface->CreateSession( iDTMFSessionID );
+        if ( err == KErrNone )
+            {
+            iConsole->Printf( _L( "DTMF Session created, id: %d\n" ), iSessionId );
+            }
+        else
+            {
+            iConsole->Printf( _L( "Could not create DTMF session, error %d\n" ), err );
+            }
+
+        err = iMccInterface->CreateLink( iDTMFSessionID, KMccLinkGeneral, iDtmfLinkID, iNetSettings );
+        if ( err == KErrNone )
+            {
+            iConsole->Printf( _L( "DTMF link created, id: %d\n" ), iDtmfLinkID );
+            }
+        else
+            {
+            iConsole->Printf( _L( "Could not create DTMF session, error %d\n" ), err );
+            }
+        }
+    else
+        {
+        // Create session
+        TInt err = iMccInterface->CreateSession( iSessionId );
+        if ( err == KErrNone )
+            {
+            iConsole->Printf( _L( "Session created, id: %d\n" ), iSessionId );
+            }
+        else
+            {
+            iConsole->Printf( _L( "Could not create session, error %d\n" ), err );
+            }
+        }        
+
+    TVersion version = iMccInterface->Version();
+    iConsole->Printf( _L( "Version %d.%d.%d\n" ),
+                      version.iMajor, version.iMinor, version.iBuild );
+    };
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestCreateStreams
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestCreateStreams()
+    {
+    TInt err( KErrNone );
+    if ( KMccFourCCIdDTMF == iCodecArray[iCodecSelected]->FourCC() )
+        {
+        // Create DTMF stream
+        err = iMccInterface->CreateStream( iDTMFSessionID, iDtmfLinkID, iDTMFStreamID, 
+                                           EMccAudioUplinkStream, iCodecArray[iCodecSelected] );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not create DTMF stream" ) );
+            return;
+            }
+        iConsole->Printf( _L( "\nEnter the Remote port: " ) );
+        TInt rport;
+        GetIntegerFromConsole( rport );
+        iRemoteAddr.SetPort( rport );
+        iMccInterface->SetRemoteAddress( iDTMFSessionID, iDtmfLinkID, iRemoteAddr );
+        iConsole->Printf( _L( "Stream created. ID: DTMF %d, pt: %d\n" ), iDTMFStreamID, iCodecArray[iCodecSelected]->PayloadType() );
+        }
+    else 
+        {
+        // Create uplink
+        iConsole->Printf( _L( "Creating uplink...\n" ) );
+        err = iMccInterface->CreateLink( iSessionId, KMccLinkGeneral, iUplinkId, iNetSettings );
+        if ( err == KErrNone )
+            {
+            iConsole->Printf( _L( "Uplink created, id: %d, port: %d\n" ),
+                              iUplinkId, iNetSettings.iLocalPort );
+            }
+        else
+            {
+            iConsole->Printf( _L( "Could not create uplink, error %d\n" ), err );
+            return;
+            }
+
+        // Create upstream
+
+        // Make the AMR codec compatible with the RTP sender program
+        if ( iCodecSelected == 0 )
+            {
+            iCodecArray[iCodecSelected]->SetBitrate( KAmrNbBitrate122 );
+            iCodecArray[iCodecSelected]->SetCodecMode( EOctetAligned );
+            iCodecArray[iCodecSelected]->SetPayloadType( 96 );
+            iCodecArray[iCodecSelected]->SetPTime( 20 );
+            iCodecArray[iCodecSelected]->SetMaxPTime( 200 );
+            }
+
+        err = iMccInterface->CreateStream( iSessionId, iUplinkId, iUpStreamId,
+                                           EMccAudioUplinkStream, iCodecArray[iCodecSelected] );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not create upstream, error %d" ), err );
+            return;
+            }
+        iConsole->Printf( _L( "Upstream created. Sess %d, link %d, stream %d, pt: %d\n" ),
+                          iSessionId, iUplinkId, iUpStreamId,
+                          iCodecArray[iCodecSelected]->PayloadType() );
+
+        // Create downlink
+        iConsole->Printf( _L( "Creating downlink...\n" ) );
+        err = iMccInterface->CreateLink( iSessionId, KMccLinkGeneral, iDownlinkId, iNetSettings );
+        if ( err == KErrNone )
+            {
+            iConsole->Printf( _L( "Downlink created, id: %d, port: %d\n" ),
+                                   iDownlinkId, iNetSettings.iLocalPort );
+            }
+        else
+            {
+            iConsole->Printf( _L( "Could not create downlink, error %d\n" ), err );
+            }
+
+        // Create downstream
+        err = iMccInterface->CreateStream( iSessionId, iDownlinkId, iDownStreamId,
+                                           EMccAudioDownlinkStream, iCodecArray[iCodecSelected] );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not create downstream, error %d" ), err );
+            return;
+            }
+        iConsole->Printf( _L( "Downstream created. Sess %d, link %d, stream %d, pt: %d\n" ),
+                          iSessionId, iDownlinkId, iDownStreamId,
+                          iCodecArray[iCodecSelected]->PayloadType() );
+
+        iMccInterface->SetRemoteAddress( iSessionId, iUplinkId, iRemoteAddr );
+        iMccInterface->SetRemoteAddress( iSessionId, iDownlinkId, iRemoteAddr );
+
+        iConsole->Printf( _L( "\nRemote addresses set" ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTest1c
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTest1c()
+    {
+    TInt err( KErrNone );
+    if ( KMccFourCCIdDTMF == iCodecArray[iCodecSelected]->FourCC() )
+        {
+        err = iMccInterface->CreateStream( iDTMFSessionID, iDtmfLinkID, iDTMFStreamID,
+                                           EMccAudioUplinkStream, iCodecArray[iCodecSelected] );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not create DTMF stream" ) );
+            return;
+            }
+        iConsole->Printf( _L( "\nEnter the Remote port: " ) );
+        TInt rport;
+        GetIntegerFromConsole( rport );
+        iRemoteAddr.SetPort( rport );
+        iMccInterface->SetRemoteAddress( iDTMFSessionID, iDtmfLinkID, iRemoteAddr );
+        iConsole->Printf( _L( "Stream created. ID: DTMF %d, pt: %d\n" ), iDTMFStreamID, iCodecArray[iCodecSelected]->PayloadType() );
+        }
+    else
+        {
+        iConsole->Printf( _L( "\nCreate Uplink or Downlink <u/d>: " ) );
+
+        TBuf<20> line;
+        GetStringFromConsole( line );
+        TChar inputChar = line.Ptr()[0];
+        
+        if ( inputChar == 'u' ) 
+            {
+            err = iMccInterface->CreateStream( iSessionId, iUplinkId, iUpStreamId,
+                                               EMccAudioUplinkStream, iCodecArray[iCodecSelected] );
+            if ( err != KErrNone )
+                {
+                iConsole->Printf( _L( "\nCould not create uplink stream" ) );
+                return;
+                }
+            }
+        else if ( inputChar == 'd' )
+            {
+            err = iMccInterface->CreateStream( iSessionId, iDownlinkId, iDownStreamId,
+                                               EMccAudioDownlinkStream, iCodecArray[iCodecSelected] );
+            if ( err != KErrNone )
+                {
+                iConsole->Printf( _L( "\nCould not create downlink stream" ) );
+                return;
+                }
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nInvalid input" ) );
+            return;
+            }
+
+        iConsole->Printf( _L( "\nEnter the Remote port: " ) );
+        TUint rport;
+
+        GetStringFromConsole( line );
+        TLex lex( line );
+        lex.Val( rport,EDecimal );
+
+        iRemoteAddr.SetPort( rport );
+        if ( inputChar == 'u' ) 
+            {
+            err = iMccInterface->SetRemoteAddress( iSessionId, iUplinkId, iRemoteAddr );
+            if ( err != KErrNone )
+                {
+                iConsole->Printf( _L( "\nCould not set remote address ( up )" ) );
+                return;
+                }
+            }
+        else if ( inputChar == 'd' )
+            {
+            err = iMccInterface->SetRemoteAddress( iSessionId, iDownlinkId, iRemoteAddr );
+            if ( err != KErrNone )
+                {
+                iConsole->Printf( _L( "\nCould not set remote address ( down )" ) );
+                return;
+                }
+            }
+
+        iConsole->Printf( _L( "Stream created. ID: UL: %d, DL: %d, pt: %d\n" ), iUpStreamId, iDownStreamId, iCodecArray[iCodecSelected]->PayloadType() );
+        }        
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestPrepareStreams
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestPrepareStreams()
+    {
+    TInt err( KErrNone );
+    if ( KMccFourCCIdDTMF == iCodecArray[iCodecSelected]->FourCC() )
+        {
+        if ( KNullId != iDTMFStreamID )
+            {
+            iMccInterface->SetPriority( iDTMFSessionID, iDtmfLinkID, iDTMFStreamID, KAudioPriorityPhoneCall /*EMdaPriorityNormal*/ );        
+            err = iMccInterface->PrepareStream( iDTMFSessionID, iDtmfLinkID, iDTMFStreamID );
+            if ( err != KErrNone )
+                {
+                iConsole->Printf( _L( "\nCould not prepare DTMF stream" ) );
+                return;
+                }
+            else
+                {
+                iConsole->Printf( _L( "\nDTMF stream prepared" ) );
+                }
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nCreate DTMF stream first" ) );
+            }
+        }
+    else
+        {
+        // Set UL priority
+        err = iMccInterface->SetPriority( iSessionId, iUplinkId, iUpStreamId, KAudioPriorityPhoneCall );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not set priority ( up )" ) );
+            return;
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nUpstream priority set" ) );
+            }
+
+        // Set DL priority
+        err = iMccInterface->SetPriority( iSessionId, iDownlinkId, iDownStreamId, KAudioPriorityPhoneCall );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not set priority ( down )" ) );
+            return;
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nDownstream priority set" ) );
+            }
+
+        // Prepare upstream
+        err = iMccInterface->PrepareStream( iSessionId, iUplinkId, iUpStreamId ); // UP
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not prepare ( up )" ) );
+            return;
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nUpstream prepared" ) );
+            }
+
+        // Prepare downstream
+        err = iMccInterface->PrepareStream( iSessionId, iDownlinkId, iDownStreamId ); // Down
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not prepare ( down )" ) );
+            return;
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nDownstream prepared\n" ) );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTest2p
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTest2p()
+    {
+    TUint iUpStreamId;
+    TUint sessionID;
+    TBool inputOK( ETrue );
+    
+    DisplayMsg( _L( "\nSessionId: " ) );
+    if ( GetIntegerFromConsole( sessionID ) )
+        {
+        inputOK = EFalse;
+        }
+    
+    DisplayMsg( _L( "\nStreamId to prepare: " ) );
+    if ( GetIntegerFromConsole( iUpStreamId ) )
+        {
+        inputOK = EFalse;        
+        }
+
+    if ( inputOK )
+        {
+        iMccInterface->SetPriority( sessionID, 0/*TBI*/, iUpStreamId, 100 );
+        iMccInterface->PrepareStream( sessionID, 0/*TBI*/, iUpStreamId );
+        }
+    else
+        {
+        DisplayMsg( _L( "Invalid input!" ) );
+        }        
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestStartStream
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestStartStream()
+    {
+    TBuf<20> line;
+    TUint input;
+    TChar inputChar;
+    TBool inputOK( ETrue );
+    TInt err( KErrNone );
+    TUint32 session( 0 );
+    TUint32 link( 0 );
+    TUint32 stream( 0 );
+    TBool startPaused( EFalse );
+    TBool enableRtcp( EFalse );
+    
+    DisplayMsg( _L( "\nStart which stream? 1 = up, 2 = down: " ) );
+    if ( GetIntegerFromConsole( input ) )
+        {
+        inputOK = EFalse;        
+        }
+    if ( !inputOK )
+        {
+        DisplayMsg( _L( "Invalid input!" ) );
+        }        
+    else if ( input == 1 )
+        {
+        session = iSessionId;
+        link = iUplinkId;
+        stream = iUpStreamId;
+        }
+    else if ( input == 2 )
+        {
+        session = iSessionId;
+        link = iDownlinkId;
+        stream = iDownStreamId;
+        }
+    else
+        {
+        DisplayMsg( _L( "Please enter 1 or 2" ) );
+        }
+
+    // Get pause mode
+    iConsole->Printf( _L( "\nStart stream paused? <y/n>: " ) );
+	GetStringFromConsole( line );
+	inputChar = line.Ptr()[0];
+
+	if ( inputChar == 'y' )
+	    {
+		startPaused = ETrue;
+	    }    
+
+    // Get RTCP mode
+    iConsole->Printf( _L( "\nEnable RTCP? <y/n>: " ) );
+	GetStringFromConsole( line );
+	inputChar = line.Ptr()[0];
+	if ( inputChar == 'y' )
+	    {
+		enableRtcp = ETrue;
+	    }    
+
+    // Start stream
+    iConsole->Printf( _L( "\nStarting stream..." ) );
+    err = iMccInterface->StartStream( session, link, stream,
+                                      startPaused, enableRtcp );
+    if ( err != KErrNone )
+        {
+        iConsole->Printf( _L( "\nCould not start stream, error %d" ), err );
+        }
+    else
+        {
+        iConsole->Printf( _L( "\nStream started" ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestPauseStreams
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestPauseStreams()
+    {    
+    TBuf<20> line;
+    TUint input;
+    TChar inputChar;
+    TBool enableRtcp( EFalse );
+    TBool inputOK( ETrue );
+    TInt err( KErrNone );
+    
+    DisplayMsg( _L( "\nPause which stream? 1 = up, 2 = down: " ) );
+    if ( GetIntegerFromConsole( input ) )
+        {
+        inputOK = EFalse;        
+        }
+
+    if ( !inputOK )
+        {
+        DisplayMsg( _L( "Invalid input!" ) );
+        return;
+        }        
+
+    // Get RTCP mode
+    iConsole->Printf( _L( "\nEnable RTCP? <y/n>: " ) );
+	GetStringFromConsole( line );
+	inputChar = line.Ptr()[0];
+	if ( inputChar == 'y' )
+	    {
+		enableRtcp = ETrue;
+	    }    
+
+    if ( input == 1 )
+        {
+        // Pause upstream
+        iConsole->Printf( _L( "\nPausing upstream..." ) );
+        err = iMccInterface->PauseStream( iSessionId, iUplinkId,
+                                          iUpStreamId, enableRtcp );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not pause upstream, error %d" ), err );
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nUpstream paused" ) );
+            }
+        }
+    else if ( input == 2 )
+        {
+        // Pause downstream
+        iConsole->Printf( _L( "\nPausing downstream..." ) );
+        err = iMccInterface->PauseStream( iSessionId, iDownlinkId,
+                                          iDownStreamId, enableRtcp );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not pause downstream, error %d" ), err );
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nDownstream paused" ) );
+            }
+        }
+    else
+        {
+        DisplayMsg( _L( "Please enter 1 or 2" ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestResumeStreams
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestResumeStreams()
+    {    
+    TBuf<20> line;
+    TUint input;
+    TBool inputOK( ETrue );
+    TChar inputChar;
+    TBool enableRtcp( EFalse );
+    TInt err( KErrNone );
+    
+    DisplayMsg( _L( "\nResume which stream? 1 = up, 2 = down: " ) );
+    if ( GetIntegerFromConsole( input ) )
+        {
+        inputOK = EFalse;        
+        }
+
+    if ( !inputOK )
+        {
+        DisplayMsg( _L( "Invalid input!" ) );
+        return;
+        }        
+
+    // Get RTCP mode
+    iConsole->Printf( _L( "\nEnable RTCP? <y/n>: " ) );
+	GetStringFromConsole( line );
+	inputChar = line.Ptr()[0];
+	if ( inputChar == 'y' )
+	    {
+		enableRtcp = ETrue;
+	    }    
+
+    if ( input == 1 )
+        {
+        // Resume upstream
+        iConsole->Printf( _L( "\nResuming upstream..." ) );
+        err = iMccInterface->ResumeStream( iSessionId, iUplinkId,
+                                           iUpStreamId, enableRtcp );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not resume upstream, error %d" ), err );
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nUpstream resumed" ) );
+            }
+        }
+    else if ( input == 2 )
+        {
+        // Resume downstream
+        iConsole->Printf( _L( "\nResuming downstream..." ) );
+        err = iMccInterface->ResumeStream( iSessionId, iDownlinkId,
+                                           iDownStreamId, enableRtcp );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not resume downstream, error %d" ), err );
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nDownstream resumed" ) );
+            }
+        }
+    else
+        {
+        DisplayMsg( _L( "Please enter 1 or 2" ) );
+        }
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestStopStream
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestStopStream()
+    {    
+    TUint input;
+    TBool inputOK( ETrue );
+    TInt err( KErrNone );
+    
+    DisplayMsg( _L( "\nStop which stream? 1 = up, 2 = down: " ) );
+    if ( GetIntegerFromConsole( input ) )
+        {
+        inputOK = EFalse;        
+        }
+
+    if ( !inputOK )
+        {
+        DisplayMsg( _L( "Invalid input!" ) );
+        }        
+    else if ( input == 1 )
+        {
+        // Stop upstream
+        iConsole->Printf( _L( "\nStopping upstream..." ) );
+        err = iMccInterface->StopStream( iSessionId, iUplinkId, iUpStreamId );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not stop upstream, error %d" ), err );
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nUpstream stopped" ) );
+            }
+        }
+    else if ( input == 2 )
+        {
+        // Stop downstream
+        iConsole->Printf( _L( "\nStopping downstream..." ) );
+        err = iMccInterface->StopStream( iSessionId, iDownlinkId, iDownStreamId );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not stop downstream, error %d" ), err );
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nDownstream stopped" ) );
+            }
+        }
+    else
+        {
+        DisplayMsg( _L( "Please enter 1 or 2" ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestDeleteStreams
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestDeleteStreams()
+    {
+    TUint input;
+    TBool inputOK( ETrue );
+    TInt err( KErrNone );
+    
+    DisplayMsg( _L( "\nDelete which stream? 1 = up, 2 = down: " ) );
+    if ( GetIntegerFromConsole( input ) )
+        {
+        inputOK = EFalse;        
+        }
+
+    if ( !inputOK )
+        {
+        DisplayMsg( _L( "Invalid input!" ) );
+        }        
+    else if ( input == 1 )
+        {
+        // Delete upstream
+        iConsole->Printf( _L( "\nDeleting upstream..." ) );
+        err = iMccInterface->DeleteStream( iSessionId, iUplinkId, iUpStreamId );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not delete upstream, error %d" ), err );
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nUpstream deleted" ) );
+            }
+
+        // Close link too
+        iConsole->Printf( _L( "\nClosing uplink..." ) );
+        err = iMccInterface->CloseLink( iSessionId, iUplinkId );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not close uplink, error %d" ), err );
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nUplink closed" ) );
+            }
+        }
+    else if ( input == 2 )
+        {
+        // Delete downstream
+        iConsole->Printf( _L( "\nDeleting downstream..." ) );
+        err = iMccInterface->DeleteStream( iSessionId, iDownlinkId, iDownStreamId );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not delete downstream, error %d" ), err );
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nDownstream deleted" ) );
+            }
+
+        // Close link too
+        iConsole->Printf( _L( "\nClosing downlink..." ) );
+        err = iMccInterface->CloseLink( iSessionId, iDownlinkId );
+        if ( err != KErrNone )
+            {
+            iConsole->Printf( _L( "\nCould not close downlink, error %d" ), err );
+            }
+        else
+            {
+            iConsole->Printf( _L( "\nDownlink closed" ) );
+            }
+        }
+    else
+        {
+        DisplayMsg( _L( "Please enter 1 or 2" ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestCloseSession
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestCloseSession()
+{    
+    TUint aSessionId;
+    iConsole->Printf( _L( "\nEnter SessionId: " ) );
+    TBuf<20> line;
+
+    GetStringFromConsole( line );
+    TLex lex( line );
+    lex.Val( aSessionId,EDecimal );
+
+    TInt err = iMccInterface->CloseSession( aSessionId );
+    if ( err == KErrNone )
+        {
+        iConsole->Printf( _L( "Session Closed.\n" ) );
+        }
+    else
+        {
+        iConsole->Printf( _L( "\nCould not close session, error %d" ), err );
+        }
+}    
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTest7
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTest7()
+{    
+    //TInt aBitrate = 12200;
+    TUint aVolume = 5;
+    TUint aGain = 4;
+    TInt aBalance = 0;
+
+    iConsole->Printf( _L( "\nEnter volume: " ) );
+    GetIntegerFromConsole( aVolume );
+    iMccInterface->SetVolume( aVolume );
+
+    iConsole->Printf( _L( "\nEnter gain: " ) );
+    GetIntegerFromConsole( aGain );
+
+    iMccInterface->SetGain( aGain ); 
+    iMccInterface->SetBalance( iSessionId, iUplinkId, iUpStreamId, aBalance,
+                               EMccAudioPlay );
+    iMccInterface->SetBalance( iSessionId, iDownlinkId, iDownStreamId, aBalance,
+                               EMccAudioPlay );
+    iConsole->Printf( _L( "Settings done.\n " ) );
+}    
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestGetCodecAndAudioSettings
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestGetCodecAndAudioSettings()
+    {
+    // get codec
+    TInt volume;
+    TInt maxvolume;
+    TInt aGain;
+    TInt aMGain;
+    CMccCodecInformation* codec( NULL );
+    TInt aUpBalance;
+    TInt aDownBalance;
+    TInt error;
+
+    iMccInterface->GetGain( aGain );
+    iMccInterface->MaxGain( iSessionId, iUplinkId, iUpStreamId, aMGain );
+    TRAP( error, codec = iMccInterface->GetCodecL( iSessionId, iUplinkId, iUpStreamId ) );
+    if ( error != KErrNone )
+        {
+        iConsole->Printf( _L( "Could not get codec, error %d\n" ), error );
+        }
+    iMccInterface->Volume( volume ); 
+    iMccInterface->MaxVolume( iSessionId, iDownlinkId, iDownStreamId, maxvolume );
+
+    iMccInterface->Balance( iSessionId, iUplinkId, iUpStreamId, aUpBalance, EMccAudioPlay );
+    iMccInterface->Balance( iSessionId, iDownlinkId, iDownStreamId, aDownBalance, EMccAudioPlay );
+
+    iConsole->Printf( _L( "Gain: %d MaxGain: %d Codec: %d Vol: %d MaxVol: %d uBal: %d dBal: %d\n" ),
+                      aGain, aMGain, codec->FourCC(), volume, maxvolume, aUpBalance, aDownBalance );
+    iConsole->Printf( _L( "Get done.\n" ) );
+    }    
+
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestDisplaySupportedCodecs
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestDisplaySupportedCodecs()
+    {
+    iConsole->Printf( _L( "Supported codecs: %d\n" ), iCodecArray.Count() );
+
+    for ( TInt i=0; i<iCodecArray.Count(); i++ ) 
+        {
+        iConsole->Printf( _L( "codec %d: br:%d 4cc:%d\n" ),
+                          i, iCodecArray[i]->Bitrate(), iCodecArray[i]->FourCC() );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunSetCodecSettings
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunSetCodecSettings()
+    {
+    iConsole->Printf( _L( "\nEnter PTime: " ) );
+    TUint iPTime;
+    GetIntegerFromConsole( iPTime );
+
+    iCodecArray[iCodecSelected]->SetPTime( iPTime );
+
+    iConsole->Printf( _L( "\nEnter MaxPTime: " ) );
+    TUint iMaxPTime;
+    GetIntegerFromConsole( iMaxPTime );
+
+    iCodecArray[iCodecSelected]->SetMaxPTime( iMaxPTime );
+
+    iConsole->Printf( _L( "\nSettings done" ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunSetFmtpAttr
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunSetFmtpAttr()
+    {
+    TBuf8<50> buf;
+    TInt err( KErrNone );
+
+    // First, try to set an invalid FMTP attribute string
+    _LIT8( KFmtpInvalid, "!PQOI;oOwiU=45;#Ur(%UT" );
+    buf.Append( KFmtpInvalid );
+    TRAP( err, iCodecArray[iCodecSelected]->SetFmtpAttrL( buf ) );
+    if ( err != KErrNone )
+        {
+        iConsole->Printf( _L( "\nCould not set invalid FMTP attribute, err %d" ), err );
+        }
+    else
+        {
+        iConsole->Printf( _L( "\nInvalid FMTP attribute set. (no error)" ) );
+        }
+
+    // Now make a valid one
+    _LIT8( KFmtpPayload, "%d " );
+    _LIT8( KFmtpOctetAlign, "octet-align=%d;" );
+    _LIT8( KFmtpModeSet, "mode-set=%d,%d, %d" );
+    
+    TInt payload( 5 );
+    TInt octetAlign( 1 );
+    TInt fmtpModeSet( 2 );
+    
+    // The string should look like this:
+    // "xx octet-align=0/1; mode-set=0-7;" (where xx is the payload type)
+
+    buf.Format( KFmtpPayload, payload );
+    buf.AppendFormat( KFmtpOctetAlign, octetAlign );
+    buf.AppendFormat( KFmtpModeSet, fmtpModeSet, 0, 5 );
+
+    TRAP( err, iCodecArray[iCodecSelected]->SetFmtpAttrL( buf ) );
+    if ( err != KErrNone )
+        {
+        iConsole->Printf( _L( "\nCould not set FMTP attribute, err %d" ), err );
+        }
+    else
+        {
+        iConsole->Printf( _L( "\nFMTP attribute set." ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::ToggleVAD
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::ToggleVAD()
+    {
+
+    if ( iCodecArray[iCodecSelected]->VAD() )
+        {
+        iCodecArray[iCodecSelected]->EnableVAD( EFalse );
+        iConsole->Printf( _L( "VAD: OFF\n" ) );
+        }
+    else
+        {
+        TInt err = iCodecArray[iCodecSelected]->EnableVAD( ETrue );
+        if ( err == KErrNotSupported ) 
+            iConsole->Printf( _L( "VAD: Not supported (in current codec)\n" ) );
+        else
+            iConsole->Printf( _L( "VAD: ON\n" ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::ChangeCodec
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::ChangeCodec()
+    {
+    TInt codecs = iCodecArray.Count();
+
+    if ( codecs == 0 )
+        return;
+
+    RDebug::Print( _L( "CodecArray size: %d" ), codecs );
+
+    iCodecSelected++;
+    
+    if ( iCodecSelected >= codecs )
+        {
+        iCodecSelected = 0;
+        }
+
+    if ( iCodecArray[iCodecSelected]->FourCC() == KMccFourCCIdAMRNB )
+        {
+        iConsole->Printf( _L( "Codec AMR-NB " ) );
+        iCodecArray[iCodecSelected]->SetPayloadType( 128 );
+        }
+
+    if ( iCodecArray[iCodecSelected]->FourCC() == KMccFourCCIdG711 )
+        {
+        if ( iCodecArray[iCodecSelected]->CodecMode() == EPCMU )
+            iConsole->Printf( _L( "Codec PCMU " ) );
+        if ( iCodecArray[iCodecSelected]->CodecMode() == EPCMA )
+            iConsole->Printf( _L( "Codec PCMA " ) );
+        }
+
+    if ( iCodecArray[iCodecSelected]->FourCC() == KMccFourCCIdG729 )
+        {
+        iConsole->Printf( _L( "Codec G.729 " ) );
+        }
+
+    if ( iCodecArray[iCodecSelected]->FourCC() == KMccFourCCIdILBC )
+        {
+        iConsole->Printf( _L( "Codec iLBC " ) );
+        }
+    
+    if ( iCodecArray[iCodecSelected]->FourCC() == KMccFourCCIdDTMF )
+        {
+        iConsole->Printf( _L( "Codec DTMF " ) );
+        }    
+        
+    iConsole->Printf( _L( "4CC: %d\n" ), iCodecArray[iCodecSelected]->FourCC() );
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::SetCodec
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::SetCodec()
+    {
+    iMccInterface->SetCodec( iSessionId, iUplinkId, iUpStreamId, iCodecArray[iCodecSelected] );
+    iMccInterface->SetCodec( iSessionId, iDownlinkId, iDownStreamId, iCodecArray[iCodecSelected] );
+    iConsole->Printf( _L( "Codec set to %d\n" ), iCodecArray[iCodecSelected]->FourCC() );
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::SetRemoteAddr
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::SetRemoteAddr()
+    {
+    TBuf<20> line;
+    TLex lex( line );
+    
+    iConsole->ClearScreen();
+    iConsole->Printf( _L( "\nEnter the Remote IP address " ) );
+    
+    GetStringFromConsole( line );
+
+    iRemoteAddr.Input( line );
+    
+    iConsole->Printf( _L( "\nEnter the Remote port: " ) );
+    TUint rport;
+    
+    GetStringFromConsole( line );
+    lex.Assign( line );
+    lex.Val( rport,EDecimal );
+
+    iRemoteAddr.SetPort( rport );
+
+    iConsole->Printf( _L( "Addr: %d , port %d\n" ), iRemoteAddr.Address(), rport );
+
+    // Get link type from user
+    iConsole->Printf( _L( "Enter link type ( u for up, d for down ):\n" ) );
+    GetStringFromConsole( line );
+    TChar inputChar = line.Ptr()[0];
+    if ( inputChar == 'u' ) 
+        {
+        iMccInterface->SetRemoteAddress( iSessionId, iUplinkId, iRemoteAddr );
+        }
+    else if ( inputChar == 'd' )
+        {
+        iMccInterface->SetRemoteAddress( iSessionId, iDownlinkId, iRemoteAddr );
+        }
+    else
+        {
+        iConsole->Printf( _L( "Invalid input\n" ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::RunTestCodecFactory
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::RunTestCodecFactory()
+{
+    RArray< CMccCodecInformation > codecArray;
+
+    CMccCodecInformationFactory* infoFactory = CMccCodecInformationFactory::NewL();
+    TBuf8<KMaxSdpNameLength> sdpName;
+
+    TInt i;
+    for ( i = 0; i < iCodecInformation.Count(); i++ )
+    {
+
+        sdpName = iCodecInformation[i]->SdpName();
+
+        CMccCodecInformation* tempInfo = NULL;
+
+        TRAPD( err1, tempInfo =  infoFactory->CreateCodecInformationL( sdpName ) );
+        if ( err1 ) 
+        {
+            tempInfo = NULL;    
+        }
+        else
+        {
+            codecArray.Append( *tempInfo );
+            delete tempInfo;
+        }
+    }
+
+    for ( i = 0; i < codecArray.Count(); i++ )
+        {
+        iCodecArray.Append( &codecArray[ i ] );
+        }
+    
+    codecArray.Close();
+
+    RDebug::Print( _L( "CodecArray size: %d" ), iCodecArray.Count() );
+
+    delete infoFactory;
+}
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::ToggleInactivityTimer
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::ToggleInactivityTimer()
+    {
+    TInt result( KErrNone );
+    TUint input;
+    TBool inputOK( ETrue );
+    TUint32 link( 0 );
+    TUint32 stream( 0 );
+
+    const TInt KInactivityTimeout( 8000000 );
+
+    DisplayMsg( _L( "\nTimer, which stream? 1 = up, 2 = down: " ) );
+    if ( GetIntegerFromConsole( input ) )
+        {
+        inputOK = EFalse;        
+        }
+
+    if ( !inputOK )
+        {
+        DisplayMsg( _L( "Invalid input!" ) );
+        }        
+    else if ( input == 1 )
+        {
+        link = iUplinkId;
+        stream = iUpStreamId;
+        }
+    else if ( input == 2 )
+        {
+        link = iDownlinkId;
+        stream = iDownStreamId;
+        }
+    else
+        {
+        DisplayMsg( _L( "Please enter 1 or 2" ) );
+        return;
+        }
+    if ( iInactivityTimerActive )
+        {
+        result = iMccInterface->StopInactivityTimer( iSessionId, link, stream );
+        if ( result == KErrNone )
+            {
+            iInactivityTimerActive = EFalse;
+            iConsole->Printf( _L( "Inactivity timer stopped\n" ) );
+            }
+        else
+            {
+            iConsole->Printf( _L( "Could not stop timer, error %d\n" ), result );
+            }
+        }
+    else
+        {
+        result = iMccInterface->StartInactivityTimer( iSessionId, link, stream,
+                                                      KInactivityTimeout );
+        if ( result == KErrNone )
+            {
+            iInactivityTimerActive = ETrue;
+            iConsole->Printf( _L( "Inactivity timer started\n" ) );
+            }
+        else
+            {
+            iConsole->Printf( _L( "Could not start timer, error %d\n" ), result );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::SendNonRtcpData
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::SendNonRtcpData()
+    {
+    TBuf8<50> data;
+    _LIT8( KData, "NonRtcpData #%d" );
+    data.Format( KData, iNumOfNonRtcpDataSent++ );
+    TInt result = iMccInterface->SendRTCPAnyData( iSessionId,
+                                                  iDownlinkId,
+                                                  iDownStreamId,
+                                                  data );
+    if ( result == KErrNone )
+        {
+        iConsole->Printf( _L( "Non-RTCP data sent\n" ) );
+        }
+    else
+        {
+        iConsole->Printf( _L( "Could not send data, error %d\n" ), result );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::MccMediaStarted
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::MccMediaStarted( TUint32 aSessionID, TUint32 aLinkId, TUint32 aStreamID, TUint32 aSinkSourceId )
+    {
+    RDebug::Print( _L( "CALLBACK: Stream Started: sess %u, link %u, stream %u, sinksource %u" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    iConsole->Printf( _L( "\nCALLBACK: Stream Started: sess %u, link %u, stream %u, sinksource %u\n" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::MccMediaStopped
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::MccMediaStopped( TUint32 aSessionID, TUint32 aLinkId, TUint32 aStreamID, TUint32 aSinkSourceId )
+    {
+    RDebug::Print( _L( "CALLBACK: Stream Stopped: sess %u, link %u, stream %u, sinksource %u" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    iConsole->Printf( _L( "\nCALLBACK: Stream Stopped: sess %u, link %u, stream %u, sinksource %u\n" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::MccMediaPaused
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::MccMediaPaused( TUint32 aSessionID, TUint32 aLinkId, TUint32 aStreamID, TUint32 aSinkSourceId )
+    {
+    RDebug::Print( _L( "CALLBACK: Stream Paused: sess %u, link %u, stream %u, sinksource %u" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    iConsole->Printf( _L( "\nCALLBACK: Stream Paused: sess %u, link %u, stream %u, sinksource %u\n" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::SMccMediaResumed
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::MccMediaResumed( TUint32 aSessionID, TUint32 aLinkId, TUint32 aStreamID, TUint32 aSinkSourceId )
+    {
+    RDebug::Print( _L( "CALLBACK: Stream Resumed: sess %u, link %u, stream %u, sinksource %u" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    iConsole->Printf( _L( "\nCALLBACK: Stream Resumed: sess %u, link %u, stream %u, sinksource %u\n" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::MccMediaPrepared
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::MccMediaPrepared( TUint32 aSessionID, TUint32 aLinkId, TUint32 aStreamID, TUint32 aSinkSourceId )
+    {
+    RDebug::Print( _L( "CALLBACK: Stream Prepared: sess %u, link %u, stream %u, sinksource %u" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    iConsole->Printf( _L( "\nCALLBACK: Stream Prepared: sess %u, link %u, stream %u, sinksource %u" ),
+                      aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::MccMediaInactive
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::MccMediaInactive( TUint32 aSessionID, TUint32 aLinkId, TUint32 aStreamID, TUint32 aSinkSourceId )
+    {
+    RDebug::Print( _L( "CALLBACK: Stream Inactive: sess %u, link %u, stream %u, sinksource %u" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    iConsole->Printf( _L( "\nCALLBACK: Stream Inactive: sess %u, link %u, stream %u, sinksource %u\n" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    iInactivityTimerActive = EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::MccMediaActive
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::MccMediaActive( TUint32 aSessionID, TUint32 aLinkId, TUint32 aStreamID, TUint32 aSinkSourceId )
+    {
+    RDebug::Print( _L( "CALLBACK: Stream active: sess %u, link %u, stream %u, sinksource %u" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    iConsole->Printf( _L( "\nCALLBACK: Stream active: sess %u, link %u, stream %u, sinksource %u\n" ),
+                   aSessionID, aLinkId, aStreamID, aSinkSourceId );
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::MccEventReceived
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::MccEventReceived( const TMccEvent& aEvent )
+    {
+    if ( aEvent.iEventCategory == KMccEventCategoryDtmf )
+        {
+        TMccDtmfEventDataPackage package;
+        package.Copy( aEvent.iEventData  );  
+        const TMccDtmfEventData& event = package();
+        
+        switch ( event.iDtmfEventType )
+            {
+            case KMccDtmfManualStart:
+                DisplayMsg( _L( "Manual start event" ) );
+                break;
+            case KMccDtmfManualStop:
+                DisplayMsg( _L( "Manual stop event" ) );
+                break;
+            case KMccDtmfManualAbort:
+                DisplayMsg( _L( "Manual abort event" ) );
+                break;
+            case KMccDtmfSequenceStart:
+                DisplayMsg( _L( "Seq start event" ) );
+                break;
+            case KMccDtmfSequenceStop:
+                DisplayMsg( _L( "Seq stop event" ) );
+                break;
+            case KMccDtmfSequenceAbort:
+                DisplayMsg( _L( "Seq abort event" ) );
+                break;
+            case KMccDtmfStopInDtmfString:
+                DisplayMsg( _L( "Stop in string" ) );
+                break;
+            }
+        }
+    else if ( aEvent.iEventCategory == KMccEventCategoryRtcp )
+        {
+        TMccRtcpEventDataPackage package;
+        package.Copy( aEvent.iEventData  );  
+        const TMccRtcpEventData& event = package();
+
+        switch ( event.iRtcpPacketType )
+            {
+            case KRtcpSdesPacket:
+                RDebug::Print( _L( "CTestAppConsole::MediaSignalReceived RTCP SDES" ) );
+                if ( !iSdesReported )
+                    {
+                    iConsole->Printf( _L( "MediaSignalReceived RTCP SDES" ) );
+                    iSdesReported = ETrue;
+                    }
+                break;
+
+            case KRtcpByePacket:
+                {
+                RDebug::Print( _L( "CTestAppConsole::MediaSignalReceived RTCP BYE" ) );
+                iConsole->Printf( _L( "MediaSignalReceived RTCP BYE" ) );
+                }
+                break;
+
+            case KRtcpAppPacket:
+                {
+                RDebug::Print( _L( "CTestAppConsole::MediaSignalReceived RTCP APP" ) );
+                iConsole->Printf( _L( "MediaSignalReceived RTCP APP" ) );
+
+                TPckgBuf<TRtcpApp> appPackage;
+                appPackage.Copy( event.iRtcpPacketData );
+                TRtcpApp app = appPackage();
+                }
+                break;
+
+            case KRtcpSrPacket:
+                RDebug::Print( _L( "CTestAppConsole::MediaSignalReceived RTCP SR" ) );
+                if ( !iSrReported )
+                    {
+                    iConsole->Printf( _L( "MediaSignalReceived RTCP SR" ) );
+                    iSrReported = ETrue;
+                    }
+                break;
+
+            case KRtcpRrPacket:
+                RDebug::Print( _L( "CTestAppConsole::MediaSignalReceived RTCP RR" ) );
+                if ( !iRrReported )
+                    {
+                    iConsole->Printf( _L( "MediaSignalReceived RTCP RR" ) );
+                    iRrReported = ETrue;
+                    }
+                break;
+
+            case KRtcpPacketUndefined:
+                {
+                RDebug::Print( _L( "CTestAppConsole::MediaSignalReceived Non-RTCP:" ) );
+                iConsole->Printf( _L( "MediaSignalReceived Data" ) );
+
+                // Convert to 16-bit text and print
+                HBufC* undefBuf = HBufC::NewLC(  event.iRtcpPacketData.Length() );
+                undefBuf->Des().Copy( event.iRtcpPacketData );
+                RDebug::Print( _L( "%s" ), undefBuf->Des() );
+                CleanupStack::PopAndDestroy( undefBuf );
+                }
+                break;
+
+            default:
+                RDebug::Print( _L( "CTestAppConsole::MediaSignalReceived unknown" ) );
+                break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::MccCtrlError
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::MccCtrlError( TInt aError )
+    {
+    iConsole->Printf( _L( "Mcc error: %d\n" ), aError );
+    RDebug::Print( _L( "Mcc Error: %d" ), aError );
+}
+
+// ---------------------------------------------------------------------------
+// CTestAppConsole::MccCtrlError
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::MccCtrlError( TInt aError, TUint32 aSessionId, TUint32 aLinkId, TUint32 aStreamId, TUint32 aSinkSourceId )
+    {
+    iConsole->Printf( _L( "Mcc error: %d Session: %u, link %u, stream %u, sinksource %u\n" ),
+                      aError, aSessionId, aLinkId, aStreamId, aSinkSourceId );
+    RDebug::Print( _L( "Mcc Error: %d Session: %u, link %u, stream %u, sinksource %u" ),
+                      aError, aSessionId, aLinkId, aStreamId, aSinkSourceId  );
+}
+
+// -----------------------------------------------------------------------------
+// CTestAppConsole::GetIntegerFromConsole
+// Reads one integer from console to the parameter.
+// -----------------------------------------------------------------------------
+// 
+TInt CTestAppConsole::GetIntegerFromConsole( TInt& aVal )
+    {
+    TBuf<20> line;
+    GetStringFromConsole( line );
+
+    TLex lex( line );
+    TInt err = lex.Val( aVal );
+
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CTestAppConsole::GetIntegerFromConsole
+// Reads one integer from console to the parameter.
+// -----------------------------------------------------------------------------
+// 
+TInt CTestAppConsole::GetIntegerFromConsole( TUint& aVal )
+    {
+    TBuf<20> line;
+    GetStringFromConsole( line );
+
+    TLex lex( line );
+    TInt err = lex.Val( aVal );
+    
+    return err;
+    }
+        
+// ---------------------------------------------------------------------------
+// CTestAppConsole::ProcessDTMFInput
+// 
+// ---------------------------------------------------------------------------
+//
+void CTestAppConsole::ProcessDTMFInput()
+    {
+    TInt choice;
+    TInt err( KErrNone );
+    GetIntegerFromConsole( choice );
+
+    TMccEvent event;
+    event.iSessionId = iDTMFSessionID;
+    event.iStreamId = iDTMFStreamID;
+    
+    TMccDtmfEventData eventData;
+    
+    switch ( choice )
+        {
+        case 1:
+            TUint input;
+            DisplayMsg( _L( "Digit to send?" ) );
+            GetIntegerFromConsole( input );
+            eventData.iDtmfEventType = EMccDtmfSigStartTone;
+            eventData.iDtmfString.Append( TChar( input ) );
+            event.iEventData.Copy( TMccDtmfEventDataPackage( eventData ) );
+            
+            TRAP( err, iMccInterface->SendMediaSignalL( event ) );
+            if ( err == KErrNone )
+                {
+                DisplayMsg( _L( "Sending started" ) );
+                }
+            else
+                {
+                iConsole->Printf( _L( "Could not send, err %d" ), err );
+                }
+            break;
+
+        case 2:
+            eventData.iDtmfEventType = EMccDtmfSigStopTone;
+            event.iEventData.Copy( TMccDtmfEventDataPackage( eventData ) );
+            
+            TRAP( err, iMccInterface->SendMediaSignalL( event ) );
+            if ( err == KErrNone )
+                {
+                DisplayMsg( _L( "Sending stopped" ) );
+                }
+            else
+                {
+                iConsole->Printf( _L( "Could not stop, err %d" ), err );
+                }
+            break;
+
+        case 3:
+            DisplayMsg( _L( "String to send?" ) );
+            TBuf<KMccMaxDtmfStringLength> dtmfString;
+            GetStringFromConsole( dtmfString );
+            eventData.iDtmfString.Copy( dtmfString );
+            eventData.iDtmfEventType = EMccDtmfSigSendString;
+            event.iEventData.Copy( TMccDtmfEventDataPackage( eventData ) );
+            TRAP( err, iMccInterface->SendMediaSignalL( event ) );
+            if ( err == KErrNone )
+                {
+                DisplayMsg( _L( "Sending started" ) );
+                }
+            else
+                {
+                iConsole->Printf( _L( "Could not start, err %d" ), err );
+                }
+            break;
+
+        case 4:
+            eventData.iDtmfEventType = EMccDtmfSigContinueSending;
+            eventData.iContinue = ETrue;
+            event.iEventData.Copy( TMccDtmfEventDataPackage( eventData ) );
+            TRAP( err, iMccInterface->SendMediaSignalL( event ) );
+            if ( err == KErrNone )
+                {
+                DisplayMsg( _L( "Sending continues" ) );
+                }
+            else
+                {
+                iConsole->Printf( _L( "Could not continue, err %d" ), err );
+                }
+            break;
+
+        case 9:
+            iCurMenu = EMainMenu;
+            DisplayConsoleMenu( KTxtMainInstructions );
+            break;
+
+        default:
+            _LIT( KTxtWrongOption, "Wrong Option!" );
+            DisplayMsg( KTxtWrongOption );
+            break;
+        }
+
+    // Ready to get next input option.
+    DoRead();
+    }
+
+// -----------------------------------------------------------------------------
+// CTestAppConsole::ProcessCodecInput
+// 
+// -----------------------------------------------------------------------------
+// 
+void CTestAppConsole::ProcessCodecInput()
+    {
+    TInt choice;
+    GetIntegerFromConsole( choice );
+    
+    switch ( choice )
+        {
+        case 1:
+            RunTestDisplaySupportedCodecs();
+            break;
+        case 2:
+            ChangeCodec();
+            break;
+        case 3:
+            RunSetCodecSettings();
+            break;
+        case 4:
+            ToggleVAD();
+            break;
+        case 5:
+            SetCodec();
+            break;
+        case 6:
+            RunSetFmtpAttr();
+            break;
+        case 9:
+            iCurMenu = EMainMenu;
+            DisplayConsoleMenu( KTxtMainInstructions );
+            break;
+        default:
+            _LIT( KTxtWrongOption, "Wrong Option!" );
+            DisplayMsg( KTxtWrongOption );
+            break;
+        }
+
+    // Ready to get next input option.
+    DoRead();
+    }