diff --git a/webrtc/modules/audio_device/audio_device.gypi b/webrtc/modules/audio_device/audio_device.gypi index 6173c7b6e3..4684a09427 100644 --- a/webrtc/modules/audio_device/audio_device.gypi +++ b/webrtc/modules/audio_device/audio_device.gypi @@ -277,24 +277,6 @@ 'test/audio_device_test_defines.h', ], }, - { - 'target_name': 'audio_device_test_func', - 'type': 'executable', - 'dependencies': [ - 'audio_device', - 'webrtc_utility', - '<(webrtc_root)/common_audio/common_audio.gyp:common_audio', - '<(webrtc_root)/system_wrappers/system_wrappers.gyp:system_wrappers', - '<(webrtc_root)/test/test.gyp:test_support', - '<(DEPTH)/testing/gtest.gyp:gtest', - ], - 'sources': [ - 'test/audio_device_test_func.cc', - 'test/audio_device_test_defines.h', - 'test/func_test_manager.cc', - 'test/func_test_manager.h', - ], - }, ], # targets }], # include_tests==1 and OS!=ios ], diff --git a/webrtc/modules/audio_device/test/README.txt b/webrtc/modules/audio_device/test/README.txt deleted file mode 100644 index 7435ac5db9..0000000000 --- a/webrtc/modules/audio_device/test/README.txt +++ /dev/null @@ -1,23 +0,0 @@ -INSTRUCTIONS: - -- Start with test #3 (Device enumeration) to get an overview of the available - audio devices. -- Next, proceed with test #4 (Device selection) to get more details about - the supported functions for each audio device. -- Verify two-way audio in test #5. - Repeat this test for different selections of playout and recording devices. -- More detailed tests (volume, mute etc.) can also be performed using #6-#11. - -NOTE: - -- Some tests requires that the user opens up the audio mixer dialog and - verifies that a certain action (e.g. Mute ON/OFF) is executed correctly. -- Files can be recorded during some tests to enable off-line analysis. -- Full support of 'Default Communication' devices requires Windows 7. -- If a test consists of several sub tests, press any key to start a new sub test. - -KNOWN ISSUES: - -- Microphone Boost control is not supported on Windows Vista or Windows 7. -- Speaker and microphone volume controls will not work as intended on Windows - Vista if a 'Default Communication' device is selected in any direction. diff --git a/webrtc/modules/audio_device/test/audio_device_test_func.cc b/webrtc/modules/audio_device/test/audio_device_test_func.cc deleted file mode 100644 index fcbbb865de..0000000000 --- a/webrtc/modules/audio_device/test/audio_device_test_func.cc +++ /dev/null @@ -1,162 +0,0 @@ -/* - * 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 -#include "webrtc/modules/audio_device/test/audio_device_test_defines.h" -#include "webrtc/modules/audio_device/test/func_test_manager.h" - -#ifndef __GNUC__ -// Disable warning message 4996 ('scanf': This function or variable may be unsafe) -#pragma warning( disable : 4996 ) -#endif - -using namespace webrtc; - -int func_test(int); - -// ---------------------------------------------------------------------------- -// main() -// ---------------------------------------------------------------------------- - -#if !defined(WEBRTC_IOS) -int main(int /*argc*/, char* /*argv*/[]) -{ - func_test(0); -} -#endif - -// ---------------------------------------------------------------------------- -// func_test() -// ---------------------------------------------------------------------------- - -int func_test(int sel) -{ - TEST_LOG("=========================================\n"); - TEST_LOG("Func Test of the WebRtcAudioDevice Module\n"); - TEST_LOG("=========================================\n\n"); - - // Initialize the counters here to get rid of "unused variables" warnings. - warningCount = 0; - - FuncTestManager funcMgr; - - funcMgr.Init(); - - bool quit(false); - - while (!quit) - { - TEST_LOG("---------------------------------------\n"); - TEST_LOG("Select type of test\n\n"); - TEST_LOG(" (0) Quit\n"); - TEST_LOG(" (1) All\n"); - TEST_LOG("- - - - - - - - - - - - - - - - - - - -\n"); - TEST_LOG(" (2) Audio-layer selection\n"); - TEST_LOG(" (3) Device enumeration\n"); - TEST_LOG(" (4) Device selection\n"); - TEST_LOG(" (5) Audio transport\n"); - TEST_LOG(" (6) Speaker volume\n"); - TEST_LOG(" (7) Microphone volume\n"); - TEST_LOG(" (8) Speaker mute\n"); - TEST_LOG(" (9) Microphone mute\n"); - TEST_LOG(" (10) Microphone boost\n"); - TEST_LOG(" (11) Microphone AGC\n"); - TEST_LOG(" (12) Loopback measurements\n"); - TEST_LOG(" (13) Device removal\n"); - TEST_LOG(" (14) Advanced mobile device API\n"); - TEST_LOG(" (66) XTEST\n"); - TEST_LOG("- - - - - - - - - - - - - - - - - - - -\n"); - TEST_LOG("\n: "); - - int selection(0); - enum TestType testType(TTInvalid); - -SHOW_MENU: - - if (sel > 0) - { - selection = sel; - } - else - { - if (scanf("%d", &selection) < 0) { - perror("Failed to get selection."); - } - } - - switch (selection) - { - case 0: - quit = true; - break; - case 1: - testType = TTAll; - break; - case 2: - testType = TTAudioLayerSelection; - break; - case 3: - testType = TTDeviceEnumeration; - break; - case 4: - testType = TTDeviceSelection; - break; - case 5: - testType = TTAudioTransport; - break; - case 6: - testType = TTSpeakerVolume; - break; - case 7: - testType = TTMicrophoneVolume; - break; - case 8: - testType = TTSpeakerMute; - break; - case 9: - testType = TTMicrophoneMute; - break; - case 10: - testType = TTMicrophoneBoost; - break; - case 11: - testType = TTMicrophoneAGC; - break; - case 12: - testType = TTLoopback; - break; - case 13: - testType = TTDeviceRemoval; - break; - case 14: - testType = TTMobileAPI; - break; - case 66: - testType = TTTest; - break; - default: - testType = TTInvalid; - TEST_LOG(": "); - goto SHOW_MENU; - break; - } - - funcMgr.DoTest(testType); - - if (sel > 0) - { - quit = true; - } - } - - funcMgr.Close(); - - return 0; -} diff --git a/webrtc/modules/audio_device/test/func_test_manager.cc b/webrtc/modules/audio_device/test/func_test_manager.cc deleted file mode 100644 index da79688d8b..0000000000 --- a/webrtc/modules/audio_device/test/func_test_manager.cc +++ /dev/null @@ -1,2751 +0,0 @@ -/* - * 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 -#include -#include -#include - -#if defined(_WIN32) -#include -#elif defined(WEBRTC_LINUX) || defined(WEBRTC_MAC) -#include // 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) ? 0 : -1; - _playFile.CloseFile(); - return 0; -} - -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 size_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 size_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 size_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.is_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.is_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; -} - -void AudioTransportImpl::PushCaptureData(int voe_channel, - const void* audio_data, - int bits_per_sample, - int sample_rate, - size_t number_of_channels, - size_t number_of_frames) {} - -void AudioTransportImpl::PullRenderData(int bits_per_sample, - int sample_rate, - size_t 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 = AudioDeviceModule::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 PlatformThread (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 = AudioDeviceModule::Create( - 555, - AudioDeviceModule::kWindowsWaveAudio); - } else if (tryWinCore) - { - _audioDevice = AudioDeviceModule::Create( - 555, - AudioDeviceModule::kWindowsCoreAudio); - } - - if (_audioDevice == NULL) - { - TEST_LOG("\nERROR: Switch of audio layer failed!\n"); - // restore default audio layer instead - EXPECT_TRUE((_audioDevice = AudioDeviceModule::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 diff --git a/webrtc/modules/audio_device/test/func_test_manager.h b/webrtc/modules/audio_device/test/func_test_manager.h deleted file mode 100644 index d81bf03131..0000000000 --- a/webrtc/modules/audio_device/test/func_test_manager.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - * 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 -#include -#include - -#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/include/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; - size_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 size_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 size_t nChannels, - const uint32_t samplesPerSec, - void* audioSamples, - size_t& nSamplesOut, - int64_t* elapsed_time_ms, - int64_t* ntp_time_ms) override; - - void PushCaptureData(int voe_channel, - const void* audio_data, - int bits_per_sample, - int sample_rate, - size_t number_of_channels, - size_t number_of_frames) override; - - void PullRenderData(int bits_per_sample, - int sample_rate, - size_t 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 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; - - std::unique_ptr _processThread; - AudioDeviceModule* _audioDevice; - AudioEventObserver* _audioEventObserver; - AudioTransportImpl* _audioTransport; -}; - -} // namespace webrtc - -#endif // #ifndef WEBRTC_AUDIO_DEVICE_FUNC_TEST_MANAGER_H