blob: 22ac91af142263a024b79b173fdd381df602db81 [file] [log] [blame]
/*
* 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;
}