/*
 *  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 <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>

#if defined(_WIN32)
#include <conio.h>
#elif defined(WEBRTC_LINUX) || defined(WEBRTC_MAC)
#include <termios.h>    // tcgetattr
#endif

#include "testing/gtest/include/gtest/gtest.h"
#include "webrtc/modules/audio_device/test/func_test_manager.h"
#include "webrtc/system_wrappers/include/sleep.h"
#include "webrtc/test/testsupport/fileutils.h"

#include "webrtc/modules/audio_device/audio_device_config.h"
#include "webrtc/modules/audio_device/audio_device_impl.h"

#ifndef __GNUC__
// Disable warning message ('sprintf': name was marked as #pragma deprecated)
#pragma warning( disable : 4995 )
// Disable warning message 4996 ('scanf': This function or variable may be unsafe)
#pragma warning( disable : 4996 )
#endif

const char* RecordedMicrophoneFile = "recorded_microphone_mono_48.pcm";
const char* RecordedMicrophoneVolumeFile =
"recorded_microphone_volume_mono_48.pcm";
const char* RecordedMicrophoneMuteFile = "recorded_microphone_mute_mono_48.pcm";
const char* RecordedMicrophoneBoostFile =
"recorded_microphone_boost_mono_48.pcm";
const char* RecordedMicrophoneAGCFile = "recorded_microphone_AGC_mono_48.pcm";
const char* RecordedSpeakerFile = "recorded_speaker_48.pcm";

#if defined(WEBRTC_IOS) || defined(ANDROID)
#define USE_SLEEP_AS_PAUSE
#else
//#define USE_SLEEP_AS_PAUSE
#endif

// Sets the default pause time if using sleep as pause
#define DEFAULT_PAUSE_TIME 5000

#if defined(USE_SLEEP_AS_PAUSE)
#define PAUSE(a) SleepMs(a);
#else
#define PAUSE(a) WaitForKey();
#endif

// Helper functions
#if !defined(WEBRTC_IOS)
char* GetFilename(char* filename)
{
    return filename;
}
const char* GetFilename(const char* filename)
{
    return filename;
}
char* GetResource(char* resource)
{
    return resource;
}
const char* GetResource(const char* resource)
{
    return resource;
}
#endif

#if !defined(USE_SLEEP_AS_PAUSE)
static void WaitForKey() {
#if defined(_WIN32)
    _getch();
#elif defined(WEBRTC_LINUX) || defined(WEBRTC_MAC)
    struct termios oldt, newt;

    tcgetattr( STDIN_FILENO, &oldt );

    // we don't want getchar to echo!

    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );

    // catch any newline that's hanging around...
    // you'll have to hit enter twice if you
    // choose enter out of all available keys

    if (getc(stdin) == '\n')
    {
        getc(stdin);
    }

    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
#endif  // defined(_WIN32)
}
#endif  // !defined(USE_SLEEP_AS_PAUSE)

namespace webrtc
{

AudioEventObserver::AudioEventObserver(AudioDeviceModule* audioDevice)
{
}

AudioEventObserver::~AudioEventObserver()
{
}

void AudioEventObserver::OnErrorIsReported(const ErrorCode error)
{
    TEST_LOG("\n[*** ERROR ***] => OnErrorIsReported(%d)\n \n", error);
    _error = error;
}


void AudioEventObserver::OnWarningIsReported(const WarningCode warning)
{
    TEST_LOG("\n[*** WARNING ***] => OnWarningIsReported(%d)\n \n", warning);
    _warning = warning;
}

AudioTransportImpl::AudioTransportImpl(AudioDeviceModule* audioDevice) :
    _audioDevice(audioDevice),
    _playFromFile(false),
    _fullDuplex(false),
    _speakerVolume(false),
    _speakerMute(false),
    _microphoneVolume(false),
    _microphoneMute(false),
    _microphoneBoost(false),
    _microphoneAGC(false),
    _loopBackMeasurements(false),
    _playFile(*FileWrapper::Create()),
    _recCount(0),
    _playCount(0)
{
    _resampler.Reset(48000, 48000, 2);
}

AudioTransportImpl::~AudioTransportImpl()
{
    _playFile.Flush();
    _playFile.CloseFile();
    delete &_playFile;

    for (AudioPacketList::iterator iter = _audioList.begin();
         iter != _audioList.end(); ++iter) {
            delete *iter;
    }
}

// ----------------------------------------------------------------------------
//	AudioTransportImpl::SetFilePlayout
// ----------------------------------------------------------------------------

int32_t AudioTransportImpl::SetFilePlayout(bool enable, const char* fileName)
{
    _playFromFile = enable;
    if (enable)
    {
        return (_playFile.OpenFile(fileName, true, true, false));
    } else
    {
        _playFile.Flush();
        return (_playFile.CloseFile());
    }
}
;

void AudioTransportImpl::SetFullDuplex(bool enable)
{
    _fullDuplex = enable;

    for (AudioPacketList::iterator iter = _audioList.begin();
         iter != _audioList.end(); ++iter) {
            delete *iter;
    }
    _audioList.clear();
}

int32_t AudioTransportImpl::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)
{
    if (_fullDuplex && _audioList.size() < 15)
    {
        AudioPacket* packet = new AudioPacket();
        memcpy(packet->dataBuffer, audioSamples, nSamples * nBytesPerSample);
        packet->nSamples = nSamples;
        packet->nBytesPerSample = nBytesPerSample;
        packet->nChannels = nChannels;
        packet->samplesPerSec = samplesPerSec;
        _audioList.push_back(packet);
    }

    _recCount++;
    if (_recCount % 100 == 0)
    {
        bool addMarker(true);

        if (_loopBackMeasurements)
        {
            addMarker = false;
        }

        if (_microphoneVolume)
        {
            uint32_t maxVolume(0);
            uint32_t minVolume(0);
            uint32_t volume(0);
            uint16_t stepSize(0);
            EXPECT_EQ(0, _audioDevice->MaxMicrophoneVolume(&maxVolume));
            EXPECT_EQ(0, _audioDevice->MinMicrophoneVolume(&minVolume));
            EXPECT_EQ(0, _audioDevice->MicrophoneVolumeStepSize(&stepSize));
            EXPECT_EQ(0, _audioDevice->MicrophoneVolume(&volume));
            if (volume == 0)
            {
                TEST_LOG("[0]");
                addMarker = false;
            }
            int stepScale = (int) ((maxVolume - minVolume) / (stepSize * 10));
            volume += (stepScale * stepSize);
            if (volume > maxVolume)
            {
                TEST_LOG("[MAX]");
                volume = 0;
                addMarker = false;
            }
            EXPECT_EQ(0, _audioDevice->SetMicrophoneVolume(volume));
        }

        if (_microphoneAGC)
        {
            uint32_t maxVolume(0);
            uint32_t minVolume(0);
            uint16_t stepSize(0);
            EXPECT_EQ(0, _audioDevice->MaxMicrophoneVolume(&maxVolume));
            EXPECT_EQ(0, _audioDevice->MinMicrophoneVolume(&minVolume));
            EXPECT_EQ(0, _audioDevice->MicrophoneVolumeStepSize(&stepSize));
            // emulate real AGC (min->max->min->max etc.)
            if (currentMicLevel <= 1)
            {
                TEST_LOG("[MIN]");
                addMarker = false;
            }
            int stepScale = (int) ((maxVolume - minVolume) / (stepSize * 10));
            newMicLevel = currentMicLevel + (stepScale * stepSize);
            if (newMicLevel > maxVolume)
            {
                TEST_LOG("[MAX]");
                newMicLevel = 1; // set lowest (non-zero) AGC level
                addMarker = false;
            }
        }

        if (_microphoneMute && (_recCount % 500 == 0))
        {
            bool muted(false);
            EXPECT_EQ(0, _audioDevice->MicrophoneMute(&muted));
            muted = !muted;
            EXPECT_EQ(0, _audioDevice->SetMicrophoneMute(muted));
            if (muted)
            {
                TEST_LOG("[MUTE ON]");
                addMarker = false;
            } else
            {
                TEST_LOG("[MUTE OFF]");
                addMarker = false;
            }
        }

        if (_microphoneBoost && (_recCount % 500 == 0))
        {
            bool boosted(false);
            EXPECT_EQ(0, _audioDevice->MicrophoneBoost(&boosted));
            boosted = !boosted;
            EXPECT_EQ(0, _audioDevice->SetMicrophoneBoost(boosted));
            if (boosted)
            {
                TEST_LOG("[BOOST ON]");
                addMarker = false;
            } else
            {
                TEST_LOG("[BOOST OFF]");
                addMarker = false;
            }
        }

        if ((nChannels == 1) && addMarker)
        {
            // mono
            TEST_LOG("-");
        } else if ((nChannels == 2) && (nBytesPerSample == 2) && addMarker)
        {
            AudioDeviceModule::ChannelType
                chType(AudioDeviceModule::kChannelLeft);
            EXPECT_EQ(0, _audioDevice->RecordingChannel(&chType));
            if (chType == AudioDeviceModule::kChannelLeft)
                TEST_LOG("-|");
            else
                TEST_LOG("|-");
        } else if (addMarker)
        {
            // stereo
            TEST_LOG("--");
        }

        if (nChannels == 2 && nBytesPerSample == 2)
        {
            // TEST_LOG("=> emulated mono (one channel exctracted from stereo input)\n");
        }
    }

    return 0;
}


int32_t AudioTransportImpl::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)
{
    if (_fullDuplex)
    {
        if (_audioList.empty())
        {
            // use zero stuffing when not enough data
            memset(audioSamples, 0, nBytesPerSample * nSamples);
        } else
        {
            AudioPacket* packet = _audioList.front();
            _audioList.pop_front();
            if (packet)
            {
                int ret(0);
                size_t lenOut(0);
                int16_t tmpBuf_96kHz[80 * 12];
                int16_t* ptr16In = NULL;
                int16_t* ptr16Out = NULL;

                const size_t nSamplesIn = packet->nSamples;
                const uint8_t nChannelsIn = packet->nChannels;
                const uint32_t samplesPerSecIn = packet->samplesPerSec;
                const size_t nBytesPerSampleIn = packet->nBytesPerSample;

                int32_t fsInHz(samplesPerSecIn);
                int32_t fsOutHz(samplesPerSec);

                if (fsInHz == 44100)
                    fsInHz = 44000;

                if (fsOutHz == 44100)
                    fsOutHz = 44000;

                if (nChannelsIn == 2 && nBytesPerSampleIn == 4)
                {
                    // input is stereo => we will resample in stereo
                    ret = _resampler.ResetIfNeeded(fsInHz, fsOutHz, 2);
                    if (ret == 0)
                    {
                        if (nChannels == 2)
                        {
                            _resampler.Push(
                                (const int16_t*) packet->dataBuffer,
                                2 * nSamplesIn, (int16_t*) audioSamples,
                                2 * nSamples, lenOut);
                        } else
                        {
                            _resampler.Push(
                                (const int16_t*) packet->dataBuffer,
                                2 * nSamplesIn, tmpBuf_96kHz, 2 * nSamples,
                                lenOut);

                            ptr16In = &tmpBuf_96kHz[0];
                            ptr16Out = (int16_t*) audioSamples;

                            // do stereo -> mono
                            for (size_t i = 0; i < nSamples; i++)
                            {
                                *ptr16Out = *ptr16In; // use left channel
                                ptr16Out++;
                                ptr16In++;
                                ptr16In++;
                            }
                        }
                        assert(2*nSamples == lenOut);
                    } else
                    {
                        if (_playCount % 100 == 0)
                            TEST_LOG(
                                     "ERROR: unable to resample from %d to %d\n",
                                     samplesPerSecIn, samplesPerSec);
                    }
                } else
                {
                    // input is mono (can be "reduced from stereo" as well) =>
                    // we will resample in mono
                    ret = _resampler.ResetIfNeeded(fsInHz, fsOutHz, 1);
                    if (ret == 0)
                    {
                        if (nChannels == 1)
                        {
                            _resampler.Push(
                                (const int16_t*) packet->dataBuffer, nSamplesIn,
                                (int16_t*) audioSamples, nSamples, lenOut);
                        } else
                        {
                            _resampler.Push(
                                (const int16_t*) packet->dataBuffer, nSamplesIn,
                                tmpBuf_96kHz, nSamples, lenOut);

                            ptr16In = &tmpBuf_96kHz[0];
                            ptr16Out = (int16_t*) audioSamples;

                            // do mono -> stereo
                            for (size_t i = 0; i < nSamples; i++)
                            {
                                *ptr16Out = *ptr16In; // left
                                ptr16Out++;
                                *ptr16Out = *ptr16In; // right (same as left sample)
                                ptr16Out++;
                                ptr16In++;
                            }
                        }
                        assert(nSamples == lenOut);
                    } else
                    {
                        if (_playCount % 100 == 0)
                            TEST_LOG("ERROR: unable to resample from %d to %d\n",
                                     samplesPerSecIn, samplesPerSec);
                    }
                }
                nSamplesOut = nSamples;
                delete packet;
            }
        }
    }  // if (_fullDuplex)

    if (_playFromFile && _playFile.Open())
    {
        int16_t fileBuf[480];

        // read mono-file
        int32_t len = _playFile.Read((int8_t*) fileBuf, 2 * nSamples);
        if (len != 2 * (int32_t) nSamples)
        {
            _playFile.Rewind();
            _playFile.Read((int8_t*) fileBuf, 2 * nSamples);
        }

        // convert to stero if required
        if (nChannels == 1)
        {
            memcpy(audioSamples, fileBuf, 2 * nSamples);
        } else
        {
            // mono sample from file is duplicated and sent to left and right
            // channels
            int16_t* audio16 = (int16_t*) audioSamples;
            for (size_t i = 0; i < nSamples; i++)
            {
                (*audio16) = fileBuf[i]; // left
                audio16++;
                (*audio16) = fileBuf[i]; // right
                audio16++;
            }
        }
    }  // if (_playFromFile && _playFile.Open())

    _playCount++;

    if (_playCount % 100 == 0)
    {
        bool addMarker(true);

        if (_speakerVolume)
        {
            uint32_t maxVolume(0);
            uint32_t minVolume(0);
            uint32_t volume(0);
            uint16_t stepSize(0);
            EXPECT_EQ(0, _audioDevice->MaxSpeakerVolume(&maxVolume));
            EXPECT_EQ(0, _audioDevice->MinSpeakerVolume(&minVolume));
            EXPECT_EQ(0, _audioDevice->SpeakerVolumeStepSize(&stepSize));
            EXPECT_EQ(0, _audioDevice->SpeakerVolume(&volume));
            if (volume == 0)
            {
                TEST_LOG("[0]");
                addMarker = false;
            }
            uint32_t step = (maxVolume - minVolume) / 10;
            step = (step < stepSize ? stepSize : step);
            volume += step;
            if (volume > maxVolume)
            {
                TEST_LOG("[MAX]");
                volume = 0;
                addMarker = false;
            }
            EXPECT_EQ(0, _audioDevice->SetSpeakerVolume(volume));
        }

        if (_speakerMute && (_playCount % 500 == 0))
        {
            bool muted(false);
            EXPECT_EQ(0, _audioDevice->SpeakerMute(&muted));
            muted = !muted;
            EXPECT_EQ(0, _audioDevice->SetSpeakerMute(muted));
            if (muted)
            {
                TEST_LOG("[MUTE ON]");
                addMarker = false;
            } else
            {
                TEST_LOG("[MUTE OFF]");
                addMarker = false;
            }
        }

        if (_loopBackMeasurements)
        {
            uint16_t recDelayMS(0);
            uint16_t playDelayMS(0);
            size_t nItemsInList(0);

            nItemsInList = _audioList.size();
            EXPECT_EQ(0, _audioDevice->RecordingDelay(&recDelayMS));
            EXPECT_EQ(0, _audioDevice->PlayoutDelay(&playDelayMS));
            TEST_LOG("Delay (rec+play)+buf: %3zu (%3u+%3u)+%3zu [ms]\n",
                     recDelayMS + playDelayMS + 10 * (nItemsInList + 1),
                     recDelayMS, playDelayMS, 10 * (nItemsInList + 1));

            addMarker = false;
        }

        if ((nChannels == 1) && addMarker)
        {
            TEST_LOG("+");
        } else if ((nChannels == 2) && addMarker)
        {
            TEST_LOG("++");
        }
    }  // if (_playCount % 100 == 0)

    nSamplesOut = nSamples;

    return 0;
}

int AudioTransportImpl::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) {
  return 0;
}

void AudioTransportImpl::PushCaptureData(int voe_channel,
                                         const void* audio_data,
                                         int bits_per_sample, int sample_rate,
                                         int number_of_channels,
                                         size_t number_of_frames) {}

void AudioTransportImpl::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) {}

FuncTestManager::FuncTestManager() :
    _audioDevice(NULL),
    _audioEventObserver(NULL),
    _audioTransport(NULL)
{
  _playoutFile48 = webrtc::test::ResourcePath("audio_device\\audio_short48",
                                              "pcm");
  _playoutFile44 = webrtc::test::ResourcePath("audio_device\\audio_short44",
                                              "pcm");
  _playoutFile16 = webrtc::test::ResourcePath("audio_device\\audio_short16",
                                              "pcm");
  _playoutFile8 = webrtc::test::ResourcePath("audio_device\\audio_short8",
                                             "pcm");
}

FuncTestManager::~FuncTestManager()
{
}

int32_t FuncTestManager::Init()
{
  EXPECT_TRUE((_processThread = ProcessThread::Create("ProcessThread")) !=
              NULL);
    if (_processThread == NULL)
    {
        return -1;
    }
    _processThread->Start();

    // create the Audio Device module
    EXPECT_TRUE((_audioDevice = AudioDeviceModuleImpl::Create(
        555, ADM_AUDIO_LAYER)) != NULL);
    if (_audioDevice == NULL)
    {
        return -1;
    }
    EXPECT_EQ(1, _audioDevice->AddRef());

    // register the Audio Device module
    _processThread->RegisterModule(_audioDevice);

    // register event observer
    _audioEventObserver = new AudioEventObserver(_audioDevice);
    EXPECT_EQ(0, _audioDevice->RegisterEventObserver(_audioEventObserver));

    // register audio transport
    _audioTransport = new AudioTransportImpl(_audioDevice);
    EXPECT_EQ(0, _audioDevice->RegisterAudioCallback(_audioTransport));

    return 0;
}

int32_t FuncTestManager::Close()
{
    EXPECT_EQ(0, _audioDevice->RegisterEventObserver(NULL));
    EXPECT_EQ(0, _audioDevice->RegisterAudioCallback(NULL));
    EXPECT_EQ(0, _audioDevice->Terminate());

    // release the ProcessThread object
    if (_processThread)
    {
        _processThread->DeRegisterModule(_audioDevice);
        _processThread->Stop();
        _processThread.reset();
    }

    // delete the audio observer
    if (_audioEventObserver)
    {
        delete _audioEventObserver;
        _audioEventObserver = NULL;
    }

    // delete the audio transport
    if (_audioTransport)
    {
        delete _audioTransport;
        _audioTransport = NULL;
    }

    // release the AudioDeviceModule object
    if (_audioDevice)
    {
        EXPECT_EQ(0, _audioDevice->Release());
        _audioDevice = NULL;
    }

    // return the ThreadWrapper (singleton)
    Trace::ReturnTrace();

    // PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::DoTest(const TestType testType)
{
    switch (testType)
    {
        case TTAll:
            TestAudioLayerSelection();
            TestDeviceEnumeration();
            TestDeviceSelection();
            TestAudioTransport();
            TestSpeakerVolume();
            TestMicrophoneVolume();
            TestLoopback();
            FALLTHROUGH();
        case TTAudioLayerSelection:
            TestAudioLayerSelection();
            break;
        case TTDeviceEnumeration:
            TestDeviceEnumeration();
            break;
        case TTDeviceSelection:
            TestDeviceSelection();
            break;
        case TTAudioTransport:
            TestAudioTransport();
            break;
        case TTSpeakerVolume:
            TestSpeakerVolume();
            break;
        case TTMicrophoneVolume:
            TestMicrophoneVolume();
            break;
        case TTSpeakerMute:
            TestSpeakerMute();
            break;
        case TTMicrophoneMute:
            TestMicrophoneMute();
            break;
        case TTMicrophoneBoost:
            TestMicrophoneBoost();
            break;
        case TTMicrophoneAGC:
            TestMicrophoneAGC();
            break;
        case TTLoopback:
            TestLoopback();
            break;
        case TTDeviceRemoval:
            TestDeviceRemoval();
            break;
        case TTMobileAPI:
            TestAdvancedMBAPI();
            FALLTHROUGH();
        case TTTest:
            TestExtra();
            break;
        default:
            break;
    }

    return 0;
}

int32_t FuncTestManager::TestAudioLayerSelection()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Audio Layer test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    AudioDeviceModule::AudioLayer audioLayer;
    EXPECT_EQ(0, audioDevice->ActiveAudioLayer(&audioLayer));

    if (audioLayer == AudioDeviceModule::kWindowsWaveAudio)
    {
        TEST_LOG("\nActiveAudioLayer: kWindowsWaveAudio\n \n");
    } else if (audioLayer == AudioDeviceModule::kWindowsCoreAudio)
    {
        TEST_LOG("\nActiveAudioLayer: kWindowsCoreAudio\n \n");
    } else if (audioLayer == AudioDeviceModule::kLinuxAlsaAudio)
    {
        TEST_LOG("\nActiveAudioLayer: kLinuxAlsaAudio\n \n");
    } else if (audioLayer == AudioDeviceModule::kLinuxPulseAudio)
    {
        TEST_LOG("\nActiveAudioLayer: kLinuxPulseAudio\n \n");
    } else
    {
        TEST_LOG("\nActiveAudioLayer: INVALID\n \n");
    }

    char ch;
    bool tryWinWave(false);
    bool tryWinCore(false);

    if (audioLayer == AudioDeviceModule::kWindowsWaveAudio)
    {
        TEST_LOG("Would you like to try kWindowsCoreAudio instead "
            "[requires Win Vista or Win 7] (Y/N)?\n: ");
        EXPECT_TRUE(scanf(" %c", &ch) > 0);
        ch = toupper(ch);
        if (ch == 'Y')
        {
            tryWinCore = true;
        }
    } else if (audioLayer == AudioDeviceModule::kWindowsCoreAudio)
    {
        TEST_LOG("Would you like to try kWindowsWaveAudio instead (Y/N)?\n: ");
        EXPECT_TRUE(scanf(" %c", &ch) > 0);
        ch = toupper(ch);
        if (ch == 'Y')
        {
            tryWinWave = true;
        }
    }

    if (tryWinWave || tryWinCore)
    {
        // =======================================
        // First, close down what we have started

        // terminate
        EXPECT_EQ(0, _audioDevice->RegisterEventObserver(NULL));
        EXPECT_EQ(0, _audioDevice->RegisterAudioCallback(NULL));
        EXPECT_EQ(0, _audioDevice->Terminate());

        // release the ProcessThread object
        if (_processThread)
        {
            _processThread->DeRegisterModule(_audioDevice);
            _processThread->Stop();
            _processThread.reset();
        }

        // delete the audio observer
        if (_audioEventObserver)
        {
            delete _audioEventObserver;
            _audioEventObserver = NULL;
        }

        // delete the audio transport
        if (_audioTransport)
        {
            delete _audioTransport;
            _audioTransport = NULL;
        }

        // release the AudioDeviceModule object
        if (_audioDevice)
        {
            EXPECT_EQ(0, _audioDevice->Release());
            _audioDevice = NULL;
        }

        // ==================================================
        // Next, try to make fresh start with new audio layer

        EXPECT_TRUE((_processThread = ProcessThread::Create("ProcessThread")) !=
                    NULL);
        if (_processThread == NULL)
        {
            return -1;
        }
        _processThread->Start();

        // create the Audio Device module based on selected audio layer
        if (tryWinWave)
        {
            _audioDevice = AudioDeviceModuleImpl::Create(
                555,
                AudioDeviceModule::kWindowsWaveAudio);
        } else if (tryWinCore)
        {
            _audioDevice = AudioDeviceModuleImpl::Create(
                555,
                AudioDeviceModule::kWindowsCoreAudio);
        }

        if (_audioDevice == NULL)
        {
            TEST_LOG("\nERROR: Switch of audio layer failed!\n");
            // restore default audio layer instead
            EXPECT_TRUE((_audioDevice = AudioDeviceModuleImpl::Create(
                555, AudioDeviceModule::kPlatformDefaultAudio)) != NULL);
        }

        if (_audioDevice == NULL)
        {
            TEST_LOG("\nERROR: Failed to revert back to default audio layer!\n");
            return -1;
        }

        EXPECT_EQ(1, _audioDevice->AddRef());

        // register the Audio Device module
        _processThread->RegisterModule(_audioDevice);

        // register event observer
        _audioEventObserver = new AudioEventObserver(_audioDevice);
        EXPECT_EQ(0, _audioDevice->RegisterEventObserver(_audioEventObserver));

        // register audio transport
        _audioTransport = new AudioTransportImpl(_audioDevice);
        EXPECT_EQ(0, _audioDevice->RegisterAudioCallback(_audioTransport));

        EXPECT_EQ(0, _audioDevice->ActiveAudioLayer(&audioLayer));

        if (audioLayer == AudioDeviceModule::kWindowsWaveAudio)
        {
            if (tryWinCore)
                TEST_LOG("\nActiveAudioLayer: kWindowsWaveAudio <=> "
                    "switch was *not* possible\n \n");
            else
                TEST_LOG("\nActiveAudioLayer: kWindowsWaveAudio <=> "
                    "switch was possible\n \n");
        } else if (audioLayer == AudioDeviceModule::kWindowsCoreAudio)
        {
            if (tryWinWave)
                TEST_LOG("\nActiveAudioLayer: kWindowsCoreAudio <=> "
                    "switch was *not* possible\n \n");
            else
                TEST_LOG("\nActiveAudioLayer: kWindowsCoreAudio <=> "
                    "switch was possible\n \n");
        }
    }  // if (tryWinWave || tryWinCore)

    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestDeviceEnumeration()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Device Enumeration test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    char name[kAdmMaxDeviceNameSize];
    char guid[kAdmMaxGuidSize];

    const int16_t nPlayoutDevices(audioDevice->PlayoutDevices());
    EXPECT_TRUE(nPlayoutDevices >= 0);
    TEST_LOG("\nPlayoutDevices: %u\n \n", nPlayoutDevices);
    for (int n = 0; n < nPlayoutDevices; n++)
    {
        EXPECT_EQ(0, audioDevice->PlayoutDeviceName(n, name, guid));
        TEST_LOG(
                 "PlayoutDeviceName(%d) :   name=%s \n \
	                 guid=%s\n",
                 n, name, guid);
    }

#ifdef _WIN32
    // default (-1)
    // TODO(henrika): fix below test.
#if 0
    EXPECT_EQ(0, audioDevice->PlayoutDeviceName(-1, name, guid));
    TEST_LOG("PlayoutDeviceName(%d):   default name=%s \n \
	                 default guid=%s\n", -1, name, guid);
#endif  // 0
#else
    // should fail
    EXPECT_EQ(-1, audioDevice->PlayoutDeviceName(-1, name, guid));
#endif

    const int16_t nRecordingDevices(audioDevice->RecordingDevices());
    EXPECT_TRUE(nRecordingDevices >= 0);
    TEST_LOG("\nRecordingDevices: %u\n \n", nRecordingDevices);
    for (int n = 0; n < nRecordingDevices; n++)
    {
        EXPECT_EQ(0, audioDevice->RecordingDeviceName(n, name, guid));
        TEST_LOG(
                 "RecordingDeviceName(%d) : name=%s \n \
	                 guid=%s\n",
                 n, name, guid);
    }

#ifdef _WIN32
    // default (-1)
    // TODO(henrika): fix below test.
#if 0
    EXPECT_EQ(0, audioDevice->RecordingDeviceName(-1, name, guid));
    TEST_LOG("RecordingDeviceName(%d): default name=%s \n \
	                 default guid=%s\n", -1, name, guid);
#endif
#else
    // should fail
    EXPECT_EQ(-1, audioDevice->PlayoutDeviceName(-1, name, guid));
#endif

    EXPECT_EQ(0, audioDevice->Terminate());
    EXPECT_FALSE(audioDevice->Initialized());

    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestDeviceSelection()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Device Selection test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

#define PRINT_HEADING(a, b) \
	{ \
		TEST_LOG("Set" #a "Device(" #b ") => \n"); \
	} \

#define PRINT_HEADING_IDX(a, b,c ) \
	{ \
		TEST_LOG("Set" #a "Device(%d) (%s) => \n", b, c); \
	} \

#define PRINT_STR(a, b) \
	{ \
                char str[128]; \
                (b == true) ? (sprintf(str, "  %-17s: available\n", #a)) : (sprintf(str, "  %-17s: NA\n", #a)); \
                TEST_LOG("%s", str); \
	} \

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    bool available(false);
    int16_t nDevices(-1);
    char name[kAdmMaxDeviceNameSize];
    char guid[kAdmMaxGuidSize];

    // =======
    // Playout

    nDevices = audioDevice->PlayoutDevices();
    EXPECT_TRUE(nDevices >= 0);

    TEST_LOG("\n");
#ifdef _WIN32
    EXPECT_TRUE(audioDevice->SetPlayoutDevice(
        AudioDeviceModule::kDefaultCommunicationDevice) == 0);
    PRINT_HEADING(Playout, kDefaultCommunicationDevice);
    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    PRINT_STR(Playout, available);
    if (available)
    {
        EXPECT_EQ(0, audioDevice->StereoPlayoutIsAvailable(&available));
        PRINT_STR(Stereo Playout, available);
    }
    else
    {
        PRINT_STR(Stereo Playout, false);
    }
    EXPECT_EQ(0, audioDevice->SpeakerVolumeIsAvailable(&available));
    PRINT_STR(Speaker Volume, available);
    EXPECT_EQ(0, audioDevice->SpeakerMuteIsAvailable(&available));
    PRINT_STR(Speaker Mute, available);

    EXPECT_EQ(0, audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice));
    PRINT_HEADING(Playout, kDefaultDevice);
    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    PRINT_STR(Playout, available);
    if (available)
    {
        EXPECT_EQ(0, audioDevice->StereoPlayoutIsAvailable(&available));
        PRINT_STR(Stereo Playout, available);
    }
    else
    {
        PRINT_STR(Stereo Playout, false);
    }
    EXPECT_EQ(0, audioDevice->SpeakerVolumeIsAvailable(&available));
    PRINT_STR(Speaker Volume, available);
    EXPECT_EQ(0, audioDevice->SpeakerMuteIsAvailable(&available));
    PRINT_STR(Speaker Mute, available);
#else
    EXPECT_TRUE(audioDevice->SetPlayoutDevice(
        AudioDeviceModule::kDefaultCommunicationDevice) == -1);
    EXPECT_EQ(-1, audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice));
#endif

    for (int i = 0; i < nDevices; i++)
    {
        EXPECT_EQ(0, audioDevice->SetPlayoutDevice(i));
        EXPECT_EQ(0, audioDevice->PlayoutDeviceName(i, name, guid));
        PRINT_HEADING_IDX(Playout, i, name);
        EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
        PRINT_STR(Playout, available);
        if (available)
        {
            EXPECT_EQ(0, audioDevice->StereoPlayoutIsAvailable(&available));
            PRINT_STR(Stereo Playout, available);
        } else
        {
            PRINT_STR(Stereo Playout, false);
        }
        EXPECT_EQ(0, audioDevice->SpeakerVolumeIsAvailable(&available));
        PRINT_STR(Speaker Volume, available);
        EXPECT_EQ(0, audioDevice->SpeakerMuteIsAvailable(&available));
        PRINT_STR(Speaker Mute, available);
    }

    // =========
    // Recording

    nDevices = audioDevice->RecordingDevices();
    EXPECT_TRUE(nDevices >= 0);

    TEST_LOG("\n");
#ifdef _WIN32
    EXPECT_TRUE(audioDevice->SetRecordingDevice(
        AudioDeviceModule::kDefaultCommunicationDevice) == 0);
    PRINT_HEADING(Recording, kDefaultCommunicationDevice);
    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
    PRINT_STR(Recording, available);
    if (available)
    {
        EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
        PRINT_STR(Stereo Recording, available);
    }
    else
    {
        // special fix to ensure that we don't log 'available' when recording is not OK
        PRINT_STR(Stereo Recording, false);
    }
    EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
    PRINT_STR(Microphone Volume, available);
    EXPECT_EQ(0, audioDevice->MicrophoneMuteIsAvailable(&available));
    PRINT_STR(Microphone Mute, available);
    EXPECT_EQ(0, audioDevice->MicrophoneBoostIsAvailable(&available));
    PRINT_STR(Microphone Boost, available);

    EXPECT_EQ(0, audioDevice->SetRecordingDevice(AudioDeviceModule::kDefaultDevice));
    PRINT_HEADING(Recording, kDefaultDevice);
    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
    PRINT_STR(Recording, available);
    if (available)
    {
        EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
        PRINT_STR(Stereo Recording, available);
    }
    else
    {
        // special fix to ensure that we don't log 'available' when recording is not OK
        PRINT_STR(Stereo Recording, false);
    }
    EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
    PRINT_STR(Microphone Volume, available);
    EXPECT_EQ(0, audioDevice->MicrophoneMuteIsAvailable(&available));
    PRINT_STR(Microphone Mute, available);
    EXPECT_EQ(0, audioDevice->MicrophoneBoostIsAvailable(&available));
    PRINT_STR(Microphone Boost, available);
#else
    EXPECT_TRUE(audioDevice->SetRecordingDevice(
        AudioDeviceModule::kDefaultCommunicationDevice) == -1);
    EXPECT_EQ(-1, audioDevice->SetRecordingDevice(AudioDeviceModule::kDefaultDevice));
#endif

    for (int i = 0; i < nDevices; i++)
    {
        EXPECT_EQ(0, audioDevice->SetRecordingDevice(i));
        EXPECT_EQ(0, audioDevice->RecordingDeviceName(i, name, guid));
        PRINT_HEADING_IDX(Recording, i, name);
        EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
        PRINT_STR(Recording, available);
        if (available)
        {
            EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
            PRINT_STR(Stereo Recording, available);
        } else
        {
            // special fix to ensure that we don't log 'available' when recording
            // is not OK
            PRINT_STR(Stereo Recording, false);
        }
        EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
        PRINT_STR(Microphone Volume, available);
        EXPECT_EQ(0, audioDevice->MicrophoneMuteIsAvailable(&available));
        PRINT_STR(Microphone Mute, available);
        EXPECT_EQ(0, audioDevice->MicrophoneBoostIsAvailable(&available));
        PRINT_STR(Microphone Boost, available);
    }

    EXPECT_EQ(0, audioDevice->Terminate());
    EXPECT_FALSE(audioDevice->Initialized());

    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestAudioTransport()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Audio Transport test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    bool recIsAvailable(false);
    bool playIsAvailable(false);

    if (SelectRecordingDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&recIsAvailable));
    if (!recIsAvailable)
    {
        TEST_LOG(
                 "\nWARNING: Recording is not available for the selected device!\n \n");
    }

    if (SelectPlayoutDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&playIsAvailable));
    if (recIsAvailable && playIsAvailable)
    {
        _audioTransport->SetFullDuplex(true);
    } else if (!playIsAvailable)
    {
        TEST_LOG(
                 "\nWARNING: Playout is not available for the selected device!\n \n");
    }

    bool available(false);
    uint32_t samplesPerSec(0);

    if (playIsAvailable)
    {
        // =========================================
        // Start by playing out an existing PCM file

        EXPECT_EQ(0, audioDevice->SpeakerVolumeIsAvailable(&available));
        if (available)
        {
            uint32_t maxVolume(0);
            EXPECT_EQ(0, audioDevice->MaxSpeakerVolume(&maxVolume));
            EXPECT_EQ(0, audioDevice->SetSpeakerVolume(maxVolume/2));
        }

        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));

        EXPECT_EQ(0, audioDevice->InitPlayout());
        EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&samplesPerSec));
        if (samplesPerSec == 48000) {
            _audioTransport->SetFilePlayout(
                true, GetResource(_playoutFile48.c_str()));
        } else if (samplesPerSec == 44100 || samplesPerSec == 44000) {
            _audioTransport->SetFilePlayout(
                true, GetResource(_playoutFile44.c_str()));
        } else if (samplesPerSec == 16000) {
            _audioTransport->SetFilePlayout(
                true, GetResource(_playoutFile16.c_str()));
        } else if (samplesPerSec == 8000) {
            _audioTransport->SetFilePlayout(
                true, GetResource(_playoutFile8.c_str()));
        } else {
            TEST_LOG("\nERROR: Sample rate (%u) is not supported!\n \n",
                     samplesPerSec);
            return -1;
        }
        EXPECT_EQ(0, audioDevice->StartPlayout());

        if (audioDevice->Playing())
        {
            TEST_LOG("\n> Listen to the file being played (fs=%d) out "
                "and verify that the audio quality is OK.\n"
                "> Press any key to stop playing...\n \n",
                samplesPerSec);
            PAUSE(DEFAULT_PAUSE_TIME);
        }

        EXPECT_EQ(0, audioDevice->StopPlayout());
        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));

        _audioTransport->SetFilePlayout(false);
    }

    bool enabled(false);
    if (recIsAvailable)
    {
        // ====================================
        // Next, record from microphone to file

        EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
        if (available)
        {
            uint32_t maxVolume(0);
            EXPECT_EQ(0, audioDevice->MaxMicrophoneVolume(&maxVolume));
            EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(maxVolume));
        }

        EXPECT_TRUE(audioDevice->StartRawInputFileRecording(
            GetFilename(RecordedMicrophoneFile)) == 0);
        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));

        EXPECT_EQ(0, audioDevice->InitRecording());
        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
        if (enabled)
        {
            // ensure file recording in mono
            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelLeft));
        }
        EXPECT_EQ(0, audioDevice->StartRecording());
        SleepMs(100);

        EXPECT_TRUE(audioDevice->Recording());
        if (audioDevice->Recording())
        {
            TEST_LOG("\n \n> The microphone input signal is now being recorded "
                "to a PCM file.\n"
                "> Speak into the microphone to ensure that your voice is"
                " recorded.\n> Press any key to stop recording...\n \n");
            PAUSE(DEFAULT_PAUSE_TIME);
        }

        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
        if (enabled)
        {
            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelBoth));
        }
        EXPECT_EQ(0, audioDevice->StopRecording());
        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
        EXPECT_EQ(0, audioDevice->StopRawInputFileRecording());
    }

    if (recIsAvailable && playIsAvailable)
    {
        // ==========================
        // Play out the recorded file

        _audioTransport->SetFilePlayout(true,
                                        GetFilename(RecordedMicrophoneFile));

        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
        EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
        if (available)
        {
            EXPECT_EQ(0, audioDevice->InitPlayout());
            EXPECT_EQ(0, audioDevice->StartPlayout());
            SleepMs(100);
        }

        EXPECT_TRUE(audioDevice->Playing());
        if (audioDevice->Playing())
        {
            TEST_LOG("\n \n> Listen to the recorded file and verify that the "
                "audio quality is OK.\n"
                "> Press any key to stop listening...\n \n");
            PAUSE(DEFAULT_PAUSE_TIME);
        }

        EXPECT_EQ(0, audioDevice->StopPlayout());
        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));

        _audioTransport->SetFilePlayout(false);
    }

    if (recIsAvailable && playIsAvailable)
    {
        // ==============================
        // Finally, make full duplex test

        uint32_t playSamplesPerSec(0);
        uint32_t recSamplesPerSecRec(0);

        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));

        _audioTransport->SetFullDuplex(true);

        EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
        if (available)
        {
            uint32_t maxVolume(0);
            EXPECT_EQ(0, audioDevice->MaxMicrophoneVolume(&maxVolume));
            EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(maxVolume));
        }

        EXPECT_EQ(0, audioDevice->InitRecording());
        EXPECT_EQ(0, audioDevice->InitPlayout());
        EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&playSamplesPerSec));
        EXPECT_EQ(0, audioDevice->RecordingSampleRate(&recSamplesPerSecRec));
        if (playSamplesPerSec != recSamplesPerSecRec)
        {
            TEST_LOG("\nERROR: sample rates does not match (fs_play=%u, fs_rec=%u)",
                     playSamplesPerSec, recSamplesPerSecRec);
            EXPECT_EQ(0, audioDevice->StopRecording());
            EXPECT_EQ(0, audioDevice->StopPlayout());
            EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
            _audioTransport->SetFullDuplex(false);
            return -1;
        }

        EXPECT_EQ(0, audioDevice->StartRecording());
        EXPECT_EQ(0, audioDevice->StartPlayout());
        SleepMs(100);

        if (audioDevice->Playing() && audioDevice->Recording())
        {
            TEST_LOG("\n \n> Full duplex audio (fs=%u) is now active.\n"
                "> Speak into the microphone and verify that your voice is "
                "played out in loopback.\n> Press any key to stop...\n \n",
                     playSamplesPerSec);
            PAUSE(DEFAULT_PAUSE_TIME);
        }

        EXPECT_EQ(0, audioDevice->StopRecording());
        EXPECT_EQ(0, audioDevice->StopPlayout());
        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));

        _audioTransport->SetFullDuplex(false);
    }

    EXPECT_EQ(0, audioDevice->Terminate());
    EXPECT_FALSE(audioDevice->Initialized());

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestSpeakerVolume()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Speaker Volume test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    if (SelectPlayoutDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    bool available(false);
    uint32_t startVolume(0);
    uint32_t samplesPerSec(0);

    EXPECT_EQ(0, audioDevice->SpeakerVolumeIsAvailable(&available));
    if (available)
    {
        _audioTransport->SetSpeakerVolume(true);
    } else
    {
        TEST_LOG("\nERROR: Volume control is not available for the selected "
            "device!\n \n");
        return -1;
    }

    // store initial volume setting
    EXPECT_EQ(0, audioDevice->InitSpeaker());
    EXPECT_EQ(0, audioDevice->SpeakerVolume(&startVolume));

    // start at volume 0
    EXPECT_EQ(0, audioDevice->SetSpeakerVolume(0));

    // ======================================
    // Start playing out an existing PCM file

    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    if (available)
    {
        EXPECT_EQ(0, audioDevice->InitPlayout());
        EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&samplesPerSec));
        if (48000 == samplesPerSec) {
            _audioTransport->SetFilePlayout(
                true, GetResource(_playoutFile48.c_str()));
        } else if (44100 == samplesPerSec || samplesPerSec == 44000) {
            _audioTransport->SetFilePlayout(
                true, GetResource(_playoutFile44.c_str()));
        } else if (samplesPerSec == 16000) {
            _audioTransport->SetFilePlayout(
                true, GetResource(_playoutFile16.c_str()));
        } else if (samplesPerSec == 8000) {
            _audioTransport->SetFilePlayout(
                true, GetResource(_playoutFile8.c_str()));
        } else {
            TEST_LOG("\nERROR: Sample rate (%d) is not supported!\n \n",
                     samplesPerSec);
            return -1;
        }
        EXPECT_EQ(0, audioDevice->StartPlayout());
    }

    EXPECT_TRUE(audioDevice->Playing());
    if (audioDevice->Playing())
    {
        TEST_LOG("\n> Listen to the file being played out and verify that the "
            "selected speaker volume is varied between [~0] and [~MAX].\n"
            "> The file shall be played out with an increasing volume level "
            "correlated to the speaker volume.\n"
            "> Press any key to stop playing...\n \n");
        PAUSE(10000);
    }

    EXPECT_EQ(0, audioDevice->StopPlayout());
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));

    _audioTransport->SetSpeakerVolume(false);
    _audioTransport->SetFilePlayout(false);

    // restore volume setting
    EXPECT_EQ(0, audioDevice->SetSpeakerVolume(startVolume));

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestSpeakerMute()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Speaker Mute test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    if (SelectPlayoutDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    bool available(false);
    bool startMute(false);
    uint32_t samplesPerSec(0);

    EXPECT_EQ(0, audioDevice->SpeakerMuteIsAvailable(&available));
    if (available)
    {
        _audioTransport->SetSpeakerMute(true);
    } else
    {
        TEST_LOG(
                 "\nERROR: Mute control is not available for the selected"
                 " device!\n \n");
        return -1;
    }

    // store initial mute setting
    EXPECT_EQ(0, audioDevice->InitSpeaker());
    EXPECT_EQ(0, audioDevice->SpeakerMute(&startMute));

    // start with no mute
    EXPECT_EQ(0, audioDevice->SetSpeakerMute(false));

    // ======================================
    // Start playing out an existing PCM file

    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    if (available)
    {
        EXPECT_EQ(0, audioDevice->InitPlayout());
        EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&samplesPerSec));
        if (48000 == samplesPerSec)
            _audioTransport->SetFilePlayout(true, _playoutFile48.c_str());
        else if (44100 == samplesPerSec || 44000 == samplesPerSec)
            _audioTransport->SetFilePlayout(true, _playoutFile44.c_str());
        else
        {
            TEST_LOG("\nERROR: Sample rate (%d) is not supported!\n \n",
                     samplesPerSec);
            return -1;
        }
        EXPECT_EQ(0, audioDevice->StartPlayout());
    }

    EXPECT_TRUE(audioDevice->Playing());
    if (audioDevice->Playing())
    {
        TEST_LOG("\n> Listen to the file being played out and verify that the"
            " selected speaker mute control is toggled between [MUTE ON] and"
            " [MUTE OFF].\n> You should only hear the file during the"
            " 'MUTE OFF' periods.\n"
            "> Press any key to stop playing...\n \n");
        PAUSE(DEFAULT_PAUSE_TIME);
    }

    EXPECT_EQ(0, audioDevice->StopPlayout());
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));

    _audioTransport->SetSpeakerMute(false);
    _audioTransport->SetFilePlayout(false);

    // restore mute setting
    EXPECT_EQ(0, audioDevice->SetSpeakerMute(startMute));

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestMicrophoneVolume()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Microphone Volume test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    if (SelectRecordingDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    bool available(false);
    EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
    if (available)
    {
        _audioTransport->SetMicrophoneVolume(true);
    } else
    {
        TEST_LOG("\nERROR: Volume control is not available for the selected "
            "device!\n \n");
        return -1;
    }

    if (SelectPlayoutDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    if (available)
    {
        _audioTransport->SetFullDuplex(true);
    } else
    {
        TEST_LOG("\nERROR: Playout is not available for the selected "
            "device!\n \n");
        return -1;
    }

    TEST_LOG("\nEnable recording of microphone input to file (%s) during this"
        " test (Y/N)?\n: ",
             RecordedMicrophoneVolumeFile);
    char ch;
    bool fileRecording(false);
    EXPECT_TRUE(scanf(" %c", &ch) > 0);
    ch = toupper(ch);
    if (ch == 'Y')
    {
        fileRecording = true;
    }

    uint32_t startVolume(0);
    bool enabled(false);

    // store initial volume setting
    EXPECT_EQ(0, audioDevice->InitMicrophone());
    EXPECT_EQ(0, audioDevice->MicrophoneVolume(&startVolume));

    // start at volume 0
    EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(0));

    // ======================================================================
    // Start recording from the microphone while the mic volume is changed
    // continuously.
    // Also, start playing out the input to enable real-time verification.

    if (fileRecording)
    {
        EXPECT_EQ(0, audioDevice->StartRawInputFileRecording(RecordedMicrophoneVolumeFile));
    }
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
    if (available)
    {
        EXPECT_EQ(0, audioDevice->InitRecording());
        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
        if (enabled)
        {
            // ensures a mono file
            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelRight));
        }
        EXPECT_EQ(0, audioDevice->StartRecording());
    }
    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    if (available)
    {
        EXPECT_EQ(0, audioDevice->InitPlayout());
        EXPECT_EQ(0, audioDevice->StartPlayout());
    }

    EXPECT_TRUE(audioDevice->Recording());
    EXPECT_TRUE(audioDevice->Playing());
    if (audioDevice->Recording() && audioDevice->Playing())
    {
        TEST_LOG("\n> Speak into the microphone and verify that the selected "
            "microphone volume is varied between [~0] and [~MAX].\n"
            "> You should hear your own voice with an increasing volume level"
            " correlated to the microphone volume.\n"
            "> After a finalized test (and if file recording was enabled) "
            "verify the recorded result off line.\n"
            "> Press any key to stop...\n \n");
        PAUSE(DEFAULT_PAUSE_TIME);
    }

    if (fileRecording)
    {
        EXPECT_EQ(0, audioDevice->StopRawInputFileRecording());
    }
    EXPECT_EQ(0, audioDevice->StopRecording());
    EXPECT_EQ(0, audioDevice->StopPlayout());
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
    EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));

    _audioTransport->SetMicrophoneVolume(false);
    _audioTransport->SetFullDuplex(false);

    // restore volume setting
    EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(startVolume));

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestMicrophoneMute()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Microphone Mute test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    if (SelectRecordingDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    bool available(false);
    EXPECT_EQ(0, audioDevice->MicrophoneMuteIsAvailable(&available));
    if (available)
    {
        _audioTransport->SetMicrophoneMute(true);
    } else
    {
        TEST_LOG("\nERROR: Mute control is not available for the selected"
            " device!\n \n");
        return -1;
    }

    if (SelectPlayoutDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    if (available)
    {
        _audioTransport->SetFullDuplex(true);
    } else
    {
        TEST_LOG("\nERROR: Playout is not available for the selected "
            "device!\n \n");
        return -1;
    }

    TEST_LOG("\nEnable recording of microphone input to file (%s) during this "
        "test (Y/N)?\n: ",
        RecordedMicrophoneMuteFile);
    char ch;
    bool fileRecording(false);
    EXPECT_TRUE(scanf(" %c", &ch) > 0);
    ch = toupper(ch);
    if (ch == 'Y')
    {
        fileRecording = true;
    }

    bool startMute(false);
    bool enabled(false);

    // store initial volume setting
    EXPECT_EQ(0, audioDevice->InitMicrophone());
    EXPECT_EQ(0, audioDevice->MicrophoneMute(&startMute));

    // start at no mute
    EXPECT_EQ(0, audioDevice->SetMicrophoneMute(false));

    // ==================================================================
    // Start recording from the microphone while the mic mute is toggled
    // continuously.
    // Also, start playing out the input to enable real-time verification.

    if (fileRecording)
    {
        EXPECT_EQ(0, audioDevice->StartRawInputFileRecording(RecordedMicrophoneMuteFile));
    }
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
    if (available)
    {
        EXPECT_EQ(0, audioDevice->InitRecording());
        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
        if (enabled)
        {
            // ensure file recording in mono
            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelLeft));
        }
        EXPECT_EQ(0, audioDevice->StartRecording());
    }
    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    if (available)
    {
        EXPECT_EQ(0, audioDevice->InitPlayout());
        EXPECT_EQ(0, audioDevice->StartPlayout());
    }

    EXPECT_TRUE(audioDevice->Recording());
    EXPECT_TRUE(audioDevice->Playing());
    if (audioDevice->Recording() && audioDevice->Playing())
    {
        TEST_LOG("\n> Speak into the microphone and verify that the selected "
            "microphone mute control is toggled between [MUTE ON] and [MUTE OFF]."
            "\n> You should only hear your own voice in loopback during the"
            " 'MUTE OFF' periods.\n> After a finalized test (and if file "
            "recording was enabled) verify the recorded result off line.\n"
            "> Press any key to stop...\n \n");
        PAUSE(DEFAULT_PAUSE_TIME);
    }

    if (fileRecording)
    {
        EXPECT_EQ(0, audioDevice->StopRawInputFileRecording());
    }
    EXPECT_EQ(0, audioDevice->StopRecording());
    EXPECT_EQ(0, audioDevice->StopPlayout());
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));

    _audioTransport->SetMicrophoneMute(false);
    _audioTransport->SetFullDuplex(false);

    // restore volume setting
    EXPECT_EQ(0, audioDevice->SetMicrophoneMute(startMute));

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestMicrophoneBoost()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Microphone Boost test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    if (SelectRecordingDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    bool available(false);
    EXPECT_EQ(0, audioDevice->MicrophoneBoostIsAvailable(&available));
    if (available)
    {
        _audioTransport->SetMicrophoneBoost(true);
    } else
    {
        TEST_LOG(
                 "\nERROR: Boost control is not available for the selected device!\n \n");
        return -1;
    }

    if (SelectPlayoutDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    if (available)
    {
        _audioTransport->SetFullDuplex(true);
    } else
    {
        TEST_LOG("\nERROR: Playout is not available for the selected device!\n \n");
        return -1;
    }

    TEST_LOG("\nEnable recording of microphone input to file (%s) during this "
        "test (Y/N)?\n: ",
        RecordedMicrophoneBoostFile);
    char ch;
    bool fileRecording(false);
    EXPECT_TRUE(scanf(" %c", &ch) > 0);
    ch = toupper(ch);
    if (ch == 'Y')
    {
        fileRecording = true;
    }

    bool startBoost(false);
    bool enabled(false);

    // store initial volume setting
    EXPECT_EQ(0, audioDevice->InitMicrophone());
    EXPECT_EQ(0, audioDevice->MicrophoneBoost(&startBoost));

    // start at no boost
    EXPECT_EQ(0, audioDevice->SetMicrophoneBoost(false));

    // ==================================================================
    // Start recording from the microphone while the mic boost is toggled
    // continuously.
    // Also, start playing out the input to enable real-time verification.

    if (fileRecording)
    {
        EXPECT_EQ(0, audioDevice->StartRawInputFileRecording(RecordedMicrophoneBoostFile));
    }
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
    if (available)
    {
        EXPECT_EQ(0, audioDevice->InitRecording());
        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
        if (enabled)
        {
            // ensure file recording in mono
            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelLeft));
        }
        EXPECT_EQ(0, audioDevice->StartRecording());
    }
    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    if (available)
    {
        EXPECT_EQ(0, audioDevice->InitPlayout());
        EXPECT_EQ(0, audioDevice->StartPlayout());
    }

    EXPECT_TRUE(audioDevice->Recording());
    EXPECT_TRUE(audioDevice->Playing());
    if (audioDevice->Recording() && audioDevice->Playing())
    {
        TEST_LOG("\n> Speak into the microphone and verify that the selected "
            "microphone boost control is toggled between [BOOST ON] and [BOOST OFF].\n"
            "> You should hear your own voice with an increased volume level "
            "during the 'BOOST ON' periods.\n \n"
            "> After a finalized test (and if file recording was enabled) verify"
            " the recorded result off line.\n"
        "> Press any key to stop...\n \n");
        PAUSE(DEFAULT_PAUSE_TIME);
    }

    if (fileRecording)
    {
        EXPECT_EQ(0, audioDevice->StopRawInputFileRecording());
    }
    EXPECT_EQ(0, audioDevice->StopRecording());
    EXPECT_EQ(0, audioDevice->StopPlayout());
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));

    _audioTransport->SetMicrophoneBoost(false);
    _audioTransport->SetFullDuplex(false);

    // restore boost setting
    EXPECT_EQ(0, audioDevice->SetMicrophoneBoost(startBoost));

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestMicrophoneAGC()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Microphone AGC test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    if (SelectRecordingDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    bool available(false);
    EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
    if (available)
    {
        _audioTransport->SetMicrophoneAGC(true);
    } else
    {
        TEST_LOG("\nERROR: It is not possible to control the microphone volume"
            " for the selected device!\n \n");
        return -1;
    }

    if (SelectPlayoutDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    if (available)
    {
        _audioTransport->SetFullDuplex(true);
    } else
    {
        TEST_LOG("\nERROR: Playout is not available for the selected device!\n \n");
        return -1;
    }

    TEST_LOG("\nEnable recording of microphone input to file (%s) during "
        "this test (Y/N)?\n: ",
        RecordedMicrophoneAGCFile);
    char ch;
    bool fileRecording(false);
    EXPECT_TRUE(scanf(" %c", &ch) > 0);
    ch = toupper(ch);
    if (ch == 'Y')
    {
        fileRecording = true;
    }

    uint32_t startVolume(0);
    bool enabled(false);

    // store initial volume setting
    EXPECT_EQ(0, audioDevice->InitMicrophone());
    EXPECT_EQ(0, audioDevice->MicrophoneVolume(&startVolume));

    // ====================================================================
    // Start recording from the microphone while the mic volume is changed
    // continuously
    // by the emulated AGC (implemented by our audio transport).
    // Also, start playing out the input to enable real-time verification.

    if (fileRecording)
    {
        EXPECT_EQ(0, audioDevice->StartRawInputFileRecording(RecordedMicrophoneAGCFile));
    }
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&available));
    if (available)
    {
        EXPECT_EQ(0, audioDevice->SetAGC(true));
        EXPECT_EQ(0, audioDevice->InitRecording());
        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
        if (enabled)
        {
            // ensures a mono file
            EXPECT_EQ(0, audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelRight));
        }
        EXPECT_EQ(0, audioDevice->StartRecording());
    }
    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&available));
    if (available)
    {
        EXPECT_EQ(0, audioDevice->InitPlayout());
        EXPECT_EQ(0, audioDevice->StartPlayout());
    }

    EXPECT_TRUE(audioDevice->AGC());
    EXPECT_TRUE(audioDevice->Recording());
    EXPECT_TRUE(audioDevice->Playing());
    if (audioDevice->Recording() && audioDevice->Playing())
    {
        TEST_LOG("\n> Speak into the microphone and verify that the volume of"
            " the selected microphone is varied between [~0] and [~MAX].\n"
            "> You should hear your own voice with an increasing volume level"
            " correlated to an emulated AGC setting.\n"
            "> After a finalized test (and if file recording was enabled) verify"
            " the recorded result off line.\n"
            "> Press any key to stop...\n \n");
        PAUSE(DEFAULT_PAUSE_TIME);
    }

    if (fileRecording)
    {
        EXPECT_EQ(0, audioDevice->StopRawInputFileRecording());
    }
    EXPECT_EQ(0, audioDevice->SetAGC(false));
    EXPECT_EQ(0, audioDevice->StopRecording());
    EXPECT_EQ(0, audioDevice->StopPlayout());
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));
    EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));

    _audioTransport->SetMicrophoneAGC(false);
    _audioTransport->SetFullDuplex(false);

    // restore volume setting
    EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(startVolume));

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestLoopback()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Loopback measurement test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    bool recIsAvailable(false);
    bool playIsAvailable(false);
    uint8_t nPlayChannels(0);
    uint8_t nRecChannels(0);

    if (SelectRecordingDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&recIsAvailable));
    if (!recIsAvailable)
    {
        TEST_LOG("\nERROR: Recording is not available for the selected device!\n \n");
        return -1;
    }

    if (SelectPlayoutDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }

    EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&playIsAvailable));
    if (recIsAvailable && playIsAvailable)
    {
        _audioTransport->SetFullDuplex(true);
        _audioTransport->SetLoopbackMeasurements(true);
    } else if (!playIsAvailable)
    {
        TEST_LOG("\nERROR: Playout is not available for the selected device!\n \n");
        return -1;
    }

    bool enabled(false);
    bool available(false);

    if (recIsAvailable && playIsAvailable)
    {
        uint32_t playSamplesPerSec(0);
        uint32_t recSamplesPerSecRec(0);

        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));

        _audioTransport->SetFullDuplex(true);

        EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
        if (available)
        {
            EXPECT_EQ(0, audioDevice->SetStereoRecording(true));
        }

        EXPECT_EQ(0, audioDevice->StereoPlayoutIsAvailable(&available));
        if (available)
        {
            EXPECT_EQ(0, audioDevice->SetStereoPlayout(true));
        }

        EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
        if (available)
        {
            uint32_t maxVolume(0);
            EXPECT_EQ(0, audioDevice->MaxMicrophoneVolume(&maxVolume));
            EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(maxVolume));
        }

        EXPECT_EQ(0, audioDevice->InitRecording());
        EXPECT_EQ(0, audioDevice->InitPlayout());
        EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&playSamplesPerSec));
        EXPECT_EQ(0, audioDevice->RecordingSampleRate(&recSamplesPerSecRec));
        EXPECT_EQ(0, audioDevice->StereoPlayout(&enabled));
        enabled ? nPlayChannels = 2 : nPlayChannels = 1;
        EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
        enabled ? nRecChannels = 2 : nRecChannels = 1;
        EXPECT_EQ(0, audioDevice->StartRecording());
        EXPECT_EQ(0, audioDevice->StartPlayout());

        if (audioDevice->Playing() && audioDevice->Recording())
        {
            TEST_LOG("\n \n> Loopback audio is now active.\n"
               "> Rec : fs=%u, #channels=%u.\n"
                "> Play: fs=%u, #channels=%u.\n"
                "> Speak into the microphone and verify that your voice is"
                "  played out in loopback.\n"
                "> Press any key to stop...\n \n",
                recSamplesPerSecRec, nRecChannels, playSamplesPerSec,
                nPlayChannels);
            PAUSE(30000);
        }

        EXPECT_EQ(0, audioDevice->StopRecording());
        EXPECT_EQ(0, audioDevice->StopPlayout());
        EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));

        _audioTransport->SetFullDuplex(false);
        _audioTransport->SetLoopbackMeasurements(false);
    }

    EXPECT_EQ(0, audioDevice->Terminate());
    EXPECT_FALSE(audioDevice->Initialized());

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestDeviceRemoval()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Device removal test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    bool recIsAvailable(false);
    bool playIsAvailable(false);
    uint8_t nPlayChannels(0);
    uint8_t nRecChannels(0);
    uint8_t loopCount(0);

    while (loopCount < 2)
    {
        if (SelectRecordingDevice() == -1)
        {
            TEST_LOG("\nERROR: Device selection failed!\n \n");
            return -1;
        }

        EXPECT_EQ(0, audioDevice->RecordingIsAvailable(&recIsAvailable));
        if (!recIsAvailable)
        {
            TEST_LOG("\nERROR: Recording is not available for the selected device!\n \n");
            return -1;
        }

        if (SelectPlayoutDevice() == -1)
        {
            TEST_LOG("\nERROR: Device selection failed!\n \n");
            return -1;
        }

        EXPECT_EQ(0, audioDevice->PlayoutIsAvailable(&playIsAvailable));
        if (recIsAvailable && playIsAvailable)
        {
            _audioTransport->SetFullDuplex(true);
        } else if (!playIsAvailable)
        {
            TEST_LOG("\nERROR: Playout is not available for the selected device!\n \n");
            return -1;
        }

        bool available(false);
        bool enabled(false);

        if (recIsAvailable && playIsAvailable)
        {
            uint32_t playSamplesPerSec(0);
            uint32_t recSamplesPerSecRec(0);

            EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));

            _audioTransport->SetFullDuplex(true);

            EXPECT_EQ(0, audioDevice->StereoRecordingIsAvailable(&available));
            if (available)
            {
                EXPECT_EQ(0, audioDevice->SetStereoRecording(true));
            }

            EXPECT_EQ(0, audioDevice->StereoPlayoutIsAvailable(&available));
            if (available)
            {
                EXPECT_EQ(0, audioDevice->SetStereoPlayout(true));
            }

            EXPECT_EQ(0, audioDevice->MicrophoneVolumeIsAvailable(&available));
            if (available)
            {
                uint32_t maxVolume(0);
                EXPECT_EQ(0, audioDevice->MaxMicrophoneVolume(&maxVolume));
                EXPECT_EQ(0, audioDevice->SetMicrophoneVolume(maxVolume));
            }

            EXPECT_EQ(0, audioDevice->InitRecording());
            EXPECT_EQ(0, audioDevice->InitPlayout());
            EXPECT_EQ(0, audioDevice->PlayoutSampleRate(&playSamplesPerSec));
            EXPECT_EQ(0, audioDevice->RecordingSampleRate(&recSamplesPerSecRec));
            EXPECT_EQ(0, audioDevice->StereoPlayout(&enabled));
            enabled ? nPlayChannels = 2 : nPlayChannels = 1;
            EXPECT_EQ(0, audioDevice->StereoRecording(&enabled));
            enabled ? nRecChannels = 2 : nRecChannels = 1;
            EXPECT_EQ(0, audioDevice->StartRecording());
            EXPECT_EQ(0, audioDevice->StartPlayout());

            AudioDeviceModule::AudioLayer audioLayer;
            EXPECT_EQ(0, audioDevice->ActiveAudioLayer(&audioLayer));

            if (audioLayer == AudioDeviceModule::kLinuxPulseAudio)
            {
                TEST_LOG("\n \n> PulseAudio loopback audio is now active.\n"
                    "> Rec : fs=%u, #channels=%u.\n"
                    "> Play: fs=%u, #channels=%u.\n"
                    "> Speak into the microphone and verify that your voice is"
                    " played out in loopback.\n"
                    "> Unplug the device and make sure that your voice is played"
                    " out in loop back on the built-in soundcard.\n"
                    "> Then press any key...\n",
                         recSamplesPerSecRec, nRecChannels, playSamplesPerSec,
                         nPlayChannels);

                PAUSE(DEFAULT_PAUSE_TIME);
            } else if (audioDevice->Playing() && audioDevice->Recording())
            {
                if (loopCount < 1)
                {
                    TEST_LOG("\n \n> Loopback audio is now active.\n"
                        "> Rec : fs=%u, #channels=%u.\n"
                        "> Play: fs=%u, #channels=%u.\n"
                        "> Speak into the microphone and verify that your voice"
                        " is played out in loopback.\n"
                        "> Unplug the device and wait for the error message...\n",
                        recSamplesPerSecRec, nRecChannels,
                        playSamplesPerSec, nPlayChannels);

                    _audioEventObserver->_error
                        = (AudioDeviceObserver::ErrorCode) (-1);
                    while (_audioEventObserver->_error
                        == (AudioDeviceObserver::ErrorCode) (-1))
                    {
                        SleepMs(500);
                    }
                } else
                {
                    TEST_LOG("\n \n> Loopback audio is now active.\n"
                        "> Rec : fs=%u, #channels=%u.\n"
                        "> Play: fs=%u, #channels=%u.\n"
                        "> Speak into the microphone and verify that your voice"
                        " is played out in loopback.\n"
                        "> Press any key to stop...\n",
                             recSamplesPerSecRec, nRecChannels,
                             playSamplesPerSec, nPlayChannels);

                    PAUSE(DEFAULT_PAUSE_TIME);
                }
            }

            EXPECT_EQ(0, audioDevice->StopRecording());
            EXPECT_EQ(0, audioDevice->StopPlayout());
            EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));

            _audioTransport->SetFullDuplex(false);

            if (loopCount < 1)
            {
                TEST_LOG("\n \n> Stopped!\n");
                TEST_LOG("> Now reinsert device if you want to enumerate it.\n");
                TEST_LOG("> Press any key when done.\n");
                PAUSE(DEFAULT_PAUSE_TIME);
            }

            loopCount++;
        }
    }  // loopCount

    EXPECT_EQ(0, audioDevice->Terminate());
    EXPECT_FALSE(audioDevice->Initialized());

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::TestExtra()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Extra test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    EXPECT_EQ(0, audioDevice->Terminate());
    EXPECT_FALSE(audioDevice->Initialized());

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

int32_t FuncTestManager::SelectRecordingDevice()
{
    int16_t nDevices = _audioDevice->RecordingDevices();
    char name[kAdmMaxDeviceNameSize];
    char guid[kAdmMaxGuidSize];
    int32_t ret(-1);

#ifdef _WIN32
    TEST_LOG("\nSelect Recording Device\n \n");
    TEST_LOG("  (%d) Default\n", 0);
    TEST_LOG("  (%d) Default Communication [Win 7]\n", 1);
    TEST_LOG("- - - - - - - - - - - - - - - - - - - -\n");
    for (int i = 0; i < nDevices; i++)
    {
        EXPECT_EQ(0, _audioDevice->RecordingDeviceName(i, name, guid));
        TEST_LOG(" (%d) Device %d (%s)\n", i+10, i, name);
    }
    TEST_LOG("\n: ");

    int sel(0);

    scanf("%u", &sel);

    if (sel == 0)
    {
        EXPECT_EQ(0, (ret = _audioDevice->SetRecordingDevice(AudioDeviceModule::kDefaultDevice)));
    }
    else if (sel == 1)
    {
        EXPECT_TRUE((ret = _audioDevice->SetRecordingDevice(
            AudioDeviceModule::kDefaultCommunicationDevice)) == 0);
    }
    else if (sel < (nDevices+10))
    {
        EXPECT_EQ(0, (ret = _audioDevice->SetRecordingDevice(sel-10)));
    }
    else
    {
        return -1;
    }
#else
    TEST_LOG("\nSelect Recording Device\n \n");
    for (int i = 0; i < nDevices; i++)
    {
        EXPECT_EQ(0, _audioDevice->RecordingDeviceName(i, name, guid));
        TEST_LOG(" (%d) Device %d (%s)\n", i, i, name);
    }
    TEST_LOG("\n: ");
    int sel(0);
    EXPECT_TRUE(scanf("%u", &sel) > 0);
    if (sel < (nDevices))
    {
        EXPECT_EQ(0, (ret = _audioDevice->SetRecordingDevice(sel)));
    } else
    {
        return -1;
    }
#endif

    return ret;
}

int32_t FuncTestManager::SelectPlayoutDevice()
{
    int16_t nDevices = _audioDevice->PlayoutDevices();
    char name[kAdmMaxDeviceNameSize];
    char guid[kAdmMaxGuidSize];

#ifdef _WIN32
    TEST_LOG("\nSelect Playout Device\n \n");
    TEST_LOG("  (%d) Default\n", 0);
    TEST_LOG("  (%d) Default Communication [Win 7]\n", 1);
    TEST_LOG("- - - - - - - - - - - - - - - - - - - -\n");
    for (int i = 0; i < nDevices; i++)
    {
        EXPECT_EQ(0, _audioDevice->PlayoutDeviceName(i, name, guid));
        TEST_LOG(" (%d) Device %d (%s)\n", i+10, i, name);
    }
    TEST_LOG("\n: ");

    int sel(0);

    scanf("%u", &sel);

    int32_t ret(0);

    if (sel == 0)
    {
        EXPECT_TRUE((ret = _audioDevice->SetPlayoutDevice(
            AudioDeviceModule::kDefaultDevice)) == 0);
    }
    else if (sel == 1)
    {
        EXPECT_TRUE((ret = _audioDevice->SetPlayoutDevice(
            AudioDeviceModule::kDefaultCommunicationDevice)) == 0);
    }
    else if (sel < (nDevices+10))
    {
        EXPECT_EQ(0, (ret = _audioDevice->SetPlayoutDevice(sel-10)));
    }
    else
    {
        return -1;
    }
#else
    TEST_LOG("\nSelect Playout Device\n \n");
    for (int i = 0; i < nDevices; i++)
    {
        EXPECT_EQ(0, _audioDevice->PlayoutDeviceName(i, name, guid));
        TEST_LOG(" (%d) Device %d (%s)\n", i, i, name);
    }
    TEST_LOG("\n: ");
    int sel(0);
    EXPECT_TRUE(scanf("%u", &sel) > 0);
    int32_t ret(0);
    if (sel < (nDevices))
    {
        EXPECT_EQ(0, (ret = _audioDevice->SetPlayoutDevice(sel)));
    } else
    {
        return -1;
    }
#endif

    return ret;
}

int32_t FuncTestManager::TestAdvancedMBAPI()
{
    TEST_LOG("\n=======================================\n");
    TEST_LOG(" Advanced mobile device API test:\n");
    TEST_LOG("=======================================\n");

    if (_audioDevice == NULL)
    {
        return -1;
    }

    RESET_TEST;

    AudioDeviceModule* audioDevice = _audioDevice;

    EXPECT_EQ(0, audioDevice->Init());
    EXPECT_TRUE(audioDevice->Initialized());

    if (SelectRecordingDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }
    if (SelectPlayoutDevice() == -1)
    {
        TEST_LOG("\nERROR: Device selection failed!\n \n");
        return -1;
    }
    _audioTransport->SetFullDuplex(true);
    _audioTransport->SetLoopbackMeasurements(true);

    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(_audioTransport));
    // Start recording
    EXPECT_EQ(0, audioDevice->InitRecording());
    EXPECT_EQ(0, audioDevice->StartRecording());
    // Start playout
    EXPECT_EQ(0, audioDevice->InitPlayout());
    EXPECT_EQ(0, audioDevice->StartPlayout());

    EXPECT_TRUE(audioDevice->Recording());
    EXPECT_TRUE(audioDevice->Playing());

#if defined(_WIN32_WCE) || defined(WEBRTC_IOS)
    TEST_LOG("\nResetAudioDevice\n \n");
    if (audioDevice->Recording() && audioDevice->Playing())
    {
        TEST_LOG("\n> Speak into the microphone and verify that the audio is good.\n\
> Press any key to stop...\n \n");
        PAUSE(DEFAULT_PAUSE_TIME);
    }
    for (int p=0; p<=60; p+=20)
    {
        TEST_LOG("Resetting sound device several time with pause %d ms\n", p);
        for (int l=0; l<20; ++l)
        {
            EXPECT_EQ(0, audioDevice->ResetAudioDevice());
            SleepMs(p);
        }
        TEST_LOG("\n> Speak into the microphone and verify that the audio is good.\n");
        SleepMs(2000);
    }
#endif

#if defined(WEBRTC_IOS)
    bool loudspeakerOn(false);
    TEST_LOG("\nSet playout spaker\n \n");
    if (audioDevice->Recording() && audioDevice->Playing())
    {
        TEST_LOG("\n> Speak into the microphone and verify that the audio is good.\n\
> Press any key to stop...\n \n");
        PAUSE(DEFAULT_PAUSE_TIME);
    }

    TEST_LOG("Set to use speaker\n");
    EXPECT_EQ(0, audioDevice->SetLoudspeakerStatus(true));
    TEST_LOG("\n> Speak into the microphone and verify that the audio is"
        " from the loudspeaker.\n\
> Press any key to stop...\n \n");
    PAUSE(DEFAULT_PAUSE_TIME);
    EXPECT_EQ(0, audioDevice->GetLoudspeakerStatus(&loudspeakerOn));
    EXPECT_TRUE(loudspeakerOn);

    TEST_LOG("Set to not use speaker\n");
    EXPECT_EQ(0, audioDevice->SetLoudspeakerStatus(false));
    TEST_LOG("\n> Speak into the microphone and verify that the audio is not"
        " from the loudspeaker.\n\
> Press any key to stop...\n \n");
    PAUSE(DEFAULT_PAUSE_TIME);
    EXPECT_EQ(0, audioDevice->GetLoudspeakerStatus(&loudspeakerOn));
    EXPECT_FALSE(loudspeakerOn);
#endif

    EXPECT_EQ(0, audioDevice->StopRecording());
    EXPECT_EQ(0, audioDevice->StopPlayout());
    EXPECT_EQ(0, audioDevice->RegisterAudioCallback(NULL));

    _audioTransport->SetFullDuplex(false);

    TEST_LOG("\n");
    PRINT_TEST_RESULTS;

    return 0;
}

}  // namespace webrtc

// EOF
