/*
 *  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"

namespace webrtc {

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;
};

} // namespace webrtc

#endif
