multimediacommscontroller/tsrc/TestConsoles/JitterbufferTestConsole/Src/Testconsole.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/tsrc/TestConsoles/JitterbufferTestConsole/Src/Testconsole.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,549 @@
+/*
+* 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 <e32math.h>
+#include "TestConsole.h"
+#include "MccInternalCodecs.h"
+
+
+_LIT(KTxtMainInstructions, "Please select one option:\n"
+ L"s. Setup\n"
+ L"1. FillBuffer\n"
+ L"2. EmptyBuffer\n"
+ L"r. Set SeqNum\n"
+ L"\n"
+
+ L"9. Quit\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),
+	MDataSink( KTestApp ), MDataSource( KTestApp )
+    {
+	
+	CActiveScheduler::Add(this);
+    }
+
+//*******************************************************************************
+// Method      : CTestAppConsole::ConstructL()
+// Purpose     : 
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+void CTestAppConsole::ConstructL()
+    {
+    _LIT(KTxtTitle, " MCCJitterBuffer Test ");
+	iConsole = Console::NewL(KTxtTitle, TSize(KConsFullScreen, KConsFullScreen));
+	DisplayConsoleMenu(KTxtMainInstructions);
+
+	//__KHEAP_MARK;
+	//iMccInterface = CMCCInterface::NewL(*this);
+	iJitterBuffer = CMccJitterBuffer::NewL();
+
+	iSeqNum = 1;
+	//iCodecArray.Reset();
+    //iMccInterface->GetCapabilities(iCodecArray); // RPointerArray<TFourCC>& aCodecs
+
+    }
+
+//*******************************************************************************
+// Method      : CTestAppConsole::~CTestAppConsole()
+// Purpose     : Destructor
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+CTestAppConsole::~CTestAppConsole()
+    {	
+    Cancel(); // any outstanding request
+   
+	if (iConsole)
+	    {
+		delete iConsole;
+		}
+		
+	delete iInstruct;
+//			iCodecArray.Close();
+	//iMccInterface->Close();	
+	delete iJitterBuffer;
+
+
+	//__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.
+   ProcessMainInput();
+	    //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()
+	{
+	//TChar inputChar = iConsole->KeyCode();
+    TDes* line = new TBuf<80>;
+
+	GetStringFromConsole(*line);
+	
+	TBuf<80> line2 = *line;
+	delete line;
+	
+	if ( line2.Length() > 0 )
+	{
+		TChar inputChar = line2[0];
+		
+		switch(inputChar)
+			{
+			case 's':	
+				RunTestSetupJitterbuffer();
+				break;
+			case '1':
+				RunTestFillBuffer();
+				break;
+			case '2':
+				RunTestEmptyBuffer();
+				break;
+			case 'r':
+				SetSeqNum();
+				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::GenerateRandomSourceData
+// Fills parameter buffer with random data.
+// -----------------------------------------------------------------------------
+//    
+void CTestAppConsole::GenerateRandomSourceData( TDes8& aToBuffer )
+    {
+    aToBuffer.Zero();
+    TInt length( aToBuffer.MaxSize() );
+    for ( TInt i = 0; i < length; i++ )
+        {
+        TUint8 byte = static_cast<TUint8>( Math::Random() );
+        aToBuffer.Append( byte );    
+        }
+    }
+
+void CTestAppConsole::PrintBuffer( TDes8& aPayload )
+{
+	for ( TInt i = 0; i < /*3 */aPayload.Length(); i++ )
+	{
+		RDebug::Print(_L("buf[%d] = [%d]"), i, aPayload[i]);
+	}
+}
+
+void CTestAppConsole::SetSeqNum()
+{
+    TDes* line = new TBuf<80>;
+
+	iConsole->Printf(_L("\nEnter Sequence Number: "));
+	TUint aSeqNum;
+	GetStringFromConsole(*line);
+	TLex lex(*line);
+	lex.Val(aSeqNum,EDecimal);
+
+	iSeqNum = TInt(aSeqNum);
+	delete line;
+
+}
+
+//*******************************************************************************
+// Method      : CTestAppConsole::RunTest1()
+// Purpose     : 
+// Parameters  : 
+// Return Value: 
+//*******************************************************************************
+void CTestAppConsole::RunTestSetupJitterbuffer()
+{
+
+	iCodec = KMccFourCCIdAMRNB;
+
+    TDes* line = new TBuf<80>;
+
+	iConsole->Printf(_L("\nEnter Initial Size (ms): "));
+	TUint aInitSize;
+	GetStringFromConsole(*line);
+	TLex lex(*line);
+	lex.Val(aInitSize,EDecimal);
+
+	//iSeqNum = TInt(aSeqNum);
+	delete line;
+
+	iJitterBuffer->AddDataSinkL( this );
+	
+	TMccCodecInfo info;
+	info.iFourCC = iCodec;
+	info.iPtime = 40;
+	info.iBitrate = 12200;
+
+	iJitterBuffer->SetupL( aInitSize, 5, info );
+
+
+}
+
+void CTestAppConsole::RunTestFillBuffer()
+    {
+
+	CMMFDataBuffer* iFrameBuffer = CMMFDataBuffer::NewL( 320 );
+	TMediaId                iMediaId;
+	iMediaId = KUidMediaTypeAudio;
+	iJitterBuffer->FillBufferL( iFrameBuffer, this, iMediaId );
+
+	if ( iFrameBuffer->Data().Length() > 0 )
+		PrintBuffer( static_cast<TDes8&>( iFrameBuffer->Data() ) );
+
+	delete iFrameBuffer;
+    };
+
+void CTestAppConsole::RunTestEmptyBuffer()
+    {
+
+	TInt iFrameSize;
+
+	if ( KMCCFourCCIdAMRNB == iCodec )
+		iFrameSize = 32;
+	else if ( KMCCFourCCIdG711 == iCodec )
+		iFrameSize = 162;
+
+	CMMFDataBuffer* iFrameBuffer = CMMFDataBuffer::NewL( iFrameSize );
+	TMediaId                iMediaId;
+	iMediaId = KUidMediaTypeAudio;
+
+	GenerateRandomSourceData( static_cast<TDes8&>( iFrameBuffer->Data() ) );
+
+	iFrameBuffer->SetFrameNumber( iSeqNum );
+
+	iJitterBuffer->EmptyBufferL( iFrameBuffer, this, iMediaId );
+
+	//PrintBuffer( static_cast<TDes8&>( iFrameBuffer->Data() ) );
+	
+	delete iFrameBuffer;
+	iSeqNum++;
+
+	if ( iSeqNum == 32 )
+		iSeqNum = 1;
+    };
+
+
+
+TFourCC CTestAppConsole::SinkDataTypeCode( TMediaId /*aMediaId*/ )
+	{
+	//TFourCC iFourCC;
+	return NULL;//iFourCC;
+	}	
+
+// -----------------------------------------------------------------------------
+// CMCCJitterBuffer::CanCreateSinkBuffer
+// From MDataSink
+// -----------------------------------------------------------------------------
+//
+TBool CTestAppConsole::CanCreateSinkBuffer()
+	{
+    // CMCCJitterBuffer can't create buffers
+	return EFalse;
+	}
+// -----------------------------------------------------------------------------
+// CMCCJitterBuffer::CreateSinkBufferL
+// From MDataSink
+// -----------------------------------------------------------------------------
+//
+CMMFBuffer* CTestAppConsole::CreateSinkBufferL( TMediaId /*aMediaId*/, TBool& /*aReference*/ )
+	{
+	return CMMFDataBuffer::NewL( 162 );
+	}
+
+// -----------------------------------------------------------------------------
+// CMCCJitterBuffer::EmptyBufferL
+// From MDataSink
+// -----------------------------------------------------------------------------
+//
+void CTestAppConsole::EmptyBufferL( CMMFBuffer* aBuffer, 
+									 MDataSource* aSupplier, 
+									 TMediaId /*aMediaId*/)
+	{
+	RDebug::Print(_L("CTestAppConsole::EmptyBufferL"));
+	if ( static_cast<CMMFDataBuffer*>(aBuffer)->Data().Length() > 0 )
+		PrintBuffer( static_cast<TDes8&>( static_cast<CMMFDataBuffer*>(aBuffer)->Data() ) );
+
+	}	
+	
+void CTestAppConsole::BufferFilledL( CMMFBuffer* aBuffer )
+{
+	RDebug::Print(_L("CTestAppConsole::BufferFilledL"));
+	if ( static_cast<CMMFDataBuffer*>(aBuffer)->Data().Length() > 0 )
+		PrintBuffer( static_cast<TDes8&>( static_cast<CMMFDataBuffer*>(aBuffer)->Data() ) );
+
+}
+// -----------------------------------------------------------------------------
+// CMCCJitterBuffer::ConstructSinkL
+// From MDataSink
+// -----------------------------------------------------------------------------
+//
+void CTestAppConsole::ConstructSinkL( const TDesC8& /*aInitData*/ )
+	{
+	
+	}
+
+// -----------------------------------------------------------------------------
+// CMCCJitterBuffer::SetSourceDataTypeCode
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CTestAppConsole::SetSourceDataTypeCode( TFourCC /*aCodec*/, TMediaId /*aMedia*/ )
+	{
+	return KErrNone;	
+	}
+
+// -----------------------------------------------------------------------------
+// CMCCJitterBuffer::SourceDataTypeCode
+// From MDataSource
+// -----------------------------------------------------------------------------
+//
+TFourCC CTestAppConsole::SourceDataTypeCode( TMediaId /*aMediaId*/ )
+	{
+	return NULL;
+	}
+
+// -----------------------------------------------------------------------------
+// CMCCJitterBuffer::FillBufferL
+// From MDataSource
+// -----------------------------------------------------------------------------
+//
+void CTestAppConsole::FillBufferL( CMMFBuffer* aBuffer,
+                      MDataSink* aConsumer,
+                      TMediaId /*aMediaId*/ )
+    {
+
+}
+
+void CTestAppConsole::BufferEmptiedL( CMMFBuffer* aBuffer )
+{
+	RDebug::Print(_L("CTestAppConsole::BufferEmptiedL"));
+}
+
+	
+// -----------------------------------------------------------------------------
+// CMCCJitterBuffer::CreateSourceBufferL
+// From MDataSource
+// -----------------------------------------------------------------------------
+//
+CMMFBuffer* CTestAppConsole::CreateSourceBufferL(TMediaId /*aMediaId*/, TBool &/*aReference*/)
+	{
+    // CMCCJitterBuffer can't create buffers
+    User::Leave( KErrNotSupported );
+	return NULL;
+	}			  
+
+// -----------------------------------------------------------------------------
+// CMCCJitterBuffer::ConstructSourceL
+// From MDataSource
+// -----------------------------------------------------------------------------
+//
+void CTestAppConsole::ConstructSourceL( const TDesC8& /*aInitData*/ )
+	{	
+	
+	}		
+	
+// -----------------------------------------------------------------------------
+// CMCCJitterBuffer::CanCreateSourceBuffer
+// From MDataSource
+// -----------------------------------------------------------------------------
+//
+TBool CTestAppConsole::CanCreateSourceBuffer()
+	{
+    // CMCCJitterBuffer can't create buffers
+	return EFalse;
+	}
+