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 "modules/audio_device/audio_device_impl.h"
12 
13 #include <stddef.h>
14 
15 #include "api/scoped_refptr.h"
16 #include "modules/audio_device/audio_device_config.h"  // IWYU pragma: keep
17 #include "modules/audio_device/audio_device_generic.h"
18 #include "rtc_base/checks.h"
19 #include "rtc_base/logging.h"
20 #include "rtc_base/ref_counted_object.h"
21 #include "system_wrappers/include/metrics.h"
22 
23 #if defined(_WIN32)
24 #if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
25 #include "modules/audio_device/win/audio_device_core_win.h"
26 #endif
27 #elif defined(WEBRTC_ANDROID)
28 #include <stdlib.h>
29 #if defined(WEBRTC_AUDIO_DEVICE_INCLUDE_ANDROID_AAUDIO)
30 #include "modules/audio_device/android/aaudio_player.h"
31 #include "modules/audio_device/android/aaudio_recorder.h"
32 #endif
33 #include "modules/audio_device/android/audio_device_template.h"
34 #include "modules/audio_device/android/audio_manager.h"
35 #include "modules/audio_device/android/audio_record_jni.h"
36 #include "modules/audio_device/android/audio_track_jni.h"
37 #include "modules/audio_device/android/opensles_player.h"
38 #include "modules/audio_device/android/opensles_recorder.h"
39 #elif defined(WEBRTC_LINUX)
40 #if defined(WEBRTC_ENABLE_LINUX_ALSA)
41 #include "modules/audio_device/linux/audio_device_alsa_linux.h"
42 #endif
43 #if defined(WEBRTC_ENABLE_LINUX_PULSE)
44 #include "modules/audio_device/linux/audio_device_pulse_linux.h"
45 #endif
46 #elif defined(WEBRTC_IOS)
47 #include "sdk/objc/native/src/audio/audio_device_ios.h"
48 #elif defined(WEBRTC_MAC)
49 #include "modules/audio_device/mac/audio_device_mac.h"
50 #endif
51 #if defined(WEBRTC_DUMMY_FILE_DEVICES)
52 #include "modules/audio_device/dummy/file_audio_device.h"
53 #include "modules/audio_device/dummy/file_audio_device_factory.h"
54 #endif
55 #include "modules/audio_device/dummy/audio_device_dummy.h"
56 
57 #define CHECKinitialized_() \
58   {                         \
59     if (!initialized_) {    \
60       return -1;            \
61     }                       \
62   }
63 
64 #define CHECKinitialized__BOOL() \
65   {                              \
66     if (!initialized_) {         \
67       return false;              \
68     }                            \
69   }
70 
71 namespace webrtc {
72 
Create(AudioLayer audio_layer,TaskQueueFactory * task_queue_factory)73 rtc::scoped_refptr<AudioDeviceModule> AudioDeviceModule::Create(
74     AudioLayer audio_layer,
75     TaskQueueFactory* task_queue_factory) {
76   RTC_LOG(INFO) << __FUNCTION__;
77   return AudioDeviceModule::CreateForTest(audio_layer, task_queue_factory);
78 }
79 
80 // static
CreateForTest(AudioLayer audio_layer,TaskQueueFactory * task_queue_factory)81 rtc::scoped_refptr<AudioDeviceModuleForTest> AudioDeviceModule::CreateForTest(
82     AudioLayer audio_layer,
83     TaskQueueFactory* task_queue_factory) {
84   RTC_LOG(INFO) << __FUNCTION__;
85 
86   // The "AudioDeviceModule::kWindowsCoreAudio2" audio layer has its own
87   // dedicated factory method which should be used instead.
88   if (audio_layer == AudioDeviceModule::kWindowsCoreAudio2) {
89     RTC_LOG(LS_ERROR) << "Use the CreateWindowsCoreAudioAudioDeviceModule() "
90                          "factory method instead for this option.";
91     return nullptr;
92   }
93 
94   // Create the generic reference counted (platform independent) implementation.
95   rtc::scoped_refptr<AudioDeviceModuleImpl> audioDevice(
96       new rtc::RefCountedObject<AudioDeviceModuleImpl>(audio_layer,
97                                                        task_queue_factory));
98 
99   // Ensure that the current platform is supported.
100   if (audioDevice->CheckPlatform() == -1) {
101     return nullptr;
102   }
103 
104   // Create the platform-dependent implementation.
105   if (audioDevice->CreatePlatformSpecificObjects() == -1) {
106     return nullptr;
107   }
108 
109   // Ensure that the generic audio buffer can communicate with the platform
110   // specific parts.
111   if (audioDevice->AttachAudioBuffer() == -1) {
112     return nullptr;
113   }
114 
115   return audioDevice;
116 }
117 
AudioDeviceModuleImpl(AudioLayer audio_layer,TaskQueueFactory * task_queue_factory)118 AudioDeviceModuleImpl::AudioDeviceModuleImpl(
119     AudioLayer audio_layer,
120     TaskQueueFactory* task_queue_factory)
121     : audio_layer_(audio_layer), audio_device_buffer_(task_queue_factory) {
122   RTC_LOG(INFO) << __FUNCTION__;
123 }
124 
CheckPlatform()125 int32_t AudioDeviceModuleImpl::CheckPlatform() {
126   RTC_LOG(INFO) << __FUNCTION__;
127   // Ensure that the current platform is supported
128   PlatformType platform(kPlatformNotSupported);
129 #if defined(_WIN32)
130   platform = kPlatformWin32;
131   RTC_LOG(INFO) << "current platform is Win32";
132 #elif defined(WEBRTC_ANDROID)
133   platform = kPlatformAndroid;
134   RTC_LOG(INFO) << "current platform is Android";
135 #elif defined(WEBRTC_LINUX)
136   platform = kPlatformLinux;
137   RTC_LOG(INFO) << "current platform is Linux";
138 #elif defined(WEBRTC_IOS)
139   platform = kPlatformIOS;
140   RTC_LOG(INFO) << "current platform is IOS";
141 #elif defined(WEBRTC_MAC)
142   platform = kPlatformMac;
143   RTC_LOG(INFO) << "current platform is Mac";
144 #endif
145   if (platform == kPlatformNotSupported) {
146     RTC_LOG(LERROR)
147         << "current platform is not supported => this module will self "
148            "destruct!";
149     return -1;
150   }
151   platform_type_ = platform;
152   return 0;
153 }
154 
CreatePlatformSpecificObjects()155 int32_t AudioDeviceModuleImpl::CreatePlatformSpecificObjects() {
156   RTC_LOG(INFO) << __FUNCTION__;
157 // Dummy ADM implementations if build flags are set.
158 #if defined(WEBRTC_DUMMY_AUDIO_BUILD)
159   audio_device_.reset(new AudioDeviceDummy());
160   RTC_LOG(INFO) << "Dummy Audio APIs will be utilized";
161 #elif defined(WEBRTC_DUMMY_FILE_DEVICES)
162   audio_device_.reset(FileAudioDeviceFactory::CreateFileAudioDevice());
163   if (audio_device_) {
164     RTC_LOG(INFO) << "Will use file-playing dummy device.";
165   } else {
166     // Create a dummy device instead.
167     audio_device_.reset(new AudioDeviceDummy());
168     RTC_LOG(INFO) << "Dummy Audio APIs will be utilized";
169   }
170 
171 // Real (non-dummy) ADM implementations.
172 #else
173   AudioLayer audio_layer(PlatformAudioLayer());
174 // Windows ADM implementation.
175 #if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
176   if ((audio_layer == kWindowsCoreAudio) ||
177       (audio_layer == kPlatformDefaultAudio)) {
178     RTC_LOG(INFO) << "Attempting to use the Windows Core Audio APIs...";
179     if (AudioDeviceWindowsCore::CoreAudioIsSupported()) {
180       audio_device_.reset(new AudioDeviceWindowsCore());
181       RTC_LOG(INFO) << "Windows Core Audio APIs will be utilized";
182     }
183   }
184 #endif  // defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
185 
186 #if defined(WEBRTC_ANDROID)
187   // Create an Android audio manager.
188   audio_manager_android_.reset(new AudioManager());
189   // Select best possible combination of audio layers.
190   if (audio_layer == kPlatformDefaultAudio) {
191     if (audio_manager_android_->IsAAudioSupported()) {
192       // Use of AAudio for both playout and recording has highest priority.
193       audio_layer = kAndroidAAudioAudio;
194     } else if (audio_manager_android_->IsLowLatencyPlayoutSupported() &&
195                audio_manager_android_->IsLowLatencyRecordSupported()) {
196       // Use OpenSL ES for both playout and recording.
197       audio_layer = kAndroidOpenSLESAudio;
198     } else if (audio_manager_android_->IsLowLatencyPlayoutSupported() &&
199                !audio_manager_android_->IsLowLatencyRecordSupported()) {
200       // Use OpenSL ES for output on devices that only supports the
201       // low-latency output audio path.
202       audio_layer = kAndroidJavaInputAndOpenSLESOutputAudio;
203     } else {
204       // Use Java-based audio in both directions when low-latency output is
205       // not supported.
206       audio_layer = kAndroidJavaAudio;
207     }
208   }
209   AudioManager* audio_manager = audio_manager_android_.get();
210   if (audio_layer == kAndroidJavaAudio) {
211     // Java audio for both input and output audio.
212     audio_device_.reset(new AudioDeviceTemplate<AudioRecordJni, AudioTrackJni>(
213         audio_layer, audio_manager));
214   } else if (audio_layer == kAndroidOpenSLESAudio) {
215     // OpenSL ES based audio for both input and output audio.
216     audio_device_.reset(
217         new AudioDeviceTemplate<OpenSLESRecorder, OpenSLESPlayer>(
218             audio_layer, audio_manager));
219   } else if (audio_layer == kAndroidJavaInputAndOpenSLESOutputAudio) {
220     // Java audio for input and OpenSL ES for output audio (i.e. mixed APIs).
221     // This combination provides low-latency output audio and at the same
222     // time support for HW AEC using the AudioRecord Java API.
223     audio_device_.reset(new AudioDeviceTemplate<AudioRecordJni, OpenSLESPlayer>(
224         audio_layer, audio_manager));
225   } else if (audio_layer == kAndroidAAudioAudio) {
226 #if defined(WEBRTC_AUDIO_DEVICE_INCLUDE_ANDROID_AAUDIO)
227     // AAudio based audio for both input and output.
228     audio_device_.reset(new AudioDeviceTemplate<AAudioRecorder, AAudioPlayer>(
229         audio_layer, audio_manager));
230 #endif
231   } else if (audio_layer == kAndroidJavaInputAndAAudioOutputAudio) {
232 #if defined(WEBRTC_AUDIO_DEVICE_INCLUDE_ANDROID_AAUDIO)
233     // Java audio for input and AAudio for output audio (i.e. mixed APIs).
234     audio_device_.reset(new AudioDeviceTemplate<AudioRecordJni, AAudioPlayer>(
235         audio_layer, audio_manager));
236 #endif
237   } else {
238     RTC_LOG(LS_ERROR) << "The requested audio layer is not supported";
239     audio_device_.reset(nullptr);
240   }
241 // END #if defined(WEBRTC_ANDROID)
242 
243 // Linux ADM implementation.
244 // Note that, WEBRTC_ENABLE_LINUX_ALSA is always defined by default when
245 // WEBRTC_LINUX is defined. WEBRTC_ENABLE_LINUX_PULSE depends on the
246 // 'rtc_include_pulse_audio' build flag.
247 // TODO(bugs.webrtc.org/9127): improve support and make it more clear that
248 // PulseAudio is the default selection.
249 #elif defined(WEBRTC_LINUX)
250 #if !defined(WEBRTC_ENABLE_LINUX_PULSE)
251   // Build flag 'rtc_include_pulse_audio' is set to false. In this mode:
252   // - kPlatformDefaultAudio => ALSA, and
253   // - kLinuxAlsaAudio => ALSA, and
254   // - kLinuxPulseAudio => Invalid selection.
255   RTC_LOG(WARNING) << "PulseAudio is disabled using build flag.";
256   if ((audio_layer == kLinuxAlsaAudio) ||
257       (audio_layer == kPlatformDefaultAudio)) {
258     audio_device_.reset(new AudioDeviceLinuxALSA());
259     RTC_LOG(INFO) << "Linux ALSA APIs will be utilized.";
260   }
261 #else
262   // Build flag 'rtc_include_pulse_audio' is set to true (default). In this
263   // mode:
264   // - kPlatformDefaultAudio => PulseAudio, and
265   // - kLinuxPulseAudio => PulseAudio, and
266   // - kLinuxAlsaAudio => ALSA (supported but not default).
267   RTC_LOG(INFO) << "PulseAudio support is enabled.";
268   if ((audio_layer == kLinuxPulseAudio) ||
269       (audio_layer == kPlatformDefaultAudio)) {
270     // Linux PulseAudio implementation is default.
271     audio_device_.reset(new AudioDeviceLinuxPulse());
272     RTC_LOG(INFO) << "Linux PulseAudio APIs will be utilized";
273   } else if (audio_layer == kLinuxAlsaAudio) {
274     audio_device_.reset(new AudioDeviceLinuxALSA());
275     RTC_LOG(WARNING) << "Linux ALSA APIs will be utilized.";
276   }
277 #endif  // #if !defined(WEBRTC_ENABLE_LINUX_PULSE)
278 #endif  // #if defined(WEBRTC_LINUX)
279 
280 // iOS ADM implementation.
281 #if defined(WEBRTC_IOS)
282   if (audio_layer == kPlatformDefaultAudio) {
283     audio_device_.reset(new ios_adm::AudioDeviceIOS());
284     RTC_LOG(INFO) << "iPhone Audio APIs will be utilized.";
285   }
286 // END #if defined(WEBRTC_IOS)
287 
288 // Mac OS X ADM implementation.
289 #elif defined(WEBRTC_MAC)
290   if (audio_layer == kPlatformDefaultAudio) {
291     audio_device_.reset(new AudioDeviceMac());
292     RTC_LOG(INFO) << "Mac OS X Audio APIs will be utilized.";
293   }
294 #endif  // WEBRTC_MAC
295 
296   // Dummy ADM implementation.
297   if (audio_layer == kDummyAudio) {
298     audio_device_.reset(new AudioDeviceDummy());
299     RTC_LOG(INFO) << "Dummy Audio APIs will be utilized.";
300   }
301 #endif  // if defined(WEBRTC_DUMMY_AUDIO_BUILD)
302 
303   if (!audio_device_) {
304     RTC_LOG(LS_ERROR)
305         << "Failed to create the platform specific ADM implementation.";
306     return -1;
307   }
308   return 0;
309 }
310 
AttachAudioBuffer()311 int32_t AudioDeviceModuleImpl::AttachAudioBuffer() {
312   RTC_LOG(INFO) << __FUNCTION__;
313   audio_device_->AttachAudioBuffer(&audio_device_buffer_);
314   return 0;
315 }
316 
~AudioDeviceModuleImpl()317 AudioDeviceModuleImpl::~AudioDeviceModuleImpl() {
318   RTC_LOG(INFO) << __FUNCTION__;
319 }
320 
ActiveAudioLayer(AudioLayer * audioLayer) const321 int32_t AudioDeviceModuleImpl::ActiveAudioLayer(AudioLayer* audioLayer) const {
322   RTC_LOG(INFO) << __FUNCTION__;
323   AudioLayer activeAudio;
324   if (audio_device_->ActiveAudioLayer(activeAudio) == -1) {
325     return -1;
326   }
327   *audioLayer = activeAudio;
328   return 0;
329 }
330 
Init()331 int32_t AudioDeviceModuleImpl::Init() {
332   RTC_LOG(INFO) << __FUNCTION__;
333   if (initialized_)
334     return 0;
335   RTC_CHECK(audio_device_);
336   AudioDeviceGeneric::InitStatus status = audio_device_->Init();
337   RTC_HISTOGRAM_ENUMERATION(
338       "WebRTC.Audio.InitializationResult", static_cast<int>(status),
339       static_cast<int>(AudioDeviceGeneric::InitStatus::NUM_STATUSES));
340   if (status != AudioDeviceGeneric::InitStatus::OK) {
341     RTC_LOG(LS_ERROR) << "Audio device initialization failed.";
342     return -1;
343   }
344   initialized_ = true;
345   return 0;
346 }
347 
Terminate()348 int32_t AudioDeviceModuleImpl::Terminate() {
349   RTC_LOG(INFO) << __FUNCTION__;
350   if (!initialized_)
351     return 0;
352   if (audio_device_->Terminate() == -1) {
353     return -1;
354   }
355   initialized_ = false;
356   return 0;
357 }
358 
Initialized() const359 bool AudioDeviceModuleImpl::Initialized() const {
360   RTC_LOG(INFO) << __FUNCTION__ << ": " << initialized_;
361   return initialized_;
362 }
363 
InitSpeaker()364 int32_t AudioDeviceModuleImpl::InitSpeaker() {
365   RTC_LOG(INFO) << __FUNCTION__;
366   CHECKinitialized_();
367   return audio_device_->InitSpeaker();
368 }
369 
InitMicrophone()370 int32_t AudioDeviceModuleImpl::InitMicrophone() {
371   RTC_LOG(INFO) << __FUNCTION__;
372   CHECKinitialized_();
373   return audio_device_->InitMicrophone();
374 }
375 
SpeakerVolumeIsAvailable(bool * available)376 int32_t AudioDeviceModuleImpl::SpeakerVolumeIsAvailable(bool* available) {
377   RTC_LOG(INFO) << __FUNCTION__;
378   CHECKinitialized_();
379   bool isAvailable = false;
380   if (audio_device_->SpeakerVolumeIsAvailable(isAvailable) == -1) {
381     return -1;
382   }
383   *available = isAvailable;
384   RTC_LOG(INFO) << "output: " << isAvailable;
385   return 0;
386 }
387 
SetSpeakerVolume(uint32_t volume)388 int32_t AudioDeviceModuleImpl::SetSpeakerVolume(uint32_t volume) {
389   RTC_LOG(INFO) << __FUNCTION__ << "(" << volume << ")";
390   CHECKinitialized_();
391   return audio_device_->SetSpeakerVolume(volume);
392 }
393 
SpeakerVolume(uint32_t * volume) const394 int32_t AudioDeviceModuleImpl::SpeakerVolume(uint32_t* volume) const {
395   RTC_LOG(INFO) << __FUNCTION__;
396   CHECKinitialized_();
397   uint32_t level = 0;
398   if (audio_device_->SpeakerVolume(level) == -1) {
399     return -1;
400   }
401   *volume = level;
402   RTC_LOG(INFO) << "output: " << *volume;
403   return 0;
404 }
405 
SpeakerIsInitialized() const406 bool AudioDeviceModuleImpl::SpeakerIsInitialized() const {
407   RTC_LOG(INFO) << __FUNCTION__;
408   CHECKinitialized__BOOL();
409   bool isInitialized = audio_device_->SpeakerIsInitialized();
410   RTC_LOG(INFO) << "output: " << isInitialized;
411   return isInitialized;
412 }
413 
MicrophoneIsInitialized() const414 bool AudioDeviceModuleImpl::MicrophoneIsInitialized() const {
415   RTC_LOG(INFO) << __FUNCTION__;
416   CHECKinitialized__BOOL();
417   bool isInitialized = audio_device_->MicrophoneIsInitialized();
418   RTC_LOG(INFO) << "output: " << isInitialized;
419   return isInitialized;
420 }
421 
MaxSpeakerVolume(uint32_t * maxVolume) const422 int32_t AudioDeviceModuleImpl::MaxSpeakerVolume(uint32_t* maxVolume) const {
423   CHECKinitialized_();
424   uint32_t maxVol = 0;
425   if (audio_device_->MaxSpeakerVolume(maxVol) == -1) {
426     return -1;
427   }
428   *maxVolume = maxVol;
429   return 0;
430 }
431 
MinSpeakerVolume(uint32_t * minVolume) const432 int32_t AudioDeviceModuleImpl::MinSpeakerVolume(uint32_t* minVolume) const {
433   CHECKinitialized_();
434   uint32_t minVol = 0;
435   if (audio_device_->MinSpeakerVolume(minVol) == -1) {
436     return -1;
437   }
438   *minVolume = minVol;
439   return 0;
440 }
441 
SpeakerMuteIsAvailable(bool * available)442 int32_t AudioDeviceModuleImpl::SpeakerMuteIsAvailable(bool* available) {
443   RTC_LOG(INFO) << __FUNCTION__;
444   CHECKinitialized_();
445   bool isAvailable = false;
446   if (audio_device_->SpeakerMuteIsAvailable(isAvailable) == -1) {
447     return -1;
448   }
449   *available = isAvailable;
450   RTC_LOG(INFO) << "output: " << isAvailable;
451   return 0;
452 }
453 
SetSpeakerMute(bool enable)454 int32_t AudioDeviceModuleImpl::SetSpeakerMute(bool enable) {
455   RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
456   CHECKinitialized_();
457   return audio_device_->SetSpeakerMute(enable);
458 }
459 
SpeakerMute(bool * enabled) const460 int32_t AudioDeviceModuleImpl::SpeakerMute(bool* enabled) const {
461   RTC_LOG(INFO) << __FUNCTION__;
462   CHECKinitialized_();
463   bool muted = false;
464   if (audio_device_->SpeakerMute(muted) == -1) {
465     return -1;
466   }
467   *enabled = muted;
468   RTC_LOG(INFO) << "output: " << muted;
469   return 0;
470 }
471 
MicrophoneMuteIsAvailable(bool * available)472 int32_t AudioDeviceModuleImpl::MicrophoneMuteIsAvailable(bool* available) {
473   RTC_LOG(INFO) << __FUNCTION__;
474   CHECKinitialized_();
475   bool isAvailable = false;
476   if (audio_device_->MicrophoneMuteIsAvailable(isAvailable) == -1) {
477     return -1;
478   }
479   *available = isAvailable;
480   RTC_LOG(INFO) << "output: " << isAvailable;
481   return 0;
482 }
483 
SetMicrophoneMute(bool enable)484 int32_t AudioDeviceModuleImpl::SetMicrophoneMute(bool enable) {
485   RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
486   CHECKinitialized_();
487   return (audio_device_->SetMicrophoneMute(enable));
488 }
489 
MicrophoneMute(bool * enabled) const490 int32_t AudioDeviceModuleImpl::MicrophoneMute(bool* enabled) const {
491   RTC_LOG(INFO) << __FUNCTION__;
492   CHECKinitialized_();
493   bool muted = false;
494   if (audio_device_->MicrophoneMute(muted) == -1) {
495     return -1;
496   }
497   *enabled = muted;
498   RTC_LOG(INFO) << "output: " << muted;
499   return 0;
500 }
501 
MicrophoneVolumeIsAvailable(bool * available)502 int32_t AudioDeviceModuleImpl::MicrophoneVolumeIsAvailable(bool* available) {
503   RTC_LOG(INFO) << __FUNCTION__;
504   CHECKinitialized_();
505   bool isAvailable = false;
506   if (audio_device_->MicrophoneVolumeIsAvailable(isAvailable) == -1) {
507     return -1;
508   }
509   *available = isAvailable;
510   RTC_LOG(INFO) << "output: " << isAvailable;
511   return 0;
512 }
513 
SetMicrophoneVolume(uint32_t volume)514 int32_t AudioDeviceModuleImpl::SetMicrophoneVolume(uint32_t volume) {
515   RTC_LOG(INFO) << __FUNCTION__ << "(" << volume << ")";
516   CHECKinitialized_();
517   return (audio_device_->SetMicrophoneVolume(volume));
518 }
519 
MicrophoneVolume(uint32_t * volume) const520 int32_t AudioDeviceModuleImpl::MicrophoneVolume(uint32_t* volume) const {
521   RTC_LOG(INFO) << __FUNCTION__;
522   CHECKinitialized_();
523   uint32_t level = 0;
524   if (audio_device_->MicrophoneVolume(level) == -1) {
525     return -1;
526   }
527   *volume = level;
528   RTC_LOG(INFO) << "output: " << *volume;
529   return 0;
530 }
531 
StereoRecordingIsAvailable(bool * available) const532 int32_t AudioDeviceModuleImpl::StereoRecordingIsAvailable(
533     bool* available) const {
534   RTC_LOG(INFO) << __FUNCTION__;
535   CHECKinitialized_();
536   bool isAvailable = false;
537   if (audio_device_->StereoRecordingIsAvailable(isAvailable) == -1) {
538     return -1;
539   }
540   *available = isAvailable;
541   RTC_LOG(INFO) << "output: " << isAvailable;
542   return 0;
543 }
544 
SetStereoRecording(bool enable)545 int32_t AudioDeviceModuleImpl::SetStereoRecording(bool enable) {
546   RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
547   CHECKinitialized_();
548   if (audio_device_->RecordingIsInitialized()) {
549     RTC_LOG(LERROR)
550         << "unable to set stereo mode after recording is initialized";
551     return -1;
552   }
553   if (audio_device_->SetStereoRecording(enable) == -1) {
554     if (enable) {
555       RTC_LOG(WARNING) << "failed to enable stereo recording";
556     }
557     return -1;
558   }
559   int8_t nChannels(1);
560   if (enable) {
561     nChannels = 2;
562   }
563   audio_device_buffer_.SetRecordingChannels(nChannels);
564   return 0;
565 }
566 
StereoRecording(bool * enabled) const567 int32_t AudioDeviceModuleImpl::StereoRecording(bool* enabled) const {
568   RTC_LOG(INFO) << __FUNCTION__;
569   CHECKinitialized_();
570   bool stereo = false;
571   if (audio_device_->StereoRecording(stereo) == -1) {
572     return -1;
573   }
574   *enabled = stereo;
575   RTC_LOG(INFO) << "output: " << stereo;
576   return 0;
577 }
578 
StereoPlayoutIsAvailable(bool * available) const579 int32_t AudioDeviceModuleImpl::StereoPlayoutIsAvailable(bool* available) const {
580   RTC_LOG(INFO) << __FUNCTION__;
581   CHECKinitialized_();
582   bool isAvailable = false;
583   if (audio_device_->StereoPlayoutIsAvailable(isAvailable) == -1) {
584     return -1;
585   }
586   *available = isAvailable;
587   RTC_LOG(INFO) << "output: " << isAvailable;
588   return 0;
589 }
590 
SetStereoPlayout(bool enable)591 int32_t AudioDeviceModuleImpl::SetStereoPlayout(bool enable) {
592   RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
593   CHECKinitialized_();
594   if (audio_device_->PlayoutIsInitialized()) {
595     RTC_LOG(LERROR)
596         << "unable to set stereo mode while playing side is initialized";
597     return -1;
598   }
599   if (audio_device_->SetStereoPlayout(enable)) {
600     RTC_LOG(WARNING) << "stereo playout is not supported";
601     return -1;
602   }
603   int8_t nChannels(1);
604   if (enable) {
605     nChannels = 2;
606   }
607   audio_device_buffer_.SetPlayoutChannels(nChannels);
608   return 0;
609 }
610 
StereoPlayout(bool * enabled) const611 int32_t AudioDeviceModuleImpl::StereoPlayout(bool* enabled) const {
612   RTC_LOG(INFO) << __FUNCTION__;
613   CHECKinitialized_();
614   bool stereo = false;
615   if (audio_device_->StereoPlayout(stereo) == -1) {
616     return -1;
617   }
618   *enabled = stereo;
619   RTC_LOG(INFO) << "output: " << stereo;
620   return 0;
621 }
622 
PlayoutIsAvailable(bool * available)623 int32_t AudioDeviceModuleImpl::PlayoutIsAvailable(bool* available) {
624   RTC_LOG(INFO) << __FUNCTION__;
625   CHECKinitialized_();
626   bool isAvailable = false;
627   if (audio_device_->PlayoutIsAvailable(isAvailable) == -1) {
628     return -1;
629   }
630   *available = isAvailable;
631   RTC_LOG(INFO) << "output: " << isAvailable;
632   return 0;
633 }
634 
RecordingIsAvailable(bool * available)635 int32_t AudioDeviceModuleImpl::RecordingIsAvailable(bool* available) {
636   RTC_LOG(INFO) << __FUNCTION__;
637   CHECKinitialized_();
638   bool isAvailable = false;
639   if (audio_device_->RecordingIsAvailable(isAvailable) == -1) {
640     return -1;
641   }
642   *available = isAvailable;
643   RTC_LOG(INFO) << "output: " << isAvailable;
644   return 0;
645 }
646 
MaxMicrophoneVolume(uint32_t * maxVolume) const647 int32_t AudioDeviceModuleImpl::MaxMicrophoneVolume(uint32_t* maxVolume) const {
648   CHECKinitialized_();
649   uint32_t maxVol(0);
650   if (audio_device_->MaxMicrophoneVolume(maxVol) == -1) {
651     return -1;
652   }
653   *maxVolume = maxVol;
654   return 0;
655 }
656 
MinMicrophoneVolume(uint32_t * minVolume) const657 int32_t AudioDeviceModuleImpl::MinMicrophoneVolume(uint32_t* minVolume) const {
658   CHECKinitialized_();
659   uint32_t minVol(0);
660   if (audio_device_->MinMicrophoneVolume(minVol) == -1) {
661     return -1;
662   }
663   *minVolume = minVol;
664   return 0;
665 }
666 
PlayoutDevices()667 int16_t AudioDeviceModuleImpl::PlayoutDevices() {
668   RTC_LOG(INFO) << __FUNCTION__;
669   CHECKinitialized_();
670   uint16_t nPlayoutDevices = audio_device_->PlayoutDevices();
671   RTC_LOG(INFO) << "output: " << nPlayoutDevices;
672   return (int16_t)(nPlayoutDevices);
673 }
674 
SetPlayoutDevice(uint16_t index)675 int32_t AudioDeviceModuleImpl::SetPlayoutDevice(uint16_t index) {
676   RTC_LOG(INFO) << __FUNCTION__ << "(" << index << ")";
677   CHECKinitialized_();
678   return audio_device_->SetPlayoutDevice(index);
679 }
680 
SetPlayoutDevice(WindowsDeviceType device)681 int32_t AudioDeviceModuleImpl::SetPlayoutDevice(WindowsDeviceType device) {
682   RTC_LOG(INFO) << __FUNCTION__;
683   CHECKinitialized_();
684   return audio_device_->SetPlayoutDevice(device);
685 }
686 
PlayoutDeviceName(uint16_t index,char name[kAdmMaxDeviceNameSize],char guid[kAdmMaxGuidSize])687 int32_t AudioDeviceModuleImpl::PlayoutDeviceName(
688     uint16_t index,
689     char name[kAdmMaxDeviceNameSize],
690     char guid[kAdmMaxGuidSize]) {
691   RTC_LOG(INFO) << __FUNCTION__ << "(" << index << ", ...)";
692   CHECKinitialized_();
693   if (name == NULL) {
694     return -1;
695   }
696   if (audio_device_->PlayoutDeviceName(index, name, guid) == -1) {
697     return -1;
698   }
699   if (name != NULL) {
700     RTC_LOG(INFO) << "output: name = " << name;
701   }
702   if (guid != NULL) {
703     RTC_LOG(INFO) << "output: guid = " << guid;
704   }
705   return 0;
706 }
707 
RecordingDeviceName(uint16_t index,char name[kAdmMaxDeviceNameSize],char guid[kAdmMaxGuidSize])708 int32_t AudioDeviceModuleImpl::RecordingDeviceName(
709     uint16_t index,
710     char name[kAdmMaxDeviceNameSize],
711     char guid[kAdmMaxGuidSize]) {
712   RTC_LOG(INFO) << __FUNCTION__ << "(" << index << ", ...)";
713   CHECKinitialized_();
714   if (name == NULL) {
715     return -1;
716   }
717   if (audio_device_->RecordingDeviceName(index, name, guid) == -1) {
718     return -1;
719   }
720   if (name != NULL) {
721     RTC_LOG(INFO) << "output: name = " << name;
722   }
723   if (guid != NULL) {
724     RTC_LOG(INFO) << "output: guid = " << guid;
725   }
726   return 0;
727 }
728 
RecordingDevices()729 int16_t AudioDeviceModuleImpl::RecordingDevices() {
730   RTC_LOG(INFO) << __FUNCTION__;
731   CHECKinitialized_();
732   uint16_t nRecordingDevices = audio_device_->RecordingDevices();
733   RTC_LOG(INFO) << "output: " << nRecordingDevices;
734   return (int16_t)nRecordingDevices;
735 }
736 
SetRecordingDevice(uint16_t index)737 int32_t AudioDeviceModuleImpl::SetRecordingDevice(uint16_t index) {
738   RTC_LOG(INFO) << __FUNCTION__ << "(" << index << ")";
739   CHECKinitialized_();
740   return audio_device_->SetRecordingDevice(index);
741 }
742 
SetRecordingDevice(WindowsDeviceType device)743 int32_t AudioDeviceModuleImpl::SetRecordingDevice(WindowsDeviceType device) {
744   RTC_LOG(INFO) << __FUNCTION__;
745   CHECKinitialized_();
746   return audio_device_->SetRecordingDevice(device);
747 }
748 
InitPlayout()749 int32_t AudioDeviceModuleImpl::InitPlayout() {
750   RTC_LOG(INFO) << __FUNCTION__;
751   CHECKinitialized_();
752   if (PlayoutIsInitialized()) {
753     return 0;
754   }
755   int32_t result = audio_device_->InitPlayout();
756   RTC_LOG(INFO) << "output: " << result;
757   RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.InitPlayoutSuccess",
758                         static_cast<int>(result == 0));
759   return result;
760 }
761 
InitRecording()762 int32_t AudioDeviceModuleImpl::InitRecording() {
763   RTC_LOG(INFO) << __FUNCTION__;
764   CHECKinitialized_();
765   if (RecordingIsInitialized()) {
766     return 0;
767   }
768   int32_t result = audio_device_->InitRecording();
769   RTC_LOG(INFO) << "output: " << result;
770   RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.InitRecordingSuccess",
771                         static_cast<int>(result == 0));
772   return result;
773 }
774 
PlayoutIsInitialized() const775 bool AudioDeviceModuleImpl::PlayoutIsInitialized() const {
776   RTC_LOG(INFO) << __FUNCTION__;
777   CHECKinitialized__BOOL();
778   return audio_device_->PlayoutIsInitialized();
779 }
780 
RecordingIsInitialized() const781 bool AudioDeviceModuleImpl::RecordingIsInitialized() const {
782   RTC_LOG(INFO) << __FUNCTION__;
783   CHECKinitialized__BOOL();
784   return audio_device_->RecordingIsInitialized();
785 }
786 
StartPlayout()787 int32_t AudioDeviceModuleImpl::StartPlayout() {
788   RTC_LOG(INFO) << __FUNCTION__;
789   CHECKinitialized_();
790   if (Playing()) {
791     return 0;
792   }
793   audio_device_buffer_.StartPlayout();
794   int32_t result = audio_device_->StartPlayout();
795   RTC_LOG(INFO) << "output: " << result;
796   RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StartPlayoutSuccess",
797                         static_cast<int>(result == 0));
798   return result;
799 }
800 
StopPlayout()801 int32_t AudioDeviceModuleImpl::StopPlayout() {
802   RTC_LOG(INFO) << __FUNCTION__;
803   CHECKinitialized_();
804   int32_t result = audio_device_->StopPlayout();
805   audio_device_buffer_.StopPlayout();
806   RTC_LOG(INFO) << "output: " << result;
807   RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StopPlayoutSuccess",
808                         static_cast<int>(result == 0));
809   return result;
810 }
811 
Playing() const812 bool AudioDeviceModuleImpl::Playing() const {
813   RTC_LOG(INFO) << __FUNCTION__;
814   CHECKinitialized__BOOL();
815   return audio_device_->Playing();
816 }
817 
StartRecording()818 int32_t AudioDeviceModuleImpl::StartRecording() {
819   RTC_LOG(INFO) << __FUNCTION__;
820   CHECKinitialized_();
821   if (Recording()) {
822     return 0;
823   }
824   audio_device_buffer_.StartRecording();
825   int32_t result = audio_device_->StartRecording();
826   RTC_LOG(INFO) << "output: " << result;
827   RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StartRecordingSuccess",
828                         static_cast<int>(result == 0));
829   return result;
830 }
831 
StopRecording()832 int32_t AudioDeviceModuleImpl::StopRecording() {
833   RTC_LOG(INFO) << __FUNCTION__;
834   CHECKinitialized_();
835   int32_t result = audio_device_->StopRecording();
836   audio_device_buffer_.StopRecording();
837   RTC_LOG(INFO) << "output: " << result;
838   RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StopRecordingSuccess",
839                         static_cast<int>(result == 0));
840   return result;
841 }
842 
Recording() const843 bool AudioDeviceModuleImpl::Recording() const {
844   RTC_LOG(INFO) << __FUNCTION__;
845   CHECKinitialized__BOOL();
846   return audio_device_->Recording();
847 }
848 
RegisterAudioCallback(AudioTransport * audioCallback)849 int32_t AudioDeviceModuleImpl::RegisterAudioCallback(
850     AudioTransport* audioCallback) {
851   RTC_LOG(INFO) << __FUNCTION__;
852   return audio_device_buffer_.RegisterAudioCallback(audioCallback);
853 }
854 
PlayoutDelay(uint16_t * delayMS) const855 int32_t AudioDeviceModuleImpl::PlayoutDelay(uint16_t* delayMS) const {
856   CHECKinitialized_();
857   uint16_t delay = 0;
858   if (audio_device_->PlayoutDelay(delay) == -1) {
859     RTC_LOG(LERROR) << "failed to retrieve the playout delay";
860     return -1;
861   }
862   *delayMS = delay;
863   return 0;
864 }
865 
BuiltInAECIsAvailable() const866 bool AudioDeviceModuleImpl::BuiltInAECIsAvailable() const {
867   RTC_LOG(INFO) << __FUNCTION__;
868   CHECKinitialized__BOOL();
869   bool isAvailable = audio_device_->BuiltInAECIsAvailable();
870   RTC_LOG(INFO) << "output: " << isAvailable;
871   return isAvailable;
872 }
873 
EnableBuiltInAEC(bool enable)874 int32_t AudioDeviceModuleImpl::EnableBuiltInAEC(bool enable) {
875   RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
876   CHECKinitialized_();
877   int32_t ok = audio_device_->EnableBuiltInAEC(enable);
878   RTC_LOG(INFO) << "output: " << ok;
879   return ok;
880 }
881 
BuiltInAGCIsAvailable() const882 bool AudioDeviceModuleImpl::BuiltInAGCIsAvailable() const {
883   RTC_LOG(INFO) << __FUNCTION__;
884   CHECKinitialized__BOOL();
885   bool isAvailable = audio_device_->BuiltInAGCIsAvailable();
886   RTC_LOG(INFO) << "output: " << isAvailable;
887   return isAvailable;
888 }
889 
EnableBuiltInAGC(bool enable)890 int32_t AudioDeviceModuleImpl::EnableBuiltInAGC(bool enable) {
891   RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
892   CHECKinitialized_();
893   int32_t ok = audio_device_->EnableBuiltInAGC(enable);
894   RTC_LOG(INFO) << "output: " << ok;
895   return ok;
896 }
897 
BuiltInNSIsAvailable() const898 bool AudioDeviceModuleImpl::BuiltInNSIsAvailable() const {
899   RTC_LOG(INFO) << __FUNCTION__;
900   CHECKinitialized__BOOL();
901   bool isAvailable = audio_device_->BuiltInNSIsAvailable();
902   RTC_LOG(INFO) << "output: " << isAvailable;
903   return isAvailable;
904 }
905 
EnableBuiltInNS(bool enable)906 int32_t AudioDeviceModuleImpl::EnableBuiltInNS(bool enable) {
907   RTC_LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
908   CHECKinitialized_();
909   int32_t ok = audio_device_->EnableBuiltInNS(enable);
910   RTC_LOG(INFO) << "output: " << ok;
911   return ok;
912 }
913 
GetPlayoutUnderrunCount() const914 int32_t AudioDeviceModuleImpl::GetPlayoutUnderrunCount() const {
915   RTC_LOG(INFO) << __FUNCTION__;
916   CHECKinitialized_();
917   int32_t underrunCount = audio_device_->GetPlayoutUnderrunCount();
918   RTC_LOG(INFO) << "output: " << underrunCount;
919   return underrunCount;
920 }
921 
922 #if defined(WEBRTC_IOS)
GetPlayoutAudioParameters(AudioParameters * params) const923 int AudioDeviceModuleImpl::GetPlayoutAudioParameters(
924     AudioParameters* params) const {
925   RTC_LOG(INFO) << __FUNCTION__;
926   int r = audio_device_->GetPlayoutAudioParameters(params);
927   RTC_LOG(INFO) << "output: " << r;
928   return r;
929 }
930 
GetRecordAudioParameters(AudioParameters * params) const931 int AudioDeviceModuleImpl::GetRecordAudioParameters(
932     AudioParameters* params) const {
933   RTC_LOG(INFO) << __FUNCTION__;
934   int r = audio_device_->GetRecordAudioParameters(params);
935   RTC_LOG(INFO) << "output: " << r;
936   return r;
937 }
938 #endif  // WEBRTC_IOS
939 
Platform() const940 AudioDeviceModuleImpl::PlatformType AudioDeviceModuleImpl::Platform() const {
941   RTC_LOG(INFO) << __FUNCTION__;
942   return platform_type_;
943 }
944 
PlatformAudioLayer() const945 AudioDeviceModule::AudioLayer AudioDeviceModuleImpl::PlatformAudioLayer()
946     const {
947   RTC_LOG(INFO) << __FUNCTION__;
948   return audio_layer_;
949 }
950 
951 }  // namespace webrtc
952