multimediacommscontroller/tsrc/TestConsoles/JitterbufferTestConsole/Src/Testconsole.cpp
--- /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;
+ }
+