/*
 *  Copyright (c) 2011 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.
 */

#ifndef API_TEST_H
#define API_TEST_H

#include "ACMTest.h"
#include "Channel.h"
#include "PCMFile.h"
#include "event_wrapper.h"
#include "utility.h"

enum APITESTAction {TEST_CHANGE_CODEC_ONLY = 0, DTX_TEST = 1};

class APITest : public ACMTest
{
public:
    APITest();
    ~APITest();

    void Perform();
private:
    WebRtc_Word16 SetUp();
    
    static bool PushAudioThreadA(void* obj);
    static bool PullAudioThreadA(void* obj);
    static bool ProcessThreadA(void* obj);
    static bool APIThreadA(void* obj);

    static bool PushAudioThreadB(void* obj);
    static bool PullAudioThreadB(void* obj);
    static bool ProcessThreadB(void* obj);
    static bool APIThreadB(void* obj);

    void CheckVADStatus(char side);

    // Set Min delay, get delay, playout timestamp
    void TestDelay(char side);

    // Unregister a codec & register again.
    void TestRegisteration(char side);

    // Playout Mode, background noise mode.
    // Receiver Frequency, playout frequency.
    void TestPlayout(char receiveSide);

    // set/get receiver VAD status & mode.
    void TestReceiverVAD(char side);

    // 
    void TestSendVAD(char side);

    void CurrentCodec(char side);
    
    void ChangeCodec(char side);
    
    void Wait(WebRtc_UWord32 waitLengthMs);

    void LookForDTMF(char side);

    void RunTest(char thread);
    
    bool PushAudioRunA();    
    bool PullAudioRunA();
    bool ProcessRunA();
    bool APIRunA();
  
    bool PullAudioRunB();
    bool PushAudioRunB();
    bool ProcessRunB();
    bool APIRunB();



    //--- ACMs
    AudioCodingModule* _acmA;
    AudioCodingModule* _acmB;
    
    //--- Channels
    Channel* _channel_A2B;
    Channel* _channel_B2A;
    
    //--- I/O files
    // A
    PCMFile _inFileA;
    PCMFile _outFileA;
    // B
    PCMFile _outFileB;
    PCMFile _inFileB;
    
    //--- I/O params
    // A
    WebRtc_Word32 _outFreqHzA;
    // B
    WebRtc_Word32 _outFreqHzB;
    
    // Should we write to file.
    // we might skip writing to file if we
    // run the test for a long time.
    bool _writeToFile;
    //--- Events
    // A
    EventWrapper* _pullEventA;      // pulling data from ACM
    EventWrapper* _pushEventA;      // pushing data to ACM
    EventWrapper* _processEventA;   // process
    EventWrapper* _apiEventA;       // API calls
    // B
    EventWrapper* _pullEventB;      // pulling data from ACM
    EventWrapper* _pushEventB;      // pushing data to ACM
    EventWrapper* _processEventB;   // process
    EventWrapper* _apiEventB;       // API calls

    // keep track of the codec in either side.
    WebRtc_UWord8 _codecCntrA;
    WebRtc_UWord8 _codecCntrB;

    // keep track of tests
    WebRtc_UWord8 _testCntrA;
    WebRtc_UWord8 _testCntrB;

    // Is set to true if there is no encoder in either side
    bool _thereIsEncoderA;
    bool _thereIsEncoderB;
    bool _thereIsDecoderA;
    bool _thereIsDecoderB;

    bool             _sendVADA;
    bool             _sendDTXA;
    ACMVADMode       _sendVADModeA;

    bool             _sendVADB;
    bool             _sendDTXB;
    ACMVADMode       _sendVADModeB;

    WebRtc_Word32    _minDelayA;
    WebRtc_Word32    _minDelayB;
    bool             _payloadUsed[32];
        
    AudioPlayoutMode    _playoutModeA;
    AudioPlayoutMode    _playoutModeB;

    ACMBackgroundNoiseMode _bgnModeA;
    ACMBackgroundNoiseMode _bgnModeB;


    int            _receiveVADActivityA[3];
    int            _receiveVADActivityB[3];
    bool           _verbose;
    
    int            _dotPositionA;
    int            _dotMoveDirectionA;
    int            _dotPositionB;
    int            _dotMoveDirectionB;

    char           _movingDot[41];
    
    DTMFDetector*  _dtmfCallback;
    VADCallback*   _vadCallbackA;
    VADCallback*   _vadCallbackB;
    RWLockWrapper&    _apiTestRWLock;
    bool           _randomTest;
    int            _testNumA;
    int            _testNumB;
};


#endif
