blob: 4fd461cb756d129ea754d2d5a8fea2d072447c97 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
xians@webrtc.org20aabbb2012-02-20 09:17:41 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
Max Morin84cab202016-07-01 13:35:19 +020011#include "webrtc/base/checks.h"
Max Morin098e6c52016-06-28 09:36:25 +020012#include "webrtc/base/logging.h"
Peter Boström1d194412016-03-21 16:44:31 +010013#include "webrtc/base/refcount.h"
Niels Möllerd28db7f2016-05-10 16:31:47 +020014#include "webrtc/base/timeutils.h"
pbos@webrtc.org811269d2013-07-11 13:24:38 +000015#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
16#include "webrtc/modules/audio_device/audio_device_config.h"
Max Morin84cab202016-07-01 13:35:19 +020017#include "webrtc/modules/audio_device/audio_device_generic.h"
pbos@webrtc.org811269d2013-07-11 13:24:38 +000018#include "webrtc/modules/audio_device/audio_device_impl.h"
Max Morin84cab202016-07-01 13:35:19 +020019#include "webrtc/system_wrappers/include/metrics.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000020
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +000021#include <assert.h>
xians@google.combf5d2ba2011-08-16 07:44:19 +000022#include <string.h>
niklase@google.com470e71d2011-07-07 08:21:25 +000023
24#if defined(_WIN32)
Max Morin787eeed2016-06-23 10:42:07 +020025#include "audio_device_wave_win.h"
26#if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
27#include "audio_device_core_win.h"
28#endif
leozwang@google.com39f20512011-07-15 16:29:40 +000029#elif defined(WEBRTC_ANDROID)
henrikab2619892015-05-18 16:49:16 +020030#include <stdlib.h>
henrikab2619892015-05-18 16:49:16 +020031#include "webrtc/modules/audio_device/android/audio_device_template.h"
32#include "webrtc/modules/audio_device/android/audio_manager.h"
33#include "webrtc/modules/audio_device/android/audio_record_jni.h"
34#include "webrtc/modules/audio_device/android/audio_track_jni.h"
35#include "webrtc/modules/audio_device/android/opensles_player.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000036#elif defined(WEBRTC_LINUX)
Max Morin787eeed2016-06-23 10:42:07 +020037#if defined(LINUX_ALSA)
38#include "audio_device_alsa_linux.h"
39#endif
Tommi68898a22015-05-19 17:28:07 +020040#if defined(LINUX_PULSE)
Max Morin787eeed2016-06-23 10:42:07 +020041#include "audio_device_pulse_linux.h"
Tommi68898a22015-05-19 17:28:07 +020042#endif
sjlee@webrtc.org414fa7f2012-09-11 17:25:46 +000043#elif defined(WEBRTC_IOS)
Max Morin787eeed2016-06-23 10:42:07 +020044#include "audio_device_ios.h"
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +000045#elif defined(WEBRTC_MAC)
Max Morin787eeed2016-06-23 10:42:07 +020046#include "audio_device_mac.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000047#endif
phoglund@webrtc.org8454ad12014-06-11 14:12:04 +000048
49#if defined(WEBRTC_DUMMY_FILE_DEVICES)
50#include "webrtc/modules/audio_device/dummy/file_audio_device_factory.h"
51#endif
52
pbos@webrtc.org811269d2013-07-11 13:24:38 +000053#include "webrtc/modules/audio_device/dummy/audio_device_dummy.h"
phoglund@webrtc.org8454ad12014-06-11 14:12:04 +000054#include "webrtc/modules/audio_device/dummy/file_audio_device.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010055#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000056
Max Morin787eeed2016-06-23 10:42:07 +020057#define CHECK_INITIALIZED() \
58 { \
59 if (!_initialized) { \
60 return -1; \
61 }; \
62 }
niklase@google.com470e71d2011-07-07 08:21:25 +000063
Max Morin787eeed2016-06-23 10:42:07 +020064#define CHECK_INITIALIZED_BOOL() \
65 { \
66 if (!_initialized) { \
67 return false; \
68 }; \
69 }
niklase@google.com470e71d2011-07-07 08:21:25 +000070
Peter Boström1d194412016-03-21 16:44:31 +010071namespace webrtc {
henrike@webrtc.org70efc322012-02-23 17:45:33 +000072
niklase@google.com470e71d2011-07-07 08:21:25 +000073// ============================================================================
74// Static methods
75// ============================================================================
76
77// ----------------------------------------------------------------------------
78// AudioDeviceModule::Create()
79// ----------------------------------------------------------------------------
80
Peter Boström4adbbcf2016-05-03 15:51:26 -040081rtc::scoped_refptr<AudioDeviceModule> AudioDeviceModule::Create(
Peter Boström1d194412016-03-21 16:44:31 +010082 const int32_t id,
Peter Boström4adbbcf2016-05-03 15:51:26 -040083 const AudioLayer audio_layer) {
Max Morin098e6c52016-06-28 09:36:25 +020084 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +020085 // Create the generic ref counted (platform independent) implementation.
86 rtc::scoped_refptr<AudioDeviceModuleImpl> audioDevice(
87 new rtc::RefCountedObject<AudioDeviceModuleImpl>(id, audio_layer));
niklase@google.com470e71d2011-07-07 08:21:25 +000088
Max Morin787eeed2016-06-23 10:42:07 +020089 // Ensure that the current platform is supported.
90 if (audioDevice->CheckPlatform() == -1) {
91 return nullptr;
92 }
niklase@google.com470e71d2011-07-07 08:21:25 +000093
Max Morin787eeed2016-06-23 10:42:07 +020094 // Create the platform-dependent implementation.
95 if (audioDevice->CreatePlatformSpecificObjects() == -1) {
96 return nullptr;
97 }
niklase@google.com470e71d2011-07-07 08:21:25 +000098
Max Morin787eeed2016-06-23 10:42:07 +020099 // Ensure that the generic audio buffer can communicate with the
100 // platform-specific parts.
101 if (audioDevice->AttachAudioBuffer() == -1) {
102 return nullptr;
103 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000104
Max Morin787eeed2016-06-23 10:42:07 +0200105 WebRtcSpl_Init();
kma@webrtc.orgac4d70d2012-10-05 00:19:01 +0000106
Max Morin787eeed2016-06-23 10:42:07 +0200107 return audioDevice;
niklase@google.com470e71d2011-07-07 08:21:25 +0000108}
109
niklase@google.com470e71d2011-07-07 08:21:25 +0000110// ============================================================================
111// Construction & Destruction
112// ============================================================================
113
114// ----------------------------------------------------------------------------
115// AudioDeviceModuleImpl - ctor
116// ----------------------------------------------------------------------------
117
Max Morin787eeed2016-06-23 10:42:07 +0200118AudioDeviceModuleImpl::AudioDeviceModuleImpl(const int32_t id,
119 const AudioLayer audioLayer)
120 : _critSect(*CriticalSectionWrapper::CreateCriticalSection()),
121 _critSectEventCb(*CriticalSectionWrapper::CreateCriticalSection()),
122 _critSectAudioCb(*CriticalSectionWrapper::CreateCriticalSection()),
123 _ptrCbAudioDeviceObserver(NULL),
124 _ptrAudioDevice(NULL),
125 _id(id),
126 _platformAudioLayer(audioLayer),
127 _lastProcessTime(rtc::TimeMillis()),
128 _platformType(kPlatformNotSupported),
129 _initialized(false),
130 _lastError(kAdmErrNone) {
Max Morin098e6c52016-06-28 09:36:25 +0200131 LOG(INFO) << __FUNCTION__;
niklase@google.com470e71d2011-07-07 08:21:25 +0000132}
133
134// ----------------------------------------------------------------------------
135// CheckPlatform
136// ----------------------------------------------------------------------------
137
Max Morin787eeed2016-06-23 10:42:07 +0200138int32_t AudioDeviceModuleImpl::CheckPlatform() {
Max Morin098e6c52016-06-28 09:36:25 +0200139 LOG(INFO) << __FUNCTION__;
niklase@google.com470e71d2011-07-07 08:21:25 +0000140
Max Morin787eeed2016-06-23 10:42:07 +0200141 // Ensure that the current platform is supported
142 //
143 PlatformType platform(kPlatformNotSupported);
niklase@google.com470e71d2011-07-07 08:21:25 +0000144
145#if defined(_WIN32)
Max Morin787eeed2016-06-23 10:42:07 +0200146 platform = kPlatformWin32;
Max Morin098e6c52016-06-28 09:36:25 +0200147 LOG(INFO) << "current platform is Win32";
leozwang@google.com522f42b2011-09-19 17:39:05 +0000148#elif defined(WEBRTC_ANDROID)
Max Morin787eeed2016-06-23 10:42:07 +0200149 platform = kPlatformAndroid;
Max Morin098e6c52016-06-28 09:36:25 +0200150 LOG(INFO) << "current platform is Android";
niklase@google.com470e71d2011-07-07 08:21:25 +0000151#elif defined(WEBRTC_LINUX)
Max Morin787eeed2016-06-23 10:42:07 +0200152 platform = kPlatformLinux;
Max Morin098e6c52016-06-28 09:36:25 +0200153 LOG(INFO) << "current platform is Linux";
sjlee@webrtc.org414fa7f2012-09-11 17:25:46 +0000154#elif defined(WEBRTC_IOS)
Max Morin787eeed2016-06-23 10:42:07 +0200155 platform = kPlatformIOS;
Max Morin098e6c52016-06-28 09:36:25 +0200156 LOG(INFO) << "current platform is IOS";
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000157#elif defined(WEBRTC_MAC)
Max Morin787eeed2016-06-23 10:42:07 +0200158 platform = kPlatformMac;
Max Morin098e6c52016-06-28 09:36:25 +0200159 LOG(INFO) << "current platform is Mac";
niklase@google.com470e71d2011-07-07 08:21:25 +0000160#endif
161
Max Morin787eeed2016-06-23 10:42:07 +0200162 if (platform == kPlatformNotSupported) {
Max Morin098e6c52016-06-28 09:36:25 +0200163 LOG(LERROR) << "current platform is not supported => this module will self "
164 "destruct!";
Max Morin787eeed2016-06-23 10:42:07 +0200165 return -1;
166 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000167
Max Morin787eeed2016-06-23 10:42:07 +0200168 // Store valid output results
169 //
170 _platformType = platform;
niklase@google.com470e71d2011-07-07 08:21:25 +0000171
Max Morin787eeed2016-06-23 10:42:07 +0200172 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000173}
174
niklase@google.com470e71d2011-07-07 08:21:25 +0000175// ----------------------------------------------------------------------------
176// CreatePlatformSpecificObjects
177// ----------------------------------------------------------------------------
178
Max Morin787eeed2016-06-23 10:42:07 +0200179int32_t AudioDeviceModuleImpl::CreatePlatformSpecificObjects() {
Max Morin098e6c52016-06-28 09:36:25 +0200180 LOG(INFO) << __FUNCTION__;
niklase@google.com470e71d2011-07-07 08:21:25 +0000181
Max Morin787eeed2016-06-23 10:42:07 +0200182 AudioDeviceGeneric* ptrAudioDevice(NULL);
niklase@google.com470e71d2011-07-07 08:21:25 +0000183
xians@google.combf5d2ba2011-08-16 07:44:19 +0000184#if defined(WEBRTC_DUMMY_AUDIO_BUILD)
Max Morin787eeed2016-06-23 10:42:07 +0200185 ptrAudioDevice = new AudioDeviceDummy(Id());
Max Morin098e6c52016-06-28 09:36:25 +0200186 LOG(INFO) << "Dummy Audio APIs will be utilized";
phoglund@webrtc.org8454ad12014-06-11 14:12:04 +0000187#elif defined(WEBRTC_DUMMY_FILE_DEVICES)
Max Morin787eeed2016-06-23 10:42:07 +0200188 ptrAudioDevice = FileAudioDeviceFactory::CreateFileAudioDevice(Id());
Max Morin098e6c52016-06-28 09:36:25 +0200189 LOG(INFO) << "Will use file-playing dummy device.";
xians@google.combf5d2ba2011-08-16 07:44:19 +0000190#else
Max Morin787eeed2016-06-23 10:42:07 +0200191 AudioLayer audioLayer(PlatformAudioLayer());
niklase@google.com470e71d2011-07-07 08:21:25 +0000192
Max Morin787eeed2016-06-23 10:42:07 +0200193// Create the *Windows* implementation of the Audio Device
194//
niklase@google.com470e71d2011-07-07 08:21:25 +0000195#if defined(_WIN32)
Max Morin787eeed2016-06-23 10:42:07 +0200196 if ((audioLayer == kWindowsWaveAudio)
niklase@google.com470e71d2011-07-07 08:21:25 +0000197#if !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
Max Morin787eeed2016-06-23 10:42:07 +0200198 // Wave audio is default if Core audio is not supported in this build
199 || (audioLayer == kPlatformDefaultAudio)
niklase@google.com470e71d2011-07-07 08:21:25 +0000200#endif
Max Morin787eeed2016-06-23 10:42:07 +0200201 ) {
202 // create *Windows Wave Audio* implementation
203 ptrAudioDevice = new AudioDeviceWindowsWave(Id());
Max Morin098e6c52016-06-28 09:36:25 +0200204 LOG(INFO) << "Windows Wave APIs will be utilized";
Max Morin787eeed2016-06-23 10:42:07 +0200205 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000206#if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
Max Morin787eeed2016-06-23 10:42:07 +0200207 if ((audioLayer == kWindowsCoreAudio) ||
208 (audioLayer == kPlatformDefaultAudio)) {
Max Morin098e6c52016-06-28 09:36:25 +0200209 LOG(INFO) << "attempting to use the Windows Core Audio APIs...";
niklase@google.com470e71d2011-07-07 08:21:25 +0000210
Max Morin787eeed2016-06-23 10:42:07 +0200211 if (AudioDeviceWindowsCore::CoreAudioIsSupported()) {
212 // create *Windows Core Audio* implementation
213 ptrAudioDevice = new AudioDeviceWindowsCore(Id());
Max Morin098e6c52016-06-28 09:36:25 +0200214 LOG(INFO) << "Windows Core Audio APIs will be utilized";
Max Morin787eeed2016-06-23 10:42:07 +0200215 } else {
216 // create *Windows Wave Audio* implementation
217 ptrAudioDevice = new AudioDeviceWindowsWave(Id());
218 if (ptrAudioDevice != NULL) {
219 // Core Audio was not supported => revert to Windows Wave instead
220 _platformAudioLayer =
221 kWindowsWaveAudio; // modify the state set at construction
Max Morin098e6c52016-06-28 09:36:25 +0200222 LOG(WARNING) << "Windows Core Audio is *not* supported => Wave APIs "
223 "will be utilized instead";
Max Morin787eeed2016-06-23 10:42:07 +0200224 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000225 }
Max Morin787eeed2016-06-23 10:42:07 +0200226 }
227#endif // defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
niklase@google.com470e71d2011-07-07 08:21:25 +0000228#endif // #if defined(_WIN32)
229
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000230#if defined(WEBRTC_ANDROID)
Max Morin787eeed2016-06-23 10:42:07 +0200231 // Create an Android audio manager.
232 _audioManagerAndroid.reset(new AudioManager());
233 // Select best possible combination of audio layers.
234 if (audioLayer == kPlatformDefaultAudio) {
235 if (_audioManagerAndroid->IsLowLatencyPlayoutSupported()) {
236 // Always use OpenSL ES for output on devices that supports the
237 // low-latency output audio path.
238 audioLayer = kAndroidJavaInputAndOpenSLESOutputAudio;
henrikab2619892015-05-18 16:49:16 +0200239 } else {
Max Morin787eeed2016-06-23 10:42:07 +0200240 // Use Java-based audio in both directions when low-latency output
241 // is not supported.
242 audioLayer = kAndroidJavaAudio;
niklase@google.com470e71d2011-07-07 08:21:25 +0000243 }
Max Morin787eeed2016-06-23 10:42:07 +0200244 }
245 AudioManager* audio_manager = _audioManagerAndroid.get();
246 if (audioLayer == kAndroidJavaAudio) {
247 // Java audio for both input and output audio.
248 ptrAudioDevice = new AudioDeviceTemplate<AudioRecordJni, AudioTrackJni>(
249 audioLayer, audio_manager);
250 } else if (audioLayer == kAndroidJavaInputAndOpenSLESOutputAudio) {
251 // Java audio for input and OpenSL ES for output audio (i.e. mixed APIs).
252 // This combination provides low-latency output audio and at the same
253 // time support for HW AEC using the AudioRecord Java API.
254 ptrAudioDevice = new AudioDeviceTemplate<AudioRecordJni, OpenSLESPlayer>(
255 audioLayer, audio_manager);
256 } else {
257 // Invalid audio layer.
258 ptrAudioDevice = NULL;
259 }
260// END #if defined(WEBRTC_ANDROID)
niklase@google.com470e71d2011-07-07 08:21:25 +0000261
Max Morin787eeed2016-06-23 10:42:07 +0200262// Create the *Linux* implementation of the Audio Device
263//
niklase@google.com470e71d2011-07-07 08:21:25 +0000264#elif defined(WEBRTC_LINUX)
Max Morin787eeed2016-06-23 10:42:07 +0200265 if ((audioLayer == kLinuxPulseAudio) ||
266 (audioLayer == kPlatformDefaultAudio)) {
niklase@google.com470e71d2011-07-07 08:21:25 +0000267#if defined(LINUX_PULSE)
Max Morin098e6c52016-06-28 09:36:25 +0200268 LOG(INFO) << "attempting to use the Linux PulseAudio APIs...";
niklase@google.com470e71d2011-07-07 08:21:25 +0000269
Max Morin787eeed2016-06-23 10:42:07 +0200270 // create *Linux PulseAudio* implementation
271 AudioDeviceLinuxPulse* pulseDevice = new AudioDeviceLinuxPulse(Id());
Max Morin84cab202016-07-01 13:35:19 +0200272 if (pulseDevice->Init() == AudioDeviceGeneric::InitStatus::OK) {
Max Morin787eeed2016-06-23 10:42:07 +0200273 ptrAudioDevice = pulseDevice;
Max Morin098e6c52016-06-28 09:36:25 +0200274 LOG(INFO) << "Linux PulseAudio APIs will be utilized";
Max Morin787eeed2016-06-23 10:42:07 +0200275 } else {
276 delete pulseDevice;
niklase@google.com470e71d2011-07-07 08:21:25 +0000277#endif
278#if defined(LINUX_ALSA)
Max Morin787eeed2016-06-23 10:42:07 +0200279 // create *Linux ALSA Audio* implementation
280 ptrAudioDevice = new AudioDeviceLinuxALSA(Id());
281 if (ptrAudioDevice != NULL) {
282 // Pulse Audio was not supported => revert to ALSA instead
283 _platformAudioLayer =
284 kLinuxAlsaAudio; // modify the state set at construction
Max Morin098e6c52016-06-28 09:36:25 +0200285 LOG(WARNING) << "Linux PulseAudio is *not* supported => ALSA APIs will "
286 "be utilized instead";
Max Morin787eeed2016-06-23 10:42:07 +0200287 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000288#endif
289#if defined(LINUX_PULSE)
niklase@google.com470e71d2011-07-07 08:21:25 +0000290 }
Max Morin787eeed2016-06-23 10:42:07 +0200291#endif
292 } else if (audioLayer == kLinuxAlsaAudio) {
niklase@google.com470e71d2011-07-07 08:21:25 +0000293#if defined(LINUX_ALSA)
Max Morin787eeed2016-06-23 10:42:07 +0200294 // create *Linux ALSA Audio* implementation
295 ptrAudioDevice = new AudioDeviceLinuxALSA(Id());
Max Morin098e6c52016-06-28 09:36:25 +0200296 LOG(INFO) << "Linux ALSA APIs will be utilized";
niklase@google.com470e71d2011-07-07 08:21:25 +0000297#endif
Max Morin787eeed2016-06-23 10:42:07 +0200298 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000299#endif // #if defined(WEBRTC_LINUX)
300
Max Morin787eeed2016-06-23 10:42:07 +0200301// Create the *iPhone* implementation of the Audio Device
302//
sjlee@webrtc.org414fa7f2012-09-11 17:25:46 +0000303#if defined(WEBRTC_IOS)
Max Morin787eeed2016-06-23 10:42:07 +0200304 if (audioLayer == kPlatformDefaultAudio) {
305 // Create iOS Audio Device implementation.
306 ptrAudioDevice = new AudioDeviceIOS();
Max Morin098e6c52016-06-28 09:36:25 +0200307 LOG(INFO) << "iPhone Audio APIs will be utilized";
Max Morin787eeed2016-06-23 10:42:07 +0200308 }
309// END #if defined(WEBRTC_IOS)
niklase@google.com470e71d2011-07-07 08:21:25 +0000310
Max Morin787eeed2016-06-23 10:42:07 +0200311// Create the *Mac* implementation of the Audio Device
312//
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000313#elif defined(WEBRTC_MAC)
Max Morin787eeed2016-06-23 10:42:07 +0200314 if (audioLayer == kPlatformDefaultAudio) {
315 // Create *Mac Audio* implementation
316 ptrAudioDevice = new AudioDeviceMac(Id());
Max Morin098e6c52016-06-28 09:36:25 +0200317 LOG(INFO) << "Mac OS X Audio APIs will be utilized";
Max Morin787eeed2016-06-23 10:42:07 +0200318 }
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000319#endif // WEBRTC_MAC
niklase@google.com470e71d2011-07-07 08:21:25 +0000320
Max Morin787eeed2016-06-23 10:42:07 +0200321 // Create the *Dummy* implementation of the Audio Device
322 // Available for all platforms
323 //
324 if (audioLayer == kDummyAudio) {
325 // Create *Dummy Audio* implementation
326 assert(!ptrAudioDevice);
327 ptrAudioDevice = new AudioDeviceDummy(Id());
Max Morin098e6c52016-06-28 09:36:25 +0200328 LOG(INFO) << "Dummy Audio APIs will be utilized";
Max Morin787eeed2016-06-23 10:42:07 +0200329 }
xians@google.combf5d2ba2011-08-16 07:44:19 +0000330#endif // if defined(WEBRTC_DUMMY_AUDIO_BUILD)
niklase@google.com470e71d2011-07-07 08:21:25 +0000331
Max Morin787eeed2016-06-23 10:42:07 +0200332 if (ptrAudioDevice == NULL) {
Max Morin098e6c52016-06-28 09:36:25 +0200333 LOG(LERROR)
334 << "unable to create the platform specific audio device implementation";
Max Morin787eeed2016-06-23 10:42:07 +0200335 return -1;
336 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000337
Max Morin787eeed2016-06-23 10:42:07 +0200338 // Store valid output pointers
339 //
340 _ptrAudioDevice = ptrAudioDevice;
niklase@google.com470e71d2011-07-07 08:21:25 +0000341
Max Morin787eeed2016-06-23 10:42:07 +0200342 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000343}
344
345// ----------------------------------------------------------------------------
346// AttachAudioBuffer
347//
348// Install "bridge" between the platform implemetation and the generic
349// implementation. The "child" shall set the native sampling rate and the
350// number of channels in this function call.
351// ----------------------------------------------------------------------------
352
Max Morin787eeed2016-06-23 10:42:07 +0200353int32_t AudioDeviceModuleImpl::AttachAudioBuffer() {
Max Morin098e6c52016-06-28 09:36:25 +0200354 LOG(INFO) << __FUNCTION__;
niklase@google.com470e71d2011-07-07 08:21:25 +0000355
Max Morin787eeed2016-06-23 10:42:07 +0200356 _audioDeviceBuffer.SetId(_id);
357 _ptrAudioDevice->AttachAudioBuffer(&_audioDeviceBuffer);
358 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000359}
360
361// ----------------------------------------------------------------------------
362// ~AudioDeviceModuleImpl - dtor
363// ----------------------------------------------------------------------------
364
Max Morin787eeed2016-06-23 10:42:07 +0200365AudioDeviceModuleImpl::~AudioDeviceModuleImpl() {
Max Morin098e6c52016-06-28 09:36:25 +0200366 LOG(INFO) << __FUNCTION__;
henrika@google.com73d65512011-09-07 15:11:18 +0000367
Max Morin787eeed2016-06-23 10:42:07 +0200368 if (_ptrAudioDevice) {
369 delete _ptrAudioDevice;
370 _ptrAudioDevice = NULL;
371 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000372
Max Morin787eeed2016-06-23 10:42:07 +0200373 delete &_critSect;
374 delete &_critSectEventCb;
375 delete &_critSectAudioCb;
niklase@google.com470e71d2011-07-07 08:21:25 +0000376}
377
378// ============================================================================
379// Module
380// ============================================================================
381
382// ----------------------------------------------------------------------------
niklase@google.com470e71d2011-07-07 08:21:25 +0000383// Module::TimeUntilNextProcess
384//
385// Returns the number of milliseconds until the module want a worker thread
386// to call Process().
387// ----------------------------------------------------------------------------
388
Max Morin787eeed2016-06-23 10:42:07 +0200389int64_t AudioDeviceModuleImpl::TimeUntilNextProcess() {
Max Morin098e6c52016-06-28 09:36:25 +0200390 LOG(LS_VERBOSE) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200391 int64_t now = rtc::TimeMillis();
392 int64_t deltaProcess = kAdmMaxIdleTimeProcess - (now - _lastProcessTime);
393 return deltaProcess;
niklase@google.com470e71d2011-07-07 08:21:25 +0000394}
395
396// ----------------------------------------------------------------------------
397// Module::Process
398//
399// Check for posted error and warning reports. Generate callbacks if
400// new reports exists.
401// ----------------------------------------------------------------------------
402
Max Morin787eeed2016-06-23 10:42:07 +0200403void AudioDeviceModuleImpl::Process() {
Max Morin098e6c52016-06-28 09:36:25 +0200404 LOG(LS_VERBOSE) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200405 _lastProcessTime = rtc::TimeMillis();
niklase@google.com470e71d2011-07-07 08:21:25 +0000406
Max Morin787eeed2016-06-23 10:42:07 +0200407 // kPlayoutWarning
408 if (_ptrAudioDevice->PlayoutWarning()) {
409 CriticalSectionScoped lock(&_critSectEventCb);
410 if (_ptrCbAudioDeviceObserver) {
Max Morin098e6c52016-06-28 09:36:25 +0200411 LOG(WARNING) << "=> OnWarningIsReported(kPlayoutWarning)";
Max Morin787eeed2016-06-23 10:42:07 +0200412 _ptrCbAudioDeviceObserver->OnWarningIsReported(
413 AudioDeviceObserver::kPlayoutWarning);
niklase@google.com470e71d2011-07-07 08:21:25 +0000414 }
Max Morin787eeed2016-06-23 10:42:07 +0200415 _ptrAudioDevice->ClearPlayoutWarning();
416 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000417
Max Morin787eeed2016-06-23 10:42:07 +0200418 // kPlayoutError
419 if (_ptrAudioDevice->PlayoutError()) {
420 CriticalSectionScoped lock(&_critSectEventCb);
421 if (_ptrCbAudioDeviceObserver) {
Max Morin098e6c52016-06-28 09:36:25 +0200422 LOG(LERROR) << "=> OnErrorIsReported(kPlayoutError)";
Max Morin787eeed2016-06-23 10:42:07 +0200423 _ptrCbAudioDeviceObserver->OnErrorIsReported(
424 AudioDeviceObserver::kPlayoutError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000425 }
Max Morin787eeed2016-06-23 10:42:07 +0200426 _ptrAudioDevice->ClearPlayoutError();
427 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000428
Max Morin787eeed2016-06-23 10:42:07 +0200429 // kRecordingWarning
430 if (_ptrAudioDevice->RecordingWarning()) {
431 CriticalSectionScoped lock(&_critSectEventCb);
432 if (_ptrCbAudioDeviceObserver) {
Max Morin098e6c52016-06-28 09:36:25 +0200433 LOG(WARNING) << "=> OnWarningIsReported(kRecordingWarning)";
Max Morin787eeed2016-06-23 10:42:07 +0200434 _ptrCbAudioDeviceObserver->OnWarningIsReported(
435 AudioDeviceObserver::kRecordingWarning);
niklase@google.com470e71d2011-07-07 08:21:25 +0000436 }
Max Morin787eeed2016-06-23 10:42:07 +0200437 _ptrAudioDevice->ClearRecordingWarning();
438 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000439
Max Morin787eeed2016-06-23 10:42:07 +0200440 // kRecordingError
441 if (_ptrAudioDevice->RecordingError()) {
442 CriticalSectionScoped lock(&_critSectEventCb);
443 if (_ptrCbAudioDeviceObserver) {
Max Morin098e6c52016-06-28 09:36:25 +0200444 LOG(LERROR) << "=> OnErrorIsReported(kRecordingError)";
Max Morin787eeed2016-06-23 10:42:07 +0200445 _ptrCbAudioDeviceObserver->OnErrorIsReported(
446 AudioDeviceObserver::kRecordingError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000447 }
Max Morin787eeed2016-06-23 10:42:07 +0200448 _ptrAudioDevice->ClearRecordingError();
449 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000450}
451
452// ============================================================================
453// Public API
454// ============================================================================
455
456// ----------------------------------------------------------------------------
457// ActiveAudioLayer
458// ----------------------------------------------------------------------------
459
henrikab2619892015-05-18 16:49:16 +0200460int32_t AudioDeviceModuleImpl::ActiveAudioLayer(AudioLayer* audioLayer) const {
Max Morin098e6c52016-06-28 09:36:25 +0200461 LOG(INFO) << __FUNCTION__;
henrikab2619892015-05-18 16:49:16 +0200462 AudioLayer activeAudio;
463 if (_ptrAudioDevice->ActiveAudioLayer(activeAudio) == -1) {
464 return -1;
465 }
466 *audioLayer = activeAudio;
467 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000468}
469
470// ----------------------------------------------------------------------------
471// LastError
472// ----------------------------------------------------------------------------
473
Max Morin787eeed2016-06-23 10:42:07 +0200474AudioDeviceModule::ErrorCode AudioDeviceModuleImpl::LastError() const {
Max Morin098e6c52016-06-28 09:36:25 +0200475 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200476 return _lastError;
niklase@google.com470e71d2011-07-07 08:21:25 +0000477}
478
479// ----------------------------------------------------------------------------
480// Init
481// ----------------------------------------------------------------------------
482
Max Morin787eeed2016-06-23 10:42:07 +0200483int32_t AudioDeviceModuleImpl::Init() {
Max Morin098e6c52016-06-28 09:36:25 +0200484 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200485 if (_initialized)
niklase@google.com470e71d2011-07-07 08:21:25 +0000486 return 0;
Max Morin84cab202016-07-01 13:35:19 +0200487 RTC_CHECK(_ptrAudioDevice);
Max Morin787eeed2016-06-23 10:42:07 +0200488
Max Morin84cab202016-07-01 13:35:19 +0200489 AudioDeviceGeneric::InitStatus status = _ptrAudioDevice->Init();
490 RTC_HISTOGRAM_ENUMERATION(
491 "WebRTC.Audio.InitializationResult", static_cast<int>(status),
492 static_cast<int>(AudioDeviceGeneric::InitStatus::NUM_STATUSES));
493 if (status != AudioDeviceGeneric::InitStatus::OK) {
494 LOG(LS_ERROR) << "Audio device initialization failed.";
Max Morin787eeed2016-06-23 10:42:07 +0200495 return -1;
496 }
497
498 _initialized = true;
499 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000500}
501
502// ----------------------------------------------------------------------------
503// Terminate
504// ----------------------------------------------------------------------------
505
Max Morin787eeed2016-06-23 10:42:07 +0200506int32_t AudioDeviceModuleImpl::Terminate() {
Max Morin098e6c52016-06-28 09:36:25 +0200507 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200508 if (!_initialized)
niklase@google.com470e71d2011-07-07 08:21:25 +0000509 return 0;
Max Morin787eeed2016-06-23 10:42:07 +0200510
511 if (_ptrAudioDevice->Terminate() == -1) {
512 return -1;
513 }
514
515 _initialized = false;
516 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000517}
518
519// ----------------------------------------------------------------------------
520// Initialized
521// ----------------------------------------------------------------------------
522
Max Morin787eeed2016-06-23 10:42:07 +0200523bool AudioDeviceModuleImpl::Initialized() const {
Max Morin098e6c52016-06-28 09:36:25 +0200524 LOG(INFO) << __FUNCTION__ << ": " << _initialized;
Max Morin787eeed2016-06-23 10:42:07 +0200525 return (_initialized);
niklase@google.com470e71d2011-07-07 08:21:25 +0000526}
527
528// ----------------------------------------------------------------------------
niklase@google.com470e71d2011-07-07 08:21:25 +0000529// InitSpeaker
530// ----------------------------------------------------------------------------
531
Max Morin787eeed2016-06-23 10:42:07 +0200532int32_t AudioDeviceModuleImpl::InitSpeaker() {
Max Morin098e6c52016-06-28 09:36:25 +0200533 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200534 CHECK_INITIALIZED();
535 return (_ptrAudioDevice->InitSpeaker());
niklase@google.com470e71d2011-07-07 08:21:25 +0000536}
537
538// ----------------------------------------------------------------------------
niklase@google.com470e71d2011-07-07 08:21:25 +0000539// InitMicrophone
540// ----------------------------------------------------------------------------
541
Max Morin787eeed2016-06-23 10:42:07 +0200542int32_t AudioDeviceModuleImpl::InitMicrophone() {
Max Morin098e6c52016-06-28 09:36:25 +0200543 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200544 CHECK_INITIALIZED();
545 return (_ptrAudioDevice->InitMicrophone());
niklase@google.com470e71d2011-07-07 08:21:25 +0000546}
547
548// ----------------------------------------------------------------------------
549// SpeakerVolumeIsAvailable
550// ----------------------------------------------------------------------------
551
Max Morin787eeed2016-06-23 10:42:07 +0200552int32_t AudioDeviceModuleImpl::SpeakerVolumeIsAvailable(bool* available) {
Max Morin098e6c52016-06-28 09:36:25 +0200553 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200554 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000555
Max Morin787eeed2016-06-23 10:42:07 +0200556 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000557
Max Morin787eeed2016-06-23 10:42:07 +0200558 if (_ptrAudioDevice->SpeakerVolumeIsAvailable(isAvailable) == -1) {
559 return -1;
560 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000561
Max Morin787eeed2016-06-23 10:42:07 +0200562 *available = isAvailable;
Max Morin2c332bb2016-07-04 09:03:42 +0200563 LOG(INFO) << "output: " << isAvailable;
Max Morin787eeed2016-06-23 10:42:07 +0200564 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000565}
566
567// ----------------------------------------------------------------------------
568// SetSpeakerVolume
569// ----------------------------------------------------------------------------
570
Max Morin787eeed2016-06-23 10:42:07 +0200571int32_t AudioDeviceModuleImpl::SetSpeakerVolume(uint32_t volume) {
Max Morin098e6c52016-06-28 09:36:25 +0200572 LOG(INFO) << __FUNCTION__ << "(" << volume << ")";
Max Morin787eeed2016-06-23 10:42:07 +0200573 CHECK_INITIALIZED();
574 return (_ptrAudioDevice->SetSpeakerVolume(volume));
niklase@google.com470e71d2011-07-07 08:21:25 +0000575}
576
577// ----------------------------------------------------------------------------
578// SpeakerVolume
579// ----------------------------------------------------------------------------
580
Max Morin787eeed2016-06-23 10:42:07 +0200581int32_t AudioDeviceModuleImpl::SpeakerVolume(uint32_t* volume) const {
Max Morin098e6c52016-06-28 09:36:25 +0200582 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200583 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000584
Max Morin787eeed2016-06-23 10:42:07 +0200585 uint32_t level(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000586
Max Morin787eeed2016-06-23 10:42:07 +0200587 if (_ptrAudioDevice->SpeakerVolume(level) == -1) {
588 return -1;
589 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000590
Max Morin787eeed2016-06-23 10:42:07 +0200591 *volume = level;
Max Morin2c332bb2016-07-04 09:03:42 +0200592 LOG(INFO) << "output: " << *volume;
Max Morin787eeed2016-06-23 10:42:07 +0200593 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000594}
595
596// ----------------------------------------------------------------------------
597// SetWaveOutVolume
598// ----------------------------------------------------------------------------
599
Max Morin787eeed2016-06-23 10:42:07 +0200600int32_t AudioDeviceModuleImpl::SetWaveOutVolume(uint16_t volumeLeft,
601 uint16_t volumeRight) {
Max Morin098e6c52016-06-28 09:36:25 +0200602 LOG(INFO) << __FUNCTION__ << "(" << volumeLeft << ", " << volumeRight << ")";
Max Morin787eeed2016-06-23 10:42:07 +0200603 CHECK_INITIALIZED();
604 return (_ptrAudioDevice->SetWaveOutVolume(volumeLeft, volumeRight));
niklase@google.com470e71d2011-07-07 08:21:25 +0000605}
606
607// ----------------------------------------------------------------------------
608// WaveOutVolume
609// ----------------------------------------------------------------------------
610
Max Morin787eeed2016-06-23 10:42:07 +0200611int32_t AudioDeviceModuleImpl::WaveOutVolume(uint16_t* volumeLeft,
612 uint16_t* volumeRight) const {
Max Morin098e6c52016-06-28 09:36:25 +0200613 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200614 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000615
Max Morin787eeed2016-06-23 10:42:07 +0200616 uint16_t volLeft(0);
617 uint16_t volRight(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000618
Max Morin787eeed2016-06-23 10:42:07 +0200619 if (_ptrAudioDevice->WaveOutVolume(volLeft, volRight) == -1) {
620 return -1;
621 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000622
Max Morin787eeed2016-06-23 10:42:07 +0200623 *volumeLeft = volLeft;
624 *volumeRight = volRight;
Max Morin2c332bb2016-07-04 09:03:42 +0200625 LOG(INFO) << "output: " << *volumeLeft << ", " << *volumeRight;
niklase@google.com470e71d2011-07-07 08:21:25 +0000626
Max Morin787eeed2016-06-23 10:42:07 +0200627 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000628}
629
630// ----------------------------------------------------------------------------
631// SpeakerIsInitialized
632// ----------------------------------------------------------------------------
633
Max Morin787eeed2016-06-23 10:42:07 +0200634bool AudioDeviceModuleImpl::SpeakerIsInitialized() const {
Max Morin098e6c52016-06-28 09:36:25 +0200635 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200636 CHECK_INITIALIZED_BOOL();
niklase@google.com470e71d2011-07-07 08:21:25 +0000637
Max Morin787eeed2016-06-23 10:42:07 +0200638 bool isInitialized = _ptrAudioDevice->SpeakerIsInitialized();
Max Morin2c332bb2016-07-04 09:03:42 +0200639 LOG(INFO) << "output: " << isInitialized;
Max Morin787eeed2016-06-23 10:42:07 +0200640 return (isInitialized);
niklase@google.com470e71d2011-07-07 08:21:25 +0000641}
642
643// ----------------------------------------------------------------------------
644// MicrophoneIsInitialized
645// ----------------------------------------------------------------------------
646
Max Morin787eeed2016-06-23 10:42:07 +0200647bool AudioDeviceModuleImpl::MicrophoneIsInitialized() const {
Max Morin098e6c52016-06-28 09:36:25 +0200648 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200649 CHECK_INITIALIZED_BOOL();
niklase@google.com470e71d2011-07-07 08:21:25 +0000650
Max Morin787eeed2016-06-23 10:42:07 +0200651 bool isInitialized = _ptrAudioDevice->MicrophoneIsInitialized();
Max Morin2c332bb2016-07-04 09:03:42 +0200652 LOG(INFO) << "output: " << isInitialized;
Max Morin787eeed2016-06-23 10:42:07 +0200653 return (isInitialized);
niklase@google.com470e71d2011-07-07 08:21:25 +0000654}
655
656// ----------------------------------------------------------------------------
657// MaxSpeakerVolume
658// ----------------------------------------------------------------------------
659
Max Morin787eeed2016-06-23 10:42:07 +0200660int32_t AudioDeviceModuleImpl::MaxSpeakerVolume(uint32_t* maxVolume) const {
Max Morin098e6c52016-06-28 09:36:25 +0200661 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200662 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000663
Max Morin787eeed2016-06-23 10:42:07 +0200664 uint32_t maxVol(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000665
Max Morin787eeed2016-06-23 10:42:07 +0200666 if (_ptrAudioDevice->MaxSpeakerVolume(maxVol) == -1) {
667 return -1;
668 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000669
Max Morin787eeed2016-06-23 10:42:07 +0200670 *maxVolume = maxVol;
Max Morin2c332bb2016-07-04 09:03:42 +0200671 LOG(INFO) << "output: " << *maxVolume;
Max Morin787eeed2016-06-23 10:42:07 +0200672 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000673}
674
675// ----------------------------------------------------------------------------
676// MinSpeakerVolume
677// ----------------------------------------------------------------------------
678
Max Morin787eeed2016-06-23 10:42:07 +0200679int32_t AudioDeviceModuleImpl::MinSpeakerVolume(uint32_t* minVolume) const {
Max Morin098e6c52016-06-28 09:36:25 +0200680 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200681 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000682
Max Morin787eeed2016-06-23 10:42:07 +0200683 uint32_t minVol(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000684
Max Morin787eeed2016-06-23 10:42:07 +0200685 if (_ptrAudioDevice->MinSpeakerVolume(minVol) == -1) {
686 return -1;
687 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000688
Max Morin787eeed2016-06-23 10:42:07 +0200689 *minVolume = minVol;
Max Morin2c332bb2016-07-04 09:03:42 +0200690 LOG(INFO) << "output: " << *minVolume;
Max Morin787eeed2016-06-23 10:42:07 +0200691 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000692}
693
694// ----------------------------------------------------------------------------
695// SpeakerVolumeStepSize
696// ----------------------------------------------------------------------------
697
Max Morin787eeed2016-06-23 10:42:07 +0200698int32_t AudioDeviceModuleImpl::SpeakerVolumeStepSize(uint16_t* stepSize) const {
Max Morin098e6c52016-06-28 09:36:25 +0200699 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200700 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000701
Max Morin787eeed2016-06-23 10:42:07 +0200702 uint16_t delta(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000703
Max Morin787eeed2016-06-23 10:42:07 +0200704 if (_ptrAudioDevice->SpeakerVolumeStepSize(delta) == -1) {
Max Morin098e6c52016-06-28 09:36:25 +0200705 LOG(LERROR) << "failed to retrieve the speaker-volume step size";
Max Morin787eeed2016-06-23 10:42:07 +0200706 return -1;
707 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000708
Max Morin787eeed2016-06-23 10:42:07 +0200709 *stepSize = delta;
Max Morin2c332bb2016-07-04 09:03:42 +0200710 LOG(INFO) << "output: " << *stepSize;
Max Morin787eeed2016-06-23 10:42:07 +0200711 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000712}
713
714// ----------------------------------------------------------------------------
715// SpeakerMuteIsAvailable
716// ----------------------------------------------------------------------------
717
Max Morin787eeed2016-06-23 10:42:07 +0200718int32_t AudioDeviceModuleImpl::SpeakerMuteIsAvailable(bool* available) {
Max Morin098e6c52016-06-28 09:36:25 +0200719 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200720 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000721
Max Morin787eeed2016-06-23 10:42:07 +0200722 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000723
Max Morin787eeed2016-06-23 10:42:07 +0200724 if (_ptrAudioDevice->SpeakerMuteIsAvailable(isAvailable) == -1) {
725 return -1;
726 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000727
Max Morin787eeed2016-06-23 10:42:07 +0200728 *available = isAvailable;
Max Morin2c332bb2016-07-04 09:03:42 +0200729 LOG(INFO) << "output: " << isAvailable;
Max Morin787eeed2016-06-23 10:42:07 +0200730 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000731}
732
733// ----------------------------------------------------------------------------
734// SetSpeakerMute
735// ----------------------------------------------------------------------------
736
Max Morin787eeed2016-06-23 10:42:07 +0200737int32_t AudioDeviceModuleImpl::SetSpeakerMute(bool enable) {
Max Morin098e6c52016-06-28 09:36:25 +0200738 LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
Max Morin787eeed2016-06-23 10:42:07 +0200739 CHECK_INITIALIZED();
740 return (_ptrAudioDevice->SetSpeakerMute(enable));
niklase@google.com470e71d2011-07-07 08:21:25 +0000741}
742
743// ----------------------------------------------------------------------------
744// SpeakerMute
745// ----------------------------------------------------------------------------
746
Max Morin787eeed2016-06-23 10:42:07 +0200747int32_t AudioDeviceModuleImpl::SpeakerMute(bool* enabled) const {
Max Morin098e6c52016-06-28 09:36:25 +0200748 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200749 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000750
Max Morin787eeed2016-06-23 10:42:07 +0200751 bool muted(false);
niklase@google.com470e71d2011-07-07 08:21:25 +0000752
Max Morin787eeed2016-06-23 10:42:07 +0200753 if (_ptrAudioDevice->SpeakerMute(muted) == -1) {
754 return -1;
755 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000756
Max Morin787eeed2016-06-23 10:42:07 +0200757 *enabled = muted;
Max Morin2c332bb2016-07-04 09:03:42 +0200758 LOG(INFO) << "output: " << muted;
Max Morin787eeed2016-06-23 10:42:07 +0200759 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000760}
761
762// ----------------------------------------------------------------------------
763// MicrophoneMuteIsAvailable
764// ----------------------------------------------------------------------------
765
Max Morin787eeed2016-06-23 10:42:07 +0200766int32_t AudioDeviceModuleImpl::MicrophoneMuteIsAvailable(bool* available) {
Max Morin098e6c52016-06-28 09:36:25 +0200767 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200768 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000769
Max Morin787eeed2016-06-23 10:42:07 +0200770 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000771
Max Morin787eeed2016-06-23 10:42:07 +0200772 if (_ptrAudioDevice->MicrophoneMuteIsAvailable(isAvailable) == -1) {
773 return -1;
774 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000775
Max Morin787eeed2016-06-23 10:42:07 +0200776 *available = isAvailable;
Max Morin2c332bb2016-07-04 09:03:42 +0200777 LOG(INFO) << "output: " << isAvailable;
Max Morin787eeed2016-06-23 10:42:07 +0200778 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000779}
780
781// ----------------------------------------------------------------------------
782// SetMicrophoneMute
783// ----------------------------------------------------------------------------
784
Max Morin787eeed2016-06-23 10:42:07 +0200785int32_t AudioDeviceModuleImpl::SetMicrophoneMute(bool enable) {
Max Morin098e6c52016-06-28 09:36:25 +0200786 LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
Max Morin787eeed2016-06-23 10:42:07 +0200787 CHECK_INITIALIZED();
788 return (_ptrAudioDevice->SetMicrophoneMute(enable));
niklase@google.com470e71d2011-07-07 08:21:25 +0000789}
790
791// ----------------------------------------------------------------------------
792// MicrophoneMute
793// ----------------------------------------------------------------------------
794
Max Morin787eeed2016-06-23 10:42:07 +0200795int32_t AudioDeviceModuleImpl::MicrophoneMute(bool* enabled) const {
Max Morin098e6c52016-06-28 09:36:25 +0200796 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200797 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000798
Max Morin787eeed2016-06-23 10:42:07 +0200799 bool muted(false);
niklase@google.com470e71d2011-07-07 08:21:25 +0000800
Max Morin787eeed2016-06-23 10:42:07 +0200801 if (_ptrAudioDevice->MicrophoneMute(muted) == -1) {
802 return -1;
803 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000804
Max Morin787eeed2016-06-23 10:42:07 +0200805 *enabled = muted;
Max Morin2c332bb2016-07-04 09:03:42 +0200806 LOG(INFO) << "output: " << muted;
Max Morin787eeed2016-06-23 10:42:07 +0200807 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000808}
809
810// ----------------------------------------------------------------------------
811// MicrophoneBoostIsAvailable
812// ----------------------------------------------------------------------------
813
Max Morin787eeed2016-06-23 10:42:07 +0200814int32_t AudioDeviceModuleImpl::MicrophoneBoostIsAvailable(bool* available) {
Max Morin098e6c52016-06-28 09:36:25 +0200815 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200816 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000817
Max Morin787eeed2016-06-23 10:42:07 +0200818 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000819
Max Morin787eeed2016-06-23 10:42:07 +0200820 if (_ptrAudioDevice->MicrophoneBoostIsAvailable(isAvailable) == -1) {
821 return -1;
822 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000823
Max Morin787eeed2016-06-23 10:42:07 +0200824 *available = isAvailable;
Max Morin2c332bb2016-07-04 09:03:42 +0200825 LOG(INFO) << "output: " << isAvailable;
Max Morin787eeed2016-06-23 10:42:07 +0200826 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000827}
828
829// ----------------------------------------------------------------------------
830// SetMicrophoneBoost
831// ----------------------------------------------------------------------------
832
Max Morin787eeed2016-06-23 10:42:07 +0200833int32_t AudioDeviceModuleImpl::SetMicrophoneBoost(bool enable) {
Max Morin098e6c52016-06-28 09:36:25 +0200834 LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
Max Morin787eeed2016-06-23 10:42:07 +0200835 CHECK_INITIALIZED();
836 return (_ptrAudioDevice->SetMicrophoneBoost(enable));
niklase@google.com470e71d2011-07-07 08:21:25 +0000837}
838
839// ----------------------------------------------------------------------------
840// MicrophoneBoost
841// ----------------------------------------------------------------------------
842
Max Morin787eeed2016-06-23 10:42:07 +0200843int32_t AudioDeviceModuleImpl::MicrophoneBoost(bool* enabled) const {
Max Morin098e6c52016-06-28 09:36:25 +0200844 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200845 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000846
Max Morin787eeed2016-06-23 10:42:07 +0200847 bool onOff(false);
niklase@google.com470e71d2011-07-07 08:21:25 +0000848
Max Morin787eeed2016-06-23 10:42:07 +0200849 if (_ptrAudioDevice->MicrophoneBoost(onOff) == -1) {
850 return -1;
851 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000852
Max Morin787eeed2016-06-23 10:42:07 +0200853 *enabled = onOff;
Max Morin2c332bb2016-07-04 09:03:42 +0200854 LOG(INFO) << "output: " << onOff;
Max Morin787eeed2016-06-23 10:42:07 +0200855 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000856}
857
858// ----------------------------------------------------------------------------
859// MicrophoneVolumeIsAvailable
860// ----------------------------------------------------------------------------
861
Max Morin787eeed2016-06-23 10:42:07 +0200862int32_t AudioDeviceModuleImpl::MicrophoneVolumeIsAvailable(bool* available) {
Max Morin098e6c52016-06-28 09:36:25 +0200863 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200864 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000865
Max Morin787eeed2016-06-23 10:42:07 +0200866 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000867
Max Morin787eeed2016-06-23 10:42:07 +0200868 if (_ptrAudioDevice->MicrophoneVolumeIsAvailable(isAvailable) == -1) {
869 return -1;
870 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000871
Max Morin787eeed2016-06-23 10:42:07 +0200872 *available = isAvailable;
Max Morin2c332bb2016-07-04 09:03:42 +0200873 LOG(INFO) << "output: " << isAvailable;
Max Morin787eeed2016-06-23 10:42:07 +0200874 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000875}
876
877// ----------------------------------------------------------------------------
878// SetMicrophoneVolume
879// ----------------------------------------------------------------------------
880
Max Morin787eeed2016-06-23 10:42:07 +0200881int32_t AudioDeviceModuleImpl::SetMicrophoneVolume(uint32_t volume) {
Max Morin098e6c52016-06-28 09:36:25 +0200882 LOG(INFO) << __FUNCTION__ << "(" << volume << ")";
Max Morin787eeed2016-06-23 10:42:07 +0200883 CHECK_INITIALIZED();
884 return (_ptrAudioDevice->SetMicrophoneVolume(volume));
niklase@google.com470e71d2011-07-07 08:21:25 +0000885}
886
887// ----------------------------------------------------------------------------
888// MicrophoneVolume
889// ----------------------------------------------------------------------------
890
Max Morin787eeed2016-06-23 10:42:07 +0200891int32_t AudioDeviceModuleImpl::MicrophoneVolume(uint32_t* volume) const {
Max Morin098e6c52016-06-28 09:36:25 +0200892 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200893 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000894
Max Morin787eeed2016-06-23 10:42:07 +0200895 uint32_t level(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000896
Max Morin787eeed2016-06-23 10:42:07 +0200897 if (_ptrAudioDevice->MicrophoneVolume(level) == -1) {
898 return -1;
899 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000900
Max Morin787eeed2016-06-23 10:42:07 +0200901 *volume = level;
Max Morin2c332bb2016-07-04 09:03:42 +0200902 LOG(INFO) << "output: " << *volume;
Max Morin787eeed2016-06-23 10:42:07 +0200903 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000904}
905
906// ----------------------------------------------------------------------------
907// StereoRecordingIsAvailable
908// ----------------------------------------------------------------------------
909
Max Morin787eeed2016-06-23 10:42:07 +0200910int32_t AudioDeviceModuleImpl::StereoRecordingIsAvailable(
911 bool* available) const {
Max Morin098e6c52016-06-28 09:36:25 +0200912 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200913 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000914
Max Morin787eeed2016-06-23 10:42:07 +0200915 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000916
Max Morin787eeed2016-06-23 10:42:07 +0200917 if (_ptrAudioDevice->StereoRecordingIsAvailable(isAvailable) == -1) {
918 return -1;
919 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000920
Max Morin787eeed2016-06-23 10:42:07 +0200921 *available = isAvailable;
Max Morin2c332bb2016-07-04 09:03:42 +0200922 LOG(INFO) << "output: " << isAvailable;
Max Morin787eeed2016-06-23 10:42:07 +0200923 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000924}
925
926// ----------------------------------------------------------------------------
927// SetStereoRecording
928// ----------------------------------------------------------------------------
929
Max Morin787eeed2016-06-23 10:42:07 +0200930int32_t AudioDeviceModuleImpl::SetStereoRecording(bool enable) {
Max Morin098e6c52016-06-28 09:36:25 +0200931 LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
Max Morin787eeed2016-06-23 10:42:07 +0200932 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000933
Max Morin787eeed2016-06-23 10:42:07 +0200934 if (_ptrAudioDevice->RecordingIsInitialized()) {
Max Morin098e6c52016-06-28 09:36:25 +0200935 LOG(WARNING) << "recording in stereo is not supported";
Max Morin787eeed2016-06-23 10:42:07 +0200936 return -1;
937 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000938
Max Morin787eeed2016-06-23 10:42:07 +0200939 if (_ptrAudioDevice->SetStereoRecording(enable) == -1) {
Max Morin2c332bb2016-07-04 09:03:42 +0200940 LOG(WARNING) << "failed to change stereo recording";
Max Morin787eeed2016-06-23 10:42:07 +0200941 return -1;
942 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000943
Max Morin787eeed2016-06-23 10:42:07 +0200944 int8_t nChannels(1);
945 if (enable) {
946 nChannels = 2;
947 }
948 _audioDeviceBuffer.SetRecordingChannels(nChannels);
niklase@google.com470e71d2011-07-07 08:21:25 +0000949
Max Morin787eeed2016-06-23 10:42:07 +0200950 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000951}
952
953// ----------------------------------------------------------------------------
954// StereoRecording
955// ----------------------------------------------------------------------------
956
Max Morin787eeed2016-06-23 10:42:07 +0200957int32_t AudioDeviceModuleImpl::StereoRecording(bool* enabled) const {
Max Morin098e6c52016-06-28 09:36:25 +0200958 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +0200959 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000960
Max Morin787eeed2016-06-23 10:42:07 +0200961 bool stereo(false);
niklase@google.com470e71d2011-07-07 08:21:25 +0000962
Max Morin787eeed2016-06-23 10:42:07 +0200963 if (_ptrAudioDevice->StereoRecording(stereo) == -1) {
964 return -1;
965 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000966
Max Morin787eeed2016-06-23 10:42:07 +0200967 *enabled = stereo;
Max Morin2c332bb2016-07-04 09:03:42 +0200968 LOG(INFO) << "output: " << stereo;
Max Morin787eeed2016-06-23 10:42:07 +0200969 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000970}
971
972// ----------------------------------------------------------------------------
973// SetRecordingChannel
974// ----------------------------------------------------------------------------
975
Max Morin787eeed2016-06-23 10:42:07 +0200976int32_t AudioDeviceModuleImpl::SetRecordingChannel(const ChannelType channel) {
977 if (channel == kChannelBoth) {
Max Morin098e6c52016-06-28 09:36:25 +0200978 LOG(INFO) << __FUNCTION__ << "(both)";
Max Morin787eeed2016-06-23 10:42:07 +0200979 } else if (channel == kChannelLeft) {
Max Morin098e6c52016-06-28 09:36:25 +0200980 LOG(INFO) << __FUNCTION__ << "(left)";
Max Morin787eeed2016-06-23 10:42:07 +0200981 } else {
Max Morin098e6c52016-06-28 09:36:25 +0200982 LOG(INFO) << __FUNCTION__ << "(right)";
Max Morin787eeed2016-06-23 10:42:07 +0200983 }
984 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000985
Max Morin787eeed2016-06-23 10:42:07 +0200986 bool stereo(false);
niklase@google.com470e71d2011-07-07 08:21:25 +0000987
Max Morin787eeed2016-06-23 10:42:07 +0200988 if (_ptrAudioDevice->StereoRecording(stereo) == -1) {
Max Morin098e6c52016-06-28 09:36:25 +0200989 LOG(WARNING) << "recording in stereo is not supported";
Max Morin787eeed2016-06-23 10:42:07 +0200990 return -1;
991 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000992
Max Morin787eeed2016-06-23 10:42:07 +0200993 return (_audioDeviceBuffer.SetRecordingChannel(channel));
niklase@google.com470e71d2011-07-07 08:21:25 +0000994}
995
996// ----------------------------------------------------------------------------
997// RecordingChannel
998// ----------------------------------------------------------------------------
999
Max Morin787eeed2016-06-23 10:42:07 +02001000int32_t AudioDeviceModuleImpl::RecordingChannel(ChannelType* channel) const {
Max Morin098e6c52016-06-28 09:36:25 +02001001 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001002 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001003
Max Morin787eeed2016-06-23 10:42:07 +02001004 ChannelType chType;
niklase@google.com470e71d2011-07-07 08:21:25 +00001005
Max Morin787eeed2016-06-23 10:42:07 +02001006 if (_audioDeviceBuffer.RecordingChannel(chType) == -1) {
1007 return -1;
1008 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001009
Max Morin787eeed2016-06-23 10:42:07 +02001010 *channel = chType;
Max Morin787eeed2016-06-23 10:42:07 +02001011 if (*channel == kChannelBoth) {
Max Morin2c332bb2016-07-04 09:03:42 +02001012 LOG(INFO) << "output: both";
Max Morin787eeed2016-06-23 10:42:07 +02001013 } else if (*channel == kChannelLeft) {
Max Morin2c332bb2016-07-04 09:03:42 +02001014 LOG(INFO) << "output: left";
Max Morin787eeed2016-06-23 10:42:07 +02001015 } else {
Max Morin2c332bb2016-07-04 09:03:42 +02001016 LOG(INFO) << "output: right";
Max Morin787eeed2016-06-23 10:42:07 +02001017 }
Max Morin787eeed2016-06-23 10:42:07 +02001018 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001019}
1020
1021// ----------------------------------------------------------------------------
1022// StereoPlayoutIsAvailable
1023// ----------------------------------------------------------------------------
1024
Max Morin787eeed2016-06-23 10:42:07 +02001025int32_t AudioDeviceModuleImpl::StereoPlayoutIsAvailable(bool* available) const {
Max Morin098e6c52016-06-28 09:36:25 +02001026 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001027 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001028
Max Morin787eeed2016-06-23 10:42:07 +02001029 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001030
Max Morin787eeed2016-06-23 10:42:07 +02001031 if (_ptrAudioDevice->StereoPlayoutIsAvailable(isAvailable) == -1) {
1032 return -1;
1033 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001034
Max Morin787eeed2016-06-23 10:42:07 +02001035 *available = isAvailable;
Max Morin2c332bb2016-07-04 09:03:42 +02001036 LOG(INFO) << "output: " << isAvailable;
Max Morin787eeed2016-06-23 10:42:07 +02001037 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001038}
1039
1040// ----------------------------------------------------------------------------
1041// SetStereoPlayout
1042// ----------------------------------------------------------------------------
1043
Max Morin787eeed2016-06-23 10:42:07 +02001044int32_t AudioDeviceModuleImpl::SetStereoPlayout(bool enable) {
Max Morin098e6c52016-06-28 09:36:25 +02001045 LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
Max Morin787eeed2016-06-23 10:42:07 +02001046 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001047
Max Morin787eeed2016-06-23 10:42:07 +02001048 if (_ptrAudioDevice->PlayoutIsInitialized()) {
Max Morin098e6c52016-06-28 09:36:25 +02001049 LOG(LERROR)
1050 << "unable to set stereo mode while playing side is initialized";
Max Morin787eeed2016-06-23 10:42:07 +02001051 return -1;
1052 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001053
Max Morin787eeed2016-06-23 10:42:07 +02001054 if (_ptrAudioDevice->SetStereoPlayout(enable)) {
Max Morin098e6c52016-06-28 09:36:25 +02001055 LOG(WARNING) << "stereo playout is not supported";
Max Morin787eeed2016-06-23 10:42:07 +02001056 return -1;
1057 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001058
Max Morin787eeed2016-06-23 10:42:07 +02001059 int8_t nChannels(1);
1060 if (enable) {
1061 nChannels = 2;
1062 }
1063 _audioDeviceBuffer.SetPlayoutChannels(nChannels);
niklase@google.com470e71d2011-07-07 08:21:25 +00001064
Max Morin787eeed2016-06-23 10:42:07 +02001065 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001066}
1067
1068// ----------------------------------------------------------------------------
1069// StereoPlayout
1070// ----------------------------------------------------------------------------
1071
Max Morin787eeed2016-06-23 10:42:07 +02001072int32_t AudioDeviceModuleImpl::StereoPlayout(bool* enabled) const {
Max Morin098e6c52016-06-28 09:36:25 +02001073 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001074 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001075
Max Morin787eeed2016-06-23 10:42:07 +02001076 bool stereo(false);
niklase@google.com470e71d2011-07-07 08:21:25 +00001077
Max Morin787eeed2016-06-23 10:42:07 +02001078 if (_ptrAudioDevice->StereoPlayout(stereo) == -1) {
1079 return -1;
1080 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001081
Max Morin787eeed2016-06-23 10:42:07 +02001082 *enabled = stereo;
Max Morin2c332bb2016-07-04 09:03:42 +02001083 LOG(INFO) << "output: " << stereo;
Max Morin787eeed2016-06-23 10:42:07 +02001084 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001085}
1086
1087// ----------------------------------------------------------------------------
1088// SetAGC
1089// ----------------------------------------------------------------------------
1090
Max Morin787eeed2016-06-23 10:42:07 +02001091int32_t AudioDeviceModuleImpl::SetAGC(bool enable) {
Max Morin098e6c52016-06-28 09:36:25 +02001092 LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
Max Morin787eeed2016-06-23 10:42:07 +02001093 CHECK_INITIALIZED();
1094 return (_ptrAudioDevice->SetAGC(enable));
niklase@google.com470e71d2011-07-07 08:21:25 +00001095}
1096
1097// ----------------------------------------------------------------------------
1098// AGC
1099// ----------------------------------------------------------------------------
1100
Max Morin787eeed2016-06-23 10:42:07 +02001101bool AudioDeviceModuleImpl::AGC() const {
Max Morin098e6c52016-06-28 09:36:25 +02001102 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001103 CHECK_INITIALIZED_BOOL();
1104 return (_ptrAudioDevice->AGC());
niklase@google.com470e71d2011-07-07 08:21:25 +00001105}
1106
1107// ----------------------------------------------------------------------------
1108// PlayoutIsAvailable
1109// ----------------------------------------------------------------------------
1110
Max Morin787eeed2016-06-23 10:42:07 +02001111int32_t AudioDeviceModuleImpl::PlayoutIsAvailable(bool* available) {
Max Morin098e6c52016-06-28 09:36:25 +02001112 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001113 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001114
Max Morin787eeed2016-06-23 10:42:07 +02001115 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001116
Max Morin787eeed2016-06-23 10:42:07 +02001117 if (_ptrAudioDevice->PlayoutIsAvailable(isAvailable) == -1) {
1118 return -1;
1119 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001120
Max Morin787eeed2016-06-23 10:42:07 +02001121 *available = isAvailable;
Max Morin2c332bb2016-07-04 09:03:42 +02001122 LOG(INFO) << "output: " << isAvailable;
Max Morin787eeed2016-06-23 10:42:07 +02001123 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001124}
1125
1126// ----------------------------------------------------------------------------
1127// RecordingIsAvailable
1128// ----------------------------------------------------------------------------
1129
Max Morin787eeed2016-06-23 10:42:07 +02001130int32_t AudioDeviceModuleImpl::RecordingIsAvailable(bool* available) {
Max Morin098e6c52016-06-28 09:36:25 +02001131 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001132 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001133
Max Morin787eeed2016-06-23 10:42:07 +02001134 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001135
Max Morin787eeed2016-06-23 10:42:07 +02001136 if (_ptrAudioDevice->RecordingIsAvailable(isAvailable) == -1) {
1137 return -1;
1138 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001139
Max Morin787eeed2016-06-23 10:42:07 +02001140 *available = isAvailable;
Max Morin2c332bb2016-07-04 09:03:42 +02001141 LOG(INFO) << "output: " << isAvailable;
Max Morin787eeed2016-06-23 10:42:07 +02001142 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001143}
1144
1145// ----------------------------------------------------------------------------
1146// MaxMicrophoneVolume
1147// ----------------------------------------------------------------------------
1148
Max Morin787eeed2016-06-23 10:42:07 +02001149int32_t AudioDeviceModuleImpl::MaxMicrophoneVolume(uint32_t* maxVolume) const {
Max Morin098e6c52016-06-28 09:36:25 +02001150 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001151 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001152
Max Morin787eeed2016-06-23 10:42:07 +02001153 uint32_t maxVol(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001154
Max Morin787eeed2016-06-23 10:42:07 +02001155 if (_ptrAudioDevice->MaxMicrophoneVolume(maxVol) == -1) {
1156 return -1;
1157 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001158
Max Morin787eeed2016-06-23 10:42:07 +02001159 *maxVolume = maxVol;
Max Morin2c332bb2016-07-04 09:03:42 +02001160 LOG(INFO) << "output: " << *maxVolume;
Max Morin787eeed2016-06-23 10:42:07 +02001161 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001162}
1163
1164// ----------------------------------------------------------------------------
1165// MinMicrophoneVolume
1166// ----------------------------------------------------------------------------
1167
Max Morin787eeed2016-06-23 10:42:07 +02001168int32_t AudioDeviceModuleImpl::MinMicrophoneVolume(uint32_t* minVolume) const {
Max Morin098e6c52016-06-28 09:36:25 +02001169 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001170 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001171
Max Morin787eeed2016-06-23 10:42:07 +02001172 uint32_t minVol(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001173
Max Morin787eeed2016-06-23 10:42:07 +02001174 if (_ptrAudioDevice->MinMicrophoneVolume(minVol) == -1) {
1175 return -1;
1176 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001177
Max Morin787eeed2016-06-23 10:42:07 +02001178 *minVolume = minVol;
Max Morin2c332bb2016-07-04 09:03:42 +02001179 LOG(INFO) << "output: " << *minVolume;
Max Morin787eeed2016-06-23 10:42:07 +02001180 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001181}
1182
1183// ----------------------------------------------------------------------------
1184// MicrophoneVolumeStepSize
1185// ----------------------------------------------------------------------------
1186
Max Morin787eeed2016-06-23 10:42:07 +02001187int32_t AudioDeviceModuleImpl::MicrophoneVolumeStepSize(
1188 uint16_t* stepSize) const {
Max Morin098e6c52016-06-28 09:36:25 +02001189 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001190 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001191
Max Morin787eeed2016-06-23 10:42:07 +02001192 uint16_t delta(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001193
Max Morin787eeed2016-06-23 10:42:07 +02001194 if (_ptrAudioDevice->MicrophoneVolumeStepSize(delta) == -1) {
1195 return -1;
1196 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001197
Max Morin787eeed2016-06-23 10:42:07 +02001198 *stepSize = delta;
Max Morin2c332bb2016-07-04 09:03:42 +02001199 LOG(INFO) << "output: " << *stepSize;
Max Morin787eeed2016-06-23 10:42:07 +02001200 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001201}
1202
1203// ----------------------------------------------------------------------------
1204// PlayoutDevices
1205// ----------------------------------------------------------------------------
1206
Max Morin787eeed2016-06-23 10:42:07 +02001207int16_t AudioDeviceModuleImpl::PlayoutDevices() {
Max Morin098e6c52016-06-28 09:36:25 +02001208 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001209 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001210
Max Morin787eeed2016-06-23 10:42:07 +02001211 uint16_t nPlayoutDevices = _ptrAudioDevice->PlayoutDevices();
Max Morin2c332bb2016-07-04 09:03:42 +02001212 LOG(INFO) << "output: " << nPlayoutDevices;
Max Morin787eeed2016-06-23 10:42:07 +02001213 return ((int16_t)(nPlayoutDevices));
niklase@google.com470e71d2011-07-07 08:21:25 +00001214}
1215
1216// ----------------------------------------------------------------------------
1217// SetPlayoutDevice I (II)
1218// ----------------------------------------------------------------------------
1219
Max Morin787eeed2016-06-23 10:42:07 +02001220int32_t AudioDeviceModuleImpl::SetPlayoutDevice(uint16_t index) {
Max Morin098e6c52016-06-28 09:36:25 +02001221 LOG(INFO) << __FUNCTION__ << "(" << index << ")";
Max Morin787eeed2016-06-23 10:42:07 +02001222 CHECK_INITIALIZED();
1223 return (_ptrAudioDevice->SetPlayoutDevice(index));
niklase@google.com470e71d2011-07-07 08:21:25 +00001224}
1225
1226// ----------------------------------------------------------------------------
1227// SetPlayoutDevice II (II)
1228// ----------------------------------------------------------------------------
1229
Max Morin787eeed2016-06-23 10:42:07 +02001230int32_t AudioDeviceModuleImpl::SetPlayoutDevice(WindowsDeviceType device) {
Max Morin098e6c52016-06-28 09:36:25 +02001231 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001232 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001233
Max Morin787eeed2016-06-23 10:42:07 +02001234 return (_ptrAudioDevice->SetPlayoutDevice(device));
niklase@google.com470e71d2011-07-07 08:21:25 +00001235}
1236
1237// ----------------------------------------------------------------------------
1238// PlayoutDeviceName
1239// ----------------------------------------------------------------------------
1240
pbos@webrtc.org25509882013-04-09 10:30:35 +00001241int32_t AudioDeviceModuleImpl::PlayoutDeviceName(
1242 uint16_t index,
leozwang@webrtc.org28f39132012-03-01 18:01:48 +00001243 char name[kAdmMaxDeviceNameSize],
Max Morin787eeed2016-06-23 10:42:07 +02001244 char guid[kAdmMaxGuidSize]) {
Max Morin098e6c52016-06-28 09:36:25 +02001245 LOG(INFO) << __FUNCTION__ << "(" << index << ", ...)";
Max Morin787eeed2016-06-23 10:42:07 +02001246 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001247
Max Morin787eeed2016-06-23 10:42:07 +02001248 if (name == NULL) {
1249 _lastError = kAdmErrArgument;
1250 return -1;
1251 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001252
Max Morin787eeed2016-06-23 10:42:07 +02001253 if (_ptrAudioDevice->PlayoutDeviceName(index, name, guid) == -1) {
1254 return -1;
1255 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001256
Max Morin787eeed2016-06-23 10:42:07 +02001257 if (name != NULL) {
Max Morin2c332bb2016-07-04 09:03:42 +02001258 LOG(INFO) << "output: name = " << name;
Max Morin787eeed2016-06-23 10:42:07 +02001259 }
1260 if (guid != NULL) {
Max Morin2c332bb2016-07-04 09:03:42 +02001261 LOG(INFO) << "output: guid = " << guid;
Max Morin787eeed2016-06-23 10:42:07 +02001262 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001263
Max Morin787eeed2016-06-23 10:42:07 +02001264 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001265}
1266
1267// ----------------------------------------------------------------------------
1268// RecordingDeviceName
1269// ----------------------------------------------------------------------------
1270
pbos@webrtc.org25509882013-04-09 10:30:35 +00001271int32_t AudioDeviceModuleImpl::RecordingDeviceName(
1272 uint16_t index,
leozwang@webrtc.org28f39132012-03-01 18:01:48 +00001273 char name[kAdmMaxDeviceNameSize],
Max Morin787eeed2016-06-23 10:42:07 +02001274 char guid[kAdmMaxGuidSize]) {
Max Morin098e6c52016-06-28 09:36:25 +02001275 LOG(INFO) << __FUNCTION__ << "(" << index << ", ...)";
Max Morin787eeed2016-06-23 10:42:07 +02001276 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001277
Max Morin787eeed2016-06-23 10:42:07 +02001278 if (name == NULL) {
1279 _lastError = kAdmErrArgument;
1280 return -1;
1281 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001282
Max Morin787eeed2016-06-23 10:42:07 +02001283 if (_ptrAudioDevice->RecordingDeviceName(index, name, guid) == -1) {
1284 return -1;
1285 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001286
Max Morin787eeed2016-06-23 10:42:07 +02001287 if (name != NULL) {
Max Morin2c332bb2016-07-04 09:03:42 +02001288 LOG(INFO) << "output: name = " << name;
Max Morin787eeed2016-06-23 10:42:07 +02001289 }
1290 if (guid != NULL) {
Max Morin2c332bb2016-07-04 09:03:42 +02001291 LOG(INFO) << "output: guid = " << guid;
Max Morin787eeed2016-06-23 10:42:07 +02001292 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001293
Max Morin787eeed2016-06-23 10:42:07 +02001294 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001295}
1296
1297// ----------------------------------------------------------------------------
1298// RecordingDevices
1299// ----------------------------------------------------------------------------
1300
Max Morin787eeed2016-06-23 10:42:07 +02001301int16_t AudioDeviceModuleImpl::RecordingDevices() {
Max Morin098e6c52016-06-28 09:36:25 +02001302 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001303 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001304
Max Morin787eeed2016-06-23 10:42:07 +02001305 uint16_t nRecordingDevices = _ptrAudioDevice->RecordingDevices();
niklase@google.com470e71d2011-07-07 08:21:25 +00001306
Max Morin2c332bb2016-07-04 09:03:42 +02001307 LOG(INFO) << "output: " << nRecordingDevices;
Max Morin787eeed2016-06-23 10:42:07 +02001308 return ((int16_t)nRecordingDevices);
niklase@google.com470e71d2011-07-07 08:21:25 +00001309}
1310
1311// ----------------------------------------------------------------------------
1312// SetRecordingDevice I (II)
1313// ----------------------------------------------------------------------------
1314
Max Morin787eeed2016-06-23 10:42:07 +02001315int32_t AudioDeviceModuleImpl::SetRecordingDevice(uint16_t index) {
Max Morin098e6c52016-06-28 09:36:25 +02001316 LOG(INFO) << __FUNCTION__ << "(" << index << ")";
Max Morin787eeed2016-06-23 10:42:07 +02001317 CHECK_INITIALIZED();
1318 return (_ptrAudioDevice->SetRecordingDevice(index));
niklase@google.com470e71d2011-07-07 08:21:25 +00001319}
1320
1321// ----------------------------------------------------------------------------
1322// SetRecordingDevice II (II)
1323// ----------------------------------------------------------------------------
1324
Max Morin787eeed2016-06-23 10:42:07 +02001325int32_t AudioDeviceModuleImpl::SetRecordingDevice(WindowsDeviceType device) {
Max Morin098e6c52016-06-28 09:36:25 +02001326 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001327 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001328
Max Morin787eeed2016-06-23 10:42:07 +02001329 return (_ptrAudioDevice->SetRecordingDevice(device));
niklase@google.com470e71d2011-07-07 08:21:25 +00001330}
1331
1332// ----------------------------------------------------------------------------
1333// InitPlayout
1334// ----------------------------------------------------------------------------
1335
Max Morin787eeed2016-06-23 10:42:07 +02001336int32_t AudioDeviceModuleImpl::InitPlayout() {
Max Morin098e6c52016-06-28 09:36:25 +02001337 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001338 CHECK_INITIALIZED();
1339 _audioDeviceBuffer.InitPlayout();
Max Morin84cab202016-07-01 13:35:19 +02001340 int32_t result = _ptrAudioDevice->InitPlayout();
1341 LOG(INFO) << "output: " << result;
1342 RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.InitPlayoutSuccess",
1343 static_cast<int>(result == 0));
1344 return result;
niklase@google.com470e71d2011-07-07 08:21:25 +00001345}
1346
1347// ----------------------------------------------------------------------------
1348// InitRecording
1349// ----------------------------------------------------------------------------
1350
Max Morin787eeed2016-06-23 10:42:07 +02001351int32_t AudioDeviceModuleImpl::InitRecording() {
Max Morin098e6c52016-06-28 09:36:25 +02001352 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001353 CHECK_INITIALIZED();
1354 _audioDeviceBuffer.InitRecording();
Max Morin84cab202016-07-01 13:35:19 +02001355 int32_t result = _ptrAudioDevice->InitRecording();
1356 LOG(INFO) << "output: " << result;
1357 RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.InitRecordingSuccess",
1358 static_cast<int>(result == 0));
1359 return result;
niklase@google.com470e71d2011-07-07 08:21:25 +00001360}
1361
1362// ----------------------------------------------------------------------------
1363// PlayoutIsInitialized
1364// ----------------------------------------------------------------------------
1365
Max Morin787eeed2016-06-23 10:42:07 +02001366bool AudioDeviceModuleImpl::PlayoutIsInitialized() const {
Max Morin098e6c52016-06-28 09:36:25 +02001367 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001368 CHECK_INITIALIZED_BOOL();
1369 return (_ptrAudioDevice->PlayoutIsInitialized());
niklase@google.com470e71d2011-07-07 08:21:25 +00001370}
1371
1372// ----------------------------------------------------------------------------
1373// RecordingIsInitialized
1374// ----------------------------------------------------------------------------
1375
Max Morin787eeed2016-06-23 10:42:07 +02001376bool AudioDeviceModuleImpl::RecordingIsInitialized() const {
Max Morin098e6c52016-06-28 09:36:25 +02001377 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001378 CHECK_INITIALIZED_BOOL();
1379 return (_ptrAudioDevice->RecordingIsInitialized());
niklase@google.com470e71d2011-07-07 08:21:25 +00001380}
1381
1382// ----------------------------------------------------------------------------
1383// StartPlayout
1384// ----------------------------------------------------------------------------
1385
Max Morin787eeed2016-06-23 10:42:07 +02001386int32_t AudioDeviceModuleImpl::StartPlayout() {
Max Morin098e6c52016-06-28 09:36:25 +02001387 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001388 CHECK_INITIALIZED();
Max Morin84cab202016-07-01 13:35:19 +02001389 int32_t result = _ptrAudioDevice->StartPlayout();
1390 LOG(INFO) << "output: " << result;
1391 RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StartPlayoutSuccess",
1392 static_cast<int>(result == 0));
1393 return result;
niklase@google.com470e71d2011-07-07 08:21:25 +00001394}
1395
1396// ----------------------------------------------------------------------------
1397// StopPlayout
1398// ----------------------------------------------------------------------------
1399
Max Morin787eeed2016-06-23 10:42:07 +02001400int32_t AudioDeviceModuleImpl::StopPlayout() {
Max Morin098e6c52016-06-28 09:36:25 +02001401 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001402 CHECK_INITIALIZED();
Max Morin84cab202016-07-01 13:35:19 +02001403 int32_t result = _ptrAudioDevice->StopPlayout();
1404 LOG(INFO) << "output: " << result;
1405 RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StopPlayoutSuccess",
1406 static_cast<int>(result == 0));
1407 return result;
niklase@google.com470e71d2011-07-07 08:21:25 +00001408}
1409
1410// ----------------------------------------------------------------------------
1411// Playing
1412// ----------------------------------------------------------------------------
1413
Max Morin787eeed2016-06-23 10:42:07 +02001414bool AudioDeviceModuleImpl::Playing() const {
Max Morin098e6c52016-06-28 09:36:25 +02001415 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001416 CHECK_INITIALIZED_BOOL();
1417 return (_ptrAudioDevice->Playing());
niklase@google.com470e71d2011-07-07 08:21:25 +00001418}
1419
1420// ----------------------------------------------------------------------------
1421// StartRecording
1422// ----------------------------------------------------------------------------
1423
Max Morin787eeed2016-06-23 10:42:07 +02001424int32_t AudioDeviceModuleImpl::StartRecording() {
Max Morin098e6c52016-06-28 09:36:25 +02001425 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001426 CHECK_INITIALIZED();
Max Morin84cab202016-07-01 13:35:19 +02001427 int32_t result = _ptrAudioDevice->StartRecording();
1428 LOG(INFO) << "output: " << result;
1429 RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StartRecordingSuccess",
1430 static_cast<int>(result == 0));
1431 return result;
niklase@google.com470e71d2011-07-07 08:21:25 +00001432}
1433// ----------------------------------------------------------------------------
1434// StopRecording
1435// ----------------------------------------------------------------------------
1436
Max Morin787eeed2016-06-23 10:42:07 +02001437int32_t AudioDeviceModuleImpl::StopRecording() {
Max Morin098e6c52016-06-28 09:36:25 +02001438 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001439 CHECK_INITIALIZED();
Max Morin84cab202016-07-01 13:35:19 +02001440 int32_t result = _ptrAudioDevice->StopRecording();
1441 LOG(INFO) << "output: " << result;
1442 RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StopRecordingSuccess",
1443 static_cast<int>(result == 0));
1444 return result;
niklase@google.com470e71d2011-07-07 08:21:25 +00001445}
1446
1447// ----------------------------------------------------------------------------
1448// Recording
1449// ----------------------------------------------------------------------------
1450
Max Morin787eeed2016-06-23 10:42:07 +02001451bool AudioDeviceModuleImpl::Recording() const {
Max Morin098e6c52016-06-28 09:36:25 +02001452 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001453 CHECK_INITIALIZED_BOOL();
1454 return (_ptrAudioDevice->Recording());
niklase@google.com470e71d2011-07-07 08:21:25 +00001455}
1456
1457// ----------------------------------------------------------------------------
1458// RegisterEventObserver
1459// ----------------------------------------------------------------------------
1460
Max Morin787eeed2016-06-23 10:42:07 +02001461int32_t AudioDeviceModuleImpl::RegisterEventObserver(
1462 AudioDeviceObserver* eventCallback) {
Max Morin098e6c52016-06-28 09:36:25 +02001463 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001464 CriticalSectionScoped lock(&_critSectEventCb);
1465 _ptrCbAudioDeviceObserver = eventCallback;
niklase@google.com470e71d2011-07-07 08:21:25 +00001466
Max Morin787eeed2016-06-23 10:42:07 +02001467 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001468}
1469
1470// ----------------------------------------------------------------------------
1471// RegisterAudioCallback
1472// ----------------------------------------------------------------------------
1473
Max Morin787eeed2016-06-23 10:42:07 +02001474int32_t AudioDeviceModuleImpl::RegisterAudioCallback(
1475 AudioTransport* audioCallback) {
Max Morin098e6c52016-06-28 09:36:25 +02001476 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001477 CriticalSectionScoped lock(&_critSectAudioCb);
1478 _audioDeviceBuffer.RegisterAudioCallback(audioCallback);
niklase@google.com470e71d2011-07-07 08:21:25 +00001479
Max Morin787eeed2016-06-23 10:42:07 +02001480 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001481}
1482
1483// ----------------------------------------------------------------------------
1484// StartRawInputFileRecording
1485// ----------------------------------------------------------------------------
1486
pbos@webrtc.org25509882013-04-09 10:30:35 +00001487int32_t AudioDeviceModuleImpl::StartRawInputFileRecording(
Max Morin787eeed2016-06-23 10:42:07 +02001488 const char pcmFileNameUTF8[kAdmMaxFileNameSize]) {
Max Morin098e6c52016-06-28 09:36:25 +02001489 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001490 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001491
Max Morin787eeed2016-06-23 10:42:07 +02001492 if (NULL == pcmFileNameUTF8) {
1493 return -1;
1494 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001495
Max Morin787eeed2016-06-23 10:42:07 +02001496 return (_audioDeviceBuffer.StartInputFileRecording(pcmFileNameUTF8));
niklase@google.com470e71d2011-07-07 08:21:25 +00001497}
1498
1499// ----------------------------------------------------------------------------
1500// StopRawInputFileRecording
1501// ----------------------------------------------------------------------------
1502
Max Morin787eeed2016-06-23 10:42:07 +02001503int32_t AudioDeviceModuleImpl::StopRawInputFileRecording() {
Max Morin098e6c52016-06-28 09:36:25 +02001504 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001505 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001506
Max Morin787eeed2016-06-23 10:42:07 +02001507 return (_audioDeviceBuffer.StopInputFileRecording());
niklase@google.com470e71d2011-07-07 08:21:25 +00001508}
1509
1510// ----------------------------------------------------------------------------
1511// StartRawOutputFileRecording
1512// ----------------------------------------------------------------------------
1513
pbos@webrtc.org25509882013-04-09 10:30:35 +00001514int32_t AudioDeviceModuleImpl::StartRawOutputFileRecording(
Max Morin787eeed2016-06-23 10:42:07 +02001515 const char pcmFileNameUTF8[kAdmMaxFileNameSize]) {
Max Morin098e6c52016-06-28 09:36:25 +02001516 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001517 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001518
Max Morin787eeed2016-06-23 10:42:07 +02001519 if (NULL == pcmFileNameUTF8) {
1520 return -1;
1521 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001522
Max Morin787eeed2016-06-23 10:42:07 +02001523 return (_audioDeviceBuffer.StartOutputFileRecording(pcmFileNameUTF8));
niklase@google.com470e71d2011-07-07 08:21:25 +00001524}
1525
1526// ----------------------------------------------------------------------------
1527// StopRawOutputFileRecording
1528// ----------------------------------------------------------------------------
1529
Max Morin787eeed2016-06-23 10:42:07 +02001530int32_t AudioDeviceModuleImpl::StopRawOutputFileRecording() {
Max Morin098e6c52016-06-28 09:36:25 +02001531 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001532 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001533
Max Morin787eeed2016-06-23 10:42:07 +02001534 return (_audioDeviceBuffer.StopOutputFileRecording());
niklase@google.com470e71d2011-07-07 08:21:25 +00001535}
1536
1537// ----------------------------------------------------------------------------
1538// SetPlayoutBuffer
1539// ----------------------------------------------------------------------------
1540
Max Morin787eeed2016-06-23 10:42:07 +02001541int32_t AudioDeviceModuleImpl::SetPlayoutBuffer(const BufferType type,
1542 uint16_t sizeMS) {
Max Morin098e6c52016-06-28 09:36:25 +02001543 if (type == kFixedBufferSize) {
Max Morin2c332bb2016-07-04 09:03:42 +02001544 LOG(INFO) << __FUNCTION__ << "(fixed buffer, " << sizeMS << "ms)";
Max Morin098e6c52016-06-28 09:36:25 +02001545 } else if (type == kAdaptiveBufferSize) {
Max Morin2c332bb2016-07-04 09:03:42 +02001546 LOG(INFO) << __FUNCTION__ << "(adaptive buffer, " << sizeMS << "ms)";
Max Morin098e6c52016-06-28 09:36:25 +02001547 } else {
Max Morin2c332bb2016-07-04 09:03:42 +02001548 LOG(INFO) << __FUNCTION__ << "(?, " << sizeMS << "ms)";
Max Morin098e6c52016-06-28 09:36:25 +02001549 }
Max Morin787eeed2016-06-23 10:42:07 +02001550 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001551
Max Morin787eeed2016-06-23 10:42:07 +02001552 if (_ptrAudioDevice->PlayoutIsInitialized()) {
Max Morin098e6c52016-06-28 09:36:25 +02001553 LOG(LERROR) << "unable to modify the playout buffer while playing side is "
1554 "initialized";
Max Morin787eeed2016-06-23 10:42:07 +02001555 return -1;
1556 }
1557
1558 int32_t ret(0);
1559
1560 if (kFixedBufferSize == type) {
1561 if (sizeMS < kAdmMinPlayoutBufferSizeMs ||
1562 sizeMS > kAdmMaxPlayoutBufferSizeMs) {
Max Morin098e6c52016-06-28 09:36:25 +02001563 LOG(LERROR) << "size parameter is out of range";
Max Morin787eeed2016-06-23 10:42:07 +02001564 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +00001565 }
Max Morin787eeed2016-06-23 10:42:07 +02001566 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001567
Max Morin787eeed2016-06-23 10:42:07 +02001568 if ((ret = _ptrAudioDevice->SetPlayoutBuffer(type, sizeMS)) == -1) {
Max Morin098e6c52016-06-28 09:36:25 +02001569 LOG(LERROR) << "failed to set the playout buffer (error: " << LastError()
1570 << ")";
Max Morin787eeed2016-06-23 10:42:07 +02001571 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001572
Max Morin787eeed2016-06-23 10:42:07 +02001573 return ret;
niklase@google.com470e71d2011-07-07 08:21:25 +00001574}
1575
1576// ----------------------------------------------------------------------------
1577// PlayoutBuffer
1578// ----------------------------------------------------------------------------
1579
Max Morin787eeed2016-06-23 10:42:07 +02001580int32_t AudioDeviceModuleImpl::PlayoutBuffer(BufferType* type,
1581 uint16_t* sizeMS) const {
Max Morin098e6c52016-06-28 09:36:25 +02001582 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001583 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001584
Max Morin787eeed2016-06-23 10:42:07 +02001585 BufferType bufType;
1586 uint16_t size(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001587
Max Morin787eeed2016-06-23 10:42:07 +02001588 if (_ptrAudioDevice->PlayoutBuffer(bufType, size) == -1) {
Max Morin098e6c52016-06-28 09:36:25 +02001589 LOG(LERROR) << "failed to retrieve the buffer type and size";
Max Morin787eeed2016-06-23 10:42:07 +02001590 return -1;
1591 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001592
Max Morin787eeed2016-06-23 10:42:07 +02001593 *type = bufType;
1594 *sizeMS = size;
niklase@google.com470e71d2011-07-07 08:21:25 +00001595
Max Morin2c332bb2016-07-04 09:03:42 +02001596 LOG(INFO) << "output: type = " << *type << ", sizeMS = " << *sizeMS;
Max Morin787eeed2016-06-23 10:42:07 +02001597 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001598}
1599
1600// ----------------------------------------------------------------------------
1601// PlayoutDelay
1602// ----------------------------------------------------------------------------
1603
Max Morin787eeed2016-06-23 10:42:07 +02001604int32_t AudioDeviceModuleImpl::PlayoutDelay(uint16_t* delayMS) const {
Max Morin098e6c52016-06-28 09:36:25 +02001605 LOG(LS_VERBOSE) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001606 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001607
Max Morin787eeed2016-06-23 10:42:07 +02001608 uint16_t delay(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001609
Max Morin787eeed2016-06-23 10:42:07 +02001610 if (_ptrAudioDevice->PlayoutDelay(delay) == -1) {
Max Morin098e6c52016-06-28 09:36:25 +02001611 LOG(LERROR) << "failed to retrieve the playout delay";
Max Morin787eeed2016-06-23 10:42:07 +02001612 return -1;
1613 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001614
Max Morin787eeed2016-06-23 10:42:07 +02001615 *delayMS = delay;
Max Morin2c332bb2016-07-04 09:03:42 +02001616 LOG(LS_VERBOSE) << "output: " << *delayMS;
Max Morin787eeed2016-06-23 10:42:07 +02001617 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001618}
1619
1620// ----------------------------------------------------------------------------
1621// RecordingDelay
1622// ----------------------------------------------------------------------------
1623
Max Morin787eeed2016-06-23 10:42:07 +02001624int32_t AudioDeviceModuleImpl::RecordingDelay(uint16_t* delayMS) const {
Max Morin098e6c52016-06-28 09:36:25 +02001625 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001626 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001627
Max Morin787eeed2016-06-23 10:42:07 +02001628 uint16_t delay(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001629
Max Morin787eeed2016-06-23 10:42:07 +02001630 if (_ptrAudioDevice->RecordingDelay(delay) == -1) {
Max Morin098e6c52016-06-28 09:36:25 +02001631 LOG(LERROR) << "failed to retrieve the recording delay";
Max Morin787eeed2016-06-23 10:42:07 +02001632 return -1;
1633 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001634
Max Morin787eeed2016-06-23 10:42:07 +02001635 *delayMS = delay;
Max Morin2c332bb2016-07-04 09:03:42 +02001636 LOG(INFO) << "output: " << *delayMS;
Max Morin787eeed2016-06-23 10:42:07 +02001637 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001638}
1639
1640// ----------------------------------------------------------------------------
1641// CPULoad
1642// ----------------------------------------------------------------------------
1643
Max Morin787eeed2016-06-23 10:42:07 +02001644int32_t AudioDeviceModuleImpl::CPULoad(uint16_t* load) const {
Max Morin098e6c52016-06-28 09:36:25 +02001645 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001646 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001647
Max Morin787eeed2016-06-23 10:42:07 +02001648 uint16_t cpuLoad(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001649
Max Morin787eeed2016-06-23 10:42:07 +02001650 if (_ptrAudioDevice->CPULoad(cpuLoad) == -1) {
Max Morin098e6c52016-06-28 09:36:25 +02001651 LOG(LERROR) << "failed to retrieve the CPU load";
Max Morin787eeed2016-06-23 10:42:07 +02001652 return -1;
1653 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001654
Max Morin787eeed2016-06-23 10:42:07 +02001655 *load = cpuLoad;
Max Morin2c332bb2016-07-04 09:03:42 +02001656 LOG(INFO) << "output: " << *load;
Max Morin787eeed2016-06-23 10:42:07 +02001657 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001658}
1659
1660// ----------------------------------------------------------------------------
1661// SetRecordingSampleRate
1662// ----------------------------------------------------------------------------
1663
Max Morin787eeed2016-06-23 10:42:07 +02001664int32_t AudioDeviceModuleImpl::SetRecordingSampleRate(
1665 const uint32_t samplesPerSec) {
Max Morin098e6c52016-06-28 09:36:25 +02001666 LOG(INFO) << __FUNCTION__ << "(" << samplesPerSec << ")";
Max Morin787eeed2016-06-23 10:42:07 +02001667 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001668
Max Morin787eeed2016-06-23 10:42:07 +02001669 if (_ptrAudioDevice->SetRecordingSampleRate(samplesPerSec) != 0) {
1670 return -1;
1671 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001672
Max Morin787eeed2016-06-23 10:42:07 +02001673 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001674}
1675
1676// ----------------------------------------------------------------------------
1677// RecordingSampleRate
1678// ----------------------------------------------------------------------------
1679
Max Morin787eeed2016-06-23 10:42:07 +02001680int32_t AudioDeviceModuleImpl::RecordingSampleRate(
1681 uint32_t* samplesPerSec) const {
Max Morin098e6c52016-06-28 09:36:25 +02001682 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001683 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001684
Max Morin787eeed2016-06-23 10:42:07 +02001685 int32_t sampleRate = _audioDeviceBuffer.RecordingSampleRate();
niklase@google.com470e71d2011-07-07 08:21:25 +00001686
Max Morin787eeed2016-06-23 10:42:07 +02001687 if (sampleRate == -1) {
Max Morin098e6c52016-06-28 09:36:25 +02001688 LOG(LERROR) << "failed to retrieve the sample rate";
Max Morin787eeed2016-06-23 10:42:07 +02001689 return -1;
1690 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001691
Max Morin787eeed2016-06-23 10:42:07 +02001692 *samplesPerSec = sampleRate;
Max Morin2c332bb2016-07-04 09:03:42 +02001693 LOG(INFO) << "output: " << *samplesPerSec;
Max Morin787eeed2016-06-23 10:42:07 +02001694 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001695}
1696
1697// ----------------------------------------------------------------------------
1698// SetPlayoutSampleRate
1699// ----------------------------------------------------------------------------
1700
Max Morin787eeed2016-06-23 10:42:07 +02001701int32_t AudioDeviceModuleImpl::SetPlayoutSampleRate(
1702 const uint32_t samplesPerSec) {
Max Morin098e6c52016-06-28 09:36:25 +02001703 LOG(INFO) << __FUNCTION__ << "(" << samplesPerSec << ")";
Max Morin787eeed2016-06-23 10:42:07 +02001704 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001705
Max Morin787eeed2016-06-23 10:42:07 +02001706 if (_ptrAudioDevice->SetPlayoutSampleRate(samplesPerSec) != 0) {
1707 return -1;
1708 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001709
Max Morin787eeed2016-06-23 10:42:07 +02001710 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001711}
1712
1713// ----------------------------------------------------------------------------
1714// PlayoutSampleRate
1715// ----------------------------------------------------------------------------
1716
Max Morin787eeed2016-06-23 10:42:07 +02001717int32_t AudioDeviceModuleImpl::PlayoutSampleRate(
1718 uint32_t* samplesPerSec) const {
Max Morin098e6c52016-06-28 09:36:25 +02001719 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001720 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001721
Max Morin787eeed2016-06-23 10:42:07 +02001722 int32_t sampleRate = _audioDeviceBuffer.PlayoutSampleRate();
niklase@google.com470e71d2011-07-07 08:21:25 +00001723
Max Morin787eeed2016-06-23 10:42:07 +02001724 if (sampleRate == -1) {
Max Morin098e6c52016-06-28 09:36:25 +02001725 LOG(LERROR) << "failed to retrieve the sample rate";
Max Morin787eeed2016-06-23 10:42:07 +02001726 return -1;
1727 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001728
Max Morin787eeed2016-06-23 10:42:07 +02001729 *samplesPerSec = sampleRate;
Max Morin2c332bb2016-07-04 09:03:42 +02001730 LOG(INFO) << "output: " << *samplesPerSec;
Max Morin787eeed2016-06-23 10:42:07 +02001731 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001732}
1733
1734// ----------------------------------------------------------------------------
1735// ResetAudioDevice
1736// ----------------------------------------------------------------------------
1737
Max Morin787eeed2016-06-23 10:42:07 +02001738int32_t AudioDeviceModuleImpl::ResetAudioDevice() {
Max Morin098e6c52016-06-28 09:36:25 +02001739 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001740 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001741
Max Morin787eeed2016-06-23 10:42:07 +02001742 if (_ptrAudioDevice->ResetAudioDevice() == -1) {
1743 return -1;
1744 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001745
Max Morin787eeed2016-06-23 10:42:07 +02001746 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001747}
1748
1749// ----------------------------------------------------------------------------
1750// SetLoudspeakerStatus
1751// ----------------------------------------------------------------------------
1752
Max Morin787eeed2016-06-23 10:42:07 +02001753int32_t AudioDeviceModuleImpl::SetLoudspeakerStatus(bool enable) {
Max Morin098e6c52016-06-28 09:36:25 +02001754 LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
Max Morin787eeed2016-06-23 10:42:07 +02001755 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001756
Max Morin787eeed2016-06-23 10:42:07 +02001757 if (_ptrAudioDevice->SetLoudspeakerStatus(enable) != 0) {
1758 return -1;
1759 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001760
Max Morin787eeed2016-06-23 10:42:07 +02001761 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001762}
1763
1764// ----------------------------------------------------------------------------
1765// GetLoudspeakerStatus
1766// ----------------------------------------------------------------------------
1767
henrikac14f5ff2015-09-23 14:08:33 +02001768int32_t AudioDeviceModuleImpl::GetLoudspeakerStatus(bool* enabled) const {
Max Morin098e6c52016-06-28 09:36:25 +02001769 LOG(INFO) << __FUNCTION__;
henrika@webrtc.orga954c072014-12-09 16:22:09 +00001770 CHECK_INITIALIZED();
Max Morin098e6c52016-06-28 09:36:25 +02001771 int32_t ok = 0;
henrikac14f5ff2015-09-23 14:08:33 +02001772 if (_ptrAudioDevice->GetLoudspeakerStatus(*enabled) != 0) {
Max Morin098e6c52016-06-28 09:36:25 +02001773 ok = -1;
henrikac14f5ff2015-09-23 14:08:33 +02001774 }
Max Morin2c332bb2016-07-04 09:03:42 +02001775 LOG(INFO) << "output: " << ok;
Max Morin098e6c52016-06-28 09:36:25 +02001776 return ok;
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +00001777}
1778
henrikac14f5ff2015-09-23 14:08:33 +02001779bool AudioDeviceModuleImpl::BuiltInAECIsEnabled() const {
Max Morin098e6c52016-06-28 09:36:25 +02001780 LOG(INFO) << __FUNCTION__;
henrikac14f5ff2015-09-23 14:08:33 +02001781 CHECK_INITIALIZED_BOOL();
Max Morin098e6c52016-06-28 09:36:25 +02001782 bool isEnabled = _ptrAudioDevice->BuiltInAECIsEnabled();
Max Morin2c332bb2016-07-04 09:03:42 +02001783 LOG(INFO) << "output: " << isEnabled;
Max Morin098e6c52016-06-28 09:36:25 +02001784 return isEnabled;
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +00001785}
1786
henrika@webrtc.orga954c072014-12-09 16:22:09 +00001787bool AudioDeviceModuleImpl::BuiltInAECIsAvailable() const {
Max Morin098e6c52016-06-28 09:36:25 +02001788 LOG(INFO) << __FUNCTION__;
henrika@webrtc.orga954c072014-12-09 16:22:09 +00001789 CHECK_INITIALIZED_BOOL();
Max Morin098e6c52016-06-28 09:36:25 +02001790 bool isAvailable = _ptrAudioDevice->BuiltInAECIsAvailable();
Max Morin2c332bb2016-07-04 09:03:42 +02001791 LOG(INFO) << "output: " << isAvailable;
Max Morin098e6c52016-06-28 09:36:25 +02001792 return isAvailable;
henrika@webrtc.orga954c072014-12-09 16:22:09 +00001793}
1794
henrikac14f5ff2015-09-23 14:08:33 +02001795int32_t AudioDeviceModuleImpl::EnableBuiltInAEC(bool enable) {
Max Morin098e6c52016-06-28 09:36:25 +02001796 LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
henrikac14f5ff2015-09-23 14:08:33 +02001797 CHECK_INITIALIZED();
Max Morin098e6c52016-06-28 09:36:25 +02001798 int32_t ok = _ptrAudioDevice->EnableBuiltInAEC(enable);
Max Morin2c332bb2016-07-04 09:03:42 +02001799 LOG(INFO) << "output: " << ok;
Max Morin098e6c52016-06-28 09:36:25 +02001800 return ok;
henrikac14f5ff2015-09-23 14:08:33 +02001801}
1802
1803bool AudioDeviceModuleImpl::BuiltInAGCIsAvailable() const {
Max Morin098e6c52016-06-28 09:36:25 +02001804 LOG(INFO) << __FUNCTION__;
henrikac14f5ff2015-09-23 14:08:33 +02001805 CHECK_INITIALIZED_BOOL();
Max Morin098e6c52016-06-28 09:36:25 +02001806 bool isAvailable = _ptrAudioDevice->BuiltInAGCIsAvailable();
Max Morin2c332bb2016-07-04 09:03:42 +02001807 LOG(INFO) << "output: " << isAvailable;
Max Morin098e6c52016-06-28 09:36:25 +02001808 return isAvailable;
henrikac14f5ff2015-09-23 14:08:33 +02001809}
1810
1811int32_t AudioDeviceModuleImpl::EnableBuiltInAGC(bool enable) {
Max Morin098e6c52016-06-28 09:36:25 +02001812 LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
henrikac14f5ff2015-09-23 14:08:33 +02001813 CHECK_INITIALIZED();
Max Morin098e6c52016-06-28 09:36:25 +02001814 int32_t ok = _ptrAudioDevice->EnableBuiltInAGC(enable);
Max Morin2c332bb2016-07-04 09:03:42 +02001815 LOG(INFO) << "output: " << ok;
Max Morin098e6c52016-06-28 09:36:25 +02001816 return ok;
henrikac14f5ff2015-09-23 14:08:33 +02001817}
1818
1819bool AudioDeviceModuleImpl::BuiltInNSIsAvailable() const {
Max Morin098e6c52016-06-28 09:36:25 +02001820 LOG(INFO) << __FUNCTION__;
henrikac14f5ff2015-09-23 14:08:33 +02001821 CHECK_INITIALIZED_BOOL();
Max Morin098e6c52016-06-28 09:36:25 +02001822 bool isAvailable = _ptrAudioDevice->BuiltInNSIsAvailable();
Max Morin2c332bb2016-07-04 09:03:42 +02001823 LOG(INFO) << "output: " << isAvailable;
Max Morin098e6c52016-06-28 09:36:25 +02001824 return isAvailable;
henrikac14f5ff2015-09-23 14:08:33 +02001825}
1826
1827int32_t AudioDeviceModuleImpl::EnableBuiltInNS(bool enable) {
Max Morin098e6c52016-06-28 09:36:25 +02001828 LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
henrikac14f5ff2015-09-23 14:08:33 +02001829 CHECK_INITIALIZED();
Max Morin098e6c52016-06-28 09:36:25 +02001830 int32_t ok = _ptrAudioDevice->EnableBuiltInNS(enable);
Max Morin2c332bb2016-07-04 09:03:42 +02001831 LOG(INFO) << "output: " << ok;
Max Morin098e6c52016-06-28 09:36:25 +02001832 return ok;
henrikac14f5ff2015-09-23 14:08:33 +02001833}
1834
henrikaba35d052015-07-14 17:04:08 +02001835int AudioDeviceModuleImpl::GetPlayoutAudioParameters(
1836 AudioParameters* params) const {
Max Morin098e6c52016-06-28 09:36:25 +02001837 LOG(INFO) << __FUNCTION__;
1838 int r = _ptrAudioDevice->GetPlayoutAudioParameters(params);
Max Morin2c332bb2016-07-04 09:03:42 +02001839 LOG(INFO) << "output: " << r;
Max Morin098e6c52016-06-28 09:36:25 +02001840 return r;
henrikaba35d052015-07-14 17:04:08 +02001841}
1842
1843int AudioDeviceModuleImpl::GetRecordAudioParameters(
1844 AudioParameters* params) const {
Max Morin098e6c52016-06-28 09:36:25 +02001845 LOG(INFO) << __FUNCTION__;
1846 int r = _ptrAudioDevice->GetRecordAudioParameters(params);
Max Morin2c332bb2016-07-04 09:03:42 +02001847 LOG(INFO) << "output: " << r;
Max Morin098e6c52016-06-28 09:36:25 +02001848 return r;
henrikaba35d052015-07-14 17:04:08 +02001849}
1850
niklase@google.com470e71d2011-07-07 08:21:25 +00001851// ============================================================================
1852// Private Methods
1853// ============================================================================
1854
1855// ----------------------------------------------------------------------------
1856// Platform
1857// ----------------------------------------------------------------------------
1858
Max Morin787eeed2016-06-23 10:42:07 +02001859AudioDeviceModuleImpl::PlatformType AudioDeviceModuleImpl::Platform() const {
Max Morin098e6c52016-06-28 09:36:25 +02001860 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001861 return _platformType;
niklase@google.com470e71d2011-07-07 08:21:25 +00001862}
1863
1864// ----------------------------------------------------------------------------
1865// PlatformAudioLayer
1866// ----------------------------------------------------------------------------
1867
Max Morin787eeed2016-06-23 10:42:07 +02001868AudioDeviceModule::AudioLayer AudioDeviceModuleImpl::PlatformAudioLayer()
1869 const {
Max Morin098e6c52016-06-28 09:36:25 +02001870 LOG(INFO) << __FUNCTION__;
Max Morin787eeed2016-06-23 10:42:07 +02001871 return _platformAudioLayer;
niklase@google.com470e71d2011-07-07 08:21:25 +00001872}
1873
1874} // namespace webrtc