| /* |
| * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #include <stdio.h> |
| #include <string.h> |
| |
| #include "audio_device_test_defines.h" |
| |
| #include "../source/audio_device_config.h" |
| #include "../source/audio_device_impl.h" |
| #include "../source/audio_device_utility.h" |
| |
| // Helper functions |
| #if defined(ANDROID) |
| char filenameStr[2][256] = |
| { 0}; // Allow two buffers for those API calls taking two filenames |
| int currentStr = 0; |
| |
| char* GetFilename(char* filename) |
| { |
| currentStr = !currentStr; |
| sprintf(filenameStr[currentStr], "/sdcard/admtest/%s", filename); |
| return filenameStr[currentStr]; |
| } |
| const char* GetFilename(const char* filename) |
| { |
| currentStr = !currentStr; |
| sprintf(filenameStr[currentStr], "/sdcard/admtest/%s", filename); |
| return filenameStr[currentStr]; |
| } |
| int GetResource(char* resource, char* dest, int destLen) |
| { |
| currentStr = !currentStr; |
| sprintf(filenameStr[currentStr], "/sdcard/admtest/%s", resource); |
| strncpy(dest, filenameStr[currentStr], destLen-1); |
| return 0; |
| } |
| char* GetResource(char* resource) |
| { |
| currentStr = !currentStr; |
| sprintf(filenameStr[currentStr], "/sdcard/admtest/%s", resource); |
| return filenameStr[currentStr]; |
| } |
| const char* GetResource(const char* resource) |
| { |
| currentStr = !currentStr; |
| sprintf(filenameStr[currentStr], "/sdcard/admtest/%s", resource); |
| return filenameStr[currentStr]; |
| } |
| #elif !defined(MAC_IPHONE) |
| 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 |
| |
| using namespace webrtc; |
| |
| // ---------------------------------------------------------------------------- |
| // AudioEventObserverAPI |
| // ---------------------------------------------------------------------------- |
| |
| class AudioEventObserverAPI: public AudioDeviceObserver |
| { |
| public: |
| AudioEventObserverAPI(AudioDeviceModule* audioDevice) : |
| _error(kRecordingError), |
| _warning(kRecordingWarning), |
| _audioDevice(audioDevice) |
| { |
| } |
| ; |
| ~AudioEventObserverAPI() |
| { |
| } |
| ; |
| virtual void OnErrorIsReported(const ErrorCode error) |
| { |
| TEST_LOG("\n[*** ERROR ***] => OnErrorIsReported(%d)\n\n", error); |
| _error = error; |
| // TEST(_audioDevice->StopRecording() == 0); |
| // TEST(_audioDevice->StopPlayout() == 0); |
| } |
| ; |
| virtual void OnWarningIsReported(const WarningCode warning) |
| { |
| TEST_LOG("\n[*** WARNING ***] => OnWarningIsReported(%d)\n\n", warning); |
| _warning = warning; |
| TEST(_audioDevice->StopRecording() == 0); |
| TEST(_audioDevice->StopPlayout() == 0); |
| } |
| ; |
| public: |
| ErrorCode _error; |
| WarningCode _warning; |
| private: |
| AudioDeviceModule* _audioDevice; |
| }; |
| |
| class AudioTransportAPI: public AudioTransport |
| { |
| public: |
| AudioTransportAPI(AudioDeviceModule* audioDevice) : |
| _audioDevice(audioDevice), _recCount(0), _playCount(0) |
| { |
| } |
| ; |
| |
| ~AudioTransportAPI() |
| { |
| } |
| ; |
| |
| virtual WebRtc_Word32 RecordedDataIsAvailable( |
| const WebRtc_Word8* audioSamples, |
| const WebRtc_UWord32 nSamples, |
| const WebRtc_UWord8 nBytesPerSample, |
| const WebRtc_UWord8 nChannels, |
| const WebRtc_UWord32 sampleRate, |
| const WebRtc_UWord32 totalDelay, |
| const WebRtc_Word32 clockSkew, |
| const WebRtc_UWord32 currentMicLevel, |
| WebRtc_UWord32& newMicLevel) |
| { |
| _recCount++; |
| if (_recCount % 100 == 0) |
| { |
| if (nChannels == 1) |
| { |
| // mono |
| TEST_LOG("-"); |
| } else if ((nChannels == 2) && (nBytesPerSample == 2)) |
| { |
| // stereo but only using one channel |
| TEST_LOG("-|"); |
| } else |
| { |
| // stereo |
| TEST_LOG("--"); |
| } |
| } |
| |
| return 0; |
| } |
| |
| virtual WebRtc_Word32 NeedMorePlayData(const WebRtc_UWord32 nSamples, |
| const WebRtc_UWord8 nBytesPerSample, |
| const WebRtc_UWord8 nChannels, |
| const WebRtc_UWord32 sampleRate, |
| WebRtc_Word8* audioSamples, |
| WebRtc_UWord32& nSamplesOut) |
| { |
| _playCount++; |
| if (_playCount % 100 == 0) |
| { |
| if (nChannels == 1) |
| { |
| TEST_LOG("+"); |
| } else |
| { |
| TEST_LOG("++"); |
| } |
| } |
| |
| nSamplesOut = 480; |
| |
| return 0; |
| } |
| ; |
| private: |
| AudioDeviceModule* _audioDevice; |
| WebRtc_UWord32 _recCount; |
| WebRtc_UWord32 _playCount; |
| }; |
| |
| int api_test(); |
| |
| |
| #if !defined(MAC_IPHONE) && !defined(ANDROID) |
| int api_test(); |
| |
| int main(int /*argc*/, char* /*argv*/[]) |
| { |
| api_test(); |
| } |
| #endif |
| |
| int api_test() |
| { |
| int i(0); |
| |
| TEST_LOG("========================================\n"); |
| TEST_LOG("API Test of the WebRtcAudioDevice Module\n"); |
| TEST_LOG("========================================\n\n"); |
| |
| ProcessThread* processThread = ProcessThread::CreateProcessThread(); |
| processThread->Start(); |
| |
| // ======================================================= |
| // AudioDeviceModuleImpl::Create |
| // |
| // Windows: |
| // if (WEBRTC_WINDOWS_CORE_AUDIO_BUILD) |
| // user can select between default (Core) or Wave |
| // else |
| // user can select between default (Wave) or Wave |
| // ======================================================= |
| |
| const WebRtc_Word32 myId = 444; |
| AudioDeviceModule* audioDevice(NULL); |
| |
| #if defined(_WIN32) |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kLinuxAlsaAudio)) == NULL); |
| #if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) |
| TEST_LOG("WEBRTC_WINDOWS_CORE_AUDIO_BUILD is defined!\n\n"); |
| // create default implementation (=Core Audio) instance |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL); |
| audioDevice->AddRef(); |
| TEST(audioDevice->Release() == 0); |
| // create non-default (=Wave Audio) instance |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kWindowsWaveAudio)) != NULL); |
| audioDevice->AddRef(); |
| TEST(audioDevice->Release() == 0); |
| // explicitly specify usage of Core Audio (same as default) |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kWindowsCoreAudio)) != NULL); |
| #else |
| TEST_LOG("WEBRTC_WINDOWS_CORE_AUDIO_BUILD is *not* defined!\n"); |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kWindowsCoreAudio)) == NULL); |
| // create default implementation (=Wave Audio) instance |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL); |
| audioDevice->AddRef(); |
| TEST(audioDevice->Release() == 0); |
| // explicitly specify usage of Wave Audio (same as default) |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kWindowsWaveAudio)) != NULL); |
| #endif |
| #endif |
| |
| #if defined(ANDROID) |
| // Fails tests |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kWindowsWaveAudio)) == NULL); |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kWindowsCoreAudio)) == NULL); |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kLinuxAlsaAudio)) == NULL); |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kLinuxPulseAudio)) == NULL); |
| // Create default implementation instance |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL); |
| #elif defined(WEBRTC_LINUX) |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kWindowsWaveAudio)) == NULL); |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kWindowsCoreAudio)) == NULL); |
| // create default implementation instance |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL); |
| audioDevice->AddRef(); |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Release() == 0); |
| // explicitly specify usage of Pulse Audio (same as default) |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kLinuxPulseAudio)) != NULL); |
| #endif |
| |
| #if defined(WEBRTC_MAC) |
| // Fails tests |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kWindowsWaveAudio)) == NULL); |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kWindowsCoreAudio)) == NULL); |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kLinuxAlsaAudio)) == NULL); |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kLinuxPulseAudio)) == NULL); |
| // Create default implementation instance |
| TEST((audioDevice = AudioDeviceModuleImpl::Create( |
| myId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL); |
| #endif |
| |
| if (audioDevice == NULL) |
| { |
| #ifdef _WIN32 |
| goto Exit; |
| #else |
| TEST_LOG("Failed creating audio device object! \n"); |
| return 0; |
| #endif |
| } |
| |
| // The ADM is reference counted. |
| audioDevice->AddRef(); |
| |
| processThread->RegisterModule(audioDevice); |
| |
| AudioDeviceModule::AudioLayer audioLayer = |
| AudioDeviceModule::kPlatformDefaultAudio; |
| TEST(audioDevice->ActiveAudioLayer(&audioLayer) == 0); |
| if (audioLayer == AudioDeviceModule::kLinuxAlsaAudio) { |
| TEST_LOG("API Test is not available on ALSA. \n"); |
| processThread->DeRegisterModule(audioDevice); |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Release() == 0); |
| return 0; |
| } |
| |
| TEST_LOG("Testing...\n\n"); |
| |
| // ===================== |
| // RegisterEventObserver |
| // ===================== |
| |
| AudioEventObserverAPI* eventObserver = |
| new AudioEventObserverAPI(audioDevice); |
| |
| TEST(audioDevice->RegisterEventObserver(NULL) == 0); |
| TEST(audioDevice->RegisterEventObserver(eventObserver) == 0); |
| TEST(audioDevice->RegisterEventObserver(NULL) == 0); |
| |
| // ===================== |
| // RegisterAudioCallback |
| // ===================== |
| |
| AudioTransportAPI* audioTransport = new AudioTransportAPI(audioDevice); |
| |
| TEST(audioDevice->RegisterAudioCallback(NULL) == 0); |
| TEST(audioDevice->RegisterAudioCallback(audioTransport) == 0); |
| TEST(audioDevice->RegisterAudioCallback(NULL) == 0); |
| |
| // ==== |
| // Init |
| // ==== |
| |
| TEST(audioDevice->Init() == 0); |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->Init() == 0); |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Initialized() == false); |
| TEST(audioDevice->Init() == 0); |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Initialized() == false); |
| |
| // ========= |
| // Terminate |
| // ========= |
| |
| TEST(audioDevice->Init() == 0); |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Initialized() == false); |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Initialized() == false); |
| TEST(audioDevice->Init() == 0); |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Initialized() == false); |
| |
| // ------------------------------------------------------------------------ |
| // Ensure that we keep audio device initialized for all API tests: |
| // |
| TEST(audioDevice->Init() == 0); |
| // ------------------------------------------------------------------------ |
| |
| // goto SHORTCUT; |
| |
| WebRtc_Word16 nDevices(0); |
| |
| // ============== |
| // PlayoutDevices |
| // ============== |
| |
| TEST((nDevices = audioDevice->PlayoutDevices()) > 0); |
| TEST((nDevices = audioDevice->PlayoutDevices()) > 0); |
| |
| // ================ |
| // RecordingDevices |
| // ================ |
| |
| TEST((nDevices = audioDevice->RecordingDevices()) > 0); |
| TEST((nDevices = audioDevice->RecordingDevices()) > 0); |
| |
| // ================= |
| // PlayoutDeviceName |
| // ================= |
| |
| WebRtc_Word8 name[kAdmMaxDeviceNameSize]; |
| WebRtc_Word8 guid[kAdmMaxGuidSize]; |
| |
| nDevices = audioDevice->PlayoutDevices(); |
| |
| // fail tests |
| TEST(audioDevice->PlayoutDeviceName(-2, name, guid) == -1); |
| TEST(audioDevice->PlayoutDeviceName(nDevices, name, guid) == -1); |
| TEST(audioDevice->PlayoutDeviceName(0, NULL, guid) == -1); |
| |
| // bulk tests |
| TEST(audioDevice->PlayoutDeviceName(0, name, NULL) == 0); |
| #ifdef _WIN32 |
| TEST(audioDevice->PlayoutDeviceName(-1, name, NULL) == 0); // shall be mapped to 0 |
| #else |
| TEST(audioDevice->PlayoutDeviceName(-1, name, NULL) == -1); |
| #endif |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->PlayoutDeviceName(i, name, guid) == 0); |
| TEST(audioDevice->PlayoutDeviceName(i, name, NULL) == 0); |
| } |
| |
| // =================== |
| // RecordingDeviceName |
| // =================== |
| |
| nDevices = audioDevice->RecordingDevices(); |
| |
| // fail tests |
| TEST(audioDevice->RecordingDeviceName(-2, name, guid) == -1); |
| TEST(audioDevice->RecordingDeviceName(nDevices, name, guid) == -1); |
| TEST(audioDevice->RecordingDeviceName(0, NULL, guid) == -1); |
| |
| // bulk tests |
| TEST(audioDevice->RecordingDeviceName(0, name, NULL) == 0); |
| #ifdef _WIN32 |
| TEST(audioDevice->RecordingDeviceName(-1, name, NULL) == 0); // shall me mapped to 0 |
| #else |
| TEST(audioDevice->RecordingDeviceName(-1, name, NULL) == -1); |
| #endif |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->RecordingDeviceName(i, name, guid) == 0); |
| TEST(audioDevice->RecordingDeviceName(i, name, NULL) == 0); |
| } |
| |
| // ================ |
| // SetPlayoutDevice |
| // ================ |
| |
| nDevices = audioDevice->PlayoutDevices(); |
| |
| // fail tests |
| TEST(audioDevice->SetPlayoutDevice(-1) == -1); |
| TEST(audioDevice->SetPlayoutDevice(nDevices) == -1); |
| |
| // bulk tests |
| #ifdef _WIN32 |
| TEST(audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice) == 0); |
| #else |
| TEST(audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultCommunicationDevice) == -1); |
| TEST(audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice) == -1); |
| #endif |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetPlayoutDevice(i) == 0); |
| } |
| |
| // ================== |
| // SetRecordingDevice |
| // ================== |
| |
| nDevices = audioDevice->RecordingDevices(); |
| |
| // fail tests |
| TEST(audioDevice->SetRecordingDevice(-1) == -1); |
| TEST(audioDevice->SetRecordingDevice(nDevices) == -1); |
| |
| // bulk tests |
| #ifdef _WIN32 |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->SetRecordingDevice(AudioDeviceModule::kDefaultDevice) == 0); |
| #else |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == -1); |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultDevice) == -1); |
| #endif |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetRecordingDevice(i) == 0); |
| } |
| |
| // ================== |
| // PlayoutIsAvailable |
| // ================== |
| |
| bool available(false); |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| #ifdef _WIN32 |
| TEST(audioDevice->SetPlayoutDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == false); // availability check should not initialize |
| |
| TEST(audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice) == 0); |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| #endif |
| |
| nDevices = audioDevice->PlayoutDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetPlayoutDevice(i) == 0); |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| } |
| |
| // ==================== |
| // RecordingIsAvailable |
| // ==================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| #ifdef _WIN32 |
| TEST(audioDevice->SetRecordingDevice(AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| |
| TEST(audioDevice->SetRecordingDevice(AudioDeviceModule::kDefaultDevice) == 0); |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| #endif |
| |
| nDevices = audioDevice->RecordingDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetRecordingDevice(i) == 0); |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| } |
| |
| // =========== |
| // InitPlayout |
| // =========== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial state |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| |
| // ensure that device must be set before we can initialize |
| TEST(audioDevice->InitPlayout() == -1); |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == true); |
| |
| // bulk tests |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == true); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == -1); |
| TEST(audioDevice->StopPlayout() == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| } |
| |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitPlayout() == 0); |
| // Sleep is needed for e.g. iPhone since we after stopping then starting may |
| // have a hangover time of a couple of ms before initialized. |
| AudioDeviceUtility::Sleep(50); |
| TEST(audioDevice->PlayoutIsInitialized() == true); |
| } |
| |
| nDevices = audioDevice->PlayoutDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->StopPlayout() == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->SetPlayoutDevice(i) == 0); |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == true); |
| } |
| } |
| } |
| |
| TEST(audioDevice->StopPlayout() == 0); |
| |
| // ============= |
| // InitRecording |
| // ============= |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial state |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| |
| // ensure that device must be set before we can initialize |
| TEST(audioDevice->InitRecording() == -1); |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->RecordingIsInitialized() == true); |
| |
| // bulk tests |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->RecordingIsInitialized() == true); |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == -1); |
| TEST(audioDevice->StopRecording() == 0); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| } |
| |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitRecording() == 0); |
| AudioDeviceUtility::Sleep(50); |
| TEST(audioDevice->RecordingIsInitialized() == true); |
| } |
| |
| nDevices = audioDevice->RecordingDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->StopRecording() == 0); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->SetRecordingDevice(i) == 0); |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->RecordingIsInitialized() == true); |
| } |
| } |
| } |
| |
| TEST(audioDevice->StopRecording() == 0); |
| |
| // ============ |
| // StartPlayout |
| // StopPlayout |
| // ============ |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| TEST(audioDevice->RegisterAudioCallback(NULL) == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| |
| TEST(audioDevice->StartPlayout() == -1); |
| TEST(audioDevice->StopPlayout() == 0); |
| |
| #ifdef _WIN32 |
| // kDefaultCommunicationDevice |
| TEST(audioDevice->SetPlayoutDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->StartPlayout() == 0); |
| TEST(audioDevice->Playing() == true); |
| TEST(audioDevice->RegisterAudioCallback(audioTransport) == 0); |
| TEST(audioDevice->StopPlayout() == 0); |
| TEST(audioDevice->Playing() == false); |
| TEST(audioDevice->RegisterAudioCallback(NULL) == 0); |
| } |
| #endif |
| |
| // repeat test but for kDefaultDevice |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->StartPlayout() == 0); |
| TEST(audioDevice->Playing() == true); |
| TEST(audioDevice->RegisterAudioCallback(audioTransport) == 0); |
| TEST(audioDevice->StopPlayout() == 0); |
| TEST(audioDevice->Playing() == false); |
| } |
| |
| // repeat test for all devices |
| nDevices = audioDevice->PlayoutDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetPlayoutDevice(i) == 0); |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->StartPlayout() == 0); |
| TEST(audioDevice->Playing() == true); |
| TEST(audioDevice->RegisterAudioCallback(audioTransport) == 0); |
| TEST(audioDevice->StopPlayout() == 0); |
| TEST(audioDevice->Playing() == false); |
| } |
| } |
| |
| // ============== |
| // StartRecording |
| // StopRecording |
| // ============== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| TEST(audioDevice->RegisterAudioCallback(NULL) == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| |
| TEST(audioDevice->StartRecording() == -1); |
| TEST(audioDevice->StopRecording() == 0); |
| |
| #ifdef _WIN32 |
| // kDefaultCommunicationDevice |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->StartRecording() == 0); |
| TEST(audioDevice->Recording() == true); |
| TEST(audioDevice->RegisterAudioCallback(audioTransport) == 0); |
| TEST(audioDevice->StopRecording() == 0); |
| TEST(audioDevice->Recording() == false); |
| TEST(audioDevice->RegisterAudioCallback(NULL) == 0); |
| } |
| #endif |
| |
| // repeat test but for kDefaultDevice |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->StartRecording() == 0); |
| TEST(audioDevice->Recording() == true); |
| TEST(audioDevice->RegisterAudioCallback(audioTransport) == 0); |
| TEST(audioDevice->StopRecording() == 0); |
| TEST(audioDevice->Recording() == false); |
| } |
| |
| // repeat test for all devices |
| nDevices = audioDevice->RecordingDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetRecordingDevice(i) == 0); |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->StartRecording() == 0); |
| TEST(audioDevice->Recording() == true); |
| TEST(audioDevice->RegisterAudioCallback(audioTransport) == 0); |
| TEST(audioDevice->StopRecording() == 0); |
| TEST(audioDevice->Recording() == false); |
| } |
| } |
| |
| WebRtc_UWord32 vol(0); |
| |
| #if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) |
| |
| // ================ |
| // SetWaveOutVolume |
| // GetWaveOutVolume |
| // ================ |
| |
| // NOTE 1: Windows Wave only! |
| // NOTE 2: It seems like the waveOutSetVolume API returns |
| // MMSYSERR_NOTSUPPORTED on some Vista machines! |
| |
| const WebRtc_UWord16 maxVol(0xFFFF); |
| WebRtc_UWord16 volL, volR; |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| |
| // make dummy test to see if this API is supported |
| WebRtc_Word32 works = audioDevice->SetWaveOutVolume(vol, vol); |
| WARNING(works == 0); |
| |
| if (works == 0) |
| { |
| // set volume without open playout device |
| for (vol = 0; vol <= maxVol; vol += (maxVol/5)) |
| { |
| TEST(audioDevice->SetWaveOutVolume(vol, vol) == 0); |
| TEST(audioDevice->WaveOutVolume(volL, volR) == 0); |
| TEST((volL==vol) && (volR==vol)); |
| } |
| |
| // repeat test but this time with an open (default) output device |
| TEST(audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice) == 0); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == true); |
| for (vol = 0; vol <= maxVol; vol += (maxVol/5)) |
| { |
| TEST(audioDevice->SetWaveOutVolume(vol, vol) == 0); |
| TEST(audioDevice->WaveOutVolume(volL, volR) == 0); |
| TEST((volL==vol) && (volR==vol)); |
| } |
| |
| // as above but while playout is active |
| TEST(audioDevice->StartPlayout() == 0); |
| TEST(audioDevice->Playing() == true); |
| for (vol = 0; vol <= maxVol; vol += (maxVol/5)) |
| { |
| TEST(audioDevice->SetWaveOutVolume(vol, vol) == 0); |
| TEST(audioDevice->WaveOutVolume(volL, volR) == 0); |
| TEST((volL==vol) && (volR==vol)); |
| } |
| } |
| |
| TEST(audioDevice->StopPlayout() == 0); |
| TEST(audioDevice->Playing() == false); |
| |
| #endif // defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) |
| // ================== |
| // SpeakerIsAvailable |
| // ================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| |
| #ifdef _WIN32 |
| // check the kDefaultCommunicationDevice |
| TEST(audioDevice->SetPlayoutDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->SpeakerIsAvailable(&available) == 0); |
| // check for availability should not lead to initialization |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| #endif |
| |
| // check the kDefaultDevice |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->SpeakerIsAvailable(&available) == 0); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| |
| // check all availiable devices |
| nDevices = audioDevice->PlayoutDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetPlayoutDevice(i) == 0); |
| TEST(audioDevice->SpeakerIsAvailable(&available) == 0); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| } |
| |
| // =========== |
| // InitSpeaker |
| // =========== |
| |
| // NOTE: we call Terminate followed by Init to ensure that any existing output mixer |
| // handle is set to NULL. The mixer handle is closed and reopend again for each call to |
| // SetPlayoutDevice. |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| |
| // kDefaultCommunicationDevice |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->SpeakerIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| } |
| |
| // fail tests |
| TEST(audioDevice->PlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->StartPlayout() == 0); |
| TEST(audioDevice->InitSpeaker() == -1); |
| TEST(audioDevice->StopPlayout() == 0); |
| } |
| |
| // kDefaultDevice |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->SpeakerIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| } |
| |
| // repeat test for all devices |
| nDevices = audioDevice->PlayoutDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetPlayoutDevice(i) == 0); |
| TEST(audioDevice->SpeakerIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| } |
| } |
| |
| // ===================== |
| // MicrophoneIsAvailable |
| // ===================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| #ifdef _WIN32 |
| // check the kDefaultCommunicationDevice |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->MicrophoneIsAvailable(&available) == 0); |
| // check for availability should not lead to initialization |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| #endif |
| |
| // check the kDefaultDevice |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->MicrophoneIsAvailable(&available) == 0); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| // check all availiable devices |
| nDevices = audioDevice->RecordingDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetRecordingDevice(i) == 0); |
| TEST(audioDevice->MicrophoneIsAvailable(&available) == 0); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| } |
| |
| // ============== |
| // InitMicrophone |
| // ============== |
| |
| // NOTE: we call Terminate followed by Init to ensure that any existing input mixer |
| // handle is set to NULL. The mixer handle is closed and reopend again for each call to |
| // SetRecordingDevice. |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| // kDefaultCommunicationDevice |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->MicrophoneIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| } |
| |
| // fail tests |
| TEST(audioDevice->RecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->StartRecording() == 0); |
| TEST(audioDevice->InitMicrophone() == -1); |
| TEST(audioDevice->StopRecording() == 0); |
| } |
| |
| // kDefaultDevice |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->MicrophoneIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| } |
| |
| // repeat test for all devices |
| nDevices = audioDevice->RecordingDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetRecordingDevice(i) == 0); |
| TEST(audioDevice->MicrophoneIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| } |
| } |
| |
| // ======================== |
| // SpeakerVolumeIsAvailable |
| // ======================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| |
| #ifdef _WIN32 |
| // check the kDefaultCommunicationDevice |
| TEST(audioDevice->SetPlayoutDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->SpeakerVolumeIsAvailable(&available) == 0); |
| // check for availability should not lead to initialization |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| #endif |
| |
| // check the kDefaultDevice |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->SpeakerVolumeIsAvailable(&available) == 0); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| |
| // check all availiable devices |
| nDevices = audioDevice->PlayoutDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetPlayoutDevice(i) == 0); |
| TEST(audioDevice->SpeakerVolumeIsAvailable(&available) == 0); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| } |
| |
| // ================ |
| // SetSpeakerVolume |
| // SpeakerVolume |
| // MaxSpeakerVolume |
| // MinSpeakerVolume |
| // ================ |
| |
| WebRtc_UWord32 volume(0); |
| WebRtc_UWord32 maxVolume(0); |
| WebRtc_UWord32 minVolume(0); |
| WebRtc_UWord16 stepSize(0); |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| |
| // fail tests |
| TEST(audioDevice->SetSpeakerVolume(0) == -1); // speaker must be initialized first |
| TEST(audioDevice->SpeakerVolume(&volume) == -1); |
| TEST(audioDevice->MaxSpeakerVolume(&maxVolume) == -1); |
| TEST(audioDevice->MinSpeakerVolume(&minVolume) == -1); |
| TEST(audioDevice->SpeakerVolumeStepSize(&stepSize) == -1); |
| |
| #if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) |
| // test for warning (can e.g. happen on Vista with Wave API) |
| TEST(audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice) == 0); |
| TEST(audioDevice->SpeakerVolumeIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| TEST(audioDevice->SetSpeakerVolume(19001) == 0); |
| TEST(audioDevice->SpeakerVolume(&volume) == 0); |
| WARNING(volume == 19001); |
| } |
| #endif |
| |
| #ifdef _WIN32 |
| // use kDefaultCommunicationDevice and modify/retrieve the volume |
| TEST(audioDevice->SetPlayoutDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->SpeakerVolumeIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| TEST(audioDevice->MaxSpeakerVolume(&maxVolume) == 0); |
| TEST(audioDevice->MinSpeakerVolume(&minVolume) == 0); |
| TEST(audioDevice->SpeakerVolumeStepSize(&stepSize) == 0); |
| for (vol = minVolume; vol < (int)maxVolume; vol += 20*stepSize) |
| { |
| TEST(audioDevice->SetSpeakerVolume(vol) == 0); |
| TEST(audioDevice->SpeakerVolume(&volume) == 0); |
| TEST((volume == vol) || (volume == vol-1)); |
| } |
| } |
| #endif |
| |
| // use kDefaultDevice and modify/retrieve the volume |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->SpeakerVolumeIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| TEST(audioDevice->MaxSpeakerVolume(&maxVolume) == 0); |
| TEST(audioDevice->MinSpeakerVolume(&minVolume) == 0); |
| TEST(audioDevice->SpeakerVolumeStepSize(&stepSize) == 0); |
| WebRtc_UWord32 step = (maxVolume - minVolume) / 10; |
| step = (step < stepSize ? stepSize : step); |
| for (vol = minVolume; vol <= maxVolume; vol += step) |
| { |
| TEST(audioDevice->SetSpeakerVolume(vol) == 0); |
| TEST(audioDevice->SpeakerVolume(&volume) == 0); |
| TEST((volume == vol) || (volume == vol-1)); |
| } |
| } |
| |
| // use all (indexed) devices and modify/retrieve the volume |
| nDevices = audioDevice->PlayoutDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetPlayoutDevice(i) == 0); |
| TEST(audioDevice->SpeakerVolumeIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| TEST(audioDevice->MaxSpeakerVolume(&maxVolume) == 0); |
| TEST(audioDevice->MinSpeakerVolume(&minVolume) == 0); |
| TEST(audioDevice->SpeakerVolumeStepSize(&stepSize) == 0); |
| WebRtc_UWord32 step = (maxVolume - minVolume) / 10; |
| step = (step < stepSize ? stepSize : step); |
| for (vol = minVolume; vol <= maxVolume; vol += step) |
| { |
| TEST(audioDevice->SetSpeakerVolume(vol) == 0); |
| TEST(audioDevice->SpeakerVolume(&volume) == 0); |
| TEST((volume == vol) || (volume == vol-1)); |
| } |
| } |
| } |
| |
| // restore reasonable level |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->SpeakerVolumeIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| TEST(audioDevice->MaxSpeakerVolume(&maxVolume) == 0); |
| TEST(audioDevice->SetSpeakerVolume(maxVolume < 10 ? |
| maxVolume/3 : maxVolume/10) == 0); |
| } |
| |
| // ====== |
| // SetAGC |
| // AGC |
| // ====== |
| |
| // NOTE: The AGC API only enables/disables the AGC. To ensure that it will |
| // have an effect, use it in combination with MicrophoneVolumeIsAvailable. |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| TEST(audioDevice->AGC() == false); |
| |
| // set/get tests |
| TEST(audioDevice->SetAGC(true) == 0); |
| TEST(audioDevice->AGC() == true); |
| TEST(audioDevice->SetAGC(false) == 0); |
| TEST(audioDevice->AGC() == false); |
| |
| // =========================== |
| // MicrophoneVolumeIsAvailable |
| // =========================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| #ifdef _WIN32 |
| // check the kDefaultCommunicationDevice |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->MicrophoneVolumeIsAvailable(&available) == 0); |
| // check for availability should not lead to initialization |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| #endif |
| |
| // check the kDefaultDevice |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->MicrophoneVolumeIsAvailable(&available) == 0); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| // check all availiable devices |
| nDevices = audioDevice->RecordingDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetRecordingDevice(i) == 0); |
| TEST(audioDevice->MicrophoneVolumeIsAvailable(&available) == 0); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| } |
| |
| // =================== |
| // SetMicrophoneVolume |
| // MicrophoneVolume |
| // MaxMicrophoneVolume |
| // MinMicrophoneVolume |
| // =================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| // fail tests |
| TEST(audioDevice->SetMicrophoneVolume(0) == -1); // must be initialized first |
| TEST(audioDevice->MicrophoneVolume(&volume) == -1); |
| TEST(audioDevice->MaxMicrophoneVolume(&maxVolume) == -1); |
| TEST(audioDevice->MinMicrophoneVolume(&minVolume) == -1); |
| TEST(audioDevice->MicrophoneVolumeStepSize(&stepSize) == -1); |
| |
| #if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) |
| // test for warning (can e.g. happen on Vista with Wave API) |
| TEST(audioDevice->SetRecordingDevice(AudioDeviceModule::kDefaultDevice) == 0); |
| TEST(audioDevice->MicrophoneVolumeIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->SetMicrophoneVolume(19001) == 0); |
| TEST(audioDevice->MicrophoneVolume(&volume) == 0); |
| WARNING(volume == 19001); |
| } |
| #endif |
| |
| #ifdef _WIN32 |
| // initialize kDefaultCommunicationDevice and modify/retrieve the volume |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->MicrophoneVolumeIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->MaxMicrophoneVolume(&maxVolume) == 0); |
| TEST(audioDevice->MinMicrophoneVolume(&minVolume) == 0); |
| TEST(audioDevice->MicrophoneVolumeStepSize(&stepSize) == 0); |
| for (vol = minVolume; vol < (int)maxVolume; vol += 10*stepSize) |
| { |
| TEST(audioDevice->SetMicrophoneVolume(vol) == 0); |
| TEST(audioDevice->MicrophoneVolume(&volume) == 0); |
| TEST((volume == vol) || (volume == vol-1)); |
| } |
| } |
| #endif |
| |
| // reinitialize kDefaultDevice and modify/retrieve the volume |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->MicrophoneVolumeIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->MaxMicrophoneVolume(&maxVolume) == 0); |
| TEST(audioDevice->MinMicrophoneVolume(&minVolume) == 0); |
| TEST(audioDevice->MicrophoneVolumeStepSize(&stepSize) == 0); |
| for (vol = minVolume; vol < maxVolume; vol += 10 * stepSize) |
| { |
| TEST(audioDevice->SetMicrophoneVolume(vol) == 0); |
| TEST(audioDevice->MicrophoneVolume(&volume) == 0); |
| TEST((volume == vol) || (volume == vol-1)); |
| } |
| } |
| |
| // use all (indexed) devices and modify/retrieve the volume |
| nDevices = audioDevice->RecordingDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetRecordingDevice(i) == 0); |
| TEST(audioDevice->MicrophoneVolumeIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->MaxMicrophoneVolume(&maxVolume) == 0); |
| TEST(audioDevice->MinMicrophoneVolume(&minVolume) == 0); |
| TEST(audioDevice->MicrophoneVolumeStepSize(&stepSize) == 0); |
| for (vol = minVolume; vol < maxVolume; vol += 20 * stepSize) |
| { |
| TEST(audioDevice->SetMicrophoneVolume(vol) == 0); |
| TEST(audioDevice->MicrophoneVolume(&volume) == 0); |
| TEST((volume == vol) || (volume == vol-1)); |
| } |
| } |
| } |
| |
| // restore reasonable level |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->MicrophoneVolumeIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->MaxMicrophoneVolume(&maxVolume) == 0); |
| TEST(audioDevice->SetMicrophoneVolume(maxVolume/10) == 0); |
| } |
| |
| // ====================== |
| // SpeakerMuteIsAvailable |
| // ====================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| |
| #ifdef _WIN32 |
| // check the kDefaultCommunicationDevice |
| TEST(audioDevice->SetPlayoutDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->SpeakerMuteIsAvailable(&available) == 0); |
| // check for availability should not lead to initialization |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| #endif |
| |
| // check the kDefaultDevice |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->SpeakerMuteIsAvailable(&available) == 0); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| |
| // check all availiable devices |
| nDevices = audioDevice->PlayoutDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetPlayoutDevice(i) == 0); |
| TEST(audioDevice->SpeakerMuteIsAvailable(&available) == 0); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| } |
| |
| // ========================= |
| // MicrophoneMuteIsAvailable |
| // ========================= |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| #ifdef _WIN32 |
| // check the kDefaultCommunicationDevice |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->MicrophoneMuteIsAvailable(&available) == 0); |
| // check for availability should not lead to initialization |
| #endif |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| // check the kDefaultDevice |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->MicrophoneMuteIsAvailable(&available) == 0); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| // check all availiable devices |
| nDevices = audioDevice->RecordingDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetRecordingDevice(i) == 0); |
| TEST(audioDevice->MicrophoneMuteIsAvailable(&available) == 0); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| } |
| |
| // ========================== |
| // MicrophoneBoostIsAvailable |
| // ========================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| #ifdef _WIN32 |
| // check the kDefaultCommunicationDevice |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->MicrophoneBoostIsAvailable(&available) == 0); |
| // check for availability should not lead to initialization |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| #endif |
| |
| // check the kDefaultDevice |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->MicrophoneBoostIsAvailable(&available) == 0); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| // check all availiable devices |
| nDevices = audioDevice->RecordingDevices(); |
| for (i = 0; i < nDevices; i++) |
| { |
| TEST(audioDevice->SetRecordingDevice(i) == 0); |
| TEST(audioDevice->MicrophoneBoostIsAvailable(&available) == 0); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| } |
| |
| // ============== |
| // SetSpeakerMute |
| // SpeakerMute |
| // ============== |
| |
| bool enabled(false); |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| TEST(audioDevice->SpeakerIsInitialized() == false); |
| |
| // fail tests |
| TEST(audioDevice->SetSpeakerMute(true) == -1); // requires initialization |
| TEST(audioDevice->SpeakerMute(&enabled) == -1); |
| |
| #ifdef _WIN32 |
| // initialize kDefaultCommunicationDevice and modify/retrieve the mute state |
| TEST(audioDevice->SetPlayoutDevice(AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->SpeakerMuteIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| TEST(audioDevice->SetSpeakerMute(true) == 0); |
| TEST(audioDevice->SpeakerMute(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetSpeakerMute(false) == 0); |
| TEST(audioDevice->SpeakerMute(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| #endif |
| |
| // reinitialize kDefaultDevice and modify/retrieve the mute state |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->SpeakerMuteIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| TEST(audioDevice->SetSpeakerMute(true) == 0); |
| TEST(audioDevice->SpeakerMute(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetSpeakerMute(false) == 0); |
| TEST(audioDevice->SpeakerMute(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| |
| // reinitialize the default device (0) and modify/retrieve the mute state |
| TEST(audioDevice->SetPlayoutDevice(0) == 0); |
| TEST(audioDevice->SpeakerMuteIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitSpeaker() == 0); |
| TEST(audioDevice->SetSpeakerMute(true) == 0); |
| TEST(audioDevice->SpeakerMute(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetSpeakerMute(false) == 0); |
| TEST(audioDevice->SpeakerMute(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| |
| // ================== |
| // SetMicrophoneMute |
| // MicrophoneMute |
| // ================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| // fail tests |
| TEST(audioDevice->SetMicrophoneMute(true) == -1); // requires initialization |
| TEST(audioDevice->MicrophoneMute(&enabled) == -1); |
| |
| #ifdef _WIN32 |
| // initialize kDefaultCommunicationDevice and modify/retrieve the mute |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->MicrophoneMuteIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->SetMicrophoneMute(true) == 0); |
| TEST(audioDevice->MicrophoneMute(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetMicrophoneMute(false) == 0); |
| TEST(audioDevice->MicrophoneMute(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| #endif |
| |
| // reinitialize kDefaultDevice and modify/retrieve the mute |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->MicrophoneMuteIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->SetMicrophoneMute(true) == 0); |
| TEST(audioDevice->MicrophoneMute(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetMicrophoneMute(false) == 0); |
| TEST(audioDevice->MicrophoneMute(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| |
| // reinitialize the default device (0) and modify/retrieve the Mute |
| TEST(audioDevice->SetRecordingDevice(0) == 0); |
| TEST(audioDevice->MicrophoneMuteIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->SetMicrophoneMute(true) == 0); |
| TEST(audioDevice->MicrophoneMute(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetMicrophoneMute(false) == 0); |
| TEST(audioDevice->MicrophoneMute(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| |
| // ================== |
| // SetMicrophoneBoost |
| // MicrophoneBoost |
| // ================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| TEST(audioDevice->MicrophoneIsInitialized() == false); |
| |
| // fail tests |
| TEST(audioDevice->SetMicrophoneBoost(true) == -1); // requires initialization |
| TEST(audioDevice->MicrophoneBoost(&enabled) == -1); |
| |
| #ifdef _WIN32 |
| // initialize kDefaultCommunicationDevice and modify/retrieve the boost |
| TEST(audioDevice->SetRecordingDevice( |
| AudioDeviceModule::kDefaultCommunicationDevice) == 0); |
| TEST(audioDevice->MicrophoneBoostIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->SetMicrophoneBoost(true) == 0); |
| TEST(audioDevice->MicrophoneBoost(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetMicrophoneBoost(false) == 0); |
| TEST(audioDevice->MicrophoneBoost(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| #endif |
| |
| // reinitialize kDefaultDevice and modify/retrieve the boost |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->MicrophoneBoostIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->SetMicrophoneBoost(true) == 0); |
| TEST(audioDevice->MicrophoneBoost(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetMicrophoneBoost(false) == 0); |
| TEST(audioDevice->MicrophoneBoost(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| |
| // reinitialize the default device (0) and modify/retrieve the boost |
| TEST(audioDevice->SetRecordingDevice(0) == 0); |
| TEST(audioDevice->MicrophoneBoostIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->InitMicrophone() == 0); |
| TEST(audioDevice->SetMicrophoneBoost(true) == 0); |
| TEST(audioDevice->MicrophoneBoost(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetMicrophoneBoost(false) == 0); |
| TEST(audioDevice->MicrophoneBoost(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| |
| // ================ |
| // SetStereoPlayout |
| // StereoPlayout |
| // ================ |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| |
| // fail tests |
| TEST(audioDevice->InitPlayout() == -1); |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == true); |
| // must be performed before initialization |
| TEST(audioDevice->SetStereoPlayout(true) == -1); |
| |
| // ensure that we can set the stereo mode for playout |
| TEST(audioDevice->StopPlayout() == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| |
| // initialize kDefaultCommunicationDevice and modify/retrieve stereo support |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->StereoPlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->SetStereoPlayout(true) == 0); |
| TEST(audioDevice->StereoPlayout(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetStereoPlayout(false) == 0); |
| TEST(audioDevice->StereoPlayout(&enabled) == 0); |
| TEST(enabled == false); |
| TEST(audioDevice->SetStereoPlayout(true) == 0); |
| TEST(audioDevice->StereoPlayout(&enabled) == 0); |
| TEST(enabled == true); |
| } |
| |
| // initialize kDefaultDevice and modify/retrieve stereo support |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->StereoPlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->SetStereoPlayout(true) == 0); |
| TEST(audioDevice->StereoPlayout(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetStereoPlayout(false) == 0); |
| TEST(audioDevice->StereoPlayout(&enabled) == 0); |
| TEST(enabled == false); |
| TEST(audioDevice->SetStereoPlayout(true) == 0); |
| TEST(audioDevice->StereoPlayout(&enabled) == 0); |
| TEST(enabled == true); |
| } |
| |
| // initialize default device (0) and modify/retrieve stereo support |
| TEST(audioDevice->SetPlayoutDevice(0) == 0); |
| TEST(audioDevice->StereoPlayoutIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->SetStereoPlayout(true) == 0); |
| TEST(audioDevice->StereoPlayout(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetStereoPlayout(false) == 0); |
| TEST(audioDevice->StereoPlayout(&enabled) == 0); |
| TEST(enabled == false); |
| TEST(audioDevice->SetStereoPlayout(true) == 0); |
| TEST(audioDevice->StereoPlayout(&enabled) == 0); |
| TEST(enabled == true); |
| } |
| |
| // ================== |
| // SetStereoRecording |
| // StereoRecording |
| // ================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| |
| // fail tests |
| TEST(audioDevice->InitRecording() == -1); |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->RecordingIsInitialized() == true); |
| // must be performed before initialization |
| TEST(audioDevice->SetStereoRecording(true) == -1); |
| |
| // ensures that we can set the stereo mode for recording |
| TEST(audioDevice->StopRecording() == 0); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| |
| // initialize kDefaultCommunicationDevice and modify/retrieve stereo support |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->StereoRecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->SetStereoRecording(true) == 0); |
| TEST(audioDevice->StereoRecording(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetStereoRecording(false) == 0); |
| TEST(audioDevice->StereoRecording(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| |
| // initialize kDefaultDevice and modify/retrieve stereo support |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->StereoRecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->SetStereoRecording(true) == 0); |
| TEST(audioDevice->StereoRecording(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetStereoRecording(false) == 0); |
| TEST(audioDevice->StereoRecording(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| |
| // initialize default device (0) and modify/retrieve stereo support |
| TEST(audioDevice->SetRecordingDevice(0) == 0); |
| TEST(audioDevice->StereoRecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->SetStereoRecording(true) == 0); |
| TEST(audioDevice->StereoRecording(&enabled) == 0); |
| TEST(enabled == true); |
| TEST(audioDevice->SetStereoRecording(false) == 0); |
| TEST(audioDevice->StereoRecording(&enabled) == 0); |
| TEST(enabled == false); |
| } |
| |
| // =================== |
| // SetRecordingChannel |
| // RecordingChannel |
| // ================== |
| |
| // the user in Win Core Audio |
| |
| AudioDeviceModule::ChannelType channelType(AudioDeviceModule::kChannelBoth); |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| |
| // fail tests |
| TEST(audioDevice->SetStereoRecording(false) == 0); |
| TEST(audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelBoth) == -1); |
| |
| // initialize kDefaultCommunicationDevice and modify/retrieve stereo support |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->StereoRecordingIsAvailable(&available) == 0); |
| if (available) |
| { |
| TEST(audioDevice->SetStereoRecording(true) == 0); |
| TEST(audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelBoth) == 0); |
| TEST(audioDevice->RecordingChannel(&channelType) == 0); |
| TEST(channelType == AudioDeviceModule::kChannelBoth); |
| TEST(audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelLeft) == 0); |
| TEST(audioDevice->RecordingChannel(&channelType) == 0); |
| TEST(channelType == AudioDeviceModule::kChannelLeft); |
| TEST(audioDevice->SetRecordingChannel(AudioDeviceModule::kChannelRight) == 0); |
| TEST(audioDevice->RecordingChannel(&channelType) == 0); |
| TEST(channelType == AudioDeviceModule::kChannelRight); |
| } |
| |
| // ================ |
| // SetPlayoutBuffer |
| // PlayoutBuffer |
| // ================ |
| |
| AudioDeviceModule::BufferType bufferType; |
| WebRtc_UWord16 sizeMS(0); |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| TEST(audioDevice->PlayoutBuffer(&bufferType, &sizeMS) == 0); |
| #if defined(_WIN32) || defined(ANDROID) || defined(MAC_IPHONE) |
| TEST(bufferType == AudioDeviceModule::kAdaptiveBufferSize); |
| #else |
| TEST(bufferType == AudioDeviceModule::kFixedBufferSize); |
| #endif |
| |
| // fail tests |
| TEST(audioDevice->InitPlayout() == -1); // must set device first |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->PlayoutIsInitialized() == true); |
| TEST(audioDevice->SetPlayoutBuffer(AudioDeviceModule::kAdaptiveBufferSize, |
| 100) == -1); |
| TEST(audioDevice->StopPlayout() == 0); |
| TEST(audioDevice->SetPlayoutBuffer(AudioDeviceModule::kFixedBufferSize, |
| kAdmMinPlayoutBufferSizeMs-1) == -1); |
| TEST(audioDevice->SetPlayoutBuffer(AudioDeviceModule::kFixedBufferSize, |
| kAdmMaxPlayoutBufferSizeMs+1) == -1); |
| |
| // bulk tests (all should be successful) |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| #ifdef _WIN32 |
| TEST(audioDevice->SetPlayoutBuffer(AudioDeviceModule::kAdaptiveBufferSize, |
| 0) == 0); |
| TEST(audioDevice->PlayoutBuffer(&bufferType, &sizeMS) == 0); |
| TEST(bufferType == AudioDeviceModule::kAdaptiveBufferSize); |
| TEST(audioDevice->SetPlayoutBuffer(AudioDeviceModule::kAdaptiveBufferSize, |
| 10000) == 0); |
| TEST(audioDevice->PlayoutBuffer(&bufferType, &sizeMS) == 0); |
| TEST(bufferType == AudioDeviceModule::kAdaptiveBufferSize); |
| #endif |
| #if defined(ANDROID) || defined(MAC_IPHONE) |
| TEST(audioDevice->SetPlayoutBuffer(AudioDeviceModule::kFixedBufferSize, |
| kAdmMinPlayoutBufferSizeMs) == -1); |
| #else |
| TEST(audioDevice->SetPlayoutBuffer(AudioDeviceModule::kFixedBufferSize, |
| kAdmMinPlayoutBufferSizeMs) == 0); |
| TEST(audioDevice->PlayoutBuffer(&bufferType, &sizeMS) == 0); |
| TEST(bufferType == AudioDeviceModule::kFixedBufferSize); |
| TEST(sizeMS == kAdmMinPlayoutBufferSizeMs); |
| TEST(audioDevice->SetPlayoutBuffer(AudioDeviceModule::kFixedBufferSize, |
| kAdmMaxPlayoutBufferSizeMs) == 0); |
| TEST(audioDevice->PlayoutBuffer(&bufferType, &sizeMS) == 0); |
| TEST(bufferType == AudioDeviceModule::kFixedBufferSize); |
| TEST(sizeMS == kAdmMaxPlayoutBufferSizeMs); |
| TEST(audioDevice->SetPlayoutBuffer(AudioDeviceModule::kFixedBufferSize, |
| 100) == 0); |
| TEST(audioDevice->PlayoutBuffer(&bufferType, &sizeMS) == 0); |
| TEST(bufferType == AudioDeviceModule::kFixedBufferSize); |
| TEST(sizeMS == 100); |
| #endif |
| |
| #ifdef _WIN32 |
| // restore default |
| TEST(audioDevice->SetPlayoutBuffer(AudioDeviceModule::kAdaptiveBufferSize, |
| 0) == 0); |
| TEST(audioDevice->PlayoutBuffer(&bufferType, &sizeMS) == 0); |
| #endif |
| |
| // ============ |
| // PlayoutDelay |
| // ============ |
| |
| // NOTE: this API is better tested in a functional test |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| |
| // bulk tests |
| TEST(audioDevice->PlayoutDelay(&sizeMS) == 0); |
| TEST(audioDevice->PlayoutDelay(&sizeMS) == 0); |
| |
| // ============== |
| // RecordingDelay |
| // ============== |
| |
| // NOTE: this API is better tested in a functional test |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| |
| // bulk tests |
| TEST(audioDevice->RecordingDelay(&sizeMS) == 0); |
| TEST(audioDevice->RecordingDelay(&sizeMS) == 0); |
| |
| // ======= |
| // CPULoad |
| // ======= |
| |
| // NOTE: this API is better tested in a functional test |
| |
| WebRtc_UWord16 load(0); |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| |
| // bulk tests |
| #ifdef _WIN32 |
| TEST(audioDevice->CPULoad(&load) == 0); |
| TEST(load == 0); |
| #else |
| TEST(audioDevice->CPULoad(&load) == -1); |
| #endif |
| |
| // =========================== |
| // StartRawOutputFileRecording |
| // StopRawOutputFileRecording |
| // =========================== |
| |
| // NOTE: this API is better tested in a functional test |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| |
| // fail tests |
| TEST(audioDevice->StartRawOutputFileRecording(NULL) == -1); |
| |
| // bulk tests |
| TEST(audioDevice->StartRawOutputFileRecording( |
| GetFilename("raw_output_not_playing.pcm")) == 0); |
| TEST(audioDevice->StopRawOutputFileRecording() == 0); |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE) == 0); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->StartPlayout() == 0); |
| TEST(audioDevice->StartRawOutputFileRecording( |
| GetFilename("raw_output_playing.pcm")) == 0); |
| AudioDeviceUtility::Sleep(100); |
| TEST(audioDevice->StopRawOutputFileRecording() == 0); |
| TEST(audioDevice->StopPlayout() == 0); |
| TEST(audioDevice->StartRawOutputFileRecording( |
| GetFilename("raw_output_not_playing.pcm")) == 0); |
| TEST(audioDevice->StopRawOutputFileRecording() == 0); |
| |
| // results after this test: |
| // |
| // - size of raw_output_not_playing.pcm shall be 0 |
| // - size of raw_output_playing.pcm shall be > 0 |
| |
| // ========================== |
| // StartRawInputFileRecording |
| // StopRawInputFileRecording |
| // ========================== |
| |
| // NOTE: this API is better tested in a functional test |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| |
| // fail tests |
| TEST(audioDevice->StartRawInputFileRecording(NULL) == -1); |
| |
| // bulk tests |
| TEST(audioDevice->StartRawInputFileRecording( |
| GetFilename("raw_input_not_recording.pcm")) == 0); |
| TEST(audioDevice->StopRawInputFileRecording() == 0); |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->StartRecording() == 0); |
| TEST(audioDevice->StartRawInputFileRecording( |
| GetFilename("raw_input_recording.pcm")) == 0); |
| AudioDeviceUtility::Sleep(100); |
| TEST(audioDevice->StopRawInputFileRecording() == 0); |
| TEST(audioDevice->StopRecording() == 0); |
| TEST(audioDevice->StartRawInputFileRecording( |
| GetFilename("raw_input_not_recording.pcm")) == 0); |
| TEST(audioDevice->StopRawInputFileRecording() == 0); |
| |
| // results after this test: |
| // |
| // - size of raw_input_not_recording.pcm shall be 0 |
| // - size of raw_input_not_recording.pcm shall be > 0 |
| |
| // =================== |
| // RecordingSampleRate |
| // =================== |
| |
| WebRtc_UWord32 sampleRate(0); |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| |
| // bulk tests |
| TEST(audioDevice->RecordingSampleRate(&sampleRate) == 0); |
| #if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) |
| TEST(sampleRate == 48000); |
| #elif defined(ANDROID) |
| TEST_LOG("Recording sample rate is %u\n\n", sampleRate); |
| TEST((sampleRate == 44000) || (sampleRate == 16000)); |
| #elif defined(MAC_IPHONE) |
| TEST_LOG("Recording sample rate is %u\n\n", sampleRate); |
| TEST((sampleRate == 44000) || (sampleRate == 16000) || (sampleRate == 8000)); |
| #endif |
| |
| // @TODO(xians) - add tests for all platforms here... |
| |
| // ================= |
| // PlayoutSampleRate |
| // ================= |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| |
| // bulk tests |
| TEST(audioDevice->PlayoutSampleRate(&sampleRate) == 0); |
| #if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) |
| TEST(sampleRate == 48000); |
| #elif defined(ANDROID) |
| TEST_LOG("Playout sample rate is %u\n\n", sampleRate); |
| TEST((sampleRate == 44000) || (sampleRate == 16000)); |
| #elif defined(MAC_IPHONE) |
| TEST_LOG("Playout sample rate is %u\n\n", sampleRate); |
| TEST((sampleRate == 44000) || (sampleRate == 16000) || (sampleRate == 8000)); |
| #endif |
| |
| // ========================== |
| // ResetAudioDevice |
| // ========================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| TEST(audioDevice->RecordingIsInitialized() == false); |
| TEST(audioDevice->Recording() == false); |
| |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| TEST(audioDevice->SetRecordingDevice(MACRO_DEFAULT_DEVICE) == 0); |
| |
| #if defined(MAC_IPHONE) |
| // Not playing or recording, should just return 0 |
| TEST(audioDevice->ResetAudioDevice() == 0); |
| |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->StartRecording() == 0); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->StartPlayout() == 0); |
| for (int l=0; l<20; ++l) |
| { |
| TEST_LOG("Resetting sound device several time with pause %d ms\n", l); |
| TEST(audioDevice->ResetAudioDevice() == 0); |
| AudioDeviceUtility::Sleep(l); |
| } |
| #else |
| // Fail tests |
| TEST(audioDevice->ResetAudioDevice() == -1); |
| TEST(audioDevice->InitRecording() == 0); |
| TEST(audioDevice->StartRecording() == 0); |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->StartPlayout() == 0); |
| TEST(audioDevice->ResetAudioDevice() == -1); |
| #endif |
| TEST(audioDevice->StopRecording() == 0); |
| TEST(audioDevice->StopPlayout() == 0); |
| |
| // ========================== |
| // SetPlayoutSpeaker |
| // ========================== |
| |
| TEST(audioDevice->Terminate() == 0); |
| TEST(audioDevice->Init() == 0); |
| |
| // check initial states |
| TEST(audioDevice->Initialized() == true); |
| TEST(audioDevice->PlayoutIsInitialized() == false); |
| TEST(audioDevice->Playing() == false); |
| |
| TEST(audioDevice->SetPlayoutDevice(MACRO_DEFAULT_DEVICE) == 0); |
| |
| bool loudspeakerOn(false); |
| #if defined(MAC_IPHONE) |
| // Not playing or recording, should just return a success |
| TEST(audioDevice->SetLoudspeakerStatus(true) == 0); |
| TEST(audioDevice->GetLoudspeakerStatus(loudspeakerOn) == 0); |
| TEST(loudspeakerOn == true); |
| TEST(audioDevice->SetLoudspeakerStatus(false) == 0); |
| TEST(audioDevice->GetLoudspeakerStatus(loudspeakerOn) == 0); |
| TEST(loudspeakerOn == false); |
| |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->StartPlayout() == 0); |
| TEST(audioDevice->SetLoudspeakerStatus(true) == 0); |
| TEST(audioDevice->GetLoudspeakerStatus(loudspeakerOn) == 0); |
| TEST(loudspeakerOn == true); |
| TEST(audioDevice->SetLoudspeakerStatus(false) == 0); |
| TEST(audioDevice->GetLoudspeakerStatus(loudspeakerOn) == 0); |
| TEST(loudspeakerOn == false); |
| |
| #else |
| // Fail tests |
| TEST(audioDevice->SetLoudspeakerStatus(true) == -1); |
| TEST(audioDevice->SetLoudspeakerStatus(false) == -1); |
| TEST(audioDevice->SetLoudspeakerStatus(true) == -1); |
| TEST(audioDevice->SetLoudspeakerStatus(false) == -1); |
| |
| TEST(audioDevice->InitPlayout() == 0); |
| TEST(audioDevice->StartPlayout() == 0); |
| TEST(audioDevice->GetLoudspeakerStatus(&loudspeakerOn) == -1); |
| #endif |
| TEST(audioDevice->StopPlayout() == 0); |
| |
| #ifdef _WIN32 |
| Exit: |
| #endif |
| |
| // ------------------------------------------------------------------------ |
| // Terminate the module when all tests are done: |
| // |
| TEST(audioDevice->Terminate() == 0); |
| // ------------------------------------------------------------------------ |
| |
| // =================================================== |
| // AudioDeviceModuleImpl::Destroy |
| // =================================================== |
| |
| |
| // release the ProcessThread object |
| if (processThread) |
| { |
| processThread->DeRegisterModule(audioDevice); |
| processThread->Stop(); |
| ProcessThread::DestroyProcessThread(processThread); |
| } |
| |
| // delete the event observer |
| if (eventObserver) |
| { |
| delete eventObserver; |
| eventObserver = NULL; |
| } |
| |
| // delete the audio transport |
| if (audioTransport) |
| { |
| delete audioTransport; |
| audioTransport = NULL; |
| } |
| |
| // release the AudioDeviceModule object |
| if (audioDevice) { |
| TEST(audioDevice->Release() == 0); |
| } |
| |
| TEST_LOG("\n"); |
| PRINT_TEST_RESULTS; |
| |
| return 0; |
| } |