1/* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#include <math.h> 12#include <stdio.h> 13#include <string.h> 14 15#include "webrtc/modules/audio_device/test/audio_device_test_defines.h" 16 17#include "testing/gtest/include/gtest/gtest.h" 18#include "webrtc/test/testsupport/fileutils.h" 19 20#include "webrtc/modules/audio_device/audio_device_config.h" 21#include "webrtc/modules/audio_device/audio_device_impl.h" 22#include "webrtc/modules/audio_device/audio_device_utility.h" 23#include "webrtc/system_wrappers/interface/sleep.h" 24 25// Helper functions 26#if defined(ANDROID) 27char filenameStr[2][256] = 28{ {0}, 29 {0}, 30}; // Allow two buffers for those API calls taking two filenames 31int currentStr = 0; 32 33const char* GetFilename(const char* filename) 34{ 35 currentStr = !currentStr; 36 sprintf(filenameStr[currentStr], "/sdcard/admtest/%s", filename); 37 return filenameStr[currentStr]; 38} 39#elif !defined(WEBRTC_IOS) 40const char* GetFilename(const char* filename) { 41 std::string full_path_filename = webrtc::test::OutputPath() + filename; 42 return full_path_filename.c_str(); 43} 44#endif 45 46using namespace webrtc; 47 48class AudioEventObserverAPI: public AudioDeviceObserver { 49 public: 50 AudioEventObserverAPI(AudioDeviceModule* audioDevice) 51 : error_(kRecordingError), 52 warning_(kRecordingWarning), 53 audio_device_(audioDevice) { 54 } 55 56 ~AudioEventObserverAPI() {} 57 58 virtual void OnErrorIsReported(const ErrorCode error) { 59 TEST_LOG("\n[*** ERROR ***] => OnErrorIsReported(%d)\n\n", error); 60 error_ = error; 61 } 62 63 virtual void OnWarningIsReported(const WarningCode warning) { 64 TEST_LOG("\n[*** WARNING ***] => OnWarningIsReported(%d)\n\n", warning); 65 warning_ = warning; 66 EXPECT_EQ(0, audio_device_->StopRecording()); 67 EXPECT_EQ(0, audio_device_->StopPlayout()); 68 } 69 70 public: 71 ErrorCode error_; 72 WarningCode warning_; 73 private: 74 AudioDeviceModule* audio_device_; 75}; 76 77class AudioTransportAPI: public AudioTransport { 78 public: 79 AudioTransportAPI(AudioDeviceModule* audioDevice) 80 : rec_count_(0), 81 play_count_(0) { 82 } 83 84 ~AudioTransportAPI() {} 85 86 virtual int32_t RecordedDataIsAvailable( 87 const void* audioSamples, 88 const uint32_t nSamples, 89 const uint8_t nBytesPerSample, 90 const uint8_t nChannels, 91 const uint32_t sampleRate, 92 const uint32_t totalDelay, 93 const int32_t clockSkew, 94 const uint32_t currentMicLevel, 95 const bool keyPressed, 96 uint32_t& newMicLevel) { 97 rec_count_++; 98 if (rec_count_ % 100 == 0) { 99 if (nChannels == 1) { 100 // mono 101 TEST_LOG("-"); 102 } else if ((nChannels == 2) && (nBytesPerSample == 2)) { 103 // stereo but only using one channel 104 TEST_LOG("-|"); 105 } else { 106 // stereo 107 TEST_LOG("--"); 108 } 109 } 110 return 0; 111 } 112 113 virtual int32_t NeedMorePlayData( 114 const uint32_t nSamples, 115 const uint8_t nBytesPerSample, 116 const uint8_t nChannels, 117 const uint32_t sampleRate, 118 void* audioSamples, 119 uint32_t& nSamplesOut, 120 int64_t* elapsed_time_ms, 121 int64_t* ntp_time_ms) { 122 play_count_++; 123 if (play_count_ % 100 == 0) { 124 if (nChannels == 1) { 125 TEST_LOG("+"); 126 } else { 127 TEST_LOG("++"); 128 } 129 } 130 nSamplesOut = 480; 131 return 0; 132 } 133 134 virtual int OnDataAvailable(const int voe_channels[], 135 int number_of_voe_channels, 136 const int16_t* audio_data, 137 int sample_rate, 138 int number_of_channels, 139 int number_of_frames, 140 int audio_delay_milliseconds, 141 int current_volume, 142 bool key_pressed, 143 bool need_audio_processing) { 144 return 0; 145 } 146 147 virtual void PushCaptureData(int voe_channel, const void* audio_data, 148 int bits_per_sample, int sample_rate, 149 int number_of_channels, 150 int number_of_frames) {} 151 152 virtual void PullRenderData(int bits_per_sample, int sample_rate, 153 int number_of_channels, int number_of_frames, 154 void* audio_data, 155 int64_t* elapsed_time_ms, 156 int64_t* ntp_time_ms) {} 157 private: 158 uint32_t rec_count_; 159 uint32_t play_count_; 160}; 161 162class AudioDeviceAPITest: public testing::Test { 163 protected: 164 AudioDeviceAPITest() {} 165 166 virtual ~AudioDeviceAPITest() {} 167 168 static void SetUpTestCase() { 169 process_thread_ = ProcessThread::CreateProcessThread(); 170 process_thread_->Start(); 171 172 // Windows: 173 // if (WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 174 // user can select between default (Core) or Wave 175 // else 176 // user can select between default (Wave) or Wave 177 const int32_t kId = 444; 178 179#if defined(_WIN32) 180 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 181 kId, AudioDeviceModule::kLinuxAlsaAudio)) == NULL); 182#if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 183 TEST_LOG("WEBRTC_WINDOWS_CORE_AUDIO_BUILD is defined!\n\n"); 184 // create default implementation (=Core Audio) instance 185 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 186 kId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL); 187 audio_device_->AddRef(); 188 EXPECT_EQ(0, audio_device_->Release()); 189 // create non-default (=Wave Audio) instance 190 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 191 kId, AudioDeviceModule::kWindowsWaveAudio)) != NULL); 192 audio_device_->AddRef(); 193 EXPECT_EQ(0, audio_device_->Release()); 194 // explicitly specify usage of Core Audio (same as default) 195 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 196 kId, AudioDeviceModule::kWindowsCoreAudio)) != NULL); 197#else 198 TEST_LOG("WEBRTC_WINDOWS_CORE_AUDIO_BUILD is *not* defined!\n"); 199 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 200 kId, AudioDeviceModule::kWindowsCoreAudio)) == NULL); 201 // create default implementation (=Wave Audio) instance 202 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 203 kId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL); 204 audio_device_->AddRef(); 205 EXPECT_EQ(0, audio_device_->Release()); 206 // explicitly specify usage of Wave Audio (same as default) 207 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 208 kId, AudioDeviceModule::kWindowsWaveAudio)) != NULL); 209#endif 210#endif 211 212#if defined(ANDROID) 213 // Fails tests 214 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 215 kId, AudioDeviceModule::kWindowsWaveAudio)) == NULL); 216 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 217 kId, AudioDeviceModule::kWindowsCoreAudio)) == NULL); 218 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 219 kId, AudioDeviceModule::kLinuxAlsaAudio)) == NULL); 220 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 221 kId, AudioDeviceModule::kLinuxPulseAudio)) == NULL); 222 // Create default implementation instance 223 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 224 kId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL); 225#elif defined(WEBRTC_LINUX) 226 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 227 kId, AudioDeviceModule::kWindowsWaveAudio)) == NULL); 228 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 229 kId, AudioDeviceModule::kWindowsCoreAudio)) == NULL); 230 // create default implementation instance 231 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 232 kId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL); 233 audio_device_->AddRef(); 234 EXPECT_EQ(0, audio_device_->Terminate()); 235 EXPECT_EQ(0, audio_device_->Release()); 236 // explicitly specify usage of Pulse Audio (same as default) 237 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 238 kId, AudioDeviceModule::kLinuxPulseAudio)) != NULL); 239#endif 240 241#if defined(WEBRTC_MAC) 242 // Fails tests 243 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 244 kId, AudioDeviceModule::kWindowsWaveAudio)) == NULL); 245 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 246 kId, AudioDeviceModule::kWindowsCoreAudio)) == NULL); 247 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 248 kId, AudioDeviceModule::kLinuxAlsaAudio)) == NULL); 249 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 250 kId, AudioDeviceModule::kLinuxPulseAudio)) == NULL); 251 // Create default implementation instance 252 EXPECT_TRUE((audio_device_ = AudioDeviceModuleImpl::Create( 253 kId, AudioDeviceModule::kPlatformDefaultAudio)) != NULL); 254#endif 255 256 if (audio_device_ == NULL) { 257 FAIL() << "Failed creating audio device object!"; 258 } 259 260 // The ADM is reference counted. 261 audio_device_->AddRef(); 262 263 process_thread_->RegisterModule(audio_device_); 264 265 AudioDeviceModule::AudioLayer audio_layer = 266 AudioDeviceModule::kPlatformDefaultAudio; 267 EXPECT_EQ(0, audio_device_->ActiveAudioLayer(&audio_layer)); 268 if (audio_layer == AudioDeviceModule::kLinuxAlsaAudio) { 269 linux_alsa_ = true; 270 } 271 } 272 273 static void TearDownTestCase() { 274 if (process_thread_) { 275 process_thread_->DeRegisterModule(audio_device_); 276 process_thread_->Stop(); 277 ProcessThread::DestroyProcessThread(process_thread_); 278 } 279 if (event_observer_) { 280 delete event_observer_; 281 event_observer_ = NULL; 282 } 283 if (audio_transport_) { 284 delete audio_transport_; 285 audio_transport_ = NULL; 286 } 287 if (audio_device_) { 288 EXPECT_EQ(0, audio_device_->Release()); 289 } 290 PRINT_TEST_RESULTS; 291 } 292 293 void SetUp() { 294 if (linux_alsa_) { 295 FAIL() << "API Test is not available on ALSA on Linux!"; 296 } 297 EXPECT_EQ(0, audio_device_->Init()); 298 EXPECT_TRUE(audio_device_->Initialized()); 299 } 300 301 void TearDown() { 302 EXPECT_EQ(0, audio_device_->Terminate()); 303 } 304 305 void CheckVolume(uint32_t expected, uint32_t actual) { 306 // Mac and Windows have lower resolution on the volume settings. 307#if defined(WEBRTC_MAC) || defined(_WIN32) 308 int diff = abs(static_cast<int>(expected - actual)); 309 EXPECT_LE(diff, 5); 310#else 311 EXPECT_TRUE((actual == expected) || (actual == expected-1)); 312#endif 313 } 314 315 void CheckInitialPlayoutStates() { 316 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 317 EXPECT_FALSE(audio_device_->Playing()); 318 EXPECT_FALSE(audio_device_->SpeakerIsInitialized()); 319 } 320 321 void CheckInitialRecordingStates() { 322 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 323 EXPECT_FALSE(audio_device_->Recording()); 324 EXPECT_FALSE(audio_device_->MicrophoneIsInitialized()); 325 } 326 327 static bool linux_alsa_; 328 static ProcessThread* process_thread_; 329 static AudioDeviceModule* audio_device_; 330 static AudioTransportAPI* audio_transport_; 331 static AudioEventObserverAPI* event_observer_; 332}; 333 334// Must be initialized like this to handle static SetUpTestCase() above. 335bool AudioDeviceAPITest::linux_alsa_ = false; 336ProcessThread* AudioDeviceAPITest::process_thread_ = NULL; 337AudioDeviceModule* AudioDeviceAPITest::audio_device_ = NULL; 338AudioTransportAPI* AudioDeviceAPITest::audio_transport_ = NULL; 339AudioEventObserverAPI* AudioDeviceAPITest::event_observer_ = NULL; 340 341TEST_F(AudioDeviceAPITest, RegisterEventObserver) { 342 event_observer_ = new AudioEventObserverAPI(audio_device_); 343 EXPECT_EQ(0, audio_device_->RegisterEventObserver(NULL)); 344 EXPECT_EQ(0, audio_device_->RegisterEventObserver(event_observer_)); 345 EXPECT_EQ(0, audio_device_->RegisterEventObserver(NULL)); 346} 347 348TEST_F(AudioDeviceAPITest, RegisterAudioCallback) { 349 audio_transport_ = new AudioTransportAPI(audio_device_); 350 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL)); 351 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_)); 352 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL)); 353} 354 355TEST_F(AudioDeviceAPITest, Init) { 356 EXPECT_TRUE(audio_device_->Initialized()); 357 EXPECT_EQ(0, audio_device_->Init()); 358 EXPECT_TRUE(audio_device_->Initialized()); 359 EXPECT_EQ(0, audio_device_->Terminate()); 360 EXPECT_FALSE(audio_device_->Initialized()); 361 EXPECT_EQ(0, audio_device_->Init()); 362 EXPECT_TRUE(audio_device_->Initialized()); 363 EXPECT_EQ(0, audio_device_->Terminate()); 364 EXPECT_FALSE(audio_device_->Initialized()); 365} 366 367TEST_F(AudioDeviceAPITest, Terminate) { 368 EXPECT_TRUE(audio_device_->Initialized()); 369 EXPECT_EQ(0, audio_device_->Terminate()); 370 EXPECT_FALSE(audio_device_->Initialized()); 371 EXPECT_EQ(0, audio_device_->Terminate()); 372 EXPECT_FALSE(audio_device_->Initialized()); 373 EXPECT_EQ(0, audio_device_->Init()); 374 EXPECT_TRUE(audio_device_->Initialized()); 375 EXPECT_EQ(0, audio_device_->Terminate()); 376 EXPECT_FALSE(audio_device_->Initialized()); 377} 378 379TEST_F(AudioDeviceAPITest, PlayoutDevices) { 380 EXPECT_GT(audio_device_->PlayoutDevices(), 0); 381 EXPECT_GT(audio_device_->PlayoutDevices(), 0); 382} 383 384TEST_F(AudioDeviceAPITest, RecordingDevices) { 385 EXPECT_GT(audio_device_->RecordingDevices(), 0); 386 EXPECT_GT(audio_device_->RecordingDevices(), 0); 387} 388 389// TODO(henrika): uncomment when you have decided what to do with issue 3675. 390#if 0 391TEST_F(AudioDeviceAPITest, PlayoutDeviceName) { 392 char name[kAdmMaxDeviceNameSize]; 393 char guid[kAdmMaxGuidSize]; 394 int16_t no_devices = audio_device_->PlayoutDevices(); 395 396 // fail tests 397 EXPECT_EQ(-1, audio_device_->PlayoutDeviceName(-2, name, guid)); 398 EXPECT_EQ(-1, audio_device_->PlayoutDeviceName(no_devices, name, guid)); 399 EXPECT_EQ(-1, audio_device_->PlayoutDeviceName(0, NULL, guid)); 400 401 // bulk tests 402 EXPECT_EQ(0, audio_device_->PlayoutDeviceName(0, name, NULL)); 403#ifdef _WIN32 404 // shall be mapped to 0. 405 EXPECT_EQ(0, audio_device_->PlayoutDeviceName(-1, name, NULL)); 406#else 407 EXPECT_EQ(-1, audio_device_->PlayoutDeviceName(-1, name, NULL)); 408#endif 409 for (int i = 0; i < no_devices; i++) { 410 EXPECT_EQ(0, audio_device_->PlayoutDeviceName(i, name, guid)); 411 EXPECT_EQ(0, audio_device_->PlayoutDeviceName(i, name, NULL)); 412 } 413} 414 415TEST_F(AudioDeviceAPITest, RecordingDeviceName) { 416 char name[kAdmMaxDeviceNameSize]; 417 char guid[kAdmMaxGuidSize]; 418 int16_t no_devices = audio_device_->RecordingDevices(); 419 420 // fail tests 421 EXPECT_EQ(-1, audio_device_->RecordingDeviceName(-2, name, guid)); 422 EXPECT_EQ(-1, audio_device_->RecordingDeviceName(no_devices, name, guid)); 423 EXPECT_EQ(-1, audio_device_->RecordingDeviceName(0, NULL, guid)); 424 425 // bulk tests 426 EXPECT_EQ(0, audio_device_->RecordingDeviceName(0, name, NULL)); 427#ifdef _WIN32 428 // shall me mapped to 0 429 EXPECT_EQ(0, audio_device_->RecordingDeviceName(-1, name, NULL)); 430#else 431 EXPECT_EQ(-1, audio_device_->RecordingDeviceName(-1, name, NULL)); 432#endif 433 for (int i = 0; i < no_devices; i++) { 434 EXPECT_EQ(0, audio_device_->RecordingDeviceName(i, name, guid)); 435 EXPECT_EQ(0, audio_device_->RecordingDeviceName(i, name, NULL)); 436 } 437} 438 439TEST_F(AudioDeviceAPITest, SetPlayoutDevice) { 440 int16_t no_devices = audio_device_->PlayoutDevices(); 441 442 // fail tests 443 EXPECT_EQ(-1, audio_device_->SetPlayoutDevice(-1)); 444 EXPECT_EQ(-1, audio_device_->SetPlayoutDevice(no_devices)); 445 446 // bulk tests 447#ifdef _WIN32 448 EXPECT_EQ(0, audio_device_->SetPlayoutDevice( 449 AudioDeviceModule::kDefaultCommunicationDevice)); 450 EXPECT_EQ(0, audio_device_->SetPlayoutDevice( 451 AudioDeviceModule::kDefaultDevice)); 452#else 453 EXPECT_EQ(-1, audio_device_->SetPlayoutDevice( 454 AudioDeviceModule::kDefaultCommunicationDevice)); 455 EXPECT_EQ(-1, audio_device_->SetPlayoutDevice( 456 AudioDeviceModule::kDefaultDevice)); 457#endif 458 for (int i = 0; i < no_devices; i++) { 459 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i)); 460 } 461} 462 463TEST_F(AudioDeviceAPITest, SetRecordingDevice) { 464 EXPECT_EQ(0, audio_device_->Init()); 465 int16_t no_devices = audio_device_->RecordingDevices(); 466 467 // fail tests 468 EXPECT_EQ(-1, audio_device_->SetRecordingDevice(-1)); 469 EXPECT_EQ(-1, audio_device_->SetRecordingDevice(no_devices)); 470 471 // bulk tests 472#ifdef _WIN32 473 EXPECT_TRUE(audio_device_->SetRecordingDevice( 474 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 475 EXPECT_EQ(0, audio_device_->SetRecordingDevice( 476 AudioDeviceModule::kDefaultDevice)); 477#else 478 EXPECT_TRUE(audio_device_->SetRecordingDevice( 479 AudioDeviceModule::kDefaultCommunicationDevice) == -1); 480 EXPECT_TRUE(audio_device_->SetRecordingDevice( 481 AudioDeviceModule::kDefaultDevice) == -1); 482#endif 483 for (int i = 0; i < no_devices; i++) { 484 EXPECT_EQ(0, audio_device_->SetRecordingDevice(i)); 485 } 486} 487#endif // 0 488 489TEST_F(AudioDeviceAPITest, PlayoutIsAvailable) { 490 bool available; 491#ifdef _WIN32 492 EXPECT_TRUE(audio_device_->SetPlayoutDevice( 493 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 494 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 495 // Availability check should not initialize. 496 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 497 498 EXPECT_EQ(0, 499 audio_device_->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice)); 500 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 501 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 502#endif 503 504 int16_t no_devices = audio_device_->PlayoutDevices(); 505 for (int i = 0; i < no_devices; i++) { 506 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i)); 507 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 508 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 509 } 510} 511 512TEST_F(AudioDeviceAPITest, RecordingIsAvailable) { 513 bool available; 514#ifdef _WIN32 515 EXPECT_EQ(0, audio_device_->SetRecordingDevice( 516 AudioDeviceModule::kDefaultCommunicationDevice)); 517 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 518 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 519 520 EXPECT_EQ(0, audio_device_->SetRecordingDevice( 521 AudioDeviceModule::kDefaultDevice)); 522 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 523 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 524#endif 525 526 int16_t no_devices = audio_device_->RecordingDevices(); 527 for (int i = 0; i < no_devices; i++) { 528 EXPECT_EQ(0, audio_device_->SetRecordingDevice(i)); 529 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 530 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 531 } 532} 533 534TEST_F(AudioDeviceAPITest, InitPlayout) { 535 // check initial state 536 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 537 538 // ensure that device must be set before we can initialize 539 EXPECT_EQ(-1, audio_device_->InitPlayout()); 540 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 541 EXPECT_EQ(0, audio_device_->InitPlayout()); 542 EXPECT_TRUE(audio_device_->PlayoutIsInitialized()); 543 544 // bulk tests 545 bool available; 546 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 547 if (available) { 548 EXPECT_EQ(0, audio_device_->InitPlayout()); 549 EXPECT_TRUE(audio_device_->PlayoutIsInitialized()); 550 EXPECT_EQ(0, audio_device_->InitPlayout()); 551 EXPECT_EQ(-1, audio_device_->SetPlayoutDevice( 552 MACRO_DEFAULT_COMMUNICATION_DEVICE)); 553 EXPECT_EQ(0, audio_device_->StopPlayout()); 554 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 555 } 556 557 EXPECT_EQ(0, audio_device_->SetPlayoutDevice( 558 MACRO_DEFAULT_COMMUNICATION_DEVICE)); 559 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 560 if (available) { 561 EXPECT_EQ(0, audio_device_->InitPlayout()); 562 // Sleep is needed for e.g. iPhone since we after stopping then starting may 563 // have a hangover time of a couple of ms before initialized. 564 SleepMs(50); 565 EXPECT_TRUE(audio_device_->PlayoutIsInitialized()); 566 } 567 568 int16_t no_devices = audio_device_->PlayoutDevices(); 569 for (int i = 0; i < no_devices; i++) { 570 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 571 if (available) { 572 EXPECT_EQ(0, audio_device_->StopPlayout()); 573 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 574 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i)); 575 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 576 if (available) { 577 EXPECT_EQ(0, audio_device_->InitPlayout()); 578 EXPECT_TRUE(audio_device_->PlayoutIsInitialized()); 579 } 580 } 581 } 582 EXPECT_EQ(0, audio_device_->StopPlayout()); 583} 584 585TEST_F(AudioDeviceAPITest, InitRecording) { 586 // check initial state 587 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 588 589 // ensure that device must be set before we can initialize 590 EXPECT_EQ(-1, audio_device_->InitRecording()); 591 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 592 EXPECT_EQ(0, audio_device_->InitRecording()); 593 EXPECT_TRUE(audio_device_->RecordingIsInitialized()); 594 595 // bulk tests 596 bool available; 597 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 598 if (available) { 599 EXPECT_EQ(0, audio_device_->InitRecording()); 600 EXPECT_TRUE(audio_device_->RecordingIsInitialized()); 601 EXPECT_EQ(0, audio_device_->InitRecording()); 602 EXPECT_EQ(-1, 603 audio_device_->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE)); 604 EXPECT_EQ(0, audio_device_->StopRecording()); 605 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 606 } 607 608 EXPECT_EQ(0, 609 audio_device_->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE)); 610 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 611 if (available) { 612 EXPECT_EQ(0, audio_device_->InitRecording()); 613 SleepMs(50); 614 EXPECT_TRUE(audio_device_->RecordingIsInitialized()); 615 } 616 617 int16_t no_devices = audio_device_->RecordingDevices(); 618 for (int i = 0; i < no_devices; i++) { 619 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 620 if (available) { 621 EXPECT_EQ(0, audio_device_->StopRecording()); 622 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 623 EXPECT_EQ(0, audio_device_->SetRecordingDevice(i)); 624 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 625 if (available) { 626 EXPECT_EQ(0, audio_device_->InitRecording()); 627 EXPECT_TRUE(audio_device_->RecordingIsInitialized()); 628 } 629 } 630 } 631 EXPECT_EQ(0, audio_device_->StopRecording()); 632} 633 634TEST_F(AudioDeviceAPITest, StartAndStopPlayout) { 635 bool available; 636 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL)); 637 638 CheckInitialPlayoutStates(); 639 640 EXPECT_EQ(-1, audio_device_->StartPlayout()); 641 EXPECT_EQ(0, audio_device_->StopPlayout()); 642 643#ifdef _WIN32 644 // kDefaultCommunicationDevice 645 EXPECT_TRUE(audio_device_->SetPlayoutDevice( 646 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 647 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 648 if (available) 649 { 650 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 651 EXPECT_EQ(0, audio_device_->InitPlayout()); 652 EXPECT_EQ(0, audio_device_->StartPlayout()); 653 EXPECT_TRUE(audio_device_->Playing()); 654 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_)); 655 EXPECT_EQ(0, audio_device_->StopPlayout()); 656 EXPECT_FALSE(audio_device_->Playing()); 657 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL)); 658 } 659#endif 660 661 // repeat test but for kDefaultDevice 662 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 663 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 664 if (available) { 665 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 666 EXPECT_EQ(0, audio_device_->InitPlayout()); 667 EXPECT_EQ(0, audio_device_->StartPlayout()); 668 EXPECT_TRUE(audio_device_->Playing()); 669 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_)); 670 EXPECT_EQ(0, audio_device_->StopPlayout()); 671 EXPECT_FALSE(audio_device_->Playing()); 672 } 673 674 // repeat test for all devices 675 int16_t no_devices = audio_device_->PlayoutDevices(); 676 for (int i = 0; i < no_devices; i++) { 677 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i)); 678 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 679 if (available) { 680 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 681 EXPECT_EQ(0, audio_device_->InitPlayout()); 682 EXPECT_EQ(0, audio_device_->StartPlayout()); 683 EXPECT_TRUE(audio_device_->Playing()); 684 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_)); 685 EXPECT_EQ(0, audio_device_->StopPlayout()); 686 EXPECT_FALSE(audio_device_->Playing()); 687 } 688 } 689} 690 691TEST_F(AudioDeviceAPITest, StartAndStopRecording) { 692 bool available; 693 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL)); 694 695 CheckInitialRecordingStates(); 696 697 EXPECT_EQ(-1, audio_device_->StartRecording()); 698 EXPECT_EQ(0, audio_device_->StopRecording()); 699 700#ifdef _WIN32 701 // kDefaultCommunicationDevice 702 EXPECT_TRUE(audio_device_->SetRecordingDevice( 703 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 704 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 705 if (available) 706 { 707 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 708 EXPECT_EQ(0, audio_device_->InitRecording()); 709 EXPECT_EQ(0, audio_device_->StartRecording()); 710 EXPECT_TRUE(audio_device_->Recording()); 711 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_)); 712 EXPECT_EQ(0, audio_device_->StopRecording()); 713 EXPECT_FALSE(audio_device_->Recording()); 714 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(NULL)); 715 } 716#endif 717 718 // repeat test but for kDefaultDevice 719 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 720 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 721 if (available) { 722 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 723 EXPECT_EQ(0, audio_device_->InitRecording()); 724 EXPECT_EQ(0, audio_device_->StartRecording()); 725 EXPECT_TRUE(audio_device_->Recording()); 726 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_)); 727 EXPECT_EQ(0, audio_device_->StopRecording()); 728 EXPECT_FALSE(audio_device_->Recording()); 729 } 730 731 // repeat test for all devices 732 int16_t no_devices = audio_device_->RecordingDevices(); 733 for (int i = 0; i < no_devices; i++) { 734 EXPECT_EQ(0, audio_device_->SetRecordingDevice(i)); 735 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 736 if (available) { 737 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 738 EXPECT_EQ(0, audio_device_->InitRecording()); 739 EXPECT_EQ(0, audio_device_->StartRecording()); 740 EXPECT_TRUE(audio_device_->Recording()); 741 EXPECT_EQ(0, audio_device_->RegisterAudioCallback(audio_transport_)); 742 EXPECT_EQ(0, audio_device_->StopRecording()); 743 EXPECT_FALSE(audio_device_->Recording()); 744 } 745 } 746} 747 748#if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 749TEST_F(AudioDeviceAPITest, SetAndGetWaveOutVolume) { 750 uint32_t vol(0); 751 // NOTE 1: Windows Wave only! 752 // NOTE 2: It seems like the waveOutSetVolume API returns 753 // MMSYSERR_NOTSUPPORTED on some Vista machines! 754 const uint16_t maxVol(0xFFFF); 755 uint16_t volL, volR; 756 757 CheckInitialPlayoutStates(); 758 759 // make dummy test to see if this API is supported 760 int32_t works = audio_device_->SetWaveOutVolume(vol, vol); 761 WARNING(works == 0); 762 763 if (works == 0) 764 { 765 // set volume without open playout device 766 for (vol = 0; vol <= maxVol; vol += (maxVol/5)) 767 { 768 EXPECT_EQ(0, audio_device_->SetWaveOutVolume(vol, vol)); 769 EXPECT_EQ(0, audio_device_->WaveOutVolume(volL, volR)); 770 EXPECT_TRUE((volL == vol) && (volR == vol)); 771 } 772 773 // repeat test but this time with an open (default) output device 774 EXPECT_EQ(0, audio_device_->SetPlayoutDevice( 775 AudioDeviceModule::kDefaultDevice)); 776 EXPECT_EQ(0, audio_device_->InitPlayout()); 777 EXPECT_TRUE(audio_device_->PlayoutIsInitialized()); 778 for (vol = 0; vol <= maxVol; vol += (maxVol/5)) 779 { 780 EXPECT_EQ(0, audio_device_->SetWaveOutVolume(vol, vol)); 781 EXPECT_EQ(0, audio_device_->WaveOutVolume(volL, volR)); 782 EXPECT_TRUE((volL == vol) && (volR == vol)); 783 } 784 785 // as above but while playout is active 786 EXPECT_EQ(0, audio_device_->StartPlayout()); 787 EXPECT_TRUE(audio_device_->Playing()); 788 for (vol = 0; vol <= maxVol; vol += (maxVol/5)) 789 { 790 EXPECT_EQ(0, audio_device_->SetWaveOutVolume(vol, vol)); 791 EXPECT_EQ(0, audio_device_->WaveOutVolume(volL, volR)); 792 EXPECT_TRUE((volL == vol) && (volR == vol)); 793 } 794 } 795 796 EXPECT_EQ(0, audio_device_->StopPlayout()); 797 EXPECT_FALSE(audio_device_->Playing()); 798} 799#endif // defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 800 801TEST_F(AudioDeviceAPITest, InitSpeaker) { 802 // NOTE: By calling Terminate (in TearDown) followed by Init (in SetUp) we 803 // ensure that any existing output mixer handle is set to NULL. 804 // The mixer handle is closed and reopened again for each call to 805 // SetPlayoutDevice. 806 CheckInitialPlayoutStates(); 807 808 // kDefaultCommunicationDevice 809 EXPECT_EQ(0, audio_device_->SetPlayoutDevice( 810 MACRO_DEFAULT_COMMUNICATION_DEVICE)); 811 EXPECT_EQ(0, audio_device_->InitSpeaker()); 812 813 // fail tests 814 bool available; 815 EXPECT_EQ(0, audio_device_->PlayoutIsAvailable(&available)); 816 if (available) { 817 EXPECT_EQ(0, audio_device_->InitPlayout()); 818 EXPECT_EQ(0, audio_device_->StartPlayout()); 819 EXPECT_EQ(-1, audio_device_->InitSpeaker()); 820 EXPECT_EQ(0, audio_device_->StopPlayout()); 821 } 822 823 // kDefaultDevice 824 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 825 EXPECT_EQ(0, audio_device_->InitSpeaker()); 826 827 // repeat test for all devices 828 int16_t no_devices = audio_device_->PlayoutDevices(); 829 for (int i = 0; i < no_devices; i++) { 830 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i)); 831 EXPECT_EQ(0, audio_device_->InitSpeaker()); 832 } 833} 834 835TEST_F(AudioDeviceAPITest, InitMicrophone) { 836 // NOTE: By calling Terminate (in TearDown) followed by Init (in SetUp) we 837 // ensure that any existing output mixer handle is set to NULL. 838 // The mixer handle is closed and reopened again for each call to 839 // SetRecordingDevice. 840 CheckInitialRecordingStates(); 841 842 // kDefaultCommunicationDevice 843 EXPECT_EQ(0, 844 audio_device_->SetRecordingDevice(MACRO_DEFAULT_COMMUNICATION_DEVICE)); 845 EXPECT_EQ(0, audio_device_->InitMicrophone()); 846 847 // fail tests 848 bool available; 849 EXPECT_EQ(0, audio_device_->RecordingIsAvailable(&available)); 850 if (available) { 851 EXPECT_EQ(0, audio_device_->InitRecording()); 852 EXPECT_EQ(0, audio_device_->StartRecording()); 853 EXPECT_EQ(-1, audio_device_->InitMicrophone()); 854 EXPECT_EQ(0, audio_device_->StopRecording()); 855 } 856 857 // kDefaultDevice 858 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 859 EXPECT_EQ(0, audio_device_->InitMicrophone()); 860 861 // repeat test for all devices 862 int16_t no_devices = audio_device_->RecordingDevices(); 863 for (int i = 0; i < no_devices; i++) { 864 EXPECT_EQ(0, audio_device_->SetRecordingDevice(i)); 865 EXPECT_EQ(0, audio_device_->InitMicrophone()); 866 } 867} 868 869TEST_F(AudioDeviceAPITest, SpeakerVolumeIsAvailable) { 870 CheckInitialPlayoutStates(); 871 bool available; 872 873#ifdef _WIN32 874 // check the kDefaultCommunicationDevice 875 EXPECT_TRUE(audio_device_->SetPlayoutDevice( 876 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 877 EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available)); 878 // check for availability should not lead to initialization 879 EXPECT_FALSE(audio_device_->SpeakerIsInitialized()); 880#endif 881 882 // check the kDefaultDevice 883 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 884 EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available)); 885 EXPECT_FALSE(audio_device_->SpeakerIsInitialized()); 886 887 // check all availiable devices 888 int16_t no_devices = audio_device_->PlayoutDevices(); 889 for (int i = 0; i < no_devices; i++) { 890 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i)); 891 EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available)); 892 EXPECT_FALSE(audio_device_->SpeakerIsInitialized()); 893 } 894} 895 896// Tests the following methods: 897// SetSpeakerVolume 898// SpeakerVolume 899// MaxSpeakerVolume 900// MinSpeakerVolume 901// NOTE: Disabled on mac due to issue 257. 902#ifndef WEBRTC_MAC 903TEST_F(AudioDeviceAPITest, SpeakerVolumeTests) { 904 uint32_t vol(0); 905 uint32_t volume(0); 906 uint32_t maxVolume(0); 907 uint32_t minVolume(0); 908 uint16_t stepSize(0); 909 bool available; 910 CheckInitialPlayoutStates(); 911 912 // fail tests 913 EXPECT_EQ(-1, audio_device_->SetSpeakerVolume(0)); 914 // speaker must be initialized first 915 EXPECT_EQ(-1, audio_device_->SpeakerVolume(&volume)); 916 EXPECT_EQ(-1, audio_device_->MaxSpeakerVolume(&maxVolume)); 917 EXPECT_EQ(-1, audio_device_->MinSpeakerVolume(&minVolume)); 918 EXPECT_EQ(-1, audio_device_->SpeakerVolumeStepSize(&stepSize)); 919 920#if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 921 // test for warning (can e.g. happen on Vista with Wave API) 922 EXPECT_EQ(0, 923 audio_device_->SetPlayoutDevice(AudioDeviceModule::kDefaultDevice)); 924 EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available)); 925 if (available) { 926 EXPECT_EQ(0, audio_device_->InitSpeaker()); 927 EXPECT_EQ(0, audio_device_->SetSpeakerVolume(19001)); 928 EXPECT_EQ(0, audio_device_->SpeakerVolume(&volume)); 929 WARNING(volume == 19001); 930 } 931#endif 932 933#ifdef _WIN32 934 // use kDefaultCommunicationDevice and modify/retrieve the volume 935 EXPECT_TRUE(audio_device_->SetPlayoutDevice( 936 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 937 EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available)); 938 if (available) { 939 EXPECT_EQ(0, audio_device_->InitSpeaker()); 940 EXPECT_EQ(0, audio_device_->MaxSpeakerVolume(&maxVolume)); 941 EXPECT_EQ(0, audio_device_->MinSpeakerVolume(&minVolume)); 942 EXPECT_EQ(0, audio_device_->SpeakerVolumeStepSize(&stepSize)); 943 for (vol = minVolume; vol < (int)maxVolume; vol += 20*stepSize) { 944 EXPECT_EQ(0, audio_device_->SetSpeakerVolume(vol)); 945 EXPECT_EQ(0, audio_device_->SpeakerVolume(&volume)); 946 CheckVolume(volume, vol); 947 } 948 } 949#endif 950 951 // use kDefaultDevice and modify/retrieve the volume 952 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 953 EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available)); 954 if (available) { 955 EXPECT_EQ(0, audio_device_->InitSpeaker()); 956 EXPECT_EQ(0, audio_device_->MaxSpeakerVolume(&maxVolume)); 957 EXPECT_EQ(0, audio_device_->MinSpeakerVolume(&minVolume)); 958 EXPECT_EQ(0, audio_device_->SpeakerVolumeStepSize(&stepSize)); 959 uint32_t step = (maxVolume - minVolume) / 10; 960 step = (step < stepSize ? stepSize : step); 961 for (vol = minVolume; vol <= maxVolume; vol += step) { 962 EXPECT_EQ(0, audio_device_->SetSpeakerVolume(vol)); 963 EXPECT_EQ(0, audio_device_->SpeakerVolume(&volume)); 964 CheckVolume(volume, vol); 965 } 966 } 967 968 // use all (indexed) devices and modify/retrieve the volume 969 int16_t no_devices = audio_device_->PlayoutDevices(); 970 for (int i = 0; i < no_devices; i++) { 971 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i)); 972 EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available)); 973 if (available) { 974 EXPECT_EQ(0, audio_device_->InitSpeaker()); 975 EXPECT_EQ(0, audio_device_->MaxSpeakerVolume(&maxVolume)); 976 EXPECT_EQ(0, audio_device_->MinSpeakerVolume(&minVolume)); 977 EXPECT_EQ(0, audio_device_->SpeakerVolumeStepSize(&stepSize)); 978 uint32_t step = (maxVolume - minVolume) / 10; 979 step = (step < stepSize ? stepSize : step); 980 for (vol = minVolume; vol <= maxVolume; vol += step) { 981 EXPECT_EQ(0, audio_device_->SetSpeakerVolume(vol)); 982 EXPECT_EQ(0, audio_device_->SpeakerVolume(&volume)); 983 CheckVolume(volume, vol); 984 } 985 } 986 } 987 988 // restore reasonable level 989 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 990 EXPECT_EQ(0, audio_device_->SpeakerVolumeIsAvailable(&available)); 991 if (available) { 992 EXPECT_EQ(0, audio_device_->InitSpeaker()); 993 EXPECT_EQ(0, audio_device_->MaxSpeakerVolume(&maxVolume)); 994 EXPECT_TRUE(audio_device_->SetSpeakerVolume(maxVolume < 10 ? 995 maxVolume/3 : maxVolume/10) == 0); 996 } 997} 998#endif // !WEBRTC_MAC 999 1000TEST_F(AudioDeviceAPITest, AGC) { 1001 // NOTE: The AGC API only enables/disables the AGC. To ensure that it will 1002 // have an effect, use it in combination with MicrophoneVolumeIsAvailable. 1003 CheckInitialRecordingStates(); 1004 EXPECT_FALSE(audio_device_->AGC()); 1005 1006 // set/get tests 1007 EXPECT_EQ(0, audio_device_->SetAGC(true)); 1008 EXPECT_TRUE(audio_device_->AGC()); 1009 EXPECT_EQ(0, audio_device_->SetAGC(false)); 1010 EXPECT_FALSE(audio_device_->AGC()); 1011} 1012 1013TEST_F(AudioDeviceAPITest, MicrophoneVolumeIsAvailable) { 1014 CheckInitialRecordingStates(); 1015 bool available; 1016 1017#ifdef _WIN32 1018 // check the kDefaultCommunicationDevice 1019 EXPECT_TRUE(audio_device_->SetRecordingDevice( 1020 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 1021 EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available)); 1022 // check for availability should not lead to initialization 1023 EXPECT_FALSE(audio_device_->MicrophoneIsInitialized()); 1024#endif 1025 1026 // check the kDefaultDevice 1027 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 1028 EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available)); 1029 EXPECT_FALSE(audio_device_->MicrophoneIsInitialized()); 1030 1031 // check all availiable devices 1032 int16_t no_devices = audio_device_->RecordingDevices(); 1033 for (int i = 0; i < no_devices; i++) { 1034 EXPECT_EQ(0, audio_device_->SetRecordingDevice(i)); 1035 EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available)); 1036 EXPECT_FALSE(audio_device_->MicrophoneIsInitialized()); 1037 } 1038} 1039 1040// Tests the methods: 1041// SetMicrophoneVolume 1042// MicrophoneVolume 1043// MaxMicrophoneVolume 1044// MinMicrophoneVolume 1045// NOTE: Disabled on mac due to issue 257. 1046#ifndef WEBRTC_MAC 1047TEST_F(AudioDeviceAPITest, MicrophoneVolumeTests) { 1048 uint32_t vol(0); 1049 uint32_t volume(0); 1050 uint32_t maxVolume(0); 1051 uint32_t minVolume(0); 1052 uint16_t stepSize(0); 1053 bool available; 1054 CheckInitialRecordingStates(); 1055 1056 // fail tests 1057 EXPECT_EQ(-1, audio_device_->SetMicrophoneVolume(0)); 1058 // must be initialized first 1059 EXPECT_EQ(-1, audio_device_->MicrophoneVolume(&volume)); 1060 EXPECT_EQ(-1, audio_device_->MaxMicrophoneVolume(&maxVolume)); 1061 EXPECT_EQ(-1, audio_device_->MinMicrophoneVolume(&minVolume)); 1062 EXPECT_EQ(-1, audio_device_->MicrophoneVolumeStepSize(&stepSize)); 1063 1064#if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 1065 // test for warning (can e.g. happen on Vista with Wave API) 1066 EXPECT_EQ(0, audio_device_->SetRecordingDevice( 1067 AudioDeviceModule::kDefaultDevice)); 1068 EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available)); 1069 if (available) 1070 { 1071 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1072 EXPECT_EQ(0, audio_device_->SetMicrophoneVolume(19001)); 1073 EXPECT_EQ(0, audio_device_->MicrophoneVolume(&volume)); 1074 WARNING(volume == 19001); 1075 } 1076#endif 1077 1078#ifdef _WIN32 1079 // initialize kDefaultCommunicationDevice and modify/retrieve the volume 1080 EXPECT_TRUE(audio_device_->SetRecordingDevice( 1081 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 1082 EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available)); 1083 if (available) 1084 { 1085 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1086 EXPECT_EQ(0, audio_device_->MaxMicrophoneVolume(&maxVolume)); 1087 EXPECT_EQ(0, audio_device_->MinMicrophoneVolume(&minVolume)); 1088 EXPECT_EQ(0, audio_device_->MicrophoneVolumeStepSize(&stepSize)); 1089 for (vol = minVolume; vol < (int)maxVolume; vol += 10*stepSize) 1090 { 1091 EXPECT_EQ(0, audio_device_->SetMicrophoneVolume(vol)); 1092 EXPECT_EQ(0, audio_device_->MicrophoneVolume(&volume)); 1093 CheckVolume(volume, vol); 1094 } 1095 } 1096#endif 1097 1098 // reinitialize kDefaultDevice and modify/retrieve the volume 1099 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 1100 EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available)); 1101 if (available) { 1102 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1103 EXPECT_EQ(0, audio_device_->MaxMicrophoneVolume(&maxVolume)); 1104 EXPECT_EQ(0, audio_device_->MinMicrophoneVolume(&minVolume)); 1105 EXPECT_EQ(0, audio_device_->MicrophoneVolumeStepSize(&stepSize)); 1106 for (vol = minVolume; vol < maxVolume; vol += 10 * stepSize) { 1107 EXPECT_EQ(0, audio_device_->SetMicrophoneVolume(vol)); 1108 EXPECT_EQ(0, audio_device_->MicrophoneVolume(&volume)); 1109 CheckVolume(volume, vol); 1110 } 1111 } 1112 1113 // use all (indexed) devices and modify/retrieve the volume 1114 int16_t no_devices = audio_device_->RecordingDevices(); 1115 for (int i = 0; i < no_devices; i++) { 1116 EXPECT_EQ(0, audio_device_->SetRecordingDevice(i)); 1117 EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available)); 1118 if (available) { 1119 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1120 EXPECT_EQ(0, audio_device_->MaxMicrophoneVolume(&maxVolume)); 1121 EXPECT_EQ(0, audio_device_->MinMicrophoneVolume(&minVolume)); 1122 EXPECT_EQ(0, audio_device_->MicrophoneVolumeStepSize(&stepSize)); 1123 for (vol = minVolume; vol < maxVolume; vol += 20 * stepSize) { 1124 EXPECT_EQ(0, audio_device_->SetMicrophoneVolume(vol)); 1125 EXPECT_EQ(0, audio_device_->MicrophoneVolume(&volume)); 1126 CheckVolume(volume, vol); 1127 } 1128 } 1129 } 1130 1131 // restore reasonable level 1132 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 1133 EXPECT_EQ(0, audio_device_->MicrophoneVolumeIsAvailable(&available)); 1134 if (available) { 1135 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1136 EXPECT_EQ(0, audio_device_->MaxMicrophoneVolume(&maxVolume)); 1137 EXPECT_EQ(0, audio_device_->SetMicrophoneVolume(maxVolume/10)); 1138 } 1139} 1140#endif // !WEBRTC_MAC 1141 1142TEST_F(AudioDeviceAPITest, SpeakerMuteIsAvailable) { 1143 bool available; 1144 CheckInitialPlayoutStates(); 1145#ifdef _WIN32 1146 // check the kDefaultCommunicationDevice 1147 EXPECT_TRUE(audio_device_->SetPlayoutDevice( 1148 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 1149 EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available)); 1150 // check for availability should not lead to initialization 1151 EXPECT_FALSE(audio_device_->SpeakerIsInitialized()); 1152#endif 1153 1154 // check the kDefaultDevice 1155 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 1156 EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available)); 1157 EXPECT_FALSE(audio_device_->SpeakerIsInitialized()); 1158 1159 // check all availiable devices 1160 int16_t no_devices = audio_device_->PlayoutDevices(); 1161 for (int i = 0; i < no_devices; i++) { 1162 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(i)); 1163 EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available)); 1164 EXPECT_FALSE(audio_device_->SpeakerIsInitialized()); 1165 } 1166} 1167 1168TEST_F(AudioDeviceAPITest, MicrophoneMuteIsAvailable) { 1169 bool available; 1170 CheckInitialRecordingStates(); 1171#ifdef _WIN32 1172 // check the kDefaultCommunicationDevice 1173 EXPECT_TRUE(audio_device_->SetRecordingDevice( 1174 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 1175 EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available)); 1176 // check for availability should not lead to initialization 1177#endif 1178 EXPECT_FALSE(audio_device_->MicrophoneIsInitialized()); 1179 1180 // check the kDefaultDevice 1181 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 1182 EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available)); 1183 EXPECT_FALSE(audio_device_->MicrophoneIsInitialized()); 1184 1185 // check all availiable devices 1186 int16_t no_devices = audio_device_->RecordingDevices(); 1187 for (int i = 0; i < no_devices; i++) { 1188 EXPECT_EQ(0, audio_device_->SetRecordingDevice(i)); 1189 EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available)); 1190 EXPECT_FALSE(audio_device_->MicrophoneIsInitialized()); 1191 } 1192} 1193 1194TEST_F(AudioDeviceAPITest, MicrophoneBoostIsAvailable) { 1195 bool available; 1196 CheckInitialRecordingStates(); 1197#ifdef _WIN32 1198 // check the kDefaultCommunicationDevice 1199 EXPECT_TRUE(audio_device_->SetRecordingDevice( 1200 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 1201 EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available)); 1202 // check for availability should not lead to initialization 1203 EXPECT_FALSE(audio_device_->MicrophoneIsInitialized()); 1204#endif 1205 1206 // check the kDefaultDevice 1207 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 1208 EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available)); 1209 EXPECT_FALSE(audio_device_->MicrophoneIsInitialized()); 1210 1211 // check all availiable devices 1212 int16_t no_devices = audio_device_->RecordingDevices(); 1213 for (int i = 0; i < no_devices; i++) { 1214 EXPECT_EQ(0, audio_device_->SetRecordingDevice(i)); 1215 EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available)); 1216 EXPECT_FALSE(audio_device_->MicrophoneIsInitialized()); 1217 } 1218} 1219 1220TEST_F(AudioDeviceAPITest, SpeakerMuteTests) { 1221 bool available; 1222 bool enabled; 1223 CheckInitialPlayoutStates(); 1224 // fail tests 1225 EXPECT_EQ(-1, audio_device_->SetSpeakerMute(true)); 1226 // requires initialization 1227 EXPECT_EQ(-1, audio_device_->SpeakerMute(&enabled)); 1228 1229#ifdef _WIN32 1230 // initialize kDefaultCommunicationDevice and modify/retrieve the mute state 1231 EXPECT_EQ(0, audio_device_->SetPlayoutDevice( 1232 AudioDeviceModule::kDefaultCommunicationDevice)); 1233 EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available)); 1234 if (available) 1235 { 1236 EXPECT_EQ(0, audio_device_->InitSpeaker()); 1237 EXPECT_EQ(0, audio_device_->SetSpeakerMute(true)); 1238 EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled)); 1239 EXPECT_TRUE(enabled); 1240 EXPECT_EQ(0, audio_device_->SetSpeakerMute(false)); 1241 EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled)); 1242 EXPECT_FALSE(enabled); 1243 } 1244#endif 1245 1246 // reinitialize kDefaultDevice and modify/retrieve the mute state 1247 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 1248 EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available)); 1249 if (available) { 1250 EXPECT_EQ(0, audio_device_->InitSpeaker()); 1251 EXPECT_EQ(0, audio_device_->SetSpeakerMute(true)); 1252 EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled)); 1253 EXPECT_TRUE(enabled); 1254 EXPECT_EQ(0, audio_device_->SetSpeakerMute(false)); 1255 EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled)); 1256 EXPECT_FALSE(enabled); 1257 } 1258 1259 // reinitialize the default device (0) and modify/retrieve the mute state 1260 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(0)); 1261 EXPECT_EQ(0, audio_device_->SpeakerMuteIsAvailable(&available)); 1262 if (available) { 1263 EXPECT_EQ(0, audio_device_->InitSpeaker()); 1264 EXPECT_EQ(0, audio_device_->SetSpeakerMute(true)); 1265 EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled)); 1266 EXPECT_TRUE(enabled); 1267 EXPECT_EQ(0, audio_device_->SetSpeakerMute(false)); 1268 EXPECT_EQ(0, audio_device_->SpeakerMute(&enabled)); 1269 EXPECT_FALSE(enabled); 1270 } 1271} 1272 1273TEST_F(AudioDeviceAPITest, MicrophoneMuteTests) { 1274 CheckInitialRecordingStates(); 1275 1276 // fail tests 1277 EXPECT_EQ(-1, audio_device_->SetMicrophoneMute(true)); 1278 // requires initialization 1279 bool available; 1280 bool enabled; 1281 EXPECT_EQ(-1, audio_device_->MicrophoneMute(&enabled)); 1282 1283#ifdef _WIN32 1284 // initialize kDefaultCommunicationDevice and modify/retrieve the mute 1285 EXPECT_TRUE(audio_device_->SetRecordingDevice( 1286 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 1287 EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available)); 1288 if (available) 1289 { 1290 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1291 EXPECT_EQ(0, audio_device_->SetMicrophoneMute(true)); 1292 EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled)); 1293 EXPECT_TRUE(enabled); 1294 EXPECT_EQ(0, audio_device_->SetMicrophoneMute(false)); 1295 EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled)); 1296 EXPECT_FALSE(enabled); 1297 } 1298#endif 1299 1300 // reinitialize kDefaultDevice and modify/retrieve the mute 1301 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 1302 EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available)); 1303 if (available) { 1304 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1305 EXPECT_EQ(0, audio_device_->SetMicrophoneMute(true)); 1306 EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled)); 1307 EXPECT_TRUE(enabled); 1308 EXPECT_EQ(0, audio_device_->SetMicrophoneMute(false)); 1309 EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled)); 1310 EXPECT_FALSE(enabled); 1311 } 1312 1313 // reinitialize the default device (0) and modify/retrieve the Mute 1314 EXPECT_EQ(0, audio_device_->SetRecordingDevice(0)); 1315 EXPECT_EQ(0, audio_device_->MicrophoneMuteIsAvailable(&available)); 1316 if (available) { 1317 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1318 EXPECT_EQ(0, audio_device_->SetMicrophoneMute(true)); 1319 EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled)); 1320 EXPECT_TRUE(enabled); 1321 EXPECT_EQ(0, audio_device_->SetMicrophoneMute(false)); 1322 EXPECT_EQ(0, audio_device_->MicrophoneMute(&enabled)); 1323 EXPECT_FALSE(enabled); 1324 } 1325} 1326 1327TEST_F(AudioDeviceAPITest, MicrophoneBoostTests) { 1328 bool available; 1329 bool enabled; 1330 CheckInitialRecordingStates(); 1331 1332 // fail tests 1333 EXPECT_EQ(-1, audio_device_->SetMicrophoneBoost(true)); 1334 // requires initialization 1335 EXPECT_EQ(-1, audio_device_->MicrophoneBoost(&enabled)); 1336 1337#ifdef _WIN32 1338 // initialize kDefaultCommunicationDevice and modify/retrieve the boost 1339 EXPECT_TRUE(audio_device_->SetRecordingDevice( 1340 AudioDeviceModule::kDefaultCommunicationDevice) == 0); 1341 EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available)); 1342 if (available) 1343 { 1344 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1345 EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(true)); 1346 EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled)); 1347 EXPECT_TRUE(enabled); 1348 EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(false)); 1349 EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled)); 1350 EXPECT_FALSE(enabled); 1351 } 1352#endif 1353 1354 // reinitialize kDefaultDevice and modify/retrieve the boost 1355 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 1356 EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available)); 1357 if (available) { 1358 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1359 EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(true)); 1360 EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled)); 1361 EXPECT_TRUE(enabled); 1362 EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(false)); 1363 EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled)); 1364 EXPECT_FALSE(enabled); 1365 } 1366 1367 // reinitialize the default device (0) and modify/retrieve the boost 1368 EXPECT_EQ(0, audio_device_->SetRecordingDevice(0)); 1369 EXPECT_EQ(0, audio_device_->MicrophoneBoostIsAvailable(&available)); 1370 if (available) { 1371 EXPECT_EQ(0, audio_device_->InitMicrophone()); 1372 EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(true)); 1373 EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled)); 1374 EXPECT_TRUE(enabled); 1375 EXPECT_EQ(0, audio_device_->SetMicrophoneBoost(false)); 1376 EXPECT_EQ(0, audio_device_->MicrophoneBoost(&enabled)); 1377 EXPECT_FALSE(enabled); 1378 } 1379} 1380 1381TEST_F(AudioDeviceAPITest, StereoPlayoutTests) { 1382 CheckInitialPlayoutStates(); 1383 1384 // fail tests 1385 EXPECT_EQ(-1, audio_device_->InitPlayout()); 1386 EXPECT_EQ(0, audio_device_->SetPlayoutDevice( 1387 MACRO_DEFAULT_COMMUNICATION_DEVICE)); 1388 1389 // TODO(kjellander): Fix so these tests pass on Mac. 1390#if !defined(WEBRTC_MAC) 1391 EXPECT_EQ(0, audio_device_->InitPlayout()); 1392 EXPECT_TRUE(audio_device_->PlayoutIsInitialized()); 1393 // must be performed before initialization 1394 EXPECT_EQ(-1, audio_device_->SetStereoPlayout(true)); 1395#endif 1396 1397 // ensure that we can set the stereo mode for playout 1398 EXPECT_EQ(0, audio_device_->StopPlayout()); 1399 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 1400 1401 // initialize kDefaultCommunicationDevice and modify/retrieve stereo support 1402 EXPECT_EQ(0, audio_device_->SetPlayoutDevice( 1403 MACRO_DEFAULT_COMMUNICATION_DEVICE)); 1404 bool available; 1405 bool enabled; 1406 EXPECT_EQ(0, audio_device_->StereoPlayoutIsAvailable(&available)); 1407 if (available) { 1408 EXPECT_EQ(0, audio_device_->SetStereoPlayout(true)); 1409 EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled)); 1410 EXPECT_TRUE(enabled); 1411 EXPECT_EQ(0, audio_device_->SetStereoPlayout(false)); 1412 EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled)); 1413 EXPECT_FALSE(enabled); 1414 EXPECT_EQ(0, audio_device_->SetStereoPlayout(true)); 1415 EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled)); 1416 EXPECT_TRUE(enabled); 1417 } 1418 1419 // initialize kDefaultDevice and modify/retrieve stereo support 1420 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 1421 EXPECT_EQ(0, audio_device_->StereoPlayoutIsAvailable(&available)); 1422 if (available) { 1423 EXPECT_EQ(0, audio_device_->SetStereoPlayout(true)); 1424 EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled)); 1425 EXPECT_TRUE(enabled); 1426 EXPECT_EQ(0, audio_device_->SetStereoPlayout(false)); 1427 EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled)); 1428 EXPECT_FALSE(enabled); 1429 EXPECT_EQ(0, audio_device_->SetStereoPlayout(true)); 1430 EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled)); 1431 EXPECT_TRUE(enabled); 1432 } 1433 1434 // initialize default device (0) and modify/retrieve stereo support 1435 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(0)); 1436 EXPECT_EQ(0, audio_device_->StereoPlayoutIsAvailable(&available)); 1437 if (available) { 1438 EXPECT_EQ(0, audio_device_->SetStereoPlayout(true)); 1439 EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled)); 1440 EXPECT_TRUE(enabled); 1441 EXPECT_EQ(0, audio_device_->SetStereoPlayout(false)); 1442 EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled)); 1443 EXPECT_FALSE(enabled); 1444 EXPECT_EQ(0, audio_device_->SetStereoPlayout(true)); 1445 EXPECT_EQ(0, audio_device_->StereoPlayout(&enabled)); 1446 EXPECT_TRUE(enabled); 1447 } 1448} 1449 1450TEST_F(AudioDeviceAPITest, StereoRecordingTests) { 1451 CheckInitialRecordingStates(); 1452 EXPECT_FALSE(audio_device_->Playing()); 1453 1454 // fail tests 1455 EXPECT_EQ(-1, audio_device_->InitRecording()); 1456 EXPECT_EQ(0, audio_device_->SetRecordingDevice( 1457 MACRO_DEFAULT_COMMUNICATION_DEVICE)); 1458 1459 // TODO(kjellander): Fix so these tests pass on Mac. 1460#if !defined(WEBRTC_MAC) 1461 EXPECT_EQ(0, audio_device_->InitRecording()); 1462 EXPECT_TRUE(audio_device_->RecordingIsInitialized()); 1463 // must be performed before initialization 1464 EXPECT_EQ(-1, audio_device_->SetStereoRecording(true)); 1465#endif 1466 // ensures that we can set the stereo mode for recording 1467 EXPECT_EQ(0, audio_device_->StopRecording()); 1468 EXPECT_FALSE(audio_device_->RecordingIsInitialized()); 1469 1470 // initialize kDefaultCommunicationDevice and modify/retrieve stereo support 1471 EXPECT_EQ(0, audio_device_->SetRecordingDevice( 1472 MACRO_DEFAULT_COMMUNICATION_DEVICE)); 1473 bool available; 1474 bool enabled; 1475 EXPECT_EQ(0, audio_device_->StereoRecordingIsAvailable(&available)); 1476 if (available) { 1477 EXPECT_EQ(0, audio_device_->SetStereoRecording(true)); 1478 EXPECT_EQ(0, audio_device_->StereoRecording(&enabled)); 1479 EXPECT_TRUE(enabled); 1480 EXPECT_EQ(0, audio_device_->SetStereoRecording(false)); 1481 EXPECT_EQ(0, audio_device_->StereoRecording(&enabled)); 1482 EXPECT_FALSE(enabled); 1483 } 1484 1485 // initialize kDefaultDevice and modify/retrieve stereo support 1486 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 1487 EXPECT_EQ(0, audio_device_->StereoRecordingIsAvailable(&available)); 1488 if (available) { 1489 EXPECT_EQ(0, audio_device_->SetStereoRecording(true)); 1490 EXPECT_EQ(0, audio_device_->StereoRecording(&enabled)); 1491 EXPECT_TRUE(enabled); 1492 EXPECT_EQ(0, audio_device_->SetStereoRecording(false)); 1493 EXPECT_EQ(0, audio_device_->StereoRecording(&enabled)); 1494 EXPECT_FALSE(enabled); 1495 } 1496 1497 // initialize default device (0) and modify/retrieve stereo support 1498 EXPECT_EQ(0, audio_device_->SetRecordingDevice(0)); 1499 EXPECT_EQ(0, audio_device_->StereoRecordingIsAvailable(&available)); 1500 if (available) { 1501 EXPECT_EQ(0, audio_device_->SetStereoRecording(true)); 1502 EXPECT_EQ(0, audio_device_->StereoRecording(&enabled)); 1503 EXPECT_TRUE(enabled); 1504 EXPECT_EQ(0, audio_device_->SetStereoRecording(false)); 1505 EXPECT_EQ(0, audio_device_->StereoRecording(&enabled)); 1506 EXPECT_FALSE(enabled); 1507 } 1508} 1509 1510TEST_F(AudioDeviceAPITest, RecordingChannelTests) { 1511 // the user in Win Core Audio 1512 AudioDeviceModule::ChannelType channelType(AudioDeviceModule::kChannelBoth); 1513 CheckInitialRecordingStates(); 1514 EXPECT_FALSE(audio_device_->Playing()); 1515 1516 // fail tests 1517 EXPECT_EQ(0, audio_device_->SetStereoRecording(false)); 1518 EXPECT_EQ(-1, audio_device_->SetRecordingChannel( 1519 AudioDeviceModule::kChannelBoth)); 1520 1521 // initialize kDefaultCommunicationDevice and modify/retrieve stereo support 1522 EXPECT_EQ(0, audio_device_->SetRecordingDevice( 1523 MACRO_DEFAULT_COMMUNICATION_DEVICE)); 1524 bool available; 1525 EXPECT_EQ(0, audio_device_->StereoRecordingIsAvailable(&available)); 1526 if (available) { 1527 EXPECT_EQ(0, audio_device_->SetStereoRecording(true)); 1528 EXPECT_EQ(0, audio_device_->SetRecordingChannel( 1529 AudioDeviceModule::kChannelBoth)); 1530 EXPECT_EQ(0, audio_device_->RecordingChannel(&channelType)); 1531 EXPECT_EQ(AudioDeviceModule::kChannelBoth, channelType); 1532 EXPECT_EQ(0, audio_device_->SetRecordingChannel( 1533 AudioDeviceModule::kChannelLeft)); 1534 EXPECT_EQ(0, audio_device_->RecordingChannel(&channelType)); 1535 EXPECT_EQ(AudioDeviceModule::kChannelLeft, channelType); 1536 EXPECT_EQ(0, audio_device_->SetRecordingChannel( 1537 AudioDeviceModule::kChannelRight)); 1538 EXPECT_EQ(0, audio_device_->RecordingChannel(&channelType)); 1539 EXPECT_EQ(AudioDeviceModule::kChannelRight, channelType); 1540 } 1541} 1542 1543TEST_F(AudioDeviceAPITest, PlayoutBufferTests) { 1544 AudioDeviceModule::BufferType bufferType; 1545 uint16_t sizeMS(0); 1546 1547 CheckInitialPlayoutStates(); 1548 EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS)); 1549#if defined(_WIN32) || defined(ANDROID) || defined(WEBRTC_IOS) 1550 EXPECT_EQ(AudioDeviceModule::kAdaptiveBufferSize, bufferType); 1551#else 1552 EXPECT_EQ(AudioDeviceModule::kFixedBufferSize, bufferType); 1553#endif 1554 1555 // fail tests 1556 EXPECT_EQ(-1, audio_device_->InitPlayout()); 1557 // must set device first 1558 EXPECT_EQ(0, audio_device_->SetPlayoutDevice( 1559 MACRO_DEFAULT_COMMUNICATION_DEVICE)); 1560 1561 // TODO(kjellander): Fix so these tests pass on Mac. 1562#if !defined(WEBRTC_MAC) 1563 EXPECT_EQ(0, audio_device_->InitPlayout()); 1564 EXPECT_TRUE(audio_device_->PlayoutIsInitialized()); 1565#endif 1566 EXPECT_TRUE(audio_device_->SetPlayoutBuffer( 1567 AudioDeviceModule::kAdaptiveBufferSize, 100) == -1); 1568 EXPECT_EQ(0, audio_device_->StopPlayout()); 1569 EXPECT_TRUE(audio_device_->SetPlayoutBuffer( 1570 AudioDeviceModule::kFixedBufferSize, kAdmMinPlayoutBufferSizeMs-1) == -1); 1571 EXPECT_TRUE(audio_device_->SetPlayoutBuffer( 1572 AudioDeviceModule::kFixedBufferSize, kAdmMaxPlayoutBufferSizeMs+1) == -1); 1573 1574 // bulk tests (all should be successful) 1575 EXPECT_FALSE(audio_device_->PlayoutIsInitialized()); 1576#ifdef _WIN32 1577 EXPECT_EQ(0, audio_device_->SetPlayoutBuffer( 1578 AudioDeviceModule::kAdaptiveBufferSize, 0)); 1579 EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS)); 1580 EXPECT_EQ(AudioDeviceModule::kAdaptiveBufferSize, bufferType); 1581 EXPECT_EQ(0, audio_device_->SetPlayoutBuffer( 1582 AudioDeviceModule::kAdaptiveBufferSize, 10000)); 1583 EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS)); 1584 EXPECT_EQ(AudioDeviceModule::kAdaptiveBufferSize, bufferType); 1585#endif 1586#if defined(ANDROID) || defined(WEBRTC_IOS) 1587 EXPECT_EQ(-1, 1588 audio_device_->SetPlayoutBuffer(AudioDeviceModule::kFixedBufferSize, 1589 kAdmMinPlayoutBufferSizeMs)); 1590#else 1591 EXPECT_EQ(0, audio_device_->SetPlayoutBuffer( 1592 AudioDeviceModule::kFixedBufferSize, kAdmMinPlayoutBufferSizeMs)); 1593 EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS)); 1594 EXPECT_EQ(AudioDeviceModule::kFixedBufferSize, bufferType); 1595 EXPECT_EQ(kAdmMinPlayoutBufferSizeMs, sizeMS); 1596 EXPECT_EQ(0, audio_device_->SetPlayoutBuffer( 1597 AudioDeviceModule::kFixedBufferSize, kAdmMaxPlayoutBufferSizeMs)); 1598 EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS)); 1599 EXPECT_EQ(AudioDeviceModule::kFixedBufferSize, bufferType); 1600 EXPECT_EQ(kAdmMaxPlayoutBufferSizeMs, sizeMS); 1601 EXPECT_EQ(0, audio_device_->SetPlayoutBuffer( 1602 AudioDeviceModule::kFixedBufferSize, 100)); 1603 EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS)); 1604 EXPECT_EQ(AudioDeviceModule::kFixedBufferSize, bufferType); 1605 EXPECT_EQ(100, sizeMS); 1606#endif 1607 1608#ifdef _WIN32 1609 // restore default 1610 EXPECT_EQ(0, audio_device_->SetPlayoutBuffer( 1611 AudioDeviceModule::kAdaptiveBufferSize, 0)); 1612 EXPECT_EQ(0, audio_device_->PlayoutBuffer(&bufferType, &sizeMS)); 1613#endif 1614} 1615 1616TEST_F(AudioDeviceAPITest, PlayoutDelay) { 1617 // NOTE: this API is better tested in a functional test 1618 uint16_t sizeMS(0); 1619 CheckInitialPlayoutStates(); 1620 // bulk tests 1621 EXPECT_EQ(0, audio_device_->PlayoutDelay(&sizeMS)); 1622 EXPECT_EQ(0, audio_device_->PlayoutDelay(&sizeMS)); 1623} 1624 1625TEST_F(AudioDeviceAPITest, RecordingDelay) { 1626 // NOTE: this API is better tested in a functional test 1627 uint16_t sizeMS(0); 1628 CheckInitialRecordingStates(); 1629 1630 // bulk tests 1631 EXPECT_EQ(0, audio_device_->RecordingDelay(&sizeMS)); 1632 EXPECT_EQ(0, audio_device_->RecordingDelay(&sizeMS)); 1633} 1634 1635TEST_F(AudioDeviceAPITest, CPULoad) { 1636 // NOTE: this API is better tested in a functional test 1637 uint16_t load(0); 1638 1639 // bulk tests 1640#ifdef _WIN32 1641 EXPECT_EQ(0, audio_device_->CPULoad(&load)); 1642 EXPECT_EQ(0, load); 1643#else 1644 EXPECT_EQ(-1, audio_device_->CPULoad(&load)); 1645#endif 1646} 1647 1648// TODO(kjellander): Fix flakiness causing failures on Windows. 1649// TODO(phoglund): Fix flakiness causing failures on Linux. 1650#if !defined(_WIN32) && !defined(WEBRTC_LINUX) 1651TEST_F(AudioDeviceAPITest, StartAndStopRawOutputFileRecording) { 1652 // NOTE: this API is better tested in a functional test 1653 CheckInitialPlayoutStates(); 1654 1655 // fail tests 1656 EXPECT_EQ(-1, audio_device_->StartRawOutputFileRecording(NULL)); 1657 1658 // bulk tests 1659 EXPECT_EQ(0, audio_device_->StartRawOutputFileRecording( 1660 GetFilename("raw_output_not_playing.pcm"))); 1661 EXPECT_EQ(0, audio_device_->StopRawOutputFileRecording()); 1662 EXPECT_EQ(0, audio_device_->SetPlayoutDevice( 1663 MACRO_DEFAULT_COMMUNICATION_DEVICE)); 1664 1665 // TODO(kjellander): Fix so these tests pass on Mac. 1666#if !defined(WEBRTC_MAC) 1667 EXPECT_EQ(0, audio_device_->InitPlayout()); 1668 EXPECT_EQ(0, audio_device_->StartPlayout()); 1669#endif 1670 1671 EXPECT_EQ(0, audio_device_->StartRawOutputFileRecording( 1672 GetFilename("raw_output_playing.pcm"))); 1673 SleepMs(100); 1674 EXPECT_EQ(0, audio_device_->StopRawOutputFileRecording()); 1675 EXPECT_EQ(0, audio_device_->StopPlayout()); 1676 EXPECT_EQ(0, audio_device_->StartRawOutputFileRecording( 1677 GetFilename("raw_output_not_playing.pcm"))); 1678 EXPECT_EQ(0, audio_device_->StopRawOutputFileRecording()); 1679 1680 // results after this test: 1681 // 1682 // - size of raw_output_not_playing.pcm shall be 0 1683 // - size of raw_output_playing.pcm shall be > 0 1684} 1685 1686TEST_F(AudioDeviceAPITest, StartAndStopRawInputFileRecording) { 1687 // NOTE: this API is better tested in a functional test 1688 CheckInitialRecordingStates(); 1689 EXPECT_FALSE(audio_device_->Playing()); 1690 1691 // fail tests 1692 EXPECT_EQ(-1, audio_device_->StartRawInputFileRecording(NULL)); 1693 1694 // bulk tests 1695 EXPECT_EQ(0, audio_device_->StartRawInputFileRecording( 1696 GetFilename("raw_input_not_recording.pcm"))); 1697 EXPECT_EQ(0, audio_device_->StopRawInputFileRecording()); 1698 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 1699 1700 // TODO(kjellander): Fix so these tests pass on Mac. 1701#if !defined(WEBRTC_MAC) 1702 EXPECT_EQ(0, audio_device_->InitRecording()); 1703 EXPECT_EQ(0, audio_device_->StartRecording()); 1704#endif 1705 EXPECT_EQ(0, audio_device_->StartRawInputFileRecording( 1706 GetFilename("raw_input_recording.pcm"))); 1707 SleepMs(100); 1708 EXPECT_EQ(0, audio_device_->StopRawInputFileRecording()); 1709 EXPECT_EQ(0, audio_device_->StopRecording()); 1710 EXPECT_EQ(0, audio_device_->StartRawInputFileRecording( 1711 GetFilename("raw_input_not_recording.pcm"))); 1712 EXPECT_EQ(0, audio_device_->StopRawInputFileRecording()); 1713 1714 // results after this test: 1715 // 1716 // - size of raw_input_not_recording.pcm shall be 0 1717 // - size of raw_input_not_recording.pcm shall be > 0 1718} 1719#endif // !WIN32 && !WEBRTC_LINUX 1720 1721TEST_F(AudioDeviceAPITest, RecordingSampleRate) { 1722 uint32_t sampleRate(0); 1723 1724 // bulk tests 1725 EXPECT_EQ(0, audio_device_->RecordingSampleRate(&sampleRate)); 1726#if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 1727 EXPECT_EQ(48000, sampleRate); 1728#elif defined(ANDROID) 1729 TEST_LOG("Recording sample rate is %u\n\n", sampleRate); 1730 EXPECT_TRUE((sampleRate == 44000) || (sampleRate == 16000)); 1731#elif defined(WEBRTC_IOS) 1732 TEST_LOG("Recording sample rate is %u\n\n", sampleRate); 1733 EXPECT_TRUE((sampleRate == 44000) || (sampleRate == 16000) || 1734 (sampleRate == 8000)); 1735#endif 1736 1737 // @TODO(xians) - add tests for all platforms here... 1738} 1739 1740TEST_F(AudioDeviceAPITest, PlayoutSampleRate) { 1741 uint32_t sampleRate(0); 1742 1743 // bulk tests 1744 EXPECT_EQ(0, audio_device_->PlayoutSampleRate(&sampleRate)); 1745#if defined(_WIN32) && !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 1746 EXPECT_EQ(48000, sampleRate); 1747#elif defined(ANDROID) 1748 TEST_LOG("Playout sample rate is %u\n\n", sampleRate); 1749 EXPECT_TRUE((sampleRate == 44000) || (sampleRate == 16000)); 1750#elif defined(WEBRTC_IOS) 1751 TEST_LOG("Playout sample rate is %u\n\n", sampleRate); 1752 EXPECT_TRUE((sampleRate == 44000) || (sampleRate == 16000) || 1753 (sampleRate == 8000)); 1754#endif 1755} 1756 1757TEST_F(AudioDeviceAPITest, ResetAudioDevice) { 1758 CheckInitialPlayoutStates(); 1759 CheckInitialRecordingStates(); 1760 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 1761 EXPECT_EQ(0, audio_device_->SetRecordingDevice(MACRO_DEFAULT_DEVICE)); 1762 1763#if defined(WEBRTC_IOS) 1764 // Not playing or recording, should just return 0 1765 EXPECT_EQ(0, audio_device_->ResetAudioDevice()); 1766 1767 EXPECT_EQ(0, audio_device_->InitRecording()); 1768 EXPECT_EQ(0, audio_device_->StartRecording()); 1769 EXPECT_EQ(0, audio_device_->InitPlayout()); 1770 EXPECT_EQ(0, audio_device_->StartPlayout()); 1771 for (int l=0; l<20; ++l) 1772 { 1773 TEST_LOG("Resetting sound device several time with pause %d ms\n", l); 1774 EXPECT_EQ(0, audio_device_->ResetAudioDevice()); 1775 SleepMs(l); 1776 } 1777#else 1778 // Fail tests 1779 EXPECT_EQ(-1, audio_device_->ResetAudioDevice()); 1780 1781 // TODO(kjellander): Fix so these tests pass on Mac. 1782#if !defined(WEBRTC_MAC) 1783 EXPECT_EQ(0, audio_device_->InitRecording()); 1784 EXPECT_EQ(0, audio_device_->StartRecording()); 1785 EXPECT_EQ(0, audio_device_->InitPlayout()); 1786 EXPECT_EQ(0, audio_device_->StartPlayout()); 1787#endif 1788 EXPECT_EQ(-1, audio_device_->ResetAudioDevice()); 1789#endif 1790 EXPECT_EQ(0, audio_device_->StopRecording()); 1791 EXPECT_EQ(0, audio_device_->StopPlayout()); 1792} 1793 1794TEST_F(AudioDeviceAPITest, SetPlayoutSpeaker) { 1795 CheckInitialPlayoutStates(); 1796 EXPECT_EQ(0, audio_device_->SetPlayoutDevice(MACRO_DEFAULT_DEVICE)); 1797 1798 bool loudspeakerOn(false); 1799#if defined(WEBRTC_IOS) 1800 // Not playing or recording, should just return a success 1801 EXPECT_EQ(0, audio_device_->SetLoudspeakerStatus(true)); 1802 EXPECT_EQ(0, audio_device_->GetLoudspeakerStatus(&loudspeakerOn)); 1803 EXPECT_TRUE(loudspeakerOn); 1804 EXPECT_EQ(0, audio_device_->SetLoudspeakerStatus(false)); 1805 EXPECT_EQ(0, audio_device_->GetLoudspeakerStatus(&loudspeakerOn)); 1806 EXPECT_FALSE(loudspeakerOn); 1807 1808 EXPECT_EQ(0, audio_device_->InitPlayout()); 1809 EXPECT_EQ(0, audio_device_->StartPlayout()); 1810 EXPECT_EQ(0, audio_device_->SetLoudspeakerStatus(true)); 1811 EXPECT_EQ(0, audio_device_->GetLoudspeakerStatus(&loudspeakerOn)); 1812 EXPECT_TRUE(loudspeakerOn); 1813 EXPECT_EQ(0, audio_device_->SetLoudspeakerStatus(false)); 1814 EXPECT_EQ(0, audio_device_->GetLoudspeakerStatus(&loudspeakerOn)); 1815 EXPECT_FALSE(loudspeakerOn); 1816 1817#else 1818 // Fail tests 1819 EXPECT_EQ(-1, audio_device_->SetLoudspeakerStatus(true)); 1820 EXPECT_EQ(-1, audio_device_->SetLoudspeakerStatus(false)); 1821 EXPECT_EQ(-1, audio_device_->SetLoudspeakerStatus(true)); 1822 EXPECT_EQ(-1, audio_device_->SetLoudspeakerStatus(false)); 1823 1824 // TODO(kjellander): Fix so these tests pass on Mac. 1825#if !defined(WEBRTC_MAC) 1826 EXPECT_EQ(0, audio_device_->InitPlayout()); 1827 EXPECT_EQ(0, audio_device_->StartPlayout()); 1828#endif 1829 1830 EXPECT_EQ(-1, audio_device_->GetLoudspeakerStatus(&loudspeakerOn)); 1831#endif 1832 EXPECT_EQ(0, audio_device_->StopPlayout()); 1833} 1834