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

#ifndef WEBRTC_AUDIO_DEVICE_FUNC_TEST_MANAGER_H
#define WEBRTC_AUDIO_DEVICE_FUNC_TEST_MANAGER_H

#include <list>
#include <string>

#include "webrtc/common_audio/resampler/include/resampler.h"
#include "webrtc/modules/audio_device/include/audio_device.h"
#include "webrtc/modules/audio_device/test/audio_device_test_defines.h"
#include "webrtc/system_wrappers/interface/file_wrapper.h"
#include "webrtc/typedefs.h"


#define ADM_AUDIO_LAYER AudioDeviceModule::kPlatformDefaultAudio
//#define ADM_AUDIO_LAYER AudioDeviceModule::kLinuxPulseAudio

enum TestType
{
    TTInvalid = -1,
    TTAll = 0,
    TTAudioLayerSelection = 1,
    TTDeviceEnumeration = 2,
    TTDeviceSelection = 3,
    TTAudioTransport = 4,
    TTSpeakerVolume = 5,
    TTMicrophoneVolume = 6,
    TTSpeakerMute = 7,
    TTMicrophoneMute = 8,
    TTMicrophoneBoost = 9,
    TTMicrophoneAGC = 10,
    TTLoopback = 11,
    TTDeviceRemoval = 13,
    TTMobileAPI = 14,
    TTTest = 66,
};

struct AudioPacket
{
    uint8_t dataBuffer[4 * 960];
    size_t nSamples;
    size_t nBytesPerSample;
    uint8_t nChannels;
    uint32_t samplesPerSec;
};

class ProcessThread;

namespace webrtc
{

class AudioDeviceModule;
class AudioEventObserver;
class AudioTransport;

// ----------------------------------------------------------------------------
//  AudioEventObserver
// ----------------------------------------------------------------------------

class AudioEventObserver: public AudioDeviceObserver
{
public:
    virtual void OnErrorIsReported(const ErrorCode error);
    virtual void OnWarningIsReported(const WarningCode warning);
    AudioEventObserver(AudioDeviceModule* audioDevice);
    ~AudioEventObserver();
public:
    ErrorCode _error;
    WarningCode _warning;
};

// ----------------------------------------------------------------------------
//  AudioTransport
// ----------------------------------------------------------------------------

class AudioTransportImpl: public AudioTransport
{
public:
    int32_t RecordedDataIsAvailable(const void* audioSamples,
                                    const size_t nSamples,
                                    const size_t nBytesPerSample,
                                    const uint8_t nChannels,
                                    const uint32_t samplesPerSec,
                                    const uint32_t totalDelayMS,
                                    const int32_t clockDrift,
                                    const uint32_t currentMicLevel,
                                    const bool keyPressed,
                                    uint32_t& newMicLevel) override;

    int32_t NeedMorePlayData(const size_t nSamples,
                             const size_t nBytesPerSample,
                             const uint8_t nChannels,
                             const uint32_t samplesPerSec,
                             void* audioSamples,
                             size_t& nSamplesOut,
                             int64_t* elapsed_time_ms,
                             int64_t* ntp_time_ms) override;

    int OnDataAvailable(const int voe_channels[],
                        int number_of_voe_channels,
                        const int16_t* audio_data,
                        int sample_rate,
                        int number_of_channels,
                        size_t number_of_frames,
                        int audio_delay_milliseconds,
                        int current_volume,
                        bool key_pressed,
                        bool need_audio_processing) override;

    void PushCaptureData(int voe_channel, const void* audio_data,
                         int bits_per_sample, int sample_rate,
                         int number_of_channels,
                         size_t number_of_frames) override;

    void PullRenderData(int bits_per_sample, int sample_rate,
                        int number_of_channels, size_t number_of_frames,
                        void* audio_data,
                        int64_t* elapsed_time_ms,
                        int64_t* ntp_time_ms) override;

    AudioTransportImpl(AudioDeviceModule* audioDevice);
    ~AudioTransportImpl();

public:
    int32_t SetFilePlayout(bool enable, const char* fileName = NULL);
    void SetFullDuplex(bool enable);
    void SetSpeakerVolume(bool enable)
    {
        _speakerVolume = enable;
    }
    ;
    void SetSpeakerMute(bool enable)
    {
        _speakerMute = enable;
    }
    ;
    void SetMicrophoneMute(bool enable)
    {
        _microphoneMute = enable;
    }
    ;
    void SetMicrophoneVolume(bool enable)
    {
        _microphoneVolume = enable;
    }
    ;
    void SetMicrophoneBoost(bool enable)
    {
        _microphoneBoost = enable;
    }
    ;
    void SetLoopbackMeasurements(bool enable)
    {
        _loopBackMeasurements = enable;
    }
    ;
    void SetMicrophoneAGC(bool enable)
    {
        _microphoneAGC = enable;
    }
    ;

private:
    typedef std::list<AudioPacket*> AudioPacketList;
    AudioDeviceModule* _audioDevice;

    bool _playFromFile;
    bool _fullDuplex;
    bool _speakerVolume;
    bool _speakerMute;
    bool _microphoneVolume;
    bool _microphoneMute;
    bool _microphoneBoost;
    bool _microphoneAGC;
    bool _loopBackMeasurements;

    FileWrapper& _playFile;

    uint32_t _recCount;
    uint32_t _playCount;
    AudioPacketList _audioList;

    Resampler _resampler;
};

// ----------------------------------------------------------------------------
//  FuncTestManager
// ----------------------------------------------------------------------------

class FuncTestManager
{
public:
    FuncTestManager();
    ~FuncTestManager();
    int32_t Init();
    int32_t Close();
    int32_t DoTest(const TestType testType);
private:
    int32_t TestAudioLayerSelection();
    int32_t TestDeviceEnumeration();
    int32_t TestDeviceSelection();
    int32_t TestAudioTransport();
    int32_t TestSpeakerVolume();
    int32_t TestMicrophoneVolume();
    int32_t TestSpeakerMute();
    int32_t TestMicrophoneMute();
    int32_t TestMicrophoneBoost();
    int32_t TestLoopback();
    int32_t TestDeviceRemoval();
    int32_t TestExtra();
    int32_t TestMicrophoneAGC();
    int32_t SelectPlayoutDevice();
    int32_t SelectRecordingDevice();
    int32_t TestAdvancedMBAPI();
private:
    // Paths to where the resource files to be used for this test are located.
    std::string _playoutFile48;
    std::string _playoutFile44;
    std::string _playoutFile16;
    std::string _playoutFile8;

    rtc::scoped_ptr<ProcessThread> _processThread;
    AudioDeviceModule* _audioDevice;
    AudioEventObserver* _audioEventObserver;
    AudioTransportImpl* _audioTransport;
};

}  // namespace webrtc

#endif  // #ifndef WEBRTC_AUDIO_DEVICE_FUNC_TEST_MANAGER_H
