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