/*
 *  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 WEBRTC_MODULES_AUDIO_CODING_MAIN_TEST_UTILITY_H_
#define WEBRTC_MODULES_AUDIO_CODING_MAIN_TEST_UTILITY_H_

#include "testing/gtest/include/gtest/gtest.h"
#include "webrtc/modules/audio_coding/main/interface/audio_coding_module.h"

namespace webrtc {

//-----------------------------
#define CHECK_ERROR(f)                                                                      \
    do {                                                                                    \
        EXPECT_GE(f, 0) << "Error Calling API";                                             \
    }while(0)

//-----------------------------
#define CHECK_PROTECTED(f)                                                                  \
    do {                                                                                    \
        if(f >= 0) {                                                                        \
            ADD_FAILURE() << "Error Calling API";                                           \
        }                                                                                   \
        else {                                                                              \
            printf("An expected error is caught.\n");                                       \
        }                                                                                   \
    }while(0)

//----------------------------
#define CHECK_ERROR_MT(f)                                                                   \
    do {                                                                                    \
        if(f < 0) {                                                                         \
            fprintf(stderr, "Error Calling API in file %s at line %d \n",                   \
                __FILE__, __LINE__);                                                        \
        }                                                                                   \
    }while(0)

//----------------------------
#define CHECK_PROTECTED_MT(f)                                                               \
    do {                                                                                    \
        if(f >= 0) {                                                                        \
            fprintf(stderr, "Error Calling API in file %s at line %d \n",                   \
                __FILE__, __LINE__);                                                        \
        }                                                                                   \
        else {                                                                              \
            printf("An expected error is caught.\n");                                       \
        }                                                                                   \
    }while(0)


#define DESTROY_ACM(acm)                                                                    \
    do {                                                                                    \
        if(acm != NULL) {                                                                   \
            AudioCodingModule::Destroy(acm);                       \
            acm = NULL;                                                                     \
        }                                                                                   \
    } while(0)


#define DELETE_POINTER(p)                                                                   \
    do {                                                                                    \
        if(p != NULL) {                                                                     \
            delete p;                                                                       \
            p = NULL;                                                                       \
        }                                                                                   \
    } while(0)

class ACMTestTimer
{
public:
    ACMTestTimer();
    ~ACMTestTimer();

    void Reset();
    void Tick10ms();
    void Tick1ms();
    void Tick100ms();
    void Tick1sec();
    void CurrentTimeHMS(
        char* currTime);
    void CurrentTime(
        unsigned long&  h, 
        unsigned char&  m,
        unsigned char&  s,
        unsigned short& ms);

private:
    void Adjust();

    unsigned short _msec;
    unsigned char  _sec;
    unsigned char  _min;
    unsigned long  _hour;  
};



class CircularBuffer
{
public:
    CircularBuffer(uint32_t len);
    ~CircularBuffer();

    void SetArithMean(
        bool enable);
    void SetVariance(
        bool enable);

    void Update(
        const double newVal);
    void IsBufferFull();

    int16_t Variance(double& var);
    int16_t ArithMean(double& mean);

protected:
    double* _buff;
    uint32_t _idx;
    uint32_t _buffLen;

    bool         _buffIsFull;
    bool         _calcAvg;
    bool         _calcVar;
    double       _sum;
    double       _sumSqr;
};





int16_t ChooseCodec(
    CodecInst& codecInst);

void PrintCodecs();

bool FixedPayloadTypeCodec(const char* payloadName);




class DTMFDetector: public AudioCodingFeedback
{
public:
    DTMFDetector();
    ~DTMFDetector();
    // used for inband DTMF detection
    int32_t IncomingDtmf(const uint8_t digitDtmf, const bool toneEnded);
    void PrintDetectedDigits();

private:
    uint32_t _toneCntr[1000];

};




class VADCallback : public ACMVADCallback
{
public:
    VADCallback();
    ~VADCallback(){}

    int32_t InFrameType(
        int16_t frameType);

    void PrintFrameTypes();
    void Reset();

private:
    uint32_t _numFrameTypes[6];
};

}  // namespace webrtc

#endif  // WEBRTC_MODULES_AUDIO_CODING_MAIN_TEST_UTILITY_H_
