/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <cctype>
#include <iostream>
#include <ostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "APITest.h"
#include "common_types.h"
#include "engine_configurations.h"
#include "event_wrapper.h"
#include "gtest/gtest.h"
#include "thread_wrapper.h"
#include "tick_util.h"
#include "testsupport/fileutils.h"
#include "trace.h"
#include "utility.h"

namespace webrtc {

#define TEST_DURATION_SEC 600

#define NUMBER_OF_SENDER_TESTS 6

#define MAX_FILE_NAME_LENGTH_BYTE 500
#define CHECK_THREAD_NULLITY(myThread, S)                                      \
    if(myThread != NULL)                                                       \
    {                                                                          \
        unsigned int i;                                                        \
        (myThread)->Start(i);                                                  \
    }                                                                          \
    else                                                                       \
    {                                                                          \
      ADD_FAILURE() << S;                                                      \
    }


void
APITest::Wait(WebRtc_UWord32 waitLengthMs)
{
    if(_randomTest)
    {
        return;
    }
    else
    {
        EventWrapper* myEvent = EventWrapper::Create();
        myEvent->Wait(waitLengthMs);
        delete myEvent;
        return;
    }
}



APITest::APITest():
_acmA(NULL),
_acmB(NULL),
_channel_A2B(NULL),
_channel_B2A(NULL),
_writeToFile(true),
_pullEventA(NULL),
_pushEventA(NULL),
_processEventA(NULL),
_apiEventA(NULL),
_pullEventB(NULL),
_pushEventB(NULL),
_processEventB(NULL),
_apiEventB(NULL),
_codecCntrA(0),
_codecCntrB(0),
_testCntrA(1),
_testCntrB(1),
_thereIsEncoderA(false),
_thereIsEncoderB(false),
_thereIsDecoderA(false),
_thereIsDecoderB(false),
_sendVADA(false),
_sendDTXA(false),
_sendVADModeA(VADNormal),
_sendVADB(false),
_sendDTXB(false),
_sendVADModeB(VADNormal),
_minDelayA(0),
_minDelayB(0),
_dotPositionA(0),
_dotMoveDirectionA(1),
_dotPositionB(39),
_dotMoveDirectionB(-1),
_dtmfCallback(NULL),
_vadCallbackA(NULL),
_vadCallbackB(NULL),
_apiTestRWLock(*RWLockWrapper::CreateRWLock()),
_randomTest(false),
_testNumA(0),
_testNumB(1)
{
    int n;
    for( n = 0; n < 32; n++)
    {
        _payloadUsed[n] = false;
    }

    for(n = 0; n < 3; n++)
    {
        _receiveVADActivityA[n] = 0;
        _receiveVADActivityB[n] = 0;
    }
    
    _movingDot[40] = '\0';

    for(int n = 0; n <40; n++)
    {
        _movingDot[n]  = ' ';
    }
}

APITest::~APITest()
{
    DESTROY_ACM(_acmA);
    DESTROY_ACM(_acmB);

    DELETE_POINTER(_channel_A2B);
    DELETE_POINTER(_channel_B2A);

    DELETE_POINTER(_pushEventA);
    DELETE_POINTER(_pullEventA);
    DELETE_POINTER(_processEventA);
    DELETE_POINTER(_apiEventA);

    DELETE_POINTER(_pushEventB);
    DELETE_POINTER(_pullEventB);
    DELETE_POINTER(_processEventB);
    DELETE_POINTER(_apiEventB);

    _inFileA.Close();
    _outFileA.Close();

    _inFileB.Close();
    _outFileB.Close();

    DELETE_POINTER(_dtmfCallback);
    DELETE_POINTER(_vadCallbackA);
    DELETE_POINTER(_vadCallbackB);

    delete &_apiTestRWLock;
}



//WebRtc_Word16
//APITest::SetInFile(char* fileName, WebRtc_UWord16 frequencyHz)
//{
//    return _inFile.Open(fileName, frequencyHz, "rb");
//}
//
//WebRtc_Word16
//APITest::SetOutFile(char* fileName, WebRtc_UWord16 frequencyHz)
//{
//    return _outFile.Open(fileName, frequencyHz, "wb");
//}

WebRtc_Word16 
APITest::SetUp()
{
    _acmA = AudioCodingModule::Create(1);
    _acmB = AudioCodingModule::Create(2);

    CodecInst dummyCodec;
    int lastPayloadType = 0;

    WebRtc_Word16 numCodecs = _acmA->NumberOfCodecs();
    for(WebRtc_UWord8 n = 0; n < numCodecs; n++)
    {
        AudioCodingModule::Codec(n, dummyCodec);
        if((STR_CASE_CMP(dummyCodec.plname, "CN") == 0) &&
            (dummyCodec.plfreq == 32000))
        {
            continue;
        }

        printf("Register Receive Codec %s  ", dummyCodec.plname);

        if((n != 0) && !FixedPayloadTypeCodec(dummyCodec.plname))
        {
            // Check registration with an already occupied payload type
            int currentPayloadType = dummyCodec.pltype;
            dummyCodec.pltype = 97; //lastPayloadType;
            CHECK_ERROR(_acmB->RegisterReceiveCodec(dummyCodec));
            dummyCodec.pltype = currentPayloadType;
        }

        if((n < numCodecs - 1) && !FixedPayloadTypeCodec(dummyCodec.plname))
        {
            // test if re-registration works;
            CodecInst nextCodec;
            int currentPayloadType = dummyCodec.pltype;
            AudioCodingModule::Codec(n + 1, nextCodec);
            dummyCodec.pltype = nextCodec.pltype;
            if(!FixedPayloadTypeCodec(nextCodec.plname))
            {
                _acmB->RegisterReceiveCodec(dummyCodec);
            }
            dummyCodec.pltype = currentPayloadType;
        }

        if((n < numCodecs - 1) && !FixedPayloadTypeCodec(dummyCodec.plname))
        {
            // test if un-registration works;
            CodecInst nextCodec;
            AudioCodingModule::Codec(n + 1, nextCodec);
            nextCodec.pltype = dummyCodec.pltype;
            if(!FixedPayloadTypeCodec(nextCodec.plname))
            {
                CHECK_ERROR_MT(_acmA->RegisterReceiveCodec(nextCodec));
                CHECK_ERROR_MT(_acmA->UnregisterReceiveCodec(nextCodec.pltype));
            }
        }


        CHECK_ERROR_MT(_acmA->RegisterReceiveCodec(dummyCodec));
        printf("   side A done!");
        CHECK_ERROR_MT(_acmB->RegisterReceiveCodec(dummyCodec));
        printf("   side B done!\n");

        if(!strcmp(dummyCodec.plname, "CN"))
        {
            CHECK_ERROR_MT(_acmA->RegisterSendCodec(dummyCodec));
            CHECK_ERROR_MT(_acmB->RegisterSendCodec(dummyCodec));
        }
        lastPayloadType = dummyCodec.pltype;
        if((lastPayloadType >= 96) && (lastPayloadType <= 127))
        {
            _payloadUsed[lastPayloadType - 96] = true;
        }
    }
    _thereIsDecoderA = true;
    _thereIsDecoderB = true;

    // Register Send Codec
    AudioCodingModule::Codec((WebRtc_UWord8)_codecCntrA, dummyCodec);
    CHECK_ERROR_MT(_acmA->RegisterSendCodec(dummyCodec));
    _thereIsEncoderA = true;
    //
    AudioCodingModule::Codec((WebRtc_UWord8)_codecCntrB, dummyCodec);
    CHECK_ERROR_MT(_acmB->RegisterSendCodec(dummyCodec));
    _thereIsEncoderB = true;

    char fileName[500];
    WebRtc_UWord16 frequencyHz;
    
    printf("\n\nAPI Test\n");
    printf("========\n");
    printf("Hit enter to accept the default values indicated in []\n\n");

    //--- Input A
    strcpy(fileName, "./data/audio_coding/testfile32kHz.pcm");
    frequencyHz = 32000;
    printf("Enter input file at side A [%s]: ", fileName);
    PCMFile::ChooseFile(fileName, 499, &frequencyHz);
    _inFileA.Open(fileName, frequencyHz, "rb", true);

    //--- Output A
    std::string outputFileA = webrtc::test::OutputPath() + "outA.pcm";
    strcpy(fileName, outputFileA.c_str());
    printf("Enter output file at side A [%s]: ", fileName);
    PCMFile::ChooseFile(fileName, 499, &frequencyHz);
    _outFileA.Open(fileName, frequencyHz, "wb");

    //--- Input B
    strcpy(fileName, "./data/audio_coding/testfile32kHz.pcm");
    printf("\n\nEnter input file at side B [%s]: ", fileName);
    PCMFile::ChooseFile(fileName, 499, &frequencyHz);
    _inFileB.Open(fileName, frequencyHz, "rb", true);

    //--- Output B
    std::string outputFileB = webrtc::test::OutputPath() + "outB.pcm";
    strcpy(fileName, outputFileB.c_str());
    printf("Enter output file at side B [%s]: ", fileName);
    PCMFile::ChooseFile(fileName, 499, &frequencyHz);
    _outFileB.Open(fileName, frequencyHz, "wb");

    //--- Set A-to-B channel
    _channel_A2B = new Channel(2);
    CHECK_ERROR_MT(_acmA->RegisterTransportCallback(_channel_A2B));
    _channel_A2B->RegisterReceiverACM(_acmB);

    //--- Set B-to-A channel
    _channel_B2A = new Channel(1);
    CHECK_ERROR_MT(_acmB->RegisterTransportCallback(_channel_B2A));
    _channel_B2A->RegisterReceiverACM(_acmA);
    
    //--- EVENT TIMERS
    // A
    _pullEventA    = EventWrapper::Create();
    _pushEventA    = EventWrapper::Create();
    _processEventA = EventWrapper::Create();
    _apiEventA     = EventWrapper::Create();
    // B
    _pullEventB    = EventWrapper::Create();
    _pushEventB    = EventWrapper::Create();
    _processEventB = EventWrapper::Create();
    _apiEventB     = EventWrapper::Create();

    //--- I/O params
    // A
    _outFreqHzA = _outFileA.SamplingFrequency();
    // B
    _outFreqHzB = _outFileB.SamplingFrequency();


    //Trace::SetEncryptedTraceFile("ACMAPITestEncrypted.txt");    

    char print[11];

    printf("\nRandom Test (y/n)?");
    EXPECT_TRUE(fgets(print, 10, stdin) != NULL);
    print[10] = '\0';
    if(strstr(print, "y") != NULL)
    {
        _randomTest = true;
        _verbose = false;
        _writeToFile = false;
        Trace::CreateTrace();
        Trace::SetTraceFile("ACMAPITest.txt");
        //freopen("APITest_log.txt", "w", stdout);
    }
    else
    {
        Trace::CreateTrace();
        Trace::SetTraceFile("ACMAPITest.txt", true);
        _randomTest = false;
        printf("\nPrint Tests (y/n)? ");
        EXPECT_TRUE(fgets(print, 10, stdin) != NULL);
        print[10] = '\0';
        if(strstr(print, "y") == NULL)
        {
            EXPECT_TRUE(freopen("APITest_log.txt", "w", stdout) != 0);
            _verbose = false;
        }
    }

#ifdef WEBRTC_DTMF_DETECTION
    _dtmfCallback = new DTMFDetector;
#endif
    _vadCallbackA = new VADCallback;
    _vadCallbackB = new VADCallback;
    
    return 0;
}

bool 
APITest::PushAudioThreadA(void* obj)
{
    return static_cast<APITest*>(obj)->PushAudioRunA();
}

bool 
APITest::PushAudioThreadB(void* obj)
{
    return static_cast<APITest*>(obj)->PushAudioRunB();
}

bool 
APITest::PullAudioThreadA(void* obj)
{
    return static_cast<APITest*>(obj)->PullAudioRunA();
}

bool 
APITest::PullAudioThreadB(void* obj)
{
    return static_cast<APITest*>(obj)->PullAudioRunB();
}

bool
APITest::ProcessThreadA(void* obj)
{
    return static_cast<APITest*>(obj)->ProcessRunA();
}

bool
APITest::ProcessThreadB(void* obj)
{
    return static_cast<APITest*>(obj)->ProcessRunB();
}

bool
APITest::APIThreadA(void* obj)
{
    return static_cast<APITest*>(obj)->APIRunA();
}

bool
APITest::APIThreadB(void* obj)
{
    return static_cast<APITest*>(obj)->APIRunB();
}

bool 
APITest::PullAudioRunA()
{
    _pullEventA->Wait(100);
    AudioFrame audioFrame;
    if(_acmA->PlayoutData10Ms(_outFreqHzA, audioFrame) < 0)
    {
        bool thereIsDecoder;
        {
            ReadLockScoped rl(_apiTestRWLock);
            thereIsDecoder = _thereIsDecoderA;
        }
        if(thereIsDecoder)
        {
            fprintf(stderr, "\n>>>>>>    cannot pull audio A       <<<<<<<< \n");
        }
    }
    else
    {
        if(_writeToFile)
        {
            _outFileA.Write10MsData(audioFrame);
        }
        _receiveVADActivityA[(int)audioFrame.vad_activity_]++;
    }
    return true;
}

bool 
APITest::PullAudioRunB()
{
    _pullEventB->Wait(100);
    AudioFrame audioFrame;
    if(_acmB->PlayoutData10Ms(_outFreqHzB, audioFrame) < 0)
    {
        bool thereIsDecoder;
        {
            ReadLockScoped rl(_apiTestRWLock);
            thereIsDecoder = _thereIsDecoderB;
        }
        if(thereIsDecoder)
        {
            fprintf(stderr, "\n>>>>>>    cannot pull audio B       <<<<<<<< \n");
            fprintf(stderr, "%d %d\n", _testNumA, _testNumB);
        }
    }
    else
    {
        if(_writeToFile)
        {
            _outFileB.Write10MsData(audioFrame);
        }
        _receiveVADActivityB[(int)audioFrame.vad_activity_]++;
    }     
    return true;
}

bool 
APITest::PushAudioRunA()
{
    _pushEventA->Wait(100);
    AudioFrame audioFrame;
    _inFileA.Read10MsData(audioFrame);
    if(_acmA->Add10MsData(audioFrame) < 0)
    {
        bool thereIsEncoder;
        {
            ReadLockScoped rl(_apiTestRWLock);
            thereIsEncoder = _thereIsEncoderA;
        }
        if(thereIsEncoder)
        {
            fprintf(stderr, "\n>>>>        add10MsData at A failed       <<<<\n");
        }
    }
    return true;
}

bool 
APITest::PushAudioRunB()
{
    _pushEventB->Wait(100);
    AudioFrame audioFrame;
    _inFileB.Read10MsData(audioFrame);
    if(_acmB->Add10MsData(audioFrame) < 0)
    {
        bool thereIsEncoder;
        {
            ReadLockScoped rl(_apiTestRWLock);
            thereIsEncoder = _thereIsEncoderB;
        }

        if(thereIsEncoder)
        {
            fprintf(stderr, "\n>>>>   cannot add audio to B    <<<<");
        }
    }

    return true;
}

bool
APITest::ProcessRunA()
{
    _processEventA->Wait(100);
    if(_acmA->Process() < 0)
    {
        // do not print error message if there is no encoder
        bool thereIsEncoder;
        {
            ReadLockScoped rl(_apiTestRWLock);
            thereIsEncoder = _thereIsEncoderA;
        }

        if(thereIsEncoder)
        {
            fprintf(stderr, "\n>>>>>      Process Failed at A     <<<<<\n");
        }
    }
    return true;
}

bool
APITest::ProcessRunB()
{
    _processEventB->Wait(100);
    if(_acmB->Process() < 0)
    {
        bool thereIsEncoder;
        {
            ReadLockScoped rl(_apiTestRWLock);
            thereIsEncoder = _thereIsEncoderB;
        }
        if(thereIsEncoder)
        {
            fprintf(stderr, "\n>>>>>      Process Failed at B     <<<<<\n");
        }
    }
    return true;
}

/*/
 *
 * In side A we test the APIs which are related to sender Side.
 *
/*/


void
APITest::RunTest(char thread)
{
    int testNum;
    {
        WriteLockScoped cs(_apiTestRWLock);
        if(thread == 'A')
        {
            _testNumA = (_testNumB + 1 + (rand() % 6)) % 7;
            testNum = _testNumA;
            
            _movingDot[_dotPositionA] = ' ';
            if(_dotPositionA == 0)
            {
                _dotMoveDirectionA = 1;
            }
            if(_dotPositionA == 19)
            {
                _dotMoveDirectionA = -1;
            }
            _dotPositionA += _dotMoveDirectionA;            
            _movingDot[_dotPositionA] = (_dotMoveDirectionA > 0)? '>':'<';
        }
        else
        {
            _testNumB = (_testNumA + 1 + (rand() % 6)) % 7;
            testNum = _testNumB;

            _movingDot[_dotPositionB] = ' ';
            if(_dotPositionB == 20)
            {
                _dotMoveDirectionB = 1;
            }
            if(_dotPositionB == 39)
            {
                _dotMoveDirectionB = -1;
            }
            _dotPositionB += _dotMoveDirectionB;            
            _movingDot[_dotPositionB] = (_dotMoveDirectionB > 0)? '>':'<';
        }
        //fprintf(stderr, "%c: %d \n", thread, testNum);
        //fflush(stderr);
    }
    switch(testNum)
    {
    case 0:
        CurrentCodec('A');
        ChangeCodec('A');
        break;
    case 1:
        TestPlayout('B');
        break;
    case 2:
        if(!_randomTest)
        {
            fprintf(stdout, "\nTesting Delay ...\n");
        }
        TestDelay('A');
        break;
    case 3:
        TestSendVAD('A');    
        break;
    case 4:
        TestRegisteration('A');
        break;
    case 5:
        TestReceiverVAD('A');
        break;
    case 6:
#ifdef WEBRTC_DTMF_DETECTION
        LookForDTMF('A');
#endif
        break;
    default:
        fprintf(stderr, "Wrong Test Number\n");
        getchar();
        exit(1);
    }
}



bool
APITest::APIRunA()
{   
    _apiEventA->Wait(50);

    bool randomTest;
    {
        ReadLockScoped rl(_apiTestRWLock);
        randomTest = _randomTest;
    }
    if(randomTest)
    {
        RunTest('A');
    }
    else
    {
        CurrentCodec('A');
        ChangeCodec('A');
        TestPlayout('B');
        if(_codecCntrA == 0)
        {
            fprintf(stdout, "\nTesting Delay ...\n");
            TestDelay('A');
        }
        // VAD TEST
        TestSendVAD('A');    
        TestRegisteration('A');
        TestReceiverVAD('A');
#ifdef WEBRTC_DTMF_DETECTION
        LookForDTMF('A');
#endif
    }
    return true;
}

bool
APITest::APIRunB()
{   
    _apiEventB->Wait(50);
    bool randomTest;
    {
        ReadLockScoped rl(_apiTestRWLock);
        randomTest = _randomTest;
    }
    //_apiEventB->Wait(2000);
    if(randomTest)
    {
        RunTest('B');
    }
 
    return true;
}

void
APITest::Perform()
{
    SetUp();

    //--- THREADS
    // A
    // PUSH
    ThreadWrapper* myPushAudioThreadA = ThreadWrapper::CreateThread(PushAudioThreadA, 
        this, kNormalPriority, "PushAudioThreadA");
    CHECK_THREAD_NULLITY(myPushAudioThreadA, "Unable to start A::PUSH thread");
    // PULL
    ThreadWrapper* myPullAudioThreadA = ThreadWrapper::CreateThread(PullAudioThreadA, 
        this, kNormalPriority, "PullAudioThreadA");
    CHECK_THREAD_NULLITY(myPullAudioThreadA, "Unable to start A::PULL thread");
    // Process
    ThreadWrapper* myProcessThreadA = ThreadWrapper::CreateThread(ProcessThreadA, 
        this, kNormalPriority, "ProcessThreadA");
    CHECK_THREAD_NULLITY(myProcessThreadA, "Unable to start A::Process thread");
    // API 
    ThreadWrapper* myAPIThreadA = ThreadWrapper::CreateThread(APIThreadA, 
        this, kNormalPriority, "APIThreadA");
    CHECK_THREAD_NULLITY(myAPIThreadA, "Unable to start A::API thread");
    // B
    // PUSH
    ThreadWrapper* myPushAudioThreadB = ThreadWrapper::CreateThread(PushAudioThreadB, 
        this, kNormalPriority, "PushAudioThreadB");
    CHECK_THREAD_NULLITY(myPushAudioThreadB, "Unable to start B::PUSH thread");
    // PULL
    ThreadWrapper* myPullAudioThreadB = ThreadWrapper::CreateThread(PullAudioThreadB, 
        this, kNormalPriority, "PullAudioThreadB");
    CHECK_THREAD_NULLITY(myPullAudioThreadB, "Unable to start B::PULL thread");
    // Process
    ThreadWrapper* myProcessThreadB = ThreadWrapper::CreateThread(ProcessThreadB, 
        this, kNormalPriority, "ProcessThreadB");
    CHECK_THREAD_NULLITY(myProcessThreadB, "Unable to start B::Process thread");
    // API
    ThreadWrapper* myAPIThreadB = ThreadWrapper::CreateThread(APIThreadB, 
        this, kNormalPriority, "APIThreadB");
    CHECK_THREAD_NULLITY(myAPIThreadB, "Unable to start B::API thread");
 

    //_apiEventA->StartTimer(true, 5000);
    //_apiEventB->StartTimer(true, 5000);

    _processEventA->StartTimer(true, 10);
    _processEventB->StartTimer(true, 10);
    
    _pullEventA->StartTimer(true, 10);
    _pullEventB->StartTimer(true, 10);

    _pushEventA->StartTimer(true, 10);
    _pushEventB->StartTimer(true, 10);

    // Keep main thread waiting for sender/receiver
    // threads to complete
    EventWrapper* completeEvent = EventWrapper::Create();
    WebRtc_UWord64 startTime = TickTime::MillisecondTimestamp();
    WebRtc_UWord64 currentTime;
    do
    {
        {
            //ReadLockScoped rl(_apiTestRWLock);
            //fprintf(stderr, "\r%s", _movingDot);
        }
        //fflush(stderr);
        completeEvent->Wait(50);
        currentTime = TickTime::MillisecondTimestamp();
    } while((currentTime - startTime) < 120000); // Run test in 2 minutes (120000 ms)

    //completeEvent->Wait(0xFFFFFFFF);//(unsigned long)((unsigned long)TEST_DURATION_SEC * (unsigned long)1000));
    delete completeEvent;
    
    myPushAudioThreadA->Stop();
    myPullAudioThreadA->Stop();
    myProcessThreadA->Stop();
    myAPIThreadA->Stop();

    delete myPushAudioThreadA;
    delete myPullAudioThreadA;
    delete myProcessThreadA;
    delete myAPIThreadA;


    myPushAudioThreadB->Stop();
    myPullAudioThreadB->Stop();
    myProcessThreadB->Stop();
    myAPIThreadB->Stop();

    delete myPushAudioThreadB;
    delete myPullAudioThreadB;
    delete myProcessThreadB;
    delete myAPIThreadB;
}


void
APITest::CheckVADStatus(char side)
{

    bool dtxEnabled;
    bool vadEnabled;
    ACMVADMode vadMode;

    if(side == 'A')
    {
        _acmA->VAD(dtxEnabled, vadEnabled, vadMode);
        _acmA->RegisterVADCallback(NULL);
        _vadCallbackA->Reset();
        _acmA->RegisterVADCallback(_vadCallbackA);
        
        if(!_randomTest)
        {
            if(_verbose)
            {
                fprintf(stdout, "DTX %3s, VAD %3s, Mode %d", 
                    dtxEnabled? "ON":"OFF",
                    vadEnabled? "ON":"OFF",
                    (int)vadMode);
                Wait(5000);
                fprintf(stdout, " => bit-rate %3.0f kbps\n",
                    _channel_A2B->BitRate());
            }
            else
            {
                Wait(5000);
                fprintf(stdout, "DTX %3s, VAD %3s, Mode %d => bit-rate %3.0f kbps\n", 
                    dtxEnabled? "ON":"OFF",
                    vadEnabled? "ON":"OFF",
                    (int)vadMode,
                    _channel_A2B->BitRate());
            }
            _vadCallbackA->PrintFrameTypes();
        }

        if(dtxEnabled != _sendDTXA)
        {
            fprintf(stderr, ">>>   Error Enabling DTX    <<<\n");
        }
        if((vadEnabled != _sendVADA) && (!dtxEnabled))
        {
            fprintf(stderr, ">>>   Error Enabling VAD    <<<\n");
        }
        if((vadMode != _sendVADModeA) && vadEnabled)
        {
            fprintf(stderr, ">>>   Error setting VAD-mode    <<<\n");
        }
    }
    else
    {
        _acmB->VAD(dtxEnabled, vadEnabled, vadMode);

        _acmB->RegisterVADCallback(NULL);
        _vadCallbackB->Reset();
        _acmB->RegisterVADCallback(_vadCallbackB);
        
        if(!_randomTest)
        {
            if(_verbose)
            {
                fprintf(stdout, "DTX %3s, VAD %3s, Mode %d", 
                    dtxEnabled? "ON":"OFF",
                    vadEnabled? "ON":"OFF",
                    (int)vadMode);
                Wait(5000);
                fprintf(stdout, " => bit-rate %3.0f kbps\n",
                    _channel_B2A->BitRate());
            }
            else
            {
                Wait(5000);
                fprintf(stdout, "DTX %3s, VAD %3s, Mode %d => bit-rate %3.0f kbps\n", 
                    dtxEnabled? "ON":"OFF",
                    vadEnabled? "ON":"OFF",
                    (int)vadMode,
                    _channel_B2A->BitRate());
            }
            _vadCallbackB->PrintFrameTypes();
        }

        if(dtxEnabled != _sendDTXB)
        {
            fprintf(stderr, ">>>   Error Enabling DTX    <<<\n");
        }
        if((vadEnabled != _sendVADB) && (!dtxEnabled))
        {
            fprintf(stderr, ">>>   Error Enabling VAD    <<<\n");
        }
        if((vadMode != _sendVADModeB) && vadEnabled)
        {
            fprintf(stderr, ">>>   Error setting VAD-mode    <<<\n");
        }
    }
}

// Set Min delay, get delay, playout timestamp
void
APITest::TestDelay(char side)
{
    AudioCodingModule* myACM;
    Channel* myChannel;
    WebRtc_Word32* myMinDelay;
    EventWrapper* myEvent = EventWrapper::Create();

    WebRtc_UWord32 inTimestamp = 0;
    WebRtc_UWord32 outTimestamp = 0;
    double estimDelay = 0;    

    double averageEstimDelay = 0;
    double averageDelay = 0;

    CircularBuffer estimDelayCB(100);
    estimDelayCB.SetArithMean(true);

    if(side == 'A')
    {
        myACM = _acmA;
        myChannel = _channel_B2A;
        myMinDelay = &_minDelayA;
    }
    else
    {
        myACM = _acmB;
        myChannel = _channel_A2B;
        myMinDelay = &_minDelayB;
    }


    CHECK_ERROR_MT(myACM->SetMinimumPlayoutDelay(*myMinDelay));


    inTimestamp = myChannel->LastInTimestamp();        
    CHECK_ERROR_MT(myACM->PlayoutTimestamp(outTimestamp));

    if(!_randomTest)
    {
        myEvent->StartTimer(true, 30);
        int n = 0;
        int settlePoint = 5000;
        while(n < settlePoint + 400)
        {
            myEvent->Wait(1000);

            inTimestamp = myChannel->LastInTimestamp();        
            CHECK_ERROR_MT(myACM->PlayoutTimestamp(outTimestamp));

            //std::cout << outTimestamp << std::endl << std::flush;
            estimDelay = (double)((WebRtc_UWord32)(inTimestamp - outTimestamp)) / 
                ((double)myACM->ReceiveFrequency() / 1000.0);

            estimDelayCB.Update(estimDelay);

            estimDelayCB.ArithMean(averageEstimDelay);
            //printf("\n %6.1f \n", estimDelay);
            //std::cout << " " << std::flush;

            if(_verbose)
            {
                fprintf(stdout, "\rExpected: %4d,    retreived: %6.1f,   measured: %6.1f",
                    *myMinDelay, averageDelay, averageEstimDelay);
                std::cout << " " << std::flush;
            }
            if((averageDelay > *myMinDelay) && (n < settlePoint))
            {
                settlePoint = n;
            }
            n++;
        }
        myEvent->StopTimer();
    }

    if((!_verbose) && (!_randomTest))
    {
        fprintf(stdout, "\nExpected: %4d,    retreived: %6.1f,   measured: %6.1f",
            *myMinDelay, averageDelay, averageEstimDelay);
    }

    *myMinDelay = (rand() % 1000) + 1;
  
    ACMNetworkStatistics networkStat;
    CHECK_ERROR_MT(myACM->NetworkStatistics(networkStat));

    if(!_randomTest)
    {
        fprintf(stdout, "\n\nJitter Statistics at Side %c\n", side);
        fprintf(stdout, "--------------------------------------\n");
        fprintf(stdout, "buffer-size............. %d\n", networkStat.currentBufferSize);    
        fprintf(stdout, "Preferred buffer-size... %d\n", networkStat.preferredBufferSize);
        fprintf(stdout, "Peaky jitter mode........%d\n", networkStat.jitterPeaksFound);
        fprintf(stdout, "packet-size rate........ %d\n", networkStat.currentPacketLossRate);
        fprintf(stdout, "discard rate............ %d\n", networkStat.currentDiscardRate);   
        fprintf(stdout, "expand rate............. %d\n", networkStat.currentExpandRate);    
        fprintf(stdout, "Preemptive rate......... %d\n", networkStat.currentPreemptiveRate);
        fprintf(stdout, "Accelerate rate......... %d\n", networkStat.currentAccelerateRate);
        fprintf(stdout, "Clock-drift............. %d\n", networkStat.clockDriftPPM);
        fprintf(stdout, "Mean waiting time....... %d\n", networkStat.meanWaitingTimeMs);
        fprintf(stdout, "Median waiting time..... %d\n", networkStat.medianWaitingTimeMs);
        fprintf(stdout, "Min waiting time........ %d\n", networkStat.minWaitingTimeMs);
        fprintf(stdout, "Max waiting time........ %d\n", networkStat.maxWaitingTimeMs);
    }

    CHECK_ERROR_MT(myACM->SetMinimumPlayoutDelay(*myMinDelay));

    if(!_randomTest)
    {
        myEvent->Wait(500);
        fprintf(stdout, "\n");
        fprintf(stdout, "\n");
    }
    delete myEvent;
}

// Unregister a codec & register again.
void
APITest::TestRegisteration(char sendSide)
{
    AudioCodingModule* sendACM;
    AudioCodingModule* receiveACM;
    bool* thereIsDecoder;
    EventWrapper* myEvent = EventWrapper::Create();

    if(!_randomTest)
    {
        fprintf(stdout, "\n\n");
        fprintf(stdout, "---------------------------------------------------------\n");
        fprintf(stdout, "           Unregister/register Receive Codec\n");
        fprintf(stdout, "---------------------------------------------------------\n");
    }
    
    switch(sendSide)
    {
    case 'A':
        {
            sendACM = _acmA;
            receiveACM = _acmB;
            thereIsDecoder = &_thereIsDecoderB;
            break;
        }
    case 'B':
        {
            sendACM = _acmB;
            receiveACM = _acmA;
            thereIsDecoder = &_thereIsDecoderA;
            break;
        }
    default:
        fprintf(stderr, "Invalid sender-side in TestRegistration(%c)\n", sendSide);
        exit(-1);
    }

    CodecInst myCodec;
    if(sendACM->SendCodec(myCodec) < 0)
    {
        AudioCodingModule::Codec(_codecCntrA, myCodec);
    }

    if(!_randomTest)
    {
        fprintf(stdout, "Unregistering reveive codec, NO AUDIO.\n");
        fflush(stdout);
    }
    {
        WriteLockScoped wl(_apiTestRWLock);
        *thereIsDecoder = false;
    }
    //myEvent->Wait(20);
    CHECK_ERROR_MT(receiveACM->UnregisterReceiveCodec(myCodec.pltype));
    Wait(1000);

    int currentPayload = myCodec.pltype;

    if(!FixedPayloadTypeCodec(myCodec.plname))
    {
        WebRtc_Word32 i;
        for(i = 0; i < 32; i++)
        {
            if(!_payloadUsed[i])
            {
                if(!_randomTest)
                {
                    fprintf(stdout, "Register receive codec with new Payload, AUDIO BACK.\n");
                }
                //myCodec.pltype = i + 96;
                //CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(myCodec));
                //CHECK_ERROR_MT(sendACM->RegisterSendCodec(myCodec));
                //myEvent->Wait(20);
                //{
                //    WriteLockScoped wl(_apiTestRWLock);
                //    *thereIsDecoder = true;
                //}
                Wait(1000);

                if(!_randomTest)
                {
                    fprintf(stdout, "Unregistering reveive codec, NO AUDIO.\n");
                }
                //{
                //    WriteLockScoped wl(_apiTestRWLock);
                //    *thereIsDecoder = false;
                //}
                //myEvent->Wait(20);
                //CHECK_ERROR_MT(receiveACM->UnregisterReceiveCodec(myCodec.pltype));
                Wait(1000);

                myCodec.pltype = currentPayload;
                if(!_randomTest)
                {
                    fprintf(stdout, "Register receive codec with default Payload, AUDIO BACK.\n");
                    fflush(stdout);
                }
                CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(myCodec));
                //CHECK_ERROR_MT(sendACM->RegisterSendCodec(myCodec));
                myEvent->Wait(20);
                {
                    WriteLockScoped wl(_apiTestRWLock);
                    *thereIsDecoder = true;
                }
                Wait(1000);

                break;
            }
        }
        if(i == 32)
        {
            CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(myCodec));
            {
                WriteLockScoped wl(_apiTestRWLock);
                *thereIsDecoder = true;
            }
        }
    }
    else
    {
        if(!_randomTest)
        {
            fprintf(stdout, "Register receive codec with fixed Payload, AUDIO BACK.\n");
            fflush(stdout);
        }
        CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(myCodec));
        //CHECK_ERROR_MT(receiveACM->UnregisterReceiveCodec(myCodec.pltype));
        //CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(myCodec));
        myEvent->Wait(20);
        {
            WriteLockScoped wl(_apiTestRWLock);
            *thereIsDecoder = true;
        }
    }
    delete myEvent;
    if(!_randomTest)
    {
        fprintf(stdout, "---------------------------------------------------------\n");
    }
}

// Playout Mode, background noise mode.
// Receiver Frequency, playout frequency.
void
APITest::TestPlayout(char receiveSide)
{
    AudioCodingModule* receiveACM;
    AudioPlayoutMode* playoutMode = NULL;
    ACMBackgroundNoiseMode* bgnMode = NULL;
    switch(receiveSide)
    {
        case 'A':
            {
                receiveACM = _acmA;
                playoutMode = &_playoutModeA;
                bgnMode = &_bgnModeA;
                break;
            }
        case 'B':
            {
                receiveACM = _acmB;
                playoutMode = &_playoutModeB;
                bgnMode = &_bgnModeB;
                break;
            }
        default:
            receiveACM = _acmA;
    }

    WebRtc_Word32 receiveFreqHz = receiveACM->ReceiveFrequency();
    WebRtc_Word32 playoutFreqHz = receiveACM->PlayoutFrequency();

    CHECK_ERROR_MT(receiveFreqHz);
    CHECK_ERROR_MT(playoutFreqHz);
    
    char bgnString[25];
    switch(*bgnMode)
    {
    case On:
        {
            *bgnMode = Fade;
            strncpy(bgnString, "Fade", 25);
            break;
        }
    case Fade:
        {
            *bgnMode = Off;
            strncpy(bgnString, "OFF", 25);
            break;
        }
    case Off:
        {
            *bgnMode = On;
            strncpy(bgnString, "ON", 25);
            break;
        }
    default:
        *bgnMode = On;
        strncpy(bgnString, "ON", 25);
    }
    CHECK_ERROR_MT(receiveACM->SetBackgroundNoiseMode(*bgnMode));
    bgnString[24] = '\0';

    char playoutString[25];
    switch(*playoutMode)
    {
    case voice:
        {
            *playoutMode = fax;
            strncpy(playoutString, "FAX", 25);
            break;
        }
    case fax:
        {
            *playoutMode = streaming;
            strncpy(playoutString, "Streaming", 25);
            break;
        }
    case streaming:
        {
            *playoutMode = voice;
            strncpy(playoutString, "Voice", 25);
            break;
        }
    default:
        *playoutMode = voice;
        strncpy(playoutString, "Voice", 25);
    }
    CHECK_ERROR_MT(receiveACM->SetPlayoutMode(*playoutMode));
    playoutString[24] = '\0';

    if(!_randomTest)
    {
        fprintf(stdout, "\n");
        fprintf(stdout, "In Side %c\n", receiveSide);
        fprintf(stdout, "---------------------------------\n");
        fprintf(stdout, "Receive Frequency....... %d Hz\n", receiveFreqHz);
        fprintf(stdout, "Playout Frequency....... %d Hz\n", playoutFreqHz);
        fprintf(stdout, "Audio Playout Mode...... %s\n", playoutString);
        fprintf(stdout, "Background Noise Mode... %s\n", bgnString);
    }
}

// set/get receiver VAD status & mode.
void
APITest::TestReceiverVAD(char side)
{
    AudioCodingModule* myACM;
    int* myReceiveVADActivity;

    if(side == 'A')
    {
        myACM = _acmA;
        myReceiveVADActivity = _receiveVADActivityA;
    }
    else
    {
        myACM = _acmB;
        myReceiveVADActivity = _receiveVADActivityB;
    }

    ACMVADMode mode = myACM->ReceiveVADMode();

    CHECK_ERROR_MT(mode);

    if(!_randomTest)
    {
        fprintf(stdout, "\n\nCurrent Receive VAD at side %c\n", side);
        fprintf(stdout, "----------------------------------\n");
        fprintf(stdout, "mode.......... %d\n", (int)mode);
        fprintf(stdout, "VAD Active.... %d\n", myReceiveVADActivity[0]);
        fprintf(stdout, "VAD Passive... %d\n", myReceiveVADActivity[1]);
        fprintf(stdout, "VAD Unknown... %d\n", myReceiveVADActivity[2]);
    }

    if(!_randomTest)
    {
        fprintf(stdout, "\nChange Receive VAD at side %c\n\n", side);
    }

    switch(mode)
    {
      case VADNormal:
          mode = VADAggr;
          break;
      case VADLowBitrate:
          mode = VADVeryAggr;
          break;
      case VADAggr:
          mode = VADLowBitrate;
          break;
      case VADVeryAggr:
          mode = VADNormal;
          break;
      default:
          mode = VADNormal;

          CHECK_ERROR_MT(myACM->SetReceiveVADMode(mode));
    }
    for(int n = 0; n < 3; n++)
    {
        myReceiveVADActivity[n] = 0;
    }
}


void
APITest::TestSendVAD(char side)
{
    if(_randomTest)
    {
        return;
    }

    bool* vad;
    bool* dtx;
    ACMVADMode* mode;
    Channel* myChannel;
    AudioCodingModule* myACM;

    CodecInst myCodec;
    if(!_randomTest)
    {
        fprintf(stdout, "\n\n");
        fprintf(stdout, "-----------------------------------------------\n");
        fprintf(stdout, "                Test VAD API\n");
        fprintf(stdout, "-----------------------------------------------\n");
    }

    if(side == 'A')
    {
        AudioCodingModule::Codec(_codecCntrA, myCodec);
        vad = &_sendVADA;
        dtx = &_sendDTXA;
        mode = &_sendVADModeA;
        myChannel = _channel_A2B;
        myACM = _acmA;
    }
    else
    {
        AudioCodingModule::Codec(_codecCntrB, myCodec);
        vad = &_sendVADB;
        dtx = &_sendDTXB;
        mode = &_sendVADModeB;
        myChannel = _channel_B2A;
        myACM = _acmB;
    }

    CheckVADStatus(side);
    if(!_randomTest)
    {
        fprintf(stdout, "\n\n");
    }

    switch(*mode)
    {
    case VADNormal:
        *vad = true;
        *dtx = true;
        *mode = VADAggr;
        break;
    case VADLowBitrate:
        *vad = true;
        *dtx = true;
        *mode = VADVeryAggr;
        break;
    case VADAggr:
        *vad = true;
        *dtx = true;
        *mode = VADLowBitrate;
        break;
    case VADVeryAggr:
        *vad = false;
        *dtx = false;
        *mode = VADNormal;
        break;
    default:
        *mode = VADNormal;
    }

    *dtx = (myCodec.plfreq == 32000)? false:*dtx;

    CHECK_ERROR_MT(myACM->SetVAD(*dtx, *vad, *mode));
    myChannel->ResetStats();

    CheckVADStatus(side);
    if(!_randomTest)
    {
        fprintf(stdout, "\n");
        fprintf(stdout, "-----------------------------------------------\n");
    }

    // Fault Test
    CHECK_PROTECTED_MT(myACM->SetVAD(false, true, (ACMVADMode)-1));
    CHECK_PROTECTED_MT(myACM->SetVAD(false, true, (ACMVADMode)4));
    


}


void
APITest::CurrentCodec(char side)
{
    CodecInst myCodec;
    if(side == 'A')
    {
        _acmA->SendCodec(myCodec);
    }
    else
    {
        _acmB->SendCodec(myCodec);
    }

    if(!_randomTest)
    {
        fprintf(stdout, "\n\n");
        fprintf(stdout, "Send codec in Side A\n");
        fprintf(stdout, "----------------------------\n");
        fprintf(stdout, "Name................. %s\n", myCodec.plname);
        fprintf(stdout, "Sampling Frequency... %d\n", myCodec.plfreq);
        fprintf(stdout, "Rate................. %d\n", myCodec.rate);
        fprintf(stdout, "Payload-type......... %d\n", myCodec.pltype);
        fprintf(stdout, "Packet-size.......... %d\n", myCodec.pacsize);
    }

    Wait(100);
}

void
APITest::ChangeCodec(char side)
{
    CodecInst myCodec;
    AudioCodingModule* myACM;
    WebRtc_UWord8* codecCntr;
    bool* thereIsEncoder;
    bool* vad;
    bool* dtx;
    ACMVADMode* mode;
    Channel* myChannel;
    // Reset and Wait
    if(!_randomTest)
    {
        fprintf(stdout, "Reset Encoder Side A \n");
    }
    if(side == 'A')
    {
        myACM = _acmA;
        codecCntr = &_codecCntrA;
        {
            WriteLockScoped wl(_apiTestRWLock);
            thereIsEncoder = &_thereIsEncoderA;
        }
        vad = &_sendVADA;
        dtx = &_sendDTXA;
        mode = &_sendVADModeA;
        myChannel = _channel_A2B;
    }
    else
    {
        myACM = _acmB;
        codecCntr = &_codecCntrB;
        {
            WriteLockScoped wl(_apiTestRWLock);
            thereIsEncoder = &_thereIsEncoderB;
        }
        vad = &_sendVADB;
        dtx = &_sendDTXB;
        mode = &_sendVADModeB;
        myChannel = _channel_B2A;
    }

    myACM->ResetEncoder();  
    Wait(100);

    // Register the next codec
    do
    {
        *codecCntr = (*codecCntr < AudioCodingModule::NumberOfCodecs() - 1)? 
            (*codecCntr + 1):0;     

        if(*codecCntr == 0)
        {
            //printf("Initialize Sender Side A \n");
            {
                WriteLockScoped wl(_apiTestRWLock);
                *thereIsEncoder = false;
            }
            CHECK_ERROR_MT(myACM->InitializeSender());
            Wait(1000);   

            // After Initialization CN is lost, re-register them
            if(AudioCodingModule::Codec("CN", myCodec, 8000) >= 0)
            {
                CHECK_ERROR_MT(myACM->RegisterSendCodec(myCodec));
            }
            if(AudioCodingModule::Codec("CN", myCodec, 16000) >= 0)
            {
                CHECK_ERROR_MT(myACM->RegisterSendCodec(myCodec));
            }
            // VAD & DTX are disabled after initialization
            *vad = false;
            *dtx = false;
            _writeToFile = false;
        }

        AudioCodingModule::Codec(*codecCntr, myCodec);
    } while(!STR_CASE_CMP(myCodec.plname, "CN")          ||
        !STR_CASE_CMP(myCodec.plname, "telephone-event") ||
        !STR_CASE_CMP(myCodec.plname, "RED"));

    if(!_randomTest)
    {
        fprintf(stdout, "\n====================================================================\n");
        fprintf(stdout, "      Registering New Codec %s, %d kHz, %d kbps\n",
            myCodec.plname, myCodec.plfreq / 1000, myCodec.rate / 1000);
    }
    //std::cout<< std::flush;

    // NO DTX for supe-wideband codec at this point
    if(myCodec.plfreq == 32000)
    {
        *dtx = false;
        CHECK_ERROR_MT(myACM->SetVAD(*dtx, *vad, *mode));

    }

    CHECK_ERROR_MT(myACM->RegisterSendCodec(myCodec));
    myChannel->ResetStats();
    {
        WriteLockScoped wl(_apiTestRWLock);
        *thereIsEncoder = true;
    }
    Wait(500);
}

 
void 
APITest::LookForDTMF(char side)
{
    if(!_randomTest)
    {
        fprintf(stdout, "\n\nLooking for DTMF Signal in Side %c\n", side);
        fprintf(stdout, "----------------------------------------\n");
    }
 
    if(side == 'A')
    {
        _acmB->RegisterIncomingMessagesCallback(NULL);
        _acmA->RegisterIncomingMessagesCallback(_dtmfCallback);    
        Wait(1000);
        _acmA->RegisterIncomingMessagesCallback(NULL);
    }
    else
    {
        _acmA->RegisterIncomingMessagesCallback(NULL);
        _acmB->RegisterIncomingMessagesCallback(_dtmfCallback);
        Wait(1000);
        _acmB->RegisterIncomingMessagesCallback(NULL);
    }
}

} // namespace webrtc

