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 "webrtc/common_audio/signal_processing/include/signal_processing_library.h" 12 #include "webrtc/modules/audio_device/audio_device_config.h" 13 #include "webrtc/modules/audio_device/audio_device_impl.h" 14 #include "webrtc/system_wrappers/interface/ref_count.h" 15 16 #include <assert.h> 17 #include <string.h> 18 19 #if defined(_WIN32) 20 #include "audio_device_utility_win.h" 21 #include "audio_device_wave_win.h" 22 #if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 23 #include "audio_device_core_win.h" 24 #endif 25 #elif defined(WEBRTC_ANDROID) 26 #include <stdlib.h> 27 #include "audio_device_utility_android.h" 28 #include "webrtc/modules/audio_device/android/audio_device_template.h" 29 #include "webrtc/modules/audio_device/android/audio_record_jni.h" 30 #include "webrtc/modules/audio_device/android/audio_track_jni.h" 31 #include "webrtc/modules/audio_device/android/opensles_input.h" 32 #include "webrtc/modules/audio_device/android/opensles_output.h" 33 #elif defined(WEBRTC_LINUX) 34 #include "audio_device_utility_linux.h" 35 #if defined(LINUX_ALSA) 36 #include "audio_device_alsa_linux.h" 37 #endif 38 #if defined(LINUX_PULSE) 39 #include "audio_device_pulse_linux.h" 40 #endif 41 #elif defined(WEBRTC_IOS) 42 #include "audio_device_utility_ios.h" 43 #include "audio_device_ios.h" 44 #elif defined(WEBRTC_MAC) 45 #include "audio_device_utility_mac.h" 46 #include "audio_device_mac.h" 47 #endif 48 49 #if defined(WEBRTC_DUMMY_FILE_DEVICES) 50 #include "webrtc/modules/audio_device/dummy/file_audio_device_factory.h" 51 #endif 52 53 #include "webrtc/modules/audio_device/dummy/audio_device_dummy.h" 54 #include "webrtc/modules/audio_device/dummy/audio_device_utility_dummy.h" 55 #include "webrtc/modules/audio_device/dummy/file_audio_device.h" 56 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 57 #include "webrtc/system_wrappers/interface/trace.h" 58 59 #define CHECK_INITIALIZED() \ 60 { \ 61 if (!_initialized) { \ 62 return -1; \ 63 }; \ 64 } 65 66 #define CHECK_INITIALIZED_BOOL() \ 67 { \ 68 if (!_initialized) { \ 69 return false; \ 70 }; \ 71 } 72 73 namespace webrtc 74 { 75 76 AudioDeviceModule* CreateAudioDeviceModule( 77 int32_t id, AudioDeviceModule::AudioLayer audioLayer) { 78 return AudioDeviceModuleImpl::Create(id, audioLayer); 79 } 80 81 82 // ============================================================================ 83 // Static methods 84 // ============================================================================ 85 86 // ---------------------------------------------------------------------------- 87 // AudioDeviceModule::Create() 88 // ---------------------------------------------------------------------------- 89 90 AudioDeviceModule* AudioDeviceModuleImpl::Create(const int32_t id, 91 const AudioLayer audioLayer) 92 { 93 94 // Create the generic ref counted (platform independent) implementation. 95 RefCountImpl<AudioDeviceModuleImpl>* audioDevice = 96 new RefCountImpl<AudioDeviceModuleImpl>(id, audioLayer); 97 98 // Ensure that the current platform is supported. 99 if (audioDevice->CheckPlatform() == -1) 100 { 101 delete audioDevice; 102 return NULL; 103 } 104 105 // Create the platform-dependent implementation. 106 if (audioDevice->CreatePlatformSpecificObjects() == -1) 107 { 108 delete audioDevice; 109 return NULL; 110 } 111 112 // Ensure that the generic audio buffer can communicate with the 113 // platform-specific parts. 114 if (audioDevice->AttachAudioBuffer() == -1) 115 { 116 delete audioDevice; 117 return NULL; 118 } 119 120 WebRtcSpl_Init(); 121 122 return audioDevice; 123 } 124 125 // ============================================================================ 126 // Construction & Destruction 127 // ============================================================================ 128 129 // ---------------------------------------------------------------------------- 130 // AudioDeviceModuleImpl - ctor 131 // ---------------------------------------------------------------------------- 132 133 AudioDeviceModuleImpl::AudioDeviceModuleImpl(const int32_t id, const AudioLayer audioLayer) : 134 _critSect(*CriticalSectionWrapper::CreateCriticalSection()), 135 _critSectEventCb(*CriticalSectionWrapper::CreateCriticalSection()), 136 _critSectAudioCb(*CriticalSectionWrapper::CreateCriticalSection()), 137 _ptrCbAudioDeviceObserver(NULL), 138 _ptrAudioDeviceUtility(NULL), 139 _ptrAudioDevice(NULL), 140 _id(id), 141 _platformAudioLayer(audioLayer), 142 _lastProcessTime(AudioDeviceUtility::GetTimeInMS()), 143 _platformType(kPlatformNotSupported), 144 _initialized(false), 145 _lastError(kAdmErrNone) 146 { 147 WEBRTC_TRACE(kTraceMemory, kTraceAudioDevice, id, "%s created", __FUNCTION__); 148 } 149 150 // ---------------------------------------------------------------------------- 151 // CheckPlatform 152 // ---------------------------------------------------------------------------- 153 154 int32_t AudioDeviceModuleImpl::CheckPlatform() 155 { 156 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", __FUNCTION__); 157 158 // Ensure that the current platform is supported 159 // 160 PlatformType platform(kPlatformNotSupported); 161 162 #if defined(_WIN32) 163 platform = kPlatformWin32; 164 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is WIN32"); 165 #elif defined(WEBRTC_ANDROID) 166 platform = kPlatformAndroid; 167 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is ANDROID"); 168 #elif defined(WEBRTC_LINUX) 169 platform = kPlatformLinux; 170 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is LINUX"); 171 #elif defined(WEBRTC_IOS) 172 platform = kPlatformIOS; 173 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is IOS"); 174 #elif defined(WEBRTC_MAC) 175 platform = kPlatformMac; 176 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is MAC"); 177 #endif 178 179 if (platform == kPlatformNotSupported) 180 { 181 WEBRTC_TRACE(kTraceCritical, kTraceAudioDevice, _id, "current platform is not supported => this module will self destruct!"); 182 return -1; 183 } 184 185 // Store valid output results 186 // 187 _platformType = platform; 188 189 return 0; 190 } 191 192 193 // ---------------------------------------------------------------------------- 194 // CreatePlatformSpecificObjects 195 // ---------------------------------------------------------------------------- 196 197 int32_t AudioDeviceModuleImpl::CreatePlatformSpecificObjects() 198 { 199 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", __FUNCTION__); 200 201 AudioDeviceGeneric* ptrAudioDevice(NULL); 202 AudioDeviceUtility* ptrAudioDeviceUtility(NULL); 203 204 #if defined(WEBRTC_DUMMY_AUDIO_BUILD) 205 ptrAudioDevice = new AudioDeviceDummy(Id()); 206 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Dummy Audio APIs will be utilized"); 207 208 if (ptrAudioDevice != NULL) 209 { 210 ptrAudioDeviceUtility = new AudioDeviceUtilityDummy(Id()); 211 } 212 #elif defined(WEBRTC_DUMMY_FILE_DEVICES) 213 ptrAudioDevice = FileAudioDeviceFactory::CreateFileAudioDevice(Id()); 214 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, 215 "Will use file-playing dummy device."); 216 if (ptrAudioDevice != NULL) 217 { 218 ptrAudioDeviceUtility = new AudioDeviceUtilityDummy(Id()); 219 } 220 #else 221 const AudioLayer audioLayer(PlatformAudioLayer()); 222 223 // Create the *Windows* implementation of the Audio Device 224 // 225 #if defined(_WIN32) 226 if ((audioLayer == kWindowsWaveAudio) 227 #if !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 228 // Wave audio is default if Core audio is not supported in this build 229 || (audioLayer == kPlatformDefaultAudio) 230 #endif 231 ) 232 { 233 // create *Windows Wave Audio* implementation 234 ptrAudioDevice = new AudioDeviceWindowsWave(Id()); 235 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Windows Wave APIs will be utilized"); 236 } 237 #if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 238 if ((audioLayer == kWindowsCoreAudio) || 239 (audioLayer == kPlatformDefaultAudio) 240 ) 241 { 242 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "attempting to use the Windows Core Audio APIs..."); 243 244 if (AudioDeviceWindowsCore::CoreAudioIsSupported()) 245 { 246 // create *Windows Core Audio* implementation 247 ptrAudioDevice = new AudioDeviceWindowsCore(Id()); 248 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Windows Core Audio APIs will be utilized"); 249 } 250 else 251 { 252 // create *Windows Wave Audio* implementation 253 ptrAudioDevice = new AudioDeviceWindowsWave(Id()); 254 if (ptrAudioDevice != NULL) 255 { 256 // Core Audio was not supported => revert to Windows Wave instead 257 _platformAudioLayer = kWindowsWaveAudio; // modify the state set at construction 258 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, "Windows Core Audio is *not* supported => Wave APIs will be utilized instead"); 259 } 260 } 261 } 262 #endif // defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD) 263 if (ptrAudioDevice != NULL) 264 { 265 // Create the Windows implementation of the Device Utility. 266 // This class is independent of the selected audio layer 267 // for Windows. 268 // 269 ptrAudioDeviceUtility = new AudioDeviceUtilityWindows(Id()); 270 } 271 #endif // #if defined(_WIN32) 272 273 // Create the *Android OpenSLES* implementation of the Audio Device 274 // 275 #if defined(WEBRTC_ANDROID) 276 if (audioLayer == kPlatformDefaultAudio) 277 { 278 // AudioRecordJni provides hardware AEC and OpenSlesOutput low latency. 279 #if defined(WEBRTC_ANDROID_OPENSLES) 280 ptrAudioDevice = new AudioDeviceTemplate<OpenSlesInput, OpenSlesOutput>(Id()); 281 #else 282 ptrAudioDevice = new AudioDeviceTemplate<AudioRecordJni, AudioTrackJni>(Id()); 283 #endif 284 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, 285 "Android OpenSLES Audio APIs will be utilized"); 286 } 287 288 if (ptrAudioDevice != NULL) 289 { 290 // Create the Android implementation of the Device Utility. 291 ptrAudioDeviceUtility = new AudioDeviceUtilityAndroid(Id()); 292 } 293 // END #if defined(WEBRTC_ANDROID) 294 295 // Create the *Linux* implementation of the Audio Device 296 // 297 #elif defined(WEBRTC_LINUX) 298 if ((audioLayer == kLinuxPulseAudio) || (audioLayer == kPlatformDefaultAudio)) 299 { 300 #if defined(LINUX_PULSE) 301 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "attempting to use the Linux PulseAudio APIs..."); 302 303 // create *Linux PulseAudio* implementation 304 AudioDeviceLinuxPulse* pulseDevice = new AudioDeviceLinuxPulse(Id()); 305 if (pulseDevice->Init() != -1) 306 { 307 ptrAudioDevice = pulseDevice; 308 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Linux PulseAudio APIs will be utilized"); 309 } 310 else 311 { 312 delete pulseDevice; 313 #endif 314 #if defined(LINUX_ALSA) 315 // create *Linux ALSA Audio* implementation 316 ptrAudioDevice = new AudioDeviceLinuxALSA(Id()); 317 if (ptrAudioDevice != NULL) 318 { 319 // Pulse Audio was not supported => revert to ALSA instead 320 _platformAudioLayer = kLinuxAlsaAudio; // modify the state set at construction 321 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, "Linux PulseAudio is *not* supported => ALSA APIs will be utilized instead"); 322 } 323 #endif 324 #if defined(LINUX_PULSE) 325 } 326 #endif 327 } 328 else if (audioLayer == kLinuxAlsaAudio) 329 { 330 #if defined(LINUX_ALSA) 331 // create *Linux ALSA Audio* implementation 332 ptrAudioDevice = new AudioDeviceLinuxALSA(Id()); 333 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Linux ALSA APIs will be utilized"); 334 #endif 335 } 336 337 if (ptrAudioDevice != NULL) 338 { 339 // Create the Linux implementation of the Device Utility. 340 // This class is independent of the selected audio layer 341 // for Linux. 342 // 343 ptrAudioDeviceUtility = new AudioDeviceUtilityLinux(Id()); 344 } 345 #endif // #if defined(WEBRTC_LINUX) 346 347 // Create the *iPhone* implementation of the Audio Device 348 // 349 #if defined(WEBRTC_IOS) 350 if (audioLayer == kPlatformDefaultAudio) 351 { 352 // Create *iPhone Audio* implementation 353 ptrAudioDevice = new AudioDeviceIPhone(Id()); 354 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "iPhone Audio APIs will be utilized"); 355 } 356 357 if (ptrAudioDevice != NULL) 358 { 359 // Create the Mac implementation of the Device Utility. 360 ptrAudioDeviceUtility = new AudioDeviceUtilityIPhone(Id()); 361 } 362 // END #if defined(WEBRTC_IOS) 363 364 // Create the *Mac* implementation of the Audio Device 365 // 366 #elif defined(WEBRTC_MAC) 367 if (audioLayer == kPlatformDefaultAudio) 368 { 369 // Create *Mac Audio* implementation 370 ptrAudioDevice = new AudioDeviceMac(Id()); 371 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Mac OS X Audio APIs will be utilized"); 372 } 373 374 if (ptrAudioDevice != NULL) 375 { 376 // Create the Mac implementation of the Device Utility. 377 ptrAudioDeviceUtility = new AudioDeviceUtilityMac(Id()); 378 } 379 #endif // WEBRTC_MAC 380 381 // Create the *Dummy* implementation of the Audio Device 382 // Available for all platforms 383 // 384 if (audioLayer == kDummyAudio) 385 { 386 // Create *Dummy Audio* implementation 387 assert(!ptrAudioDevice); 388 ptrAudioDevice = new AudioDeviceDummy(Id()); 389 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Dummy Audio APIs will be utilized"); 390 391 if (ptrAudioDevice != NULL) 392 { 393 ptrAudioDeviceUtility = new AudioDeviceUtilityDummy(Id()); 394 } 395 } 396 #endif // if defined(WEBRTC_DUMMY_AUDIO_BUILD) 397 398 if (ptrAudioDevice == NULL) 399 { 400 WEBRTC_TRACE(kTraceCritical, kTraceAudioDevice, _id, "unable to create the platform specific audio device implementation"); 401 return -1; 402 } 403 404 if (ptrAudioDeviceUtility == NULL) 405 { 406 WEBRTC_TRACE(kTraceCritical, kTraceAudioDevice, _id, "unable to create the platform specific audio device utility"); 407 return -1; 408 } 409 410 // Store valid output pointers 411 // 412 _ptrAudioDevice = ptrAudioDevice; 413 _ptrAudioDeviceUtility = ptrAudioDeviceUtility; 414 415 return 0; 416 } 417 418 // ---------------------------------------------------------------------------- 419 // AttachAudioBuffer 420 // 421 // Install "bridge" between the platform implemetation and the generic 422 // implementation. The "child" shall set the native sampling rate and the 423 // number of channels in this function call. 424 // ---------------------------------------------------------------------------- 425 426 int32_t AudioDeviceModuleImpl::AttachAudioBuffer() 427 { 428 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", __FUNCTION__); 429 430 _audioDeviceBuffer.SetId(_id); 431 _ptrAudioDevice->AttachAudioBuffer(&_audioDeviceBuffer); 432 return 0; 433 } 434 435 // ---------------------------------------------------------------------------- 436 // ~AudioDeviceModuleImpl - dtor 437 // ---------------------------------------------------------------------------- 438 439 AudioDeviceModuleImpl::~AudioDeviceModuleImpl() 440 { 441 WEBRTC_TRACE(kTraceMemory, kTraceAudioDevice, _id, "%s destroyed", __FUNCTION__); 442 443 if (_ptrAudioDevice) 444 { 445 delete _ptrAudioDevice; 446 _ptrAudioDevice = NULL; 447 } 448 449 if (_ptrAudioDeviceUtility) 450 { 451 delete _ptrAudioDeviceUtility; 452 _ptrAudioDeviceUtility = NULL; 453 } 454 455 delete &_critSect; 456 delete &_critSectEventCb; 457 delete &_critSectAudioCb; 458 } 459 460 // ============================================================================ 461 // Module 462 // ============================================================================ 463 464 // ---------------------------------------------------------------------------- 465 // Module::ChangeUniqueId 466 // ---------------------------------------------------------------------------- 467 468 int32_t AudioDeviceModuleImpl::ChangeUniqueId(const int32_t id) 469 { 470 _id = id; 471 return 0; 472 } 473 474 // ---------------------------------------------------------------------------- 475 // Module::TimeUntilNextProcess 476 // 477 // Returns the number of milliseconds until the module want a worker thread 478 // to call Process(). 479 // ---------------------------------------------------------------------------- 480 481 int32_t AudioDeviceModuleImpl::TimeUntilNextProcess() 482 { 483 uint32_t now = AudioDeviceUtility::GetTimeInMS(); 484 int32_t deltaProcess = kAdmMaxIdleTimeProcess - (now - _lastProcessTime); 485 return (deltaProcess); 486 } 487 488 // ---------------------------------------------------------------------------- 489 // Module::Process 490 // 491 // Check for posted error and warning reports. Generate callbacks if 492 // new reports exists. 493 // ---------------------------------------------------------------------------- 494 495 int32_t AudioDeviceModuleImpl::Process() 496 { 497 498 _lastProcessTime = AudioDeviceUtility::GetTimeInMS(); 499 500 // kPlayoutWarning 501 if (_ptrAudioDevice->PlayoutWarning()) 502 { 503 CriticalSectionScoped lock(&_critSectEventCb); 504 if (_ptrCbAudioDeviceObserver) 505 { 506 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, "=> OnWarningIsReported(kPlayoutWarning)"); 507 _ptrCbAudioDeviceObserver->OnWarningIsReported(AudioDeviceObserver::kPlayoutWarning); 508 } 509 _ptrAudioDevice->ClearPlayoutWarning(); 510 } 511 512 // kPlayoutError 513 if (_ptrAudioDevice->PlayoutError()) 514 { 515 CriticalSectionScoped lock(&_critSectEventCb); 516 if (_ptrCbAudioDeviceObserver) 517 { 518 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "=> OnErrorIsReported(kPlayoutError)"); 519 _ptrCbAudioDeviceObserver->OnErrorIsReported(AudioDeviceObserver::kPlayoutError); 520 } 521 _ptrAudioDevice->ClearPlayoutError(); 522 } 523 524 // kRecordingWarning 525 if (_ptrAudioDevice->RecordingWarning()) 526 { 527 CriticalSectionScoped lock(&_critSectEventCb); 528 if (_ptrCbAudioDeviceObserver) 529 { 530 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, "=> OnWarningIsReported(kRecordingWarning)"); 531 _ptrCbAudioDeviceObserver->OnWarningIsReported(AudioDeviceObserver::kRecordingWarning); 532 } 533 _ptrAudioDevice->ClearRecordingWarning(); 534 } 535 536 // kRecordingError 537 if (_ptrAudioDevice->RecordingError()) 538 { 539 CriticalSectionScoped lock(&_critSectEventCb); 540 if (_ptrCbAudioDeviceObserver) 541 { 542 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "=> OnErrorIsReported(kRecordingError)"); 543 _ptrCbAudioDeviceObserver->OnErrorIsReported(AudioDeviceObserver::kRecordingError); 544 } 545 _ptrAudioDevice->ClearRecordingError(); 546 } 547 548 return 0; 549 } 550 551 // ============================================================================ 552 // Public API 553 // ============================================================================ 554 555 // ---------------------------------------------------------------------------- 556 // ActiveAudioLayer 557 // ---------------------------------------------------------------------------- 558 559 int32_t AudioDeviceModuleImpl::ActiveAudioLayer(AudioLayer* audioLayer) const 560 { 561 562 AudioLayer activeAudio; 563 564 if (_ptrAudioDevice->ActiveAudioLayer(activeAudio) == -1) 565 { 566 return -1; 567 } 568 569 *audioLayer = activeAudio; 570 571 if (*audioLayer == AudioDeviceModule::kWindowsWaveAudio) 572 { 573 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: kWindowsWaveAudio"); 574 } 575 else if (*audioLayer == AudioDeviceModule::kWindowsCoreAudio) 576 { 577 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: kWindowsCoreAudio"); 578 } 579 else if (*audioLayer == AudioDeviceModule::kLinuxAlsaAudio) 580 { 581 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: kLinuxAlsaAudio"); 582 } 583 else 584 { 585 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: NOT_SUPPORTED"); 586 } 587 588 return 0; 589 } 590 591 // ---------------------------------------------------------------------------- 592 // LastError 593 // ---------------------------------------------------------------------------- 594 595 AudioDeviceModule::ErrorCode AudioDeviceModuleImpl::LastError() const 596 { 597 return _lastError; 598 } 599 600 // ---------------------------------------------------------------------------- 601 // Init 602 // ---------------------------------------------------------------------------- 603 604 int32_t AudioDeviceModuleImpl::Init() 605 { 606 607 if (_initialized) 608 return 0; 609 610 if (!_ptrAudioDeviceUtility) 611 return -1; 612 613 if (!_ptrAudioDevice) 614 return -1; 615 616 _ptrAudioDeviceUtility->Init(); 617 618 if (_ptrAudioDevice->Init() == -1) 619 { 620 return -1; 621 } 622 623 _initialized = true; 624 return 0; 625 } 626 627 // ---------------------------------------------------------------------------- 628 // Terminate 629 // ---------------------------------------------------------------------------- 630 631 int32_t AudioDeviceModuleImpl::Terminate() 632 { 633 634 if (!_initialized) 635 return 0; 636 637 if (_ptrAudioDevice->Terminate() == -1) 638 { 639 return -1; 640 } 641 642 _initialized = false; 643 return 0; 644 } 645 646 // ---------------------------------------------------------------------------- 647 // Initialized 648 // ---------------------------------------------------------------------------- 649 650 bool AudioDeviceModuleImpl::Initialized() const 651 { 652 653 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: %d", _initialized); 654 return (_initialized); 655 } 656 657 // ---------------------------------------------------------------------------- 658 // InitSpeaker 659 // ---------------------------------------------------------------------------- 660 661 int32_t AudioDeviceModuleImpl::InitSpeaker() 662 { 663 CHECK_INITIALIZED(); 664 return (_ptrAudioDevice->InitSpeaker()); 665 } 666 667 // ---------------------------------------------------------------------------- 668 // InitMicrophone 669 // ---------------------------------------------------------------------------- 670 671 int32_t AudioDeviceModuleImpl::InitMicrophone() 672 { 673 CHECK_INITIALIZED(); 674 return (_ptrAudioDevice->InitMicrophone()); 675 } 676 677 // ---------------------------------------------------------------------------- 678 // SpeakerVolumeIsAvailable 679 // ---------------------------------------------------------------------------- 680 681 int32_t AudioDeviceModuleImpl::SpeakerVolumeIsAvailable(bool* available) 682 { 683 CHECK_INITIALIZED(); 684 685 bool isAvailable(0); 686 687 if (_ptrAudioDevice->SpeakerVolumeIsAvailable(isAvailable) == -1) 688 { 689 return -1; 690 } 691 692 *available = isAvailable; 693 694 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available); 695 return (0); 696 } 697 698 // ---------------------------------------------------------------------------- 699 // SetSpeakerVolume 700 // ---------------------------------------------------------------------------- 701 702 int32_t AudioDeviceModuleImpl::SetSpeakerVolume(uint32_t volume) 703 { 704 CHECK_INITIALIZED(); 705 return (_ptrAudioDevice->SetSpeakerVolume(volume)); 706 } 707 708 // ---------------------------------------------------------------------------- 709 // SpeakerVolume 710 // ---------------------------------------------------------------------------- 711 712 int32_t AudioDeviceModuleImpl::SpeakerVolume(uint32_t* volume) const 713 { 714 CHECK_INITIALIZED(); 715 716 uint32_t level(0); 717 718 if (_ptrAudioDevice->SpeakerVolume(level) == -1) 719 { 720 return -1; 721 } 722 723 *volume = level; 724 725 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: volume=%u", *volume); 726 return (0); 727 } 728 729 // ---------------------------------------------------------------------------- 730 // SetWaveOutVolume 731 // ---------------------------------------------------------------------------- 732 733 int32_t AudioDeviceModuleImpl::SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight) 734 { 735 CHECK_INITIALIZED(); 736 return (_ptrAudioDevice->SetWaveOutVolume(volumeLeft, volumeRight)); 737 } 738 739 // ---------------------------------------------------------------------------- 740 // WaveOutVolume 741 // ---------------------------------------------------------------------------- 742 743 int32_t AudioDeviceModuleImpl::WaveOutVolume(uint16_t* volumeLeft, uint16_t* volumeRight) const 744 { 745 CHECK_INITIALIZED(); 746 747 uint16_t volLeft(0); 748 uint16_t volRight(0); 749 750 if (_ptrAudioDevice->WaveOutVolume(volLeft, volRight) == -1) 751 { 752 return -1; 753 } 754 755 *volumeLeft = volLeft; 756 *volumeRight = volRight; 757 758 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "outputs: volumeLeft=%u, volumeRight=%u", 759 *volumeLeft, *volumeRight); 760 761 return (0); 762 } 763 764 // ---------------------------------------------------------------------------- 765 // SpeakerIsInitialized 766 // ---------------------------------------------------------------------------- 767 768 bool AudioDeviceModuleImpl::SpeakerIsInitialized() const 769 { 770 CHECK_INITIALIZED_BOOL(); 771 772 bool isInitialized = _ptrAudioDevice->SpeakerIsInitialized(); 773 774 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: %d", isInitialized); 775 return (isInitialized); 776 } 777 778 // ---------------------------------------------------------------------------- 779 // MicrophoneIsInitialized 780 // ---------------------------------------------------------------------------- 781 782 bool AudioDeviceModuleImpl::MicrophoneIsInitialized() const 783 { 784 CHECK_INITIALIZED_BOOL(); 785 786 bool isInitialized = _ptrAudioDevice->MicrophoneIsInitialized(); 787 788 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: %d", isInitialized); 789 return (isInitialized); 790 } 791 792 // ---------------------------------------------------------------------------- 793 // MaxSpeakerVolume 794 // ---------------------------------------------------------------------------- 795 796 int32_t AudioDeviceModuleImpl::MaxSpeakerVolume(uint32_t* maxVolume) const 797 { 798 CHECK_INITIALIZED(); 799 800 uint32_t maxVol(0); 801 802 if (_ptrAudioDevice->MaxSpeakerVolume(maxVol) == -1) 803 { 804 return -1; 805 } 806 807 *maxVolume = maxVol; 808 809 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: maxVolume=%d", *maxVolume); 810 return (0); 811 } 812 813 // ---------------------------------------------------------------------------- 814 // MinSpeakerVolume 815 // ---------------------------------------------------------------------------- 816 817 int32_t AudioDeviceModuleImpl::MinSpeakerVolume(uint32_t* minVolume) const 818 { 819 CHECK_INITIALIZED(); 820 821 uint32_t minVol(0); 822 823 if (_ptrAudioDevice->MinSpeakerVolume(minVol) == -1) 824 { 825 return -1; 826 } 827 828 *minVolume = minVol; 829 830 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: minVolume=%u", *minVolume); 831 return (0); 832 } 833 834 // ---------------------------------------------------------------------------- 835 // SpeakerVolumeStepSize 836 // ---------------------------------------------------------------------------- 837 838 int32_t AudioDeviceModuleImpl::SpeakerVolumeStepSize(uint16_t* stepSize) const 839 { 840 CHECK_INITIALIZED(); 841 842 uint16_t delta(0); 843 844 if (_ptrAudioDevice->SpeakerVolumeStepSize(delta) == -1) 845 { 846 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the speaker-volume step size"); 847 return -1; 848 } 849 850 *stepSize = delta; 851 852 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: stepSize=%u", *stepSize); 853 return (0); 854 } 855 856 // ---------------------------------------------------------------------------- 857 // SpeakerMuteIsAvailable 858 // ---------------------------------------------------------------------------- 859 860 int32_t AudioDeviceModuleImpl::SpeakerMuteIsAvailable(bool* available) 861 { 862 CHECK_INITIALIZED(); 863 864 bool isAvailable(0); 865 866 if (_ptrAudioDevice->SpeakerMuteIsAvailable(isAvailable) == -1) 867 { 868 return -1; 869 } 870 871 *available = isAvailable; 872 873 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available); 874 return (0); 875 } 876 877 // ---------------------------------------------------------------------------- 878 // SetSpeakerMute 879 // ---------------------------------------------------------------------------- 880 881 int32_t AudioDeviceModuleImpl::SetSpeakerMute(bool enable) 882 { 883 CHECK_INITIALIZED(); 884 return (_ptrAudioDevice->SetSpeakerMute(enable)); 885 } 886 887 // ---------------------------------------------------------------------------- 888 // SpeakerMute 889 // ---------------------------------------------------------------------------- 890 891 int32_t AudioDeviceModuleImpl::SpeakerMute(bool* enabled) const 892 { 893 CHECK_INITIALIZED(); 894 895 bool muted(false); 896 897 if (_ptrAudioDevice->SpeakerMute(muted) == -1) 898 { 899 return -1; 900 } 901 902 *enabled = muted; 903 904 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u", *enabled); 905 return (0); 906 } 907 908 // ---------------------------------------------------------------------------- 909 // MicrophoneMuteIsAvailable 910 // ---------------------------------------------------------------------------- 911 912 int32_t AudioDeviceModuleImpl::MicrophoneMuteIsAvailable(bool* available) 913 { 914 CHECK_INITIALIZED(); 915 916 bool isAvailable(0); 917 918 if (_ptrAudioDevice->MicrophoneMuteIsAvailable(isAvailable) == -1) 919 { 920 return -1; 921 } 922 923 *available = isAvailable; 924 925 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available); 926 return (0); 927 } 928 929 // ---------------------------------------------------------------------------- 930 // SetMicrophoneMute 931 // ---------------------------------------------------------------------------- 932 933 int32_t AudioDeviceModuleImpl::SetMicrophoneMute(bool enable) 934 { 935 CHECK_INITIALIZED(); 936 return (_ptrAudioDevice->SetMicrophoneMute(enable)); 937 } 938 939 // ---------------------------------------------------------------------------- 940 // MicrophoneMute 941 // ---------------------------------------------------------------------------- 942 943 int32_t AudioDeviceModuleImpl::MicrophoneMute(bool* enabled) const 944 { 945 CHECK_INITIALIZED(); 946 947 bool muted(false); 948 949 if (_ptrAudioDevice->MicrophoneMute(muted) == -1) 950 { 951 return -1; 952 } 953 954 *enabled = muted; 955 956 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u", *enabled); 957 return (0); 958 } 959 960 // ---------------------------------------------------------------------------- 961 // MicrophoneBoostIsAvailable 962 // ---------------------------------------------------------------------------- 963 964 int32_t AudioDeviceModuleImpl::MicrophoneBoostIsAvailable(bool* available) 965 { 966 CHECK_INITIALIZED(); 967 968 bool isAvailable(0); 969 970 if (_ptrAudioDevice->MicrophoneBoostIsAvailable(isAvailable) == -1) 971 { 972 return -1; 973 } 974 975 *available = isAvailable; 976 977 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available); 978 return (0); 979 } 980 981 // ---------------------------------------------------------------------------- 982 // SetMicrophoneBoost 983 // ---------------------------------------------------------------------------- 984 985 int32_t AudioDeviceModuleImpl::SetMicrophoneBoost(bool enable) 986 { 987 CHECK_INITIALIZED(); 988 return (_ptrAudioDevice->SetMicrophoneBoost(enable)); 989 } 990 991 // ---------------------------------------------------------------------------- 992 // MicrophoneBoost 993 // ---------------------------------------------------------------------------- 994 995 int32_t AudioDeviceModuleImpl::MicrophoneBoost(bool* enabled) const 996 { 997 CHECK_INITIALIZED(); 998 999 bool onOff(false); 1000 1001 if (_ptrAudioDevice->MicrophoneBoost(onOff) == -1) 1002 { 1003 return -1; 1004 } 1005 1006 *enabled = onOff; 1007 1008 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u", *enabled); 1009 return (0); 1010 } 1011 1012 // ---------------------------------------------------------------------------- 1013 // MicrophoneVolumeIsAvailable 1014 // ---------------------------------------------------------------------------- 1015 1016 int32_t AudioDeviceModuleImpl::MicrophoneVolumeIsAvailable(bool* available) 1017 { 1018 CHECK_INITIALIZED(); 1019 1020 bool isAvailable(0); 1021 1022 if (_ptrAudioDevice->MicrophoneVolumeIsAvailable(isAvailable) == -1) 1023 { 1024 return -1; 1025 } 1026 1027 *available = isAvailable; 1028 1029 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available); 1030 return (0); 1031 } 1032 1033 // ---------------------------------------------------------------------------- 1034 // SetMicrophoneVolume 1035 // ---------------------------------------------------------------------------- 1036 1037 int32_t AudioDeviceModuleImpl::SetMicrophoneVolume(uint32_t volume) 1038 { 1039 CHECK_INITIALIZED(); 1040 return (_ptrAudioDevice->SetMicrophoneVolume(volume)); 1041 } 1042 1043 // ---------------------------------------------------------------------------- 1044 // MicrophoneVolume 1045 // ---------------------------------------------------------------------------- 1046 1047 int32_t AudioDeviceModuleImpl::MicrophoneVolume(uint32_t* volume) const 1048 { 1049 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__); 1050 CHECK_INITIALIZED(); 1051 1052 uint32_t level(0); 1053 1054 if (_ptrAudioDevice->MicrophoneVolume(level) == -1) 1055 { 1056 return -1; 1057 } 1058 1059 *volume = level; 1060 1061 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: volume=%u", *volume); 1062 return (0); 1063 } 1064 1065 // ---------------------------------------------------------------------------- 1066 // StereoRecordingIsAvailable 1067 // ---------------------------------------------------------------------------- 1068 1069 int32_t AudioDeviceModuleImpl::StereoRecordingIsAvailable(bool* available) const 1070 { 1071 CHECK_INITIALIZED(); 1072 1073 bool isAvailable(0); 1074 1075 if (_ptrAudioDevice->StereoRecordingIsAvailable(isAvailable) == -1) 1076 { 1077 return -1; 1078 } 1079 1080 *available = isAvailable; 1081 1082 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available); 1083 return (0); 1084 } 1085 1086 // ---------------------------------------------------------------------------- 1087 // SetStereoRecording 1088 // ---------------------------------------------------------------------------- 1089 1090 int32_t AudioDeviceModuleImpl::SetStereoRecording(bool enable) 1091 { 1092 CHECK_INITIALIZED(); 1093 1094 if (_ptrAudioDevice->RecordingIsInitialized()) 1095 { 1096 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "recording in stereo is not supported"); 1097 return -1; 1098 } 1099 1100 if (_ptrAudioDevice->SetStereoRecording(enable) == -1) 1101 { 1102 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to enable stereo recording"); 1103 return -1; 1104 } 1105 1106 int8_t nChannels(1); 1107 if (enable) 1108 { 1109 nChannels = 2; 1110 } 1111 _audioDeviceBuffer.SetRecordingChannels(nChannels); 1112 1113 return 0; 1114 } 1115 1116 // ---------------------------------------------------------------------------- 1117 // StereoRecording 1118 // ---------------------------------------------------------------------------- 1119 1120 int32_t AudioDeviceModuleImpl::StereoRecording(bool* enabled) const 1121 { 1122 CHECK_INITIALIZED(); 1123 1124 bool stereo(false); 1125 1126 if (_ptrAudioDevice->StereoRecording(stereo) == -1) 1127 { 1128 return -1; 1129 } 1130 1131 *enabled = stereo; 1132 1133 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u", *enabled); 1134 return (0); 1135 } 1136 1137 // ---------------------------------------------------------------------------- 1138 // SetRecordingChannel 1139 // ---------------------------------------------------------------------------- 1140 1141 int32_t AudioDeviceModuleImpl::SetRecordingChannel(const ChannelType channel) 1142 { 1143 if (channel == kChannelBoth) 1144 { 1145 } 1146 else if (channel == kChannelLeft) 1147 { 1148 } 1149 else 1150 { 1151 } 1152 CHECK_INITIALIZED(); 1153 1154 bool stereo(false); 1155 1156 if (_ptrAudioDevice->StereoRecording(stereo) == -1) 1157 { 1158 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "recording in stereo is not supported"); 1159 return -1; 1160 } 1161 1162 return (_audioDeviceBuffer.SetRecordingChannel(channel)); 1163 } 1164 1165 // ---------------------------------------------------------------------------- 1166 // RecordingChannel 1167 // ---------------------------------------------------------------------------- 1168 1169 int32_t AudioDeviceModuleImpl::RecordingChannel(ChannelType* channel) const 1170 { 1171 CHECK_INITIALIZED(); 1172 1173 ChannelType chType; 1174 1175 if (_audioDeviceBuffer.RecordingChannel(chType) == -1) 1176 { 1177 return -1; 1178 } 1179 1180 *channel = chType; 1181 1182 if (*channel == kChannelBoth) 1183 { 1184 } 1185 else if (*channel == kChannelLeft) 1186 { 1187 } 1188 else 1189 { 1190 } 1191 1192 return (0); 1193 } 1194 1195 // ---------------------------------------------------------------------------- 1196 // StereoPlayoutIsAvailable 1197 // ---------------------------------------------------------------------------- 1198 1199 int32_t AudioDeviceModuleImpl::StereoPlayoutIsAvailable(bool* available) const 1200 { 1201 CHECK_INITIALIZED(); 1202 1203 bool isAvailable(0); 1204 1205 if (_ptrAudioDevice->StereoPlayoutIsAvailable(isAvailable) == -1) 1206 { 1207 return -1; 1208 } 1209 1210 *available = isAvailable; 1211 1212 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available); 1213 return (0); 1214 } 1215 1216 // ---------------------------------------------------------------------------- 1217 // SetStereoPlayout 1218 // ---------------------------------------------------------------------------- 1219 1220 int32_t AudioDeviceModuleImpl::SetStereoPlayout(bool enable) 1221 { 1222 CHECK_INITIALIZED(); 1223 1224 if (_ptrAudioDevice->PlayoutIsInitialized()) 1225 { 1226 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "unable to set stereo mode while playing side is initialized"); 1227 return -1; 1228 } 1229 1230 if (_ptrAudioDevice->SetStereoPlayout(enable)) 1231 { 1232 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "stereo playout is not supported"); 1233 return -1; 1234 } 1235 1236 int8_t nChannels(1); 1237 if (enable) 1238 { 1239 nChannels = 2; 1240 } 1241 _audioDeviceBuffer.SetPlayoutChannels(nChannels); 1242 1243 return 0; 1244 } 1245 1246 // ---------------------------------------------------------------------------- 1247 // StereoPlayout 1248 // ---------------------------------------------------------------------------- 1249 1250 int32_t AudioDeviceModuleImpl::StereoPlayout(bool* enabled) const 1251 { 1252 CHECK_INITIALIZED(); 1253 1254 bool stereo(false); 1255 1256 if (_ptrAudioDevice->StereoPlayout(stereo) == -1) 1257 { 1258 return -1; 1259 } 1260 1261 *enabled = stereo; 1262 1263 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u", *enabled); 1264 return (0); 1265 } 1266 1267 // ---------------------------------------------------------------------------- 1268 // SetAGC 1269 // ---------------------------------------------------------------------------- 1270 1271 int32_t AudioDeviceModuleImpl::SetAGC(bool enable) 1272 { 1273 CHECK_INITIALIZED(); 1274 return (_ptrAudioDevice->SetAGC(enable)); 1275 } 1276 1277 // ---------------------------------------------------------------------------- 1278 // AGC 1279 // ---------------------------------------------------------------------------- 1280 1281 bool AudioDeviceModuleImpl::AGC() const 1282 { 1283 CHECK_INITIALIZED_BOOL(); 1284 return (_ptrAudioDevice->AGC()); 1285 } 1286 1287 // ---------------------------------------------------------------------------- 1288 // PlayoutIsAvailable 1289 // ---------------------------------------------------------------------------- 1290 1291 int32_t AudioDeviceModuleImpl::PlayoutIsAvailable(bool* available) 1292 { 1293 CHECK_INITIALIZED(); 1294 1295 bool isAvailable(0); 1296 1297 if (_ptrAudioDevice->PlayoutIsAvailable(isAvailable) == -1) 1298 { 1299 return -1; 1300 } 1301 1302 *available = isAvailable; 1303 1304 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available); 1305 return (0); 1306 } 1307 1308 // ---------------------------------------------------------------------------- 1309 // RecordingIsAvailable 1310 // ---------------------------------------------------------------------------- 1311 1312 int32_t AudioDeviceModuleImpl::RecordingIsAvailable(bool* available) 1313 { 1314 CHECK_INITIALIZED(); 1315 1316 bool isAvailable(0); 1317 1318 if (_ptrAudioDevice->RecordingIsAvailable(isAvailable) == -1) 1319 { 1320 return -1; 1321 } 1322 1323 *available = isAvailable; 1324 1325 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d", *available); 1326 return (0); 1327 } 1328 1329 // ---------------------------------------------------------------------------- 1330 // MaxMicrophoneVolume 1331 // ---------------------------------------------------------------------------- 1332 1333 int32_t AudioDeviceModuleImpl::MaxMicrophoneVolume(uint32_t* maxVolume) const 1334 { 1335 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__); 1336 CHECK_INITIALIZED(); 1337 1338 uint32_t maxVol(0); 1339 1340 if (_ptrAudioDevice->MaxMicrophoneVolume(maxVol) == -1) 1341 { 1342 return -1; 1343 } 1344 1345 *maxVolume = maxVol; 1346 1347 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: maxVolume=%d", *maxVolume); 1348 return (0); 1349 } 1350 1351 // ---------------------------------------------------------------------------- 1352 // MinMicrophoneVolume 1353 // ---------------------------------------------------------------------------- 1354 1355 int32_t AudioDeviceModuleImpl::MinMicrophoneVolume(uint32_t* minVolume) const 1356 { 1357 CHECK_INITIALIZED(); 1358 1359 uint32_t minVol(0); 1360 1361 if (_ptrAudioDevice->MinMicrophoneVolume(minVol) == -1) 1362 { 1363 return -1; 1364 } 1365 1366 *minVolume = minVol; 1367 1368 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: minVolume=%u", *minVolume); 1369 return (0); 1370 } 1371 1372 // ---------------------------------------------------------------------------- 1373 // MicrophoneVolumeStepSize 1374 // ---------------------------------------------------------------------------- 1375 1376 int32_t AudioDeviceModuleImpl::MicrophoneVolumeStepSize(uint16_t* stepSize) const 1377 { 1378 CHECK_INITIALIZED(); 1379 1380 uint16_t delta(0); 1381 1382 if (_ptrAudioDevice->MicrophoneVolumeStepSize(delta) == -1) 1383 { 1384 return -1; 1385 } 1386 1387 *stepSize = delta; 1388 1389 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: stepSize=%u", *stepSize); 1390 return (0); 1391 } 1392 1393 // ---------------------------------------------------------------------------- 1394 // PlayoutDevices 1395 // ---------------------------------------------------------------------------- 1396 1397 int16_t AudioDeviceModuleImpl::PlayoutDevices() 1398 { 1399 CHECK_INITIALIZED(); 1400 1401 uint16_t nPlayoutDevices = _ptrAudioDevice->PlayoutDevices(); 1402 1403 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: #playout devices=%d", nPlayoutDevices); 1404 return ((int16_t)(nPlayoutDevices)); 1405 } 1406 1407 // ---------------------------------------------------------------------------- 1408 // SetPlayoutDevice I (II) 1409 // ---------------------------------------------------------------------------- 1410 1411 int32_t AudioDeviceModuleImpl::SetPlayoutDevice(uint16_t index) 1412 { 1413 CHECK_INITIALIZED(); 1414 return (_ptrAudioDevice->SetPlayoutDevice(index)); 1415 } 1416 1417 // ---------------------------------------------------------------------------- 1418 // SetPlayoutDevice II (II) 1419 // ---------------------------------------------------------------------------- 1420 1421 int32_t AudioDeviceModuleImpl::SetPlayoutDevice(WindowsDeviceType device) 1422 { 1423 if (device == kDefaultDevice) 1424 { 1425 } 1426 else 1427 { 1428 } 1429 CHECK_INITIALIZED(); 1430 1431 return (_ptrAudioDevice->SetPlayoutDevice(device)); 1432 } 1433 1434 // ---------------------------------------------------------------------------- 1435 // PlayoutDeviceName 1436 // ---------------------------------------------------------------------------- 1437 1438 int32_t AudioDeviceModuleImpl::PlayoutDeviceName( 1439 uint16_t index, 1440 char name[kAdmMaxDeviceNameSize], 1441 char guid[kAdmMaxGuidSize]) 1442 { 1443 CHECK_INITIALIZED(); 1444 1445 if (name == NULL) 1446 { 1447 _lastError = kAdmErrArgument; 1448 return -1; 1449 } 1450 1451 if (_ptrAudioDevice->PlayoutDeviceName(index, name, guid) == -1) 1452 { 1453 return -1; 1454 } 1455 1456 if (name != NULL) 1457 { 1458 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: name=%s", name); 1459 } 1460 if (guid != NULL) 1461 { 1462 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: guid=%s", guid); 1463 } 1464 1465 return (0); 1466 } 1467 1468 // ---------------------------------------------------------------------------- 1469 // RecordingDeviceName 1470 // ---------------------------------------------------------------------------- 1471 1472 int32_t AudioDeviceModuleImpl::RecordingDeviceName( 1473 uint16_t index, 1474 char name[kAdmMaxDeviceNameSize], 1475 char guid[kAdmMaxGuidSize]) 1476 { 1477 CHECK_INITIALIZED(); 1478 1479 if (name == NULL) 1480 { 1481 _lastError = kAdmErrArgument; 1482 return -1; 1483 } 1484 1485 if (_ptrAudioDevice->RecordingDeviceName(index, name, guid) == -1) 1486 { 1487 return -1; 1488 } 1489 1490 if (name != NULL) 1491 { 1492 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: name=%s", name); 1493 } 1494 if (guid != NULL) 1495 { 1496 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: guid=%s", guid); 1497 } 1498 1499 return (0); 1500 } 1501 1502 // ---------------------------------------------------------------------------- 1503 // RecordingDevices 1504 // ---------------------------------------------------------------------------- 1505 1506 int16_t AudioDeviceModuleImpl::RecordingDevices() 1507 { 1508 CHECK_INITIALIZED(); 1509 1510 uint16_t nRecordingDevices = _ptrAudioDevice->RecordingDevices(); 1511 1512 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, 1513 "output: #recording devices=%d", nRecordingDevices); 1514 return ((int16_t)nRecordingDevices); 1515 } 1516 1517 // ---------------------------------------------------------------------------- 1518 // SetRecordingDevice I (II) 1519 // ---------------------------------------------------------------------------- 1520 1521 int32_t AudioDeviceModuleImpl::SetRecordingDevice(uint16_t index) 1522 { 1523 CHECK_INITIALIZED(); 1524 return (_ptrAudioDevice->SetRecordingDevice(index)); 1525 } 1526 1527 // ---------------------------------------------------------------------------- 1528 // SetRecordingDevice II (II) 1529 // ---------------------------------------------------------------------------- 1530 1531 int32_t AudioDeviceModuleImpl::SetRecordingDevice(WindowsDeviceType device) 1532 { 1533 if (device == kDefaultDevice) 1534 { 1535 } 1536 else 1537 { 1538 } 1539 CHECK_INITIALIZED(); 1540 1541 return (_ptrAudioDevice->SetRecordingDevice(device)); 1542 } 1543 1544 // ---------------------------------------------------------------------------- 1545 // InitPlayout 1546 // ---------------------------------------------------------------------------- 1547 1548 int32_t AudioDeviceModuleImpl::InitPlayout() 1549 { 1550 CHECK_INITIALIZED(); 1551 _audioDeviceBuffer.InitPlayout(); 1552 return (_ptrAudioDevice->InitPlayout()); 1553 } 1554 1555 // ---------------------------------------------------------------------------- 1556 // InitRecording 1557 // ---------------------------------------------------------------------------- 1558 1559 int32_t AudioDeviceModuleImpl::InitRecording() 1560 { 1561 CHECK_INITIALIZED(); 1562 _audioDeviceBuffer.InitRecording(); 1563 return (_ptrAudioDevice->InitRecording()); 1564 } 1565 1566 // ---------------------------------------------------------------------------- 1567 // PlayoutIsInitialized 1568 // ---------------------------------------------------------------------------- 1569 1570 bool AudioDeviceModuleImpl::PlayoutIsInitialized() const 1571 { 1572 CHECK_INITIALIZED_BOOL(); 1573 return (_ptrAudioDevice->PlayoutIsInitialized()); 1574 } 1575 1576 // ---------------------------------------------------------------------------- 1577 // RecordingIsInitialized 1578 // ---------------------------------------------------------------------------- 1579 1580 bool AudioDeviceModuleImpl::RecordingIsInitialized() const 1581 { 1582 CHECK_INITIALIZED_BOOL(); 1583 return (_ptrAudioDevice->RecordingIsInitialized()); 1584 } 1585 1586 // ---------------------------------------------------------------------------- 1587 // StartPlayout 1588 // ---------------------------------------------------------------------------- 1589 1590 int32_t AudioDeviceModuleImpl::StartPlayout() 1591 { 1592 CHECK_INITIALIZED(); 1593 return (_ptrAudioDevice->StartPlayout()); 1594 } 1595 1596 // ---------------------------------------------------------------------------- 1597 // StopPlayout 1598 // ---------------------------------------------------------------------------- 1599 1600 int32_t AudioDeviceModuleImpl::StopPlayout() 1601 { 1602 CHECK_INITIALIZED(); 1603 return (_ptrAudioDevice->StopPlayout()); 1604 } 1605 1606 // ---------------------------------------------------------------------------- 1607 // Playing 1608 // ---------------------------------------------------------------------------- 1609 1610 bool AudioDeviceModuleImpl::Playing() const 1611 { 1612 CHECK_INITIALIZED_BOOL(); 1613 return (_ptrAudioDevice->Playing()); 1614 } 1615 1616 // ---------------------------------------------------------------------------- 1617 // StartRecording 1618 // ---------------------------------------------------------------------------- 1619 1620 int32_t AudioDeviceModuleImpl::StartRecording() 1621 { 1622 CHECK_INITIALIZED(); 1623 return (_ptrAudioDevice->StartRecording()); 1624 } 1625 // ---------------------------------------------------------------------------- 1626 // StopRecording 1627 // ---------------------------------------------------------------------------- 1628 1629 int32_t AudioDeviceModuleImpl::StopRecording() 1630 { 1631 CHECK_INITIALIZED(); 1632 return (_ptrAudioDevice->StopRecording()); 1633 } 1634 1635 // ---------------------------------------------------------------------------- 1636 // Recording 1637 // ---------------------------------------------------------------------------- 1638 1639 bool AudioDeviceModuleImpl::Recording() const 1640 { 1641 CHECK_INITIALIZED_BOOL(); 1642 return (_ptrAudioDevice->Recording()); 1643 } 1644 1645 // ---------------------------------------------------------------------------- 1646 // RegisterEventObserver 1647 // ---------------------------------------------------------------------------- 1648 1649 int32_t AudioDeviceModuleImpl::RegisterEventObserver(AudioDeviceObserver* eventCallback) 1650 { 1651 1652 CriticalSectionScoped lock(&_critSectEventCb); 1653 _ptrCbAudioDeviceObserver = eventCallback; 1654 1655 return 0; 1656 } 1657 1658 // ---------------------------------------------------------------------------- 1659 // RegisterAudioCallback 1660 // ---------------------------------------------------------------------------- 1661 1662 int32_t AudioDeviceModuleImpl::RegisterAudioCallback(AudioTransport* audioCallback) 1663 { 1664 1665 CriticalSectionScoped lock(&_critSectAudioCb); 1666 _audioDeviceBuffer.RegisterAudioCallback(audioCallback); 1667 1668 return 0; 1669 } 1670 1671 // ---------------------------------------------------------------------------- 1672 // StartRawInputFileRecording 1673 // ---------------------------------------------------------------------------- 1674 1675 int32_t AudioDeviceModuleImpl::StartRawInputFileRecording( 1676 const char pcmFileNameUTF8[kAdmMaxFileNameSize]) 1677 { 1678 CHECK_INITIALIZED(); 1679 1680 if (NULL == pcmFileNameUTF8) 1681 { 1682 return -1; 1683 } 1684 1685 return (_audioDeviceBuffer.StartInputFileRecording(pcmFileNameUTF8)); 1686 } 1687 1688 // ---------------------------------------------------------------------------- 1689 // StopRawInputFileRecording 1690 // ---------------------------------------------------------------------------- 1691 1692 int32_t AudioDeviceModuleImpl::StopRawInputFileRecording() 1693 { 1694 CHECK_INITIALIZED(); 1695 1696 return (_audioDeviceBuffer.StopInputFileRecording()); 1697 } 1698 1699 // ---------------------------------------------------------------------------- 1700 // StartRawOutputFileRecording 1701 // ---------------------------------------------------------------------------- 1702 1703 int32_t AudioDeviceModuleImpl::StartRawOutputFileRecording( 1704 const char pcmFileNameUTF8[kAdmMaxFileNameSize]) 1705 { 1706 CHECK_INITIALIZED(); 1707 1708 if (NULL == pcmFileNameUTF8) 1709 { 1710 return -1; 1711 } 1712 1713 return (_audioDeviceBuffer.StartOutputFileRecording(pcmFileNameUTF8)); 1714 } 1715 1716 // ---------------------------------------------------------------------------- 1717 // StopRawOutputFileRecording 1718 // ---------------------------------------------------------------------------- 1719 1720 int32_t AudioDeviceModuleImpl::StopRawOutputFileRecording() 1721 { 1722 CHECK_INITIALIZED(); 1723 1724 return (_audioDeviceBuffer.StopOutputFileRecording()); 1725 } 1726 1727 // ---------------------------------------------------------------------------- 1728 // SetPlayoutBuffer 1729 // ---------------------------------------------------------------------------- 1730 1731 int32_t AudioDeviceModuleImpl::SetPlayoutBuffer(const BufferType type, uint16_t sizeMS) 1732 { 1733 CHECK_INITIALIZED(); 1734 1735 if (_ptrAudioDevice->PlayoutIsInitialized()) 1736 { 1737 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "unable to modify the playout buffer while playing side is initialized"); 1738 return -1; 1739 } 1740 1741 int32_t ret(0); 1742 1743 if (kFixedBufferSize == type) 1744 { 1745 if (sizeMS < kAdmMinPlayoutBufferSizeMs || sizeMS > kAdmMaxPlayoutBufferSizeMs) 1746 { 1747 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "size parameter is out of range"); 1748 return -1; 1749 } 1750 } 1751 1752 if ((ret = _ptrAudioDevice->SetPlayoutBuffer(type, sizeMS)) == -1) 1753 { 1754 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to set the playout buffer (error: %d)", LastError()); 1755 } 1756 1757 return ret; 1758 } 1759 1760 // ---------------------------------------------------------------------------- 1761 // PlayoutBuffer 1762 // ---------------------------------------------------------------------------- 1763 1764 int32_t AudioDeviceModuleImpl::PlayoutBuffer(BufferType* type, uint16_t* sizeMS) const 1765 { 1766 CHECK_INITIALIZED(); 1767 1768 BufferType bufType; 1769 uint16_t size(0); 1770 1771 if (_ptrAudioDevice->PlayoutBuffer(bufType, size) == -1) 1772 { 1773 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the buffer type and size"); 1774 return -1; 1775 } 1776 1777 *type = bufType; 1778 *sizeMS = size; 1779 1780 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: type=%u, sizeMS=%u", *type, *sizeMS); 1781 return (0); 1782 } 1783 1784 // ---------------------------------------------------------------------------- 1785 // PlayoutDelay 1786 // ---------------------------------------------------------------------------- 1787 1788 int32_t AudioDeviceModuleImpl::PlayoutDelay(uint16_t* delayMS) const 1789 { 1790 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__); 1791 CHECK_INITIALIZED(); 1792 1793 uint16_t delay(0); 1794 1795 if (_ptrAudioDevice->PlayoutDelay(delay) == -1) 1796 { 1797 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the playout delay"); 1798 return -1; 1799 } 1800 1801 *delayMS = delay; 1802 1803 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: delayMS=%u", *delayMS); 1804 return (0); 1805 } 1806 1807 // ---------------------------------------------------------------------------- 1808 // RecordingDelay 1809 // ---------------------------------------------------------------------------- 1810 1811 int32_t AudioDeviceModuleImpl::RecordingDelay(uint16_t* delayMS) const 1812 { 1813 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__); 1814 CHECK_INITIALIZED(); 1815 1816 uint16_t delay(0); 1817 1818 if (_ptrAudioDevice->RecordingDelay(delay) == -1) 1819 { 1820 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the recording delay"); 1821 return -1; 1822 } 1823 1824 *delayMS = delay; 1825 1826 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: delayMS=%u", *delayMS); 1827 return (0); 1828 } 1829 1830 // ---------------------------------------------------------------------------- 1831 // CPULoad 1832 // ---------------------------------------------------------------------------- 1833 1834 int32_t AudioDeviceModuleImpl::CPULoad(uint16_t* load) const 1835 { 1836 CHECK_INITIALIZED(); 1837 1838 uint16_t cpuLoad(0); 1839 1840 if (_ptrAudioDevice->CPULoad(cpuLoad) == -1) 1841 { 1842 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the CPU load"); 1843 return -1; 1844 } 1845 1846 *load = cpuLoad; 1847 1848 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: load=%u", *load); 1849 return (0); 1850 } 1851 1852 // ---------------------------------------------------------------------------- 1853 // SetRecordingSampleRate 1854 // ---------------------------------------------------------------------------- 1855 1856 int32_t AudioDeviceModuleImpl::SetRecordingSampleRate(const uint32_t samplesPerSec) 1857 { 1858 CHECK_INITIALIZED(); 1859 1860 if (_ptrAudioDevice->SetRecordingSampleRate(samplesPerSec) != 0) 1861 { 1862 return -1; 1863 } 1864 1865 return (0); 1866 } 1867 1868 // ---------------------------------------------------------------------------- 1869 // RecordingSampleRate 1870 // ---------------------------------------------------------------------------- 1871 1872 int32_t AudioDeviceModuleImpl::RecordingSampleRate(uint32_t* samplesPerSec) const 1873 { 1874 CHECK_INITIALIZED(); 1875 1876 int32_t sampleRate = _audioDeviceBuffer.RecordingSampleRate(); 1877 1878 if (sampleRate == -1) 1879 { 1880 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the sample rate"); 1881 return -1; 1882 } 1883 1884 *samplesPerSec = sampleRate; 1885 1886 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: samplesPerSec=%u", *samplesPerSec); 1887 return (0); 1888 } 1889 1890 // ---------------------------------------------------------------------------- 1891 // SetPlayoutSampleRate 1892 // ---------------------------------------------------------------------------- 1893 1894 int32_t AudioDeviceModuleImpl::SetPlayoutSampleRate(const uint32_t samplesPerSec) 1895 { 1896 CHECK_INITIALIZED(); 1897 1898 if (_ptrAudioDevice->SetPlayoutSampleRate(samplesPerSec) != 0) 1899 { 1900 return -1; 1901 } 1902 1903 return (0); 1904 } 1905 1906 // ---------------------------------------------------------------------------- 1907 // PlayoutSampleRate 1908 // ---------------------------------------------------------------------------- 1909 1910 int32_t AudioDeviceModuleImpl::PlayoutSampleRate(uint32_t* samplesPerSec) const 1911 { 1912 CHECK_INITIALIZED(); 1913 1914 int32_t sampleRate = _audioDeviceBuffer.PlayoutSampleRate(); 1915 1916 if (sampleRate == -1) 1917 { 1918 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id, "failed to retrieve the sample rate"); 1919 return -1; 1920 } 1921 1922 *samplesPerSec = sampleRate; 1923 1924 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: samplesPerSec=%u", *samplesPerSec); 1925 return (0); 1926 } 1927 1928 // ---------------------------------------------------------------------------- 1929 // ResetAudioDevice 1930 // ---------------------------------------------------------------------------- 1931 1932 int32_t AudioDeviceModuleImpl::ResetAudioDevice() 1933 { 1934 CHECK_INITIALIZED(); 1935 1936 1937 if (_ptrAudioDevice->ResetAudioDevice() == -1) 1938 { 1939 return -1; 1940 } 1941 1942 return (0); 1943 } 1944 1945 // ---------------------------------------------------------------------------- 1946 // SetLoudspeakerStatus 1947 // ---------------------------------------------------------------------------- 1948 1949 int32_t AudioDeviceModuleImpl::SetLoudspeakerStatus(bool enable) 1950 { 1951 CHECK_INITIALIZED(); 1952 1953 if (_ptrAudioDevice->SetLoudspeakerStatus(enable) != 0) 1954 { 1955 return -1; 1956 } 1957 1958 return 0; 1959 } 1960 1961 // ---------------------------------------------------------------------------- 1962 // GetLoudspeakerStatus 1963 // ---------------------------------------------------------------------------- 1964 1965 int32_t AudioDeviceModuleImpl::GetLoudspeakerStatus(bool* enabled) const 1966 { 1967 CHECK_INITIALIZED(); 1968 1969 if (_ptrAudioDevice->GetLoudspeakerStatus(*enabled) != 0) 1970 { 1971 return -1; 1972 } 1973 1974 return 0; 1975 } 1976 1977 int32_t AudioDeviceModuleImpl::EnableBuiltInAEC(bool enable) 1978 { 1979 CHECK_INITIALIZED(); 1980 1981 return _ptrAudioDevice->EnableBuiltInAEC(enable); 1982 } 1983 1984 bool AudioDeviceModuleImpl::BuiltInAECIsEnabled() const 1985 { 1986 CHECK_INITIALIZED_BOOL(); 1987 1988 return _ptrAudioDevice->BuiltInAECIsEnabled(); 1989 } 1990 1991 // ============================================================================ 1992 // Private Methods 1993 // ============================================================================ 1994 1995 // ---------------------------------------------------------------------------- 1996 // Platform 1997 // ---------------------------------------------------------------------------- 1998 1999 AudioDeviceModuleImpl::PlatformType AudioDeviceModuleImpl::Platform() const 2000 { 2001 return _platformType; 2002 } 2003 2004 // ---------------------------------------------------------------------------- 2005 // PlatformAudioLayer 2006 // ---------------------------------------------------------------------------- 2007 2008 AudioDeviceModule::AudioLayer AudioDeviceModuleImpl::PlatformAudioLayer() const 2009 { 2010 2011 switch (_platformAudioLayer) 2012 { 2013 case kPlatformDefaultAudio: 2014 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, 2015 "output: kPlatformDefaultAudio"); 2016 break; 2017 case kWindowsWaveAudio: 2018 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, 2019 "output: kWindowsWaveAudio"); 2020 break; 2021 case kWindowsCoreAudio: 2022 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, 2023 "output: kWindowsCoreAudio"); 2024 break; 2025 case kLinuxAlsaAudio: 2026 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, 2027 "output: kLinuxAlsaAudio"); 2028 break; 2029 case kDummyAudio: 2030 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, 2031 "output: kDummyAudio"); 2032 break; 2033 default: 2034 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, 2035 "output: INVALID"); 2036 break; 2037 } 2038 2039 return _platformAudioLayer; 2040 } 2041 2042 } // namespace webrtc 2043