diff -r 000000000000 -r 1bce908db942 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 +#include +#include +#include +#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& 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( 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( 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( iFrameBuffer->Data() ) ); + + iFrameBuffer->SetFrameNumber( iSeqNum ); + + iJitterBuffer->EmptyBufferL( iFrameBuffer, this, iMediaId ); + + //PrintBuffer( static_cast( 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(aBuffer)->Data().Length() > 0 ) + PrintBuffer( static_cast( static_cast(aBuffer)->Data() ) ); + + } + +void CTestAppConsole::BufferFilledL( CMMFBuffer* aBuffer ) +{ + RDebug::Print(_L("CTestAppConsole::BufferFilledL")); + if ( static_cast(aBuffer)->Data().Length() > 0 ) + PrintBuffer( static_cast( static_cast(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; + } +