blob: 37ed5b2113e3d21fdcfe526cfada99d314e6c3fd [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
Peter Boström1d194412016-03-21 16:44:31 +010011#include "webrtc/base/refcount.h"
Niels Möllerd28db7f2016-05-10 16:31:47 +020012#include "webrtc/base/timeutils.h"
Peter Boströmdda52b92016-04-11 16:04:33 +020013#include "webrtc/base/trace_event.h"
pbos@webrtc.org811269d2013-07-11 13:24:38 +000014#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
15#include "webrtc/modules/audio_device/audio_device_config.h"
16#include "webrtc/modules/audio_device/audio_device_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000017
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +000018#include <assert.h>
xians@google.combf5d2ba2011-08-16 07:44:19 +000019#include <string.h>
niklase@google.com470e71d2011-07-07 08:21:25 +000020
21#if defined(_WIN32)
Max Morin787eeed2016-06-23 10:42:07 +020022#include "audio_device_wave_win.h"
23#if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
24#include "audio_device_core_win.h"
25#endif
leozwang@google.com39f20512011-07-15 16:29:40 +000026#elif defined(WEBRTC_ANDROID)
henrikab2619892015-05-18 16:49:16 +020027#include <stdlib.h>
henrikab2619892015-05-18 16:49:16 +020028#include "webrtc/modules/audio_device/android/audio_device_template.h"
29#include "webrtc/modules/audio_device/android/audio_manager.h"
30#include "webrtc/modules/audio_device/android/audio_record_jni.h"
31#include "webrtc/modules/audio_device/android/audio_track_jni.h"
32#include "webrtc/modules/audio_device/android/opensles_player.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000033#elif defined(WEBRTC_LINUX)
Max Morin787eeed2016-06-23 10:42:07 +020034#if defined(LINUX_ALSA)
35#include "audio_device_alsa_linux.h"
36#endif
Tommi68898a22015-05-19 17:28:07 +020037#if defined(LINUX_PULSE)
Max Morin787eeed2016-06-23 10:42:07 +020038#include "audio_device_pulse_linux.h"
Tommi68898a22015-05-19 17:28:07 +020039#endif
sjlee@webrtc.org414fa7f2012-09-11 17:25:46 +000040#elif defined(WEBRTC_IOS)
Max Morin787eeed2016-06-23 10:42:07 +020041#include "audio_device_ios.h"
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +000042#elif defined(WEBRTC_MAC)
Max Morin787eeed2016-06-23 10:42:07 +020043#include "audio_device_mac.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000044#endif
phoglund@webrtc.org8454ad12014-06-11 14:12:04 +000045
46#if defined(WEBRTC_DUMMY_FILE_DEVICES)
47#include "webrtc/modules/audio_device/dummy/file_audio_device_factory.h"
48#endif
49
pbos@webrtc.org811269d2013-07-11 13:24:38 +000050#include "webrtc/modules/audio_device/dummy/audio_device_dummy.h"
phoglund@webrtc.org8454ad12014-06-11 14:12:04 +000051#include "webrtc/modules/audio_device/dummy/file_audio_device.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010052#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
53#include "webrtc/system_wrappers/include/trace.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000054
Max Morin787eeed2016-06-23 10:42:07 +020055#define CHECK_INITIALIZED() \
56 { \
57 if (!_initialized) { \
58 return -1; \
59 }; \
60 }
niklase@google.com470e71d2011-07-07 08:21:25 +000061
Max Morin787eeed2016-06-23 10:42:07 +020062#define CHECK_INITIALIZED_BOOL() \
63 { \
64 if (!_initialized) { \
65 return false; \
66 }; \
67 }
niklase@google.com470e71d2011-07-07 08:21:25 +000068
Peter Boström1d194412016-03-21 16:44:31 +010069namespace webrtc {
henrike@webrtc.org70efc322012-02-23 17:45:33 +000070
niklase@google.com470e71d2011-07-07 08:21:25 +000071// ============================================================================
72// Static methods
73// ============================================================================
74
75// ----------------------------------------------------------------------------
76// AudioDeviceModule::Create()
77// ----------------------------------------------------------------------------
78
Peter Boström4adbbcf2016-05-03 15:51:26 -040079rtc::scoped_refptr<AudioDeviceModule> AudioDeviceModule::Create(
Peter Boström1d194412016-03-21 16:44:31 +010080 const int32_t id,
Peter Boström4adbbcf2016-05-03 15:51:26 -040081 const AudioLayer audio_layer) {
Max Morin787eeed2016-06-23 10:42:07 +020082 // Create the generic ref counted (platform independent) implementation.
83 rtc::scoped_refptr<AudioDeviceModuleImpl> audioDevice(
84 new rtc::RefCountedObject<AudioDeviceModuleImpl>(id, audio_layer));
niklase@google.com470e71d2011-07-07 08:21:25 +000085
Max Morin787eeed2016-06-23 10:42:07 +020086 // Ensure that the current platform is supported.
87 if (audioDevice->CheckPlatform() == -1) {
88 return nullptr;
89 }
niklase@google.com470e71d2011-07-07 08:21:25 +000090
Max Morin787eeed2016-06-23 10:42:07 +020091 // Create the platform-dependent implementation.
92 if (audioDevice->CreatePlatformSpecificObjects() == -1) {
93 return nullptr;
94 }
niklase@google.com470e71d2011-07-07 08:21:25 +000095
Max Morin787eeed2016-06-23 10:42:07 +020096 // Ensure that the generic audio buffer can communicate with the
97 // platform-specific parts.
98 if (audioDevice->AttachAudioBuffer() == -1) {
99 return nullptr;
100 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000101
Max Morin787eeed2016-06-23 10:42:07 +0200102 WebRtcSpl_Init();
kma@webrtc.orgac4d70d2012-10-05 00:19:01 +0000103
Max Morin787eeed2016-06-23 10:42:07 +0200104 return audioDevice;
niklase@google.com470e71d2011-07-07 08:21:25 +0000105}
106
niklase@google.com470e71d2011-07-07 08:21:25 +0000107// ============================================================================
108// Construction & Destruction
109// ============================================================================
110
111// ----------------------------------------------------------------------------
112// AudioDeviceModuleImpl - ctor
113// ----------------------------------------------------------------------------
114
Max Morin787eeed2016-06-23 10:42:07 +0200115AudioDeviceModuleImpl::AudioDeviceModuleImpl(const int32_t id,
116 const AudioLayer audioLayer)
117 : _critSect(*CriticalSectionWrapper::CreateCriticalSection()),
118 _critSectEventCb(*CriticalSectionWrapper::CreateCriticalSection()),
119 _critSectAudioCb(*CriticalSectionWrapper::CreateCriticalSection()),
120 _ptrCbAudioDeviceObserver(NULL),
121 _ptrAudioDevice(NULL),
122 _id(id),
123 _platformAudioLayer(audioLayer),
124 _lastProcessTime(rtc::TimeMillis()),
125 _platformType(kPlatformNotSupported),
126 _initialized(false),
127 _lastError(kAdmErrNone) {
128 WEBRTC_TRACE(kTraceMemory, kTraceAudioDevice, id, "%s created", __FUNCTION__);
niklase@google.com470e71d2011-07-07 08:21:25 +0000129}
130
131// ----------------------------------------------------------------------------
132// CheckPlatform
133// ----------------------------------------------------------------------------
134
Max Morin787eeed2016-06-23 10:42:07 +0200135int32_t AudioDeviceModuleImpl::CheckPlatform() {
136 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", __FUNCTION__);
niklase@google.com470e71d2011-07-07 08:21:25 +0000137
Max Morin787eeed2016-06-23 10:42:07 +0200138 // Ensure that the current platform is supported
139 //
140 PlatformType platform(kPlatformNotSupported);
niklase@google.com470e71d2011-07-07 08:21:25 +0000141
142#if defined(_WIN32)
Max Morin787eeed2016-06-23 10:42:07 +0200143 platform = kPlatformWin32;
144 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is WIN32");
leozwang@google.com522f42b2011-09-19 17:39:05 +0000145#elif defined(WEBRTC_ANDROID)
Max Morin787eeed2016-06-23 10:42:07 +0200146 platform = kPlatformAndroid;
147 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
148 "current platform is ANDROID");
niklase@google.com470e71d2011-07-07 08:21:25 +0000149#elif defined(WEBRTC_LINUX)
Max Morin787eeed2016-06-23 10:42:07 +0200150 platform = kPlatformLinux;
151 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is LINUX");
sjlee@webrtc.org414fa7f2012-09-11 17:25:46 +0000152#elif defined(WEBRTC_IOS)
Max Morin787eeed2016-06-23 10:42:07 +0200153 platform = kPlatformIOS;
154 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is IOS");
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000155#elif defined(WEBRTC_MAC)
Max Morin787eeed2016-06-23 10:42:07 +0200156 platform = kPlatformMac;
157 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "current platform is MAC");
niklase@google.com470e71d2011-07-07 08:21:25 +0000158#endif
159
Max Morin787eeed2016-06-23 10:42:07 +0200160 if (platform == kPlatformNotSupported) {
161 WEBRTC_TRACE(
162 kTraceCritical, kTraceAudioDevice, _id,
163 "current platform is not supported => this module will self destruct!");
164 return -1;
165 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000166
Max Morin787eeed2016-06-23 10:42:07 +0200167 // Store valid output results
168 //
169 _platformType = platform;
niklase@google.com470e71d2011-07-07 08:21:25 +0000170
Max Morin787eeed2016-06-23 10:42:07 +0200171 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000172}
173
niklase@google.com470e71d2011-07-07 08:21:25 +0000174// ----------------------------------------------------------------------------
175// CreatePlatformSpecificObjects
176// ----------------------------------------------------------------------------
177
Max Morin787eeed2016-06-23 10:42:07 +0200178int32_t AudioDeviceModuleImpl::CreatePlatformSpecificObjects() {
179 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", __FUNCTION__);
niklase@google.com470e71d2011-07-07 08:21:25 +0000180
Max Morin787eeed2016-06-23 10:42:07 +0200181 AudioDeviceGeneric* ptrAudioDevice(NULL);
niklase@google.com470e71d2011-07-07 08:21:25 +0000182
xians@google.combf5d2ba2011-08-16 07:44:19 +0000183#if defined(WEBRTC_DUMMY_AUDIO_BUILD)
Max Morin787eeed2016-06-23 10:42:07 +0200184 ptrAudioDevice = new AudioDeviceDummy(Id());
185 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
186 "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());
189 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
190 "Will use file-playing dummy device.");
xians@google.combf5d2ba2011-08-16 07:44:19 +0000191#else
Max Morin787eeed2016-06-23 10:42:07 +0200192 AudioLayer audioLayer(PlatformAudioLayer());
niklase@google.com470e71d2011-07-07 08:21:25 +0000193
Max Morin787eeed2016-06-23 10:42:07 +0200194// Create the *Windows* implementation of the Audio Device
195//
niklase@google.com470e71d2011-07-07 08:21:25 +0000196#if defined(_WIN32)
Max Morin787eeed2016-06-23 10:42:07 +0200197 if ((audioLayer == kWindowsWaveAudio)
niklase@google.com470e71d2011-07-07 08:21:25 +0000198#if !defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
Max Morin787eeed2016-06-23 10:42:07 +0200199 // Wave audio is default if Core audio is not supported in this build
200 || (audioLayer == kPlatformDefaultAudio)
niklase@google.com470e71d2011-07-07 08:21:25 +0000201#endif
Max Morin787eeed2016-06-23 10:42:07 +0200202 ) {
203 // create *Windows Wave Audio* implementation
204 ptrAudioDevice = new AudioDeviceWindowsWave(Id());
205 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
206 "Windows Wave APIs will be utilized");
207 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000208#if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
Max Morin787eeed2016-06-23 10:42:07 +0200209 if ((audioLayer == kWindowsCoreAudio) ||
210 (audioLayer == kPlatformDefaultAudio)) {
211 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
212 "attempting to use the Windows Core Audio APIs...");
niklase@google.com470e71d2011-07-07 08:21:25 +0000213
Max Morin787eeed2016-06-23 10:42:07 +0200214 if (AudioDeviceWindowsCore::CoreAudioIsSupported()) {
215 // create *Windows Core Audio* implementation
216 ptrAudioDevice = new AudioDeviceWindowsCore(Id());
217 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
218 "Windows Core Audio APIs will be utilized");
219 } else {
220 // create *Windows Wave Audio* implementation
221 ptrAudioDevice = new AudioDeviceWindowsWave(Id());
222 if (ptrAudioDevice != NULL) {
223 // Core Audio was not supported => revert to Windows Wave instead
224 _platformAudioLayer =
225 kWindowsWaveAudio; // modify the state set at construction
226 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id,
227 "Windows Core Audio is *not* supported => Wave APIs will "
228 "be utilized instead");
229 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000230 }
Max Morin787eeed2016-06-23 10:42:07 +0200231 }
232#endif // defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
niklase@google.com470e71d2011-07-07 08:21:25 +0000233#endif // #if defined(_WIN32)
234
henrike@webrtc.org9ee75e92013-12-11 21:42:44 +0000235#if defined(WEBRTC_ANDROID)
Max Morin787eeed2016-06-23 10:42:07 +0200236 // Create an Android audio manager.
237 _audioManagerAndroid.reset(new AudioManager());
238 // Select best possible combination of audio layers.
239 if (audioLayer == kPlatformDefaultAudio) {
240 if (_audioManagerAndroid->IsLowLatencyPlayoutSupported()) {
241 // Always use OpenSL ES for output on devices that supports the
242 // low-latency output audio path.
243 audioLayer = kAndroidJavaInputAndOpenSLESOutputAudio;
henrikab2619892015-05-18 16:49:16 +0200244 } else {
Max Morin787eeed2016-06-23 10:42:07 +0200245 // Use Java-based audio in both directions when low-latency output
246 // is not supported.
247 audioLayer = kAndroidJavaAudio;
niklase@google.com470e71d2011-07-07 08:21:25 +0000248 }
Max Morin787eeed2016-06-23 10:42:07 +0200249 }
250 AudioManager* audio_manager = _audioManagerAndroid.get();
251 if (audioLayer == kAndroidJavaAudio) {
252 // Java audio for both input and output audio.
253 ptrAudioDevice = new AudioDeviceTemplate<AudioRecordJni, AudioTrackJni>(
254 audioLayer, audio_manager);
255 } else if (audioLayer == kAndroidJavaInputAndOpenSLESOutputAudio) {
256 // Java audio for input and OpenSL ES for output audio (i.e. mixed APIs).
257 // This combination provides low-latency output audio and at the same
258 // time support for HW AEC using the AudioRecord Java API.
259 ptrAudioDevice = new AudioDeviceTemplate<AudioRecordJni, OpenSLESPlayer>(
260 audioLayer, audio_manager);
261 } else {
262 // Invalid audio layer.
263 ptrAudioDevice = NULL;
264 }
265// END #if defined(WEBRTC_ANDROID)
niklase@google.com470e71d2011-07-07 08:21:25 +0000266
Max Morin787eeed2016-06-23 10:42:07 +0200267// Create the *Linux* implementation of the Audio Device
268//
niklase@google.com470e71d2011-07-07 08:21:25 +0000269#elif defined(WEBRTC_LINUX)
Max Morin787eeed2016-06-23 10:42:07 +0200270 if ((audioLayer == kLinuxPulseAudio) ||
271 (audioLayer == kPlatformDefaultAudio)) {
niklase@google.com470e71d2011-07-07 08:21:25 +0000272#if defined(LINUX_PULSE)
Max Morin787eeed2016-06-23 10:42:07 +0200273 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
274 "attempting to use the Linux PulseAudio APIs...");
niklase@google.com470e71d2011-07-07 08:21:25 +0000275
Max Morin787eeed2016-06-23 10:42:07 +0200276 // create *Linux PulseAudio* implementation
277 AudioDeviceLinuxPulse* pulseDevice = new AudioDeviceLinuxPulse(Id());
278 if (pulseDevice->Init() != -1) {
279 ptrAudioDevice = pulseDevice;
280 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
281 "Linux PulseAudio APIs will be utilized");
282 } else {
283 delete pulseDevice;
niklase@google.com470e71d2011-07-07 08:21:25 +0000284#endif
285#if defined(LINUX_ALSA)
Max Morin787eeed2016-06-23 10:42:07 +0200286 // create *Linux ALSA Audio* implementation
287 ptrAudioDevice = new AudioDeviceLinuxALSA(Id());
288 if (ptrAudioDevice != NULL) {
289 // Pulse Audio was not supported => revert to ALSA instead
290 _platformAudioLayer =
291 kLinuxAlsaAudio; // modify the state set at construction
292 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id,
293 "Linux PulseAudio is *not* supported => ALSA APIs will be "
294 "utilized instead");
295 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000296#endif
297#if defined(LINUX_PULSE)
niklase@google.com470e71d2011-07-07 08:21:25 +0000298 }
Max Morin787eeed2016-06-23 10:42:07 +0200299#endif
300 } else if (audioLayer == kLinuxAlsaAudio) {
niklase@google.com470e71d2011-07-07 08:21:25 +0000301#if defined(LINUX_ALSA)
Max Morin787eeed2016-06-23 10:42:07 +0200302 // create *Linux ALSA Audio* implementation
303 ptrAudioDevice = new AudioDeviceLinuxALSA(Id());
304 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
305 "Linux ALSA APIs will be utilized");
niklase@google.com470e71d2011-07-07 08:21:25 +0000306#endif
Max Morin787eeed2016-06-23 10:42:07 +0200307 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000308#endif // #if defined(WEBRTC_LINUX)
309
Max Morin787eeed2016-06-23 10:42:07 +0200310// Create the *iPhone* implementation of the Audio Device
311//
sjlee@webrtc.org414fa7f2012-09-11 17:25:46 +0000312#if defined(WEBRTC_IOS)
Max Morin787eeed2016-06-23 10:42:07 +0200313 if (audioLayer == kPlatformDefaultAudio) {
314 // Create iOS Audio Device implementation.
315 ptrAudioDevice = new AudioDeviceIOS();
316 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
317 "iPhone Audio APIs will be utilized");
318 }
319// END #if defined(WEBRTC_IOS)
niklase@google.com470e71d2011-07-07 08:21:25 +0000320
Max Morin787eeed2016-06-23 10:42:07 +0200321// Create the *Mac* implementation of the Audio Device
322//
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000323#elif defined(WEBRTC_MAC)
Max Morin787eeed2016-06-23 10:42:07 +0200324 if (audioLayer == kPlatformDefaultAudio) {
325 // Create *Mac Audio* implementation
326 ptrAudioDevice = new AudioDeviceMac(Id());
327 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
328 "Mac OS X Audio APIs will be utilized");
329 }
andrew@webrtc.orgf3b65db2012-09-06 18:17:00 +0000330#endif // WEBRTC_MAC
niklase@google.com470e71d2011-07-07 08:21:25 +0000331
Max Morin787eeed2016-06-23 10:42:07 +0200332 // Create the *Dummy* implementation of the Audio Device
333 // Available for all platforms
334 //
335 if (audioLayer == kDummyAudio) {
336 // Create *Dummy Audio* implementation
337 assert(!ptrAudioDevice);
338 ptrAudioDevice = new AudioDeviceDummy(Id());
339 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id,
340 "Dummy Audio APIs will be utilized");
341 }
xians@google.combf5d2ba2011-08-16 07:44:19 +0000342#endif // if defined(WEBRTC_DUMMY_AUDIO_BUILD)
niklase@google.com470e71d2011-07-07 08:21:25 +0000343
Max Morin787eeed2016-06-23 10:42:07 +0200344 if (ptrAudioDevice == NULL) {
345 WEBRTC_TRACE(
346 kTraceCritical, kTraceAudioDevice, _id,
347 "unable to create the platform specific audio device implementation");
348 return -1;
349 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000350
Max Morin787eeed2016-06-23 10:42:07 +0200351 // Store valid output pointers
352 //
353 _ptrAudioDevice = ptrAudioDevice;
niklase@google.com470e71d2011-07-07 08:21:25 +0000354
Max Morin787eeed2016-06-23 10:42:07 +0200355 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000356}
357
358// ----------------------------------------------------------------------------
359// AttachAudioBuffer
360//
361// Install "bridge" between the platform implemetation and the generic
362// implementation. The "child" shall set the native sampling rate and the
363// number of channels in this function call.
364// ----------------------------------------------------------------------------
365
Max Morin787eeed2016-06-23 10:42:07 +0200366int32_t AudioDeviceModuleImpl::AttachAudioBuffer() {
367 WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", __FUNCTION__);
niklase@google.com470e71d2011-07-07 08:21:25 +0000368
Max Morin787eeed2016-06-23 10:42:07 +0200369 _audioDeviceBuffer.SetId(_id);
370 _ptrAudioDevice->AttachAudioBuffer(&_audioDeviceBuffer);
371 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000372}
373
374// ----------------------------------------------------------------------------
375// ~AudioDeviceModuleImpl - dtor
376// ----------------------------------------------------------------------------
377
Max Morin787eeed2016-06-23 10:42:07 +0200378AudioDeviceModuleImpl::~AudioDeviceModuleImpl() {
379 WEBRTC_TRACE(kTraceMemory, kTraceAudioDevice, _id, "%s destroyed",
380 __FUNCTION__);
henrika@google.com73d65512011-09-07 15:11:18 +0000381
Max Morin787eeed2016-06-23 10:42:07 +0200382 if (_ptrAudioDevice) {
383 delete _ptrAudioDevice;
384 _ptrAudioDevice = NULL;
385 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000386
Max Morin787eeed2016-06-23 10:42:07 +0200387 delete &_critSect;
388 delete &_critSectEventCb;
389 delete &_critSectAudioCb;
niklase@google.com470e71d2011-07-07 08:21:25 +0000390}
391
392// ============================================================================
393// Module
394// ============================================================================
395
396// ----------------------------------------------------------------------------
niklase@google.com470e71d2011-07-07 08:21:25 +0000397// Module::TimeUntilNextProcess
398//
399// Returns the number of milliseconds until the module want a worker thread
400// to call Process().
401// ----------------------------------------------------------------------------
402
Max Morin787eeed2016-06-23 10:42:07 +0200403int64_t AudioDeviceModuleImpl::TimeUntilNextProcess() {
404 int64_t now = rtc::TimeMillis();
405 int64_t deltaProcess = kAdmMaxIdleTimeProcess - (now - _lastProcessTime);
406 return deltaProcess;
niklase@google.com470e71d2011-07-07 08:21:25 +0000407}
408
409// ----------------------------------------------------------------------------
410// Module::Process
411//
412// Check for posted error and warning reports. Generate callbacks if
413// new reports exists.
414// ----------------------------------------------------------------------------
415
Max Morin787eeed2016-06-23 10:42:07 +0200416void AudioDeviceModuleImpl::Process() {
417 _lastProcessTime = rtc::TimeMillis();
niklase@google.com470e71d2011-07-07 08:21:25 +0000418
Max Morin787eeed2016-06-23 10:42:07 +0200419 // kPlayoutWarning
420 if (_ptrAudioDevice->PlayoutWarning()) {
421 CriticalSectionScoped lock(&_critSectEventCb);
422 if (_ptrCbAudioDeviceObserver) {
423 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id,
424 "=> OnWarningIsReported(kPlayoutWarning)");
425 _ptrCbAudioDeviceObserver->OnWarningIsReported(
426 AudioDeviceObserver::kPlayoutWarning);
niklase@google.com470e71d2011-07-07 08:21:25 +0000427 }
Max Morin787eeed2016-06-23 10:42:07 +0200428 _ptrAudioDevice->ClearPlayoutWarning();
429 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000430
Max Morin787eeed2016-06-23 10:42:07 +0200431 // kPlayoutError
432 if (_ptrAudioDevice->PlayoutError()) {
433 CriticalSectionScoped lock(&_critSectEventCb);
434 if (_ptrCbAudioDeviceObserver) {
435 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
436 "=> OnErrorIsReported(kPlayoutError)");
437 _ptrCbAudioDeviceObserver->OnErrorIsReported(
438 AudioDeviceObserver::kPlayoutError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000439 }
Max Morin787eeed2016-06-23 10:42:07 +0200440 _ptrAudioDevice->ClearPlayoutError();
441 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000442
Max Morin787eeed2016-06-23 10:42:07 +0200443 // kRecordingWarning
444 if (_ptrAudioDevice->RecordingWarning()) {
445 CriticalSectionScoped lock(&_critSectEventCb);
446 if (_ptrCbAudioDeviceObserver) {
447 WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id,
448 "=> OnWarningIsReported(kRecordingWarning)");
449 _ptrCbAudioDeviceObserver->OnWarningIsReported(
450 AudioDeviceObserver::kRecordingWarning);
niklase@google.com470e71d2011-07-07 08:21:25 +0000451 }
Max Morin787eeed2016-06-23 10:42:07 +0200452 _ptrAudioDevice->ClearRecordingWarning();
453 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000454
Max Morin787eeed2016-06-23 10:42:07 +0200455 // kRecordingError
456 if (_ptrAudioDevice->RecordingError()) {
457 CriticalSectionScoped lock(&_critSectEventCb);
458 if (_ptrCbAudioDeviceObserver) {
459 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
460 "=> OnErrorIsReported(kRecordingError)");
461 _ptrCbAudioDeviceObserver->OnErrorIsReported(
462 AudioDeviceObserver::kRecordingError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000463 }
Max Morin787eeed2016-06-23 10:42:07 +0200464 _ptrAudioDevice->ClearRecordingError();
465 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000466}
467
468// ============================================================================
469// Public API
470// ============================================================================
471
472// ----------------------------------------------------------------------------
473// ActiveAudioLayer
474// ----------------------------------------------------------------------------
475
henrikab2619892015-05-18 16:49:16 +0200476int32_t AudioDeviceModuleImpl::ActiveAudioLayer(AudioLayer* audioLayer) const {
477 AudioLayer activeAudio;
478 if (_ptrAudioDevice->ActiveAudioLayer(activeAudio) == -1) {
479 return -1;
480 }
481 *audioLayer = activeAudio;
482 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000483}
484
485// ----------------------------------------------------------------------------
486// LastError
487// ----------------------------------------------------------------------------
488
Max Morin787eeed2016-06-23 10:42:07 +0200489AudioDeviceModule::ErrorCode AudioDeviceModuleImpl::LastError() const {
490 return _lastError;
niklase@google.com470e71d2011-07-07 08:21:25 +0000491}
492
493// ----------------------------------------------------------------------------
494// Init
495// ----------------------------------------------------------------------------
496
Max Morin787eeed2016-06-23 10:42:07 +0200497int32_t AudioDeviceModuleImpl::Init() {
498 if (_initialized)
niklase@google.com470e71d2011-07-07 08:21:25 +0000499 return 0;
Max Morin787eeed2016-06-23 10:42:07 +0200500
501 if (!_ptrAudioDevice)
502 return -1;
503
504 if (_ptrAudioDevice->Init() == -1) {
505 return -1;
506 }
507
508 _initialized = true;
509 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000510}
511
512// ----------------------------------------------------------------------------
513// Terminate
514// ----------------------------------------------------------------------------
515
Max Morin787eeed2016-06-23 10:42:07 +0200516int32_t AudioDeviceModuleImpl::Terminate() {
517 if (!_initialized)
niklase@google.com470e71d2011-07-07 08:21:25 +0000518 return 0;
Max Morin787eeed2016-06-23 10:42:07 +0200519
520 if (_ptrAudioDevice->Terminate() == -1) {
521 return -1;
522 }
523
524 _initialized = false;
525 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000526}
527
528// ----------------------------------------------------------------------------
529// Initialized
530// ----------------------------------------------------------------------------
531
Max Morin787eeed2016-06-23 10:42:07 +0200532bool AudioDeviceModuleImpl::Initialized() const {
533 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: %d",
534 _initialized);
535 return (_initialized);
niklase@google.com470e71d2011-07-07 08:21:25 +0000536}
537
538// ----------------------------------------------------------------------------
niklase@google.com470e71d2011-07-07 08:21:25 +0000539// InitSpeaker
540// ----------------------------------------------------------------------------
541
Max Morin787eeed2016-06-23 10:42:07 +0200542int32_t AudioDeviceModuleImpl::InitSpeaker() {
543 CHECK_INITIALIZED();
544 return (_ptrAudioDevice->InitSpeaker());
niklase@google.com470e71d2011-07-07 08:21:25 +0000545}
546
547// ----------------------------------------------------------------------------
niklase@google.com470e71d2011-07-07 08:21:25 +0000548// InitMicrophone
549// ----------------------------------------------------------------------------
550
Max Morin787eeed2016-06-23 10:42:07 +0200551int32_t AudioDeviceModuleImpl::InitMicrophone() {
552 CHECK_INITIALIZED();
553 return (_ptrAudioDevice->InitMicrophone());
niklase@google.com470e71d2011-07-07 08:21:25 +0000554}
555
556// ----------------------------------------------------------------------------
557// SpeakerVolumeIsAvailable
558// ----------------------------------------------------------------------------
559
Max Morin787eeed2016-06-23 10:42:07 +0200560int32_t AudioDeviceModuleImpl::SpeakerVolumeIsAvailable(bool* available) {
561 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000562
Max Morin787eeed2016-06-23 10:42:07 +0200563 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000564
Max Morin787eeed2016-06-23 10:42:07 +0200565 if (_ptrAudioDevice->SpeakerVolumeIsAvailable(isAvailable) == -1) {
566 return -1;
567 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000568
Max Morin787eeed2016-06-23 10:42:07 +0200569 *available = isAvailable;
niklase@google.com470e71d2011-07-07 08:21:25 +0000570
Max Morin787eeed2016-06-23 10:42:07 +0200571 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d",
572 *available);
573 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000574}
575
576// ----------------------------------------------------------------------------
577// SetSpeakerVolume
578// ----------------------------------------------------------------------------
579
Max Morin787eeed2016-06-23 10:42:07 +0200580int32_t AudioDeviceModuleImpl::SetSpeakerVolume(uint32_t volume) {
581 CHECK_INITIALIZED();
582 return (_ptrAudioDevice->SetSpeakerVolume(volume));
niklase@google.com470e71d2011-07-07 08:21:25 +0000583}
584
585// ----------------------------------------------------------------------------
586// SpeakerVolume
587// ----------------------------------------------------------------------------
588
Max Morin787eeed2016-06-23 10:42:07 +0200589int32_t AudioDeviceModuleImpl::SpeakerVolume(uint32_t* volume) const {
590 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000591
Max Morin787eeed2016-06-23 10:42:07 +0200592 uint32_t level(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000593
Max Morin787eeed2016-06-23 10:42:07 +0200594 if (_ptrAudioDevice->SpeakerVolume(level) == -1) {
595 return -1;
596 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000597
Max Morin787eeed2016-06-23 10:42:07 +0200598 *volume = level;
niklase@google.com470e71d2011-07-07 08:21:25 +0000599
Max Morin787eeed2016-06-23 10:42:07 +0200600 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: volume=%u",
601 *volume);
602 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000603}
604
605// ----------------------------------------------------------------------------
606// SetWaveOutVolume
607// ----------------------------------------------------------------------------
608
Max Morin787eeed2016-06-23 10:42:07 +0200609int32_t AudioDeviceModuleImpl::SetWaveOutVolume(uint16_t volumeLeft,
610 uint16_t volumeRight) {
611 CHECK_INITIALIZED();
612 return (_ptrAudioDevice->SetWaveOutVolume(volumeLeft, volumeRight));
niklase@google.com470e71d2011-07-07 08:21:25 +0000613}
614
615// ----------------------------------------------------------------------------
616// WaveOutVolume
617// ----------------------------------------------------------------------------
618
Max Morin787eeed2016-06-23 10:42:07 +0200619int32_t AudioDeviceModuleImpl::WaveOutVolume(uint16_t* volumeLeft,
620 uint16_t* volumeRight) const {
621 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000622
Max Morin787eeed2016-06-23 10:42:07 +0200623 uint16_t volLeft(0);
624 uint16_t volRight(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000625
Max Morin787eeed2016-06-23 10:42:07 +0200626 if (_ptrAudioDevice->WaveOutVolume(volLeft, volRight) == -1) {
627 return -1;
628 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000629
Max Morin787eeed2016-06-23 10:42:07 +0200630 *volumeLeft = volLeft;
631 *volumeRight = volRight;
niklase@google.com470e71d2011-07-07 08:21:25 +0000632
Max Morin787eeed2016-06-23 10:42:07 +0200633 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id,
634 "outputs: volumeLeft=%u, volumeRight=%u", *volumeLeft,
635 *volumeRight);
niklase@google.com470e71d2011-07-07 08:21:25 +0000636
Max Morin787eeed2016-06-23 10:42:07 +0200637 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000638}
639
640// ----------------------------------------------------------------------------
641// SpeakerIsInitialized
642// ----------------------------------------------------------------------------
643
Max Morin787eeed2016-06-23 10:42:07 +0200644bool AudioDeviceModuleImpl::SpeakerIsInitialized() const {
645 CHECK_INITIALIZED_BOOL();
niklase@google.com470e71d2011-07-07 08:21:25 +0000646
Max Morin787eeed2016-06-23 10:42:07 +0200647 bool isInitialized = _ptrAudioDevice->SpeakerIsInitialized();
niklase@google.com470e71d2011-07-07 08:21:25 +0000648
Max Morin787eeed2016-06-23 10:42:07 +0200649 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: %d",
650 isInitialized);
651 return (isInitialized);
niklase@google.com470e71d2011-07-07 08:21:25 +0000652}
653
654// ----------------------------------------------------------------------------
655// MicrophoneIsInitialized
656// ----------------------------------------------------------------------------
657
Max Morin787eeed2016-06-23 10:42:07 +0200658bool AudioDeviceModuleImpl::MicrophoneIsInitialized() const {
659 CHECK_INITIALIZED_BOOL();
niklase@google.com470e71d2011-07-07 08:21:25 +0000660
Max Morin787eeed2016-06-23 10:42:07 +0200661 bool isInitialized = _ptrAudioDevice->MicrophoneIsInitialized();
niklase@google.com470e71d2011-07-07 08:21:25 +0000662
Max Morin787eeed2016-06-23 10:42:07 +0200663 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: %d",
664 isInitialized);
665 return (isInitialized);
niklase@google.com470e71d2011-07-07 08:21:25 +0000666}
667
668// ----------------------------------------------------------------------------
669// MaxSpeakerVolume
670// ----------------------------------------------------------------------------
671
Max Morin787eeed2016-06-23 10:42:07 +0200672int32_t AudioDeviceModuleImpl::MaxSpeakerVolume(uint32_t* maxVolume) const {
673 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000674
Max Morin787eeed2016-06-23 10:42:07 +0200675 uint32_t maxVol(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000676
Max Morin787eeed2016-06-23 10:42:07 +0200677 if (_ptrAudioDevice->MaxSpeakerVolume(maxVol) == -1) {
678 return -1;
679 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000680
Max Morin787eeed2016-06-23 10:42:07 +0200681 *maxVolume = maxVol;
niklase@google.com470e71d2011-07-07 08:21:25 +0000682
Max Morin787eeed2016-06-23 10:42:07 +0200683 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: maxVolume=%d",
684 *maxVolume);
685 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000686}
687
688// ----------------------------------------------------------------------------
689// MinSpeakerVolume
690// ----------------------------------------------------------------------------
691
Max Morin787eeed2016-06-23 10:42:07 +0200692int32_t AudioDeviceModuleImpl::MinSpeakerVolume(uint32_t* minVolume) const {
693 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000694
Max Morin787eeed2016-06-23 10:42:07 +0200695 uint32_t minVol(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000696
Max Morin787eeed2016-06-23 10:42:07 +0200697 if (_ptrAudioDevice->MinSpeakerVolume(minVol) == -1) {
698 return -1;
699 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000700
Max Morin787eeed2016-06-23 10:42:07 +0200701 *minVolume = minVol;
niklase@google.com470e71d2011-07-07 08:21:25 +0000702
Max Morin787eeed2016-06-23 10:42:07 +0200703 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: minVolume=%u",
704 *minVolume);
705 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000706}
707
708// ----------------------------------------------------------------------------
709// SpeakerVolumeStepSize
710// ----------------------------------------------------------------------------
711
Max Morin787eeed2016-06-23 10:42:07 +0200712int32_t AudioDeviceModuleImpl::SpeakerVolumeStepSize(uint16_t* stepSize) const {
713 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000714
Max Morin787eeed2016-06-23 10:42:07 +0200715 uint16_t delta(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000716
Max Morin787eeed2016-06-23 10:42:07 +0200717 if (_ptrAudioDevice->SpeakerVolumeStepSize(delta) == -1) {
718 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
719 "failed to retrieve the speaker-volume step size");
720 return -1;
721 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000722
Max Morin787eeed2016-06-23 10:42:07 +0200723 *stepSize = delta;
niklase@google.com470e71d2011-07-07 08:21:25 +0000724
Max Morin787eeed2016-06-23 10:42:07 +0200725 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: stepSize=%u",
726 *stepSize);
727 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000728}
729
730// ----------------------------------------------------------------------------
731// SpeakerMuteIsAvailable
732// ----------------------------------------------------------------------------
733
Max Morin787eeed2016-06-23 10:42:07 +0200734int32_t AudioDeviceModuleImpl::SpeakerMuteIsAvailable(bool* available) {
735 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000736
Max Morin787eeed2016-06-23 10:42:07 +0200737 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000738
Max Morin787eeed2016-06-23 10:42:07 +0200739 if (_ptrAudioDevice->SpeakerMuteIsAvailable(isAvailable) == -1) {
740 return -1;
741 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000742
Max Morin787eeed2016-06-23 10:42:07 +0200743 *available = isAvailable;
niklase@google.com470e71d2011-07-07 08:21:25 +0000744
Max Morin787eeed2016-06-23 10:42:07 +0200745 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d",
746 *available);
747 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000748}
749
750// ----------------------------------------------------------------------------
751// SetSpeakerMute
752// ----------------------------------------------------------------------------
753
Max Morin787eeed2016-06-23 10:42:07 +0200754int32_t AudioDeviceModuleImpl::SetSpeakerMute(bool enable) {
755 CHECK_INITIALIZED();
756 return (_ptrAudioDevice->SetSpeakerMute(enable));
niklase@google.com470e71d2011-07-07 08:21:25 +0000757}
758
759// ----------------------------------------------------------------------------
760// SpeakerMute
761// ----------------------------------------------------------------------------
762
Max Morin787eeed2016-06-23 10:42:07 +0200763int32_t AudioDeviceModuleImpl::SpeakerMute(bool* enabled) const {
764 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000765
Max Morin787eeed2016-06-23 10:42:07 +0200766 bool muted(false);
niklase@google.com470e71d2011-07-07 08:21:25 +0000767
Max Morin787eeed2016-06-23 10:42:07 +0200768 if (_ptrAudioDevice->SpeakerMute(muted) == -1) {
769 return -1;
770 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000771
Max Morin787eeed2016-06-23 10:42:07 +0200772 *enabled = muted;
niklase@google.com470e71d2011-07-07 08:21:25 +0000773
Max Morin787eeed2016-06-23 10:42:07 +0200774 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u",
775 *enabled);
776 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000777}
778
779// ----------------------------------------------------------------------------
780// MicrophoneMuteIsAvailable
781// ----------------------------------------------------------------------------
782
Max Morin787eeed2016-06-23 10:42:07 +0200783int32_t AudioDeviceModuleImpl::MicrophoneMuteIsAvailable(bool* available) {
784 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000785
Max Morin787eeed2016-06-23 10:42:07 +0200786 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000787
Max Morin787eeed2016-06-23 10:42:07 +0200788 if (_ptrAudioDevice->MicrophoneMuteIsAvailable(isAvailable) == -1) {
789 return -1;
790 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000791
Max Morin787eeed2016-06-23 10:42:07 +0200792 *available = isAvailable;
niklase@google.com470e71d2011-07-07 08:21:25 +0000793
Max Morin787eeed2016-06-23 10:42:07 +0200794 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d",
795 *available);
796 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000797}
798
799// ----------------------------------------------------------------------------
800// SetMicrophoneMute
801// ----------------------------------------------------------------------------
802
Max Morin787eeed2016-06-23 10:42:07 +0200803int32_t AudioDeviceModuleImpl::SetMicrophoneMute(bool enable) {
804 CHECK_INITIALIZED();
805 return (_ptrAudioDevice->SetMicrophoneMute(enable));
niklase@google.com470e71d2011-07-07 08:21:25 +0000806}
807
808// ----------------------------------------------------------------------------
809// MicrophoneMute
810// ----------------------------------------------------------------------------
811
Max Morin787eeed2016-06-23 10:42:07 +0200812int32_t AudioDeviceModuleImpl::MicrophoneMute(bool* enabled) const {
813 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000814
Max Morin787eeed2016-06-23 10:42:07 +0200815 bool muted(false);
niklase@google.com470e71d2011-07-07 08:21:25 +0000816
Max Morin787eeed2016-06-23 10:42:07 +0200817 if (_ptrAudioDevice->MicrophoneMute(muted) == -1) {
818 return -1;
819 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000820
Max Morin787eeed2016-06-23 10:42:07 +0200821 *enabled = muted;
niklase@google.com470e71d2011-07-07 08:21:25 +0000822
Max Morin787eeed2016-06-23 10:42:07 +0200823 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u",
824 *enabled);
825 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000826}
827
828// ----------------------------------------------------------------------------
829// MicrophoneBoostIsAvailable
830// ----------------------------------------------------------------------------
831
Max Morin787eeed2016-06-23 10:42:07 +0200832int32_t AudioDeviceModuleImpl::MicrophoneBoostIsAvailable(bool* available) {
833 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000834
Max Morin787eeed2016-06-23 10:42:07 +0200835 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000836
Max Morin787eeed2016-06-23 10:42:07 +0200837 if (_ptrAudioDevice->MicrophoneBoostIsAvailable(isAvailable) == -1) {
838 return -1;
839 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000840
Max Morin787eeed2016-06-23 10:42:07 +0200841 *available = isAvailable;
niklase@google.com470e71d2011-07-07 08:21:25 +0000842
Max Morin787eeed2016-06-23 10:42:07 +0200843 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d",
844 *available);
845 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000846}
847
848// ----------------------------------------------------------------------------
849// SetMicrophoneBoost
850// ----------------------------------------------------------------------------
851
Max Morin787eeed2016-06-23 10:42:07 +0200852int32_t AudioDeviceModuleImpl::SetMicrophoneBoost(bool enable) {
853 CHECK_INITIALIZED();
854 return (_ptrAudioDevice->SetMicrophoneBoost(enable));
niklase@google.com470e71d2011-07-07 08:21:25 +0000855}
856
857// ----------------------------------------------------------------------------
858// MicrophoneBoost
859// ----------------------------------------------------------------------------
860
Max Morin787eeed2016-06-23 10:42:07 +0200861int32_t AudioDeviceModuleImpl::MicrophoneBoost(bool* enabled) const {
862 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000863
Max Morin787eeed2016-06-23 10:42:07 +0200864 bool onOff(false);
niklase@google.com470e71d2011-07-07 08:21:25 +0000865
Max Morin787eeed2016-06-23 10:42:07 +0200866 if (_ptrAudioDevice->MicrophoneBoost(onOff) == -1) {
867 return -1;
868 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000869
Max Morin787eeed2016-06-23 10:42:07 +0200870 *enabled = onOff;
niklase@google.com470e71d2011-07-07 08:21:25 +0000871
Max Morin787eeed2016-06-23 10:42:07 +0200872 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u",
873 *enabled);
874 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000875}
876
877// ----------------------------------------------------------------------------
878// MicrophoneVolumeIsAvailable
879// ----------------------------------------------------------------------------
880
Max Morin787eeed2016-06-23 10:42:07 +0200881int32_t AudioDeviceModuleImpl::MicrophoneVolumeIsAvailable(bool* available) {
882 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000883
Max Morin787eeed2016-06-23 10:42:07 +0200884 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000885
Max Morin787eeed2016-06-23 10:42:07 +0200886 if (_ptrAudioDevice->MicrophoneVolumeIsAvailable(isAvailable) == -1) {
887 return -1;
888 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000889
Max Morin787eeed2016-06-23 10:42:07 +0200890 *available = isAvailable;
niklase@google.com470e71d2011-07-07 08:21:25 +0000891
Max Morin787eeed2016-06-23 10:42:07 +0200892 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d",
893 *available);
894 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000895}
896
897// ----------------------------------------------------------------------------
898// SetMicrophoneVolume
899// ----------------------------------------------------------------------------
900
Max Morin787eeed2016-06-23 10:42:07 +0200901int32_t AudioDeviceModuleImpl::SetMicrophoneVolume(uint32_t volume) {
902 CHECK_INITIALIZED();
903 return (_ptrAudioDevice->SetMicrophoneVolume(volume));
niklase@google.com470e71d2011-07-07 08:21:25 +0000904}
905
906// ----------------------------------------------------------------------------
907// MicrophoneVolume
908// ----------------------------------------------------------------------------
909
Max Morin787eeed2016-06-23 10:42:07 +0200910int32_t AudioDeviceModuleImpl::MicrophoneVolume(uint32_t* volume) const {
911 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__);
912 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000913
Max Morin787eeed2016-06-23 10:42:07 +0200914 uint32_t level(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000915
Max Morin787eeed2016-06-23 10:42:07 +0200916 if (_ptrAudioDevice->MicrophoneVolume(level) == -1) {
917 return -1;
918 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000919
Max Morin787eeed2016-06-23 10:42:07 +0200920 *volume = level;
niklase@google.com470e71d2011-07-07 08:21:25 +0000921
Max Morin787eeed2016-06-23 10:42:07 +0200922 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: volume=%u",
923 *volume);
924 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000925}
926
927// ----------------------------------------------------------------------------
928// StereoRecordingIsAvailable
929// ----------------------------------------------------------------------------
930
Max Morin787eeed2016-06-23 10:42:07 +0200931int32_t AudioDeviceModuleImpl::StereoRecordingIsAvailable(
932 bool* available) const {
933 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000934
Max Morin787eeed2016-06-23 10:42:07 +0200935 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000936
Max Morin787eeed2016-06-23 10:42:07 +0200937 if (_ptrAudioDevice->StereoRecordingIsAvailable(isAvailable) == -1) {
938 return -1;
939 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000940
Max Morin787eeed2016-06-23 10:42:07 +0200941 *available = isAvailable;
niklase@google.com470e71d2011-07-07 08:21:25 +0000942
Max Morin787eeed2016-06-23 10:42:07 +0200943 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d",
944 *available);
945 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000946}
947
948// ----------------------------------------------------------------------------
949// SetStereoRecording
950// ----------------------------------------------------------------------------
951
Max Morin787eeed2016-06-23 10:42:07 +0200952int32_t AudioDeviceModuleImpl::SetStereoRecording(bool enable) {
953 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000954
Max Morin787eeed2016-06-23 10:42:07 +0200955 if (_ptrAudioDevice->RecordingIsInitialized()) {
956 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
957 "recording in stereo is not supported");
958 return -1;
959 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000960
Max Morin787eeed2016-06-23 10:42:07 +0200961 if (_ptrAudioDevice->SetStereoRecording(enable) == -1) {
962 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
963 "failed to enable stereo recording");
964 return -1;
965 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000966
Max Morin787eeed2016-06-23 10:42:07 +0200967 int8_t nChannels(1);
968 if (enable) {
969 nChannels = 2;
970 }
971 _audioDeviceBuffer.SetRecordingChannels(nChannels);
niklase@google.com470e71d2011-07-07 08:21:25 +0000972
Max Morin787eeed2016-06-23 10:42:07 +0200973 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000974}
975
976// ----------------------------------------------------------------------------
977// StereoRecording
978// ----------------------------------------------------------------------------
979
Max Morin787eeed2016-06-23 10:42:07 +0200980int32_t AudioDeviceModuleImpl::StereoRecording(bool* enabled) const {
981 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +0000982
Max Morin787eeed2016-06-23 10:42:07 +0200983 bool stereo(false);
niklase@google.com470e71d2011-07-07 08:21:25 +0000984
Max Morin787eeed2016-06-23 10:42:07 +0200985 if (_ptrAudioDevice->StereoRecording(stereo) == -1) {
986 return -1;
987 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000988
Max Morin787eeed2016-06-23 10:42:07 +0200989 *enabled = stereo;
niklase@google.com470e71d2011-07-07 08:21:25 +0000990
Max Morin787eeed2016-06-23 10:42:07 +0200991 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u",
992 *enabled);
993 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000994}
995
996// ----------------------------------------------------------------------------
997// SetRecordingChannel
998// ----------------------------------------------------------------------------
999
Max Morin787eeed2016-06-23 10:42:07 +02001000int32_t AudioDeviceModuleImpl::SetRecordingChannel(const ChannelType channel) {
1001 if (channel == kChannelBoth) {
1002 } else if (channel == kChannelLeft) {
1003 } else {
1004 }
1005 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001006
Max Morin787eeed2016-06-23 10:42:07 +02001007 bool stereo(false);
niklase@google.com470e71d2011-07-07 08:21:25 +00001008
Max Morin787eeed2016-06-23 10:42:07 +02001009 if (_ptrAudioDevice->StereoRecording(stereo) == -1) {
1010 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1011 "recording in stereo is not supported");
1012 return -1;
1013 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001014
Max Morin787eeed2016-06-23 10:42:07 +02001015 return (_audioDeviceBuffer.SetRecordingChannel(channel));
niklase@google.com470e71d2011-07-07 08:21:25 +00001016}
1017
1018// ----------------------------------------------------------------------------
1019// RecordingChannel
1020// ----------------------------------------------------------------------------
1021
Max Morin787eeed2016-06-23 10:42:07 +02001022int32_t AudioDeviceModuleImpl::RecordingChannel(ChannelType* channel) const {
1023 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001024
Max Morin787eeed2016-06-23 10:42:07 +02001025 ChannelType chType;
niklase@google.com470e71d2011-07-07 08:21:25 +00001026
Max Morin787eeed2016-06-23 10:42:07 +02001027 if (_audioDeviceBuffer.RecordingChannel(chType) == -1) {
1028 return -1;
1029 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001030
Max Morin787eeed2016-06-23 10:42:07 +02001031 *channel = chType;
niklase@google.com470e71d2011-07-07 08:21:25 +00001032
Max Morin787eeed2016-06-23 10:42:07 +02001033 if (*channel == kChannelBoth) {
1034 } else if (*channel == kChannelLeft) {
1035 } else {
1036 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001037
Max Morin787eeed2016-06-23 10:42:07 +02001038 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001039}
1040
1041// ----------------------------------------------------------------------------
1042// StereoPlayoutIsAvailable
1043// ----------------------------------------------------------------------------
1044
Max Morin787eeed2016-06-23 10:42:07 +02001045int32_t AudioDeviceModuleImpl::StereoPlayoutIsAvailable(bool* available) const {
1046 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001047
Max Morin787eeed2016-06-23 10:42:07 +02001048 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001049
Max Morin787eeed2016-06-23 10:42:07 +02001050 if (_ptrAudioDevice->StereoPlayoutIsAvailable(isAvailable) == -1) {
1051 return -1;
1052 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001053
Max Morin787eeed2016-06-23 10:42:07 +02001054 *available = isAvailable;
niklase@google.com470e71d2011-07-07 08:21:25 +00001055
Max Morin787eeed2016-06-23 10:42:07 +02001056 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d",
1057 *available);
1058 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001059}
1060
1061// ----------------------------------------------------------------------------
1062// SetStereoPlayout
1063// ----------------------------------------------------------------------------
1064
Max Morin787eeed2016-06-23 10:42:07 +02001065int32_t AudioDeviceModuleImpl::SetStereoPlayout(bool enable) {
1066 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001067
Max Morin787eeed2016-06-23 10:42:07 +02001068 if (_ptrAudioDevice->PlayoutIsInitialized()) {
1069 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1070 "unable to set stereo mode while playing side is initialized");
1071 return -1;
1072 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001073
Max Morin787eeed2016-06-23 10:42:07 +02001074 if (_ptrAudioDevice->SetStereoPlayout(enable)) {
1075 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1076 "stereo playout is not supported");
1077 return -1;
1078 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001079
Max Morin787eeed2016-06-23 10:42:07 +02001080 int8_t nChannels(1);
1081 if (enable) {
1082 nChannels = 2;
1083 }
1084 _audioDeviceBuffer.SetPlayoutChannels(nChannels);
niklase@google.com470e71d2011-07-07 08:21:25 +00001085
Max Morin787eeed2016-06-23 10:42:07 +02001086 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001087}
1088
1089// ----------------------------------------------------------------------------
1090// StereoPlayout
1091// ----------------------------------------------------------------------------
1092
Max Morin787eeed2016-06-23 10:42:07 +02001093int32_t AudioDeviceModuleImpl::StereoPlayout(bool* enabled) const {
1094 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001095
Max Morin787eeed2016-06-23 10:42:07 +02001096 bool stereo(false);
niklase@google.com470e71d2011-07-07 08:21:25 +00001097
Max Morin787eeed2016-06-23 10:42:07 +02001098 if (_ptrAudioDevice->StereoPlayout(stereo) == -1) {
1099 return -1;
1100 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001101
Max Morin787eeed2016-06-23 10:42:07 +02001102 *enabled = stereo;
niklase@google.com470e71d2011-07-07 08:21:25 +00001103
Max Morin787eeed2016-06-23 10:42:07 +02001104 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: enabled=%u",
1105 *enabled);
1106 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001107}
1108
1109// ----------------------------------------------------------------------------
1110// SetAGC
1111// ----------------------------------------------------------------------------
1112
Max Morin787eeed2016-06-23 10:42:07 +02001113int32_t AudioDeviceModuleImpl::SetAGC(bool enable) {
1114 CHECK_INITIALIZED();
1115 return (_ptrAudioDevice->SetAGC(enable));
niklase@google.com470e71d2011-07-07 08:21:25 +00001116}
1117
1118// ----------------------------------------------------------------------------
1119// AGC
1120// ----------------------------------------------------------------------------
1121
Max Morin787eeed2016-06-23 10:42:07 +02001122bool AudioDeviceModuleImpl::AGC() const {
1123 CHECK_INITIALIZED_BOOL();
1124 return (_ptrAudioDevice->AGC());
niklase@google.com470e71d2011-07-07 08:21:25 +00001125}
1126
1127// ----------------------------------------------------------------------------
1128// PlayoutIsAvailable
1129// ----------------------------------------------------------------------------
1130
Max Morin787eeed2016-06-23 10:42:07 +02001131int32_t AudioDeviceModuleImpl::PlayoutIsAvailable(bool* available) {
1132 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->PlayoutIsAvailable(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;
niklase@google.com470e71d2011-07-07 08:21:25 +00001141
Max Morin787eeed2016-06-23 10:42:07 +02001142 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d",
1143 *available);
1144 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001145}
1146
1147// ----------------------------------------------------------------------------
1148// RecordingIsAvailable
1149// ----------------------------------------------------------------------------
1150
Max Morin787eeed2016-06-23 10:42:07 +02001151int32_t AudioDeviceModuleImpl::RecordingIsAvailable(bool* available) {
1152 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001153
Max Morin787eeed2016-06-23 10:42:07 +02001154 bool isAvailable(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001155
Max Morin787eeed2016-06-23 10:42:07 +02001156 if (_ptrAudioDevice->RecordingIsAvailable(isAvailable) == -1) {
1157 return -1;
1158 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001159
Max Morin787eeed2016-06-23 10:42:07 +02001160 *available = isAvailable;
niklase@google.com470e71d2011-07-07 08:21:25 +00001161
Max Morin787eeed2016-06-23 10:42:07 +02001162 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: available=%d",
1163 *available);
1164 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001165}
1166
1167// ----------------------------------------------------------------------------
1168// MaxMicrophoneVolume
1169// ----------------------------------------------------------------------------
1170
Max Morin787eeed2016-06-23 10:42:07 +02001171int32_t AudioDeviceModuleImpl::MaxMicrophoneVolume(uint32_t* maxVolume) const {
1172 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__);
1173 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001174
Max Morin787eeed2016-06-23 10:42:07 +02001175 uint32_t maxVol(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001176
Max Morin787eeed2016-06-23 10:42:07 +02001177 if (_ptrAudioDevice->MaxMicrophoneVolume(maxVol) == -1) {
1178 return -1;
1179 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001180
Max Morin787eeed2016-06-23 10:42:07 +02001181 *maxVolume = maxVol;
niklase@google.com470e71d2011-07-07 08:21:25 +00001182
Max Morin787eeed2016-06-23 10:42:07 +02001183 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: maxVolume=%d",
1184 *maxVolume);
1185 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001186}
1187
1188// ----------------------------------------------------------------------------
1189// MinMicrophoneVolume
1190// ----------------------------------------------------------------------------
1191
Max Morin787eeed2016-06-23 10:42:07 +02001192int32_t AudioDeviceModuleImpl::MinMicrophoneVolume(uint32_t* minVolume) const {
1193 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001194
Max Morin787eeed2016-06-23 10:42:07 +02001195 uint32_t minVol(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001196
Max Morin787eeed2016-06-23 10:42:07 +02001197 if (_ptrAudioDevice->MinMicrophoneVolume(minVol) == -1) {
1198 return -1;
1199 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001200
Max Morin787eeed2016-06-23 10:42:07 +02001201 *minVolume = minVol;
niklase@google.com470e71d2011-07-07 08:21:25 +00001202
Max Morin787eeed2016-06-23 10:42:07 +02001203 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: minVolume=%u",
1204 *minVolume);
1205 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001206}
1207
1208// ----------------------------------------------------------------------------
1209// MicrophoneVolumeStepSize
1210// ----------------------------------------------------------------------------
1211
Max Morin787eeed2016-06-23 10:42:07 +02001212int32_t AudioDeviceModuleImpl::MicrophoneVolumeStepSize(
1213 uint16_t* stepSize) const {
1214 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001215
Max Morin787eeed2016-06-23 10:42:07 +02001216 uint16_t delta(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001217
Max Morin787eeed2016-06-23 10:42:07 +02001218 if (_ptrAudioDevice->MicrophoneVolumeStepSize(delta) == -1) {
1219 return -1;
1220 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001221
Max Morin787eeed2016-06-23 10:42:07 +02001222 *stepSize = delta;
niklase@google.com470e71d2011-07-07 08:21:25 +00001223
Max Morin787eeed2016-06-23 10:42:07 +02001224 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: stepSize=%u",
1225 *stepSize);
1226 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001227}
1228
1229// ----------------------------------------------------------------------------
1230// PlayoutDevices
1231// ----------------------------------------------------------------------------
1232
Max Morin787eeed2016-06-23 10:42:07 +02001233int16_t AudioDeviceModuleImpl::PlayoutDevices() {
1234 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001235
Max Morin787eeed2016-06-23 10:42:07 +02001236 uint16_t nPlayoutDevices = _ptrAudioDevice->PlayoutDevices();
niklase@google.com470e71d2011-07-07 08:21:25 +00001237
Max Morin787eeed2016-06-23 10:42:07 +02001238 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id,
1239 "output: #playout devices=%d", nPlayoutDevices);
1240 return ((int16_t)(nPlayoutDevices));
niklase@google.com470e71d2011-07-07 08:21:25 +00001241}
1242
1243// ----------------------------------------------------------------------------
1244// SetPlayoutDevice I (II)
1245// ----------------------------------------------------------------------------
1246
Max Morin787eeed2016-06-23 10:42:07 +02001247int32_t AudioDeviceModuleImpl::SetPlayoutDevice(uint16_t index) {
1248 CHECK_INITIALIZED();
1249 return (_ptrAudioDevice->SetPlayoutDevice(index));
niklase@google.com470e71d2011-07-07 08:21:25 +00001250}
1251
1252// ----------------------------------------------------------------------------
1253// SetPlayoutDevice II (II)
1254// ----------------------------------------------------------------------------
1255
Max Morin787eeed2016-06-23 10:42:07 +02001256int32_t AudioDeviceModuleImpl::SetPlayoutDevice(WindowsDeviceType device) {
1257 if (device == kDefaultDevice) {
1258 } else {
1259 }
1260 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001261
Max Morin787eeed2016-06-23 10:42:07 +02001262 return (_ptrAudioDevice->SetPlayoutDevice(device));
niklase@google.com470e71d2011-07-07 08:21:25 +00001263}
1264
1265// ----------------------------------------------------------------------------
1266// PlayoutDeviceName
1267// ----------------------------------------------------------------------------
1268
pbos@webrtc.org25509882013-04-09 10:30:35 +00001269int32_t AudioDeviceModuleImpl::PlayoutDeviceName(
1270 uint16_t index,
leozwang@webrtc.org28f39132012-03-01 18:01:48 +00001271 char name[kAdmMaxDeviceNameSize],
Max Morin787eeed2016-06-23 10:42:07 +02001272 char guid[kAdmMaxGuidSize]) {
1273 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001274
Max Morin787eeed2016-06-23 10:42:07 +02001275 if (name == NULL) {
1276 _lastError = kAdmErrArgument;
1277 return -1;
1278 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001279
Max Morin787eeed2016-06-23 10:42:07 +02001280 if (_ptrAudioDevice->PlayoutDeviceName(index, name, guid) == -1) {
1281 return -1;
1282 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001283
Max Morin787eeed2016-06-23 10:42:07 +02001284 if (name != NULL) {
1285 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: name=%s",
1286 name);
1287 }
1288 if (guid != NULL) {
1289 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: guid=%s",
1290 guid);
1291 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001292
Max Morin787eeed2016-06-23 10:42:07 +02001293 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001294}
1295
1296// ----------------------------------------------------------------------------
1297// RecordingDeviceName
1298// ----------------------------------------------------------------------------
1299
pbos@webrtc.org25509882013-04-09 10:30:35 +00001300int32_t AudioDeviceModuleImpl::RecordingDeviceName(
1301 uint16_t index,
leozwang@webrtc.org28f39132012-03-01 18:01:48 +00001302 char name[kAdmMaxDeviceNameSize],
Max Morin787eeed2016-06-23 10:42:07 +02001303 char guid[kAdmMaxGuidSize]) {
1304 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001305
Max Morin787eeed2016-06-23 10:42:07 +02001306 if (name == NULL) {
1307 _lastError = kAdmErrArgument;
1308 return -1;
1309 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001310
Max Morin787eeed2016-06-23 10:42:07 +02001311 if (_ptrAudioDevice->RecordingDeviceName(index, name, guid) == -1) {
1312 return -1;
1313 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001314
Max Morin787eeed2016-06-23 10:42:07 +02001315 if (name != NULL) {
1316 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: name=%s",
1317 name);
1318 }
1319 if (guid != NULL) {
1320 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: guid=%s",
1321 guid);
1322 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001323
Max Morin787eeed2016-06-23 10:42:07 +02001324 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001325}
1326
1327// ----------------------------------------------------------------------------
1328// RecordingDevices
1329// ----------------------------------------------------------------------------
1330
Max Morin787eeed2016-06-23 10:42:07 +02001331int16_t AudioDeviceModuleImpl::RecordingDevices() {
1332 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001333
Max Morin787eeed2016-06-23 10:42:07 +02001334 uint16_t nRecordingDevices = _ptrAudioDevice->RecordingDevices();
niklase@google.com470e71d2011-07-07 08:21:25 +00001335
Max Morin787eeed2016-06-23 10:42:07 +02001336 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id,
1337 "output: #recording devices=%d", nRecordingDevices);
1338 return ((int16_t)nRecordingDevices);
niklase@google.com470e71d2011-07-07 08:21:25 +00001339}
1340
1341// ----------------------------------------------------------------------------
1342// SetRecordingDevice I (II)
1343// ----------------------------------------------------------------------------
1344
Max Morin787eeed2016-06-23 10:42:07 +02001345int32_t AudioDeviceModuleImpl::SetRecordingDevice(uint16_t index) {
1346 CHECK_INITIALIZED();
1347 return (_ptrAudioDevice->SetRecordingDevice(index));
niklase@google.com470e71d2011-07-07 08:21:25 +00001348}
1349
1350// ----------------------------------------------------------------------------
1351// SetRecordingDevice II (II)
1352// ----------------------------------------------------------------------------
1353
Max Morin787eeed2016-06-23 10:42:07 +02001354int32_t AudioDeviceModuleImpl::SetRecordingDevice(WindowsDeviceType device) {
1355 if (device == kDefaultDevice) {
1356 } else {
1357 }
1358 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001359
Max Morin787eeed2016-06-23 10:42:07 +02001360 return (_ptrAudioDevice->SetRecordingDevice(device));
niklase@google.com470e71d2011-07-07 08:21:25 +00001361}
1362
1363// ----------------------------------------------------------------------------
1364// InitPlayout
1365// ----------------------------------------------------------------------------
1366
Max Morin787eeed2016-06-23 10:42:07 +02001367int32_t AudioDeviceModuleImpl::InitPlayout() {
1368 CHECK_INITIALIZED();
1369 _audioDeviceBuffer.InitPlayout();
1370 return (_ptrAudioDevice->InitPlayout());
niklase@google.com470e71d2011-07-07 08:21:25 +00001371}
1372
1373// ----------------------------------------------------------------------------
1374// InitRecording
1375// ----------------------------------------------------------------------------
1376
Max Morin787eeed2016-06-23 10:42:07 +02001377int32_t AudioDeviceModuleImpl::InitRecording() {
1378 TRACE_EVENT0("webrtc", "AudioDeviceModuleImpl::InitRecording");
1379 CHECK_INITIALIZED();
1380 _audioDeviceBuffer.InitRecording();
1381 return (_ptrAudioDevice->InitRecording());
niklase@google.com470e71d2011-07-07 08:21:25 +00001382}
1383
1384// ----------------------------------------------------------------------------
1385// PlayoutIsInitialized
1386// ----------------------------------------------------------------------------
1387
Max Morin787eeed2016-06-23 10:42:07 +02001388bool AudioDeviceModuleImpl::PlayoutIsInitialized() const {
1389 CHECK_INITIALIZED_BOOL();
1390 return (_ptrAudioDevice->PlayoutIsInitialized());
niklase@google.com470e71d2011-07-07 08:21:25 +00001391}
1392
1393// ----------------------------------------------------------------------------
1394// RecordingIsInitialized
1395// ----------------------------------------------------------------------------
1396
Max Morin787eeed2016-06-23 10:42:07 +02001397bool AudioDeviceModuleImpl::RecordingIsInitialized() const {
1398 CHECK_INITIALIZED_BOOL();
1399 return (_ptrAudioDevice->RecordingIsInitialized());
niklase@google.com470e71d2011-07-07 08:21:25 +00001400}
1401
1402// ----------------------------------------------------------------------------
1403// StartPlayout
1404// ----------------------------------------------------------------------------
1405
Max Morin787eeed2016-06-23 10:42:07 +02001406int32_t AudioDeviceModuleImpl::StartPlayout() {
1407 CHECK_INITIALIZED();
1408 return (_ptrAudioDevice->StartPlayout());
niklase@google.com470e71d2011-07-07 08:21:25 +00001409}
1410
1411// ----------------------------------------------------------------------------
1412// StopPlayout
1413// ----------------------------------------------------------------------------
1414
Max Morin787eeed2016-06-23 10:42:07 +02001415int32_t AudioDeviceModuleImpl::StopPlayout() {
1416 CHECK_INITIALIZED();
1417 return (_ptrAudioDevice->StopPlayout());
niklase@google.com470e71d2011-07-07 08:21:25 +00001418}
1419
1420// ----------------------------------------------------------------------------
1421// Playing
1422// ----------------------------------------------------------------------------
1423
Max Morin787eeed2016-06-23 10:42:07 +02001424bool AudioDeviceModuleImpl::Playing() const {
1425 CHECK_INITIALIZED_BOOL();
1426 return (_ptrAudioDevice->Playing());
niklase@google.com470e71d2011-07-07 08:21:25 +00001427}
1428
1429// ----------------------------------------------------------------------------
1430// StartRecording
1431// ----------------------------------------------------------------------------
1432
Max Morin787eeed2016-06-23 10:42:07 +02001433int32_t AudioDeviceModuleImpl::StartRecording() {
1434 TRACE_EVENT0("webrtc", "AudioDeviceModuleImpl::StartRecording");
1435 CHECK_INITIALIZED();
1436 return (_ptrAudioDevice->StartRecording());
niklase@google.com470e71d2011-07-07 08:21:25 +00001437}
1438// ----------------------------------------------------------------------------
1439// StopRecording
1440// ----------------------------------------------------------------------------
1441
Max Morin787eeed2016-06-23 10:42:07 +02001442int32_t AudioDeviceModuleImpl::StopRecording() {
1443 CHECK_INITIALIZED();
1444 return (_ptrAudioDevice->StopRecording());
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 {
1452 CHECK_INITIALIZED_BOOL();
1453 return (_ptrAudioDevice->Recording());
niklase@google.com470e71d2011-07-07 08:21:25 +00001454}
1455
1456// ----------------------------------------------------------------------------
1457// RegisterEventObserver
1458// ----------------------------------------------------------------------------
1459
Max Morin787eeed2016-06-23 10:42:07 +02001460int32_t AudioDeviceModuleImpl::RegisterEventObserver(
1461 AudioDeviceObserver* eventCallback) {
1462 CriticalSectionScoped lock(&_critSectEventCb);
1463 _ptrCbAudioDeviceObserver = eventCallback;
niklase@google.com470e71d2011-07-07 08:21:25 +00001464
Max Morin787eeed2016-06-23 10:42:07 +02001465 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001466}
1467
1468// ----------------------------------------------------------------------------
1469// RegisterAudioCallback
1470// ----------------------------------------------------------------------------
1471
Max Morin787eeed2016-06-23 10:42:07 +02001472int32_t AudioDeviceModuleImpl::RegisterAudioCallback(
1473 AudioTransport* audioCallback) {
1474 CriticalSectionScoped lock(&_critSectAudioCb);
1475 _audioDeviceBuffer.RegisterAudioCallback(audioCallback);
niklase@google.com470e71d2011-07-07 08:21:25 +00001476
Max Morin787eeed2016-06-23 10:42:07 +02001477 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001478}
1479
1480// ----------------------------------------------------------------------------
1481// StartRawInputFileRecording
1482// ----------------------------------------------------------------------------
1483
pbos@webrtc.org25509882013-04-09 10:30:35 +00001484int32_t AudioDeviceModuleImpl::StartRawInputFileRecording(
Max Morin787eeed2016-06-23 10:42:07 +02001485 const char pcmFileNameUTF8[kAdmMaxFileNameSize]) {
1486 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001487
Max Morin787eeed2016-06-23 10:42:07 +02001488 if (NULL == pcmFileNameUTF8) {
1489 return -1;
1490 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001491
Max Morin787eeed2016-06-23 10:42:07 +02001492 return (_audioDeviceBuffer.StartInputFileRecording(pcmFileNameUTF8));
niklase@google.com470e71d2011-07-07 08:21:25 +00001493}
1494
1495// ----------------------------------------------------------------------------
1496// StopRawInputFileRecording
1497// ----------------------------------------------------------------------------
1498
Max Morin787eeed2016-06-23 10:42:07 +02001499int32_t AudioDeviceModuleImpl::StopRawInputFileRecording() {
1500 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001501
Max Morin787eeed2016-06-23 10:42:07 +02001502 return (_audioDeviceBuffer.StopInputFileRecording());
niklase@google.com470e71d2011-07-07 08:21:25 +00001503}
1504
1505// ----------------------------------------------------------------------------
1506// StartRawOutputFileRecording
1507// ----------------------------------------------------------------------------
1508
pbos@webrtc.org25509882013-04-09 10:30:35 +00001509int32_t AudioDeviceModuleImpl::StartRawOutputFileRecording(
Max Morin787eeed2016-06-23 10:42:07 +02001510 const char pcmFileNameUTF8[kAdmMaxFileNameSize]) {
1511 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001512
Max Morin787eeed2016-06-23 10:42:07 +02001513 if (NULL == pcmFileNameUTF8) {
1514 return -1;
1515 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001516
Max Morin787eeed2016-06-23 10:42:07 +02001517 return (_audioDeviceBuffer.StartOutputFileRecording(pcmFileNameUTF8));
niklase@google.com470e71d2011-07-07 08:21:25 +00001518}
1519
1520// ----------------------------------------------------------------------------
1521// StopRawOutputFileRecording
1522// ----------------------------------------------------------------------------
1523
Max Morin787eeed2016-06-23 10:42:07 +02001524int32_t AudioDeviceModuleImpl::StopRawOutputFileRecording() {
1525 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001526
Max Morin787eeed2016-06-23 10:42:07 +02001527 return (_audioDeviceBuffer.StopOutputFileRecording());
niklase@google.com470e71d2011-07-07 08:21:25 +00001528}
1529
1530// ----------------------------------------------------------------------------
1531// SetPlayoutBuffer
1532// ----------------------------------------------------------------------------
1533
Max Morin787eeed2016-06-23 10:42:07 +02001534int32_t AudioDeviceModuleImpl::SetPlayoutBuffer(const BufferType type,
1535 uint16_t sizeMS) {
1536 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001537
Max Morin787eeed2016-06-23 10:42:07 +02001538 if (_ptrAudioDevice->PlayoutIsInitialized()) {
1539 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1540 "unable to modify the playout buffer while playing side is "
1541 "initialized");
1542 return -1;
1543 }
1544
1545 int32_t ret(0);
1546
1547 if (kFixedBufferSize == type) {
1548 if (sizeMS < kAdmMinPlayoutBufferSizeMs ||
1549 sizeMS > kAdmMaxPlayoutBufferSizeMs) {
1550 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1551 "size parameter is out of range");
1552 return -1;
niklase@google.com470e71d2011-07-07 08:21:25 +00001553 }
Max Morin787eeed2016-06-23 10:42:07 +02001554 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001555
Max Morin787eeed2016-06-23 10:42:07 +02001556 if ((ret = _ptrAudioDevice->SetPlayoutBuffer(type, sizeMS)) == -1) {
1557 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1558 "failed to set the playout buffer (error: %d)", LastError());
1559 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001560
Max Morin787eeed2016-06-23 10:42:07 +02001561 return ret;
niklase@google.com470e71d2011-07-07 08:21:25 +00001562}
1563
1564// ----------------------------------------------------------------------------
1565// PlayoutBuffer
1566// ----------------------------------------------------------------------------
1567
Max Morin787eeed2016-06-23 10:42:07 +02001568int32_t AudioDeviceModuleImpl::PlayoutBuffer(BufferType* type,
1569 uint16_t* sizeMS) const {
1570 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001571
Max Morin787eeed2016-06-23 10:42:07 +02001572 BufferType bufType;
1573 uint16_t size(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001574
Max Morin787eeed2016-06-23 10:42:07 +02001575 if (_ptrAudioDevice->PlayoutBuffer(bufType, size) == -1) {
1576 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1577 "failed to retrieve the buffer type and size");
1578 return -1;
1579 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001580
Max Morin787eeed2016-06-23 10:42:07 +02001581 *type = bufType;
1582 *sizeMS = size;
niklase@google.com470e71d2011-07-07 08:21:25 +00001583
Max Morin787eeed2016-06-23 10:42:07 +02001584 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id,
1585 "output: type=%u, sizeMS=%u", *type, *sizeMS);
1586 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001587}
1588
1589// ----------------------------------------------------------------------------
1590// PlayoutDelay
1591// ----------------------------------------------------------------------------
1592
Max Morin787eeed2016-06-23 10:42:07 +02001593int32_t AudioDeviceModuleImpl::PlayoutDelay(uint16_t* delayMS) const {
1594 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__);
1595 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001596
Max Morin787eeed2016-06-23 10:42:07 +02001597 uint16_t delay(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001598
Max Morin787eeed2016-06-23 10:42:07 +02001599 if (_ptrAudioDevice->PlayoutDelay(delay) == -1) {
1600 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1601 "failed to retrieve the playout delay");
1602 return -1;
1603 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001604
Max Morin787eeed2016-06-23 10:42:07 +02001605 *delayMS = delay;
niklase@google.com470e71d2011-07-07 08:21:25 +00001606
Max Morin787eeed2016-06-23 10:42:07 +02001607 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: delayMS=%u",
1608 *delayMS);
1609 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001610}
1611
1612// ----------------------------------------------------------------------------
1613// RecordingDelay
1614// ----------------------------------------------------------------------------
1615
Max Morin787eeed2016-06-23 10:42:07 +02001616int32_t AudioDeviceModuleImpl::RecordingDelay(uint16_t* delayMS) const {
1617 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "%s", __FUNCTION__);
1618 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001619
Max Morin787eeed2016-06-23 10:42:07 +02001620 uint16_t delay(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001621
Max Morin787eeed2016-06-23 10:42:07 +02001622 if (_ptrAudioDevice->RecordingDelay(delay) == -1) {
1623 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1624 "failed to retrieve the recording delay");
1625 return -1;
1626 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001627
Max Morin787eeed2016-06-23 10:42:07 +02001628 *delayMS = delay;
niklase@google.com470e71d2011-07-07 08:21:25 +00001629
Max Morin787eeed2016-06-23 10:42:07 +02001630 WEBRTC_TRACE(kTraceStream, kTraceAudioDevice, _id, "output: delayMS=%u",
1631 *delayMS);
1632 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001633}
1634
1635// ----------------------------------------------------------------------------
1636// CPULoad
1637// ----------------------------------------------------------------------------
1638
Max Morin787eeed2016-06-23 10:42:07 +02001639int32_t AudioDeviceModuleImpl::CPULoad(uint16_t* load) const {
1640 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001641
Max Morin787eeed2016-06-23 10:42:07 +02001642 uint16_t cpuLoad(0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001643
Max Morin787eeed2016-06-23 10:42:07 +02001644 if (_ptrAudioDevice->CPULoad(cpuLoad) == -1) {
1645 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1646 "failed to retrieve the CPU load");
1647 return -1;
1648 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001649
Max Morin787eeed2016-06-23 10:42:07 +02001650 *load = cpuLoad;
niklase@google.com470e71d2011-07-07 08:21:25 +00001651
Max Morin787eeed2016-06-23 10:42:07 +02001652 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id, "output: load=%u",
1653 *load);
1654 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001655}
1656
1657// ----------------------------------------------------------------------------
1658// SetRecordingSampleRate
1659// ----------------------------------------------------------------------------
1660
Max Morin787eeed2016-06-23 10:42:07 +02001661int32_t AudioDeviceModuleImpl::SetRecordingSampleRate(
1662 const uint32_t samplesPerSec) {
1663 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001664
Max Morin787eeed2016-06-23 10:42:07 +02001665 if (_ptrAudioDevice->SetRecordingSampleRate(samplesPerSec) != 0) {
1666 return -1;
1667 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001668
Max Morin787eeed2016-06-23 10:42:07 +02001669 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001670}
1671
1672// ----------------------------------------------------------------------------
1673// RecordingSampleRate
1674// ----------------------------------------------------------------------------
1675
Max Morin787eeed2016-06-23 10:42:07 +02001676int32_t AudioDeviceModuleImpl::RecordingSampleRate(
1677 uint32_t* samplesPerSec) const {
1678 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001679
Max Morin787eeed2016-06-23 10:42:07 +02001680 int32_t sampleRate = _audioDeviceBuffer.RecordingSampleRate();
niklase@google.com470e71d2011-07-07 08:21:25 +00001681
Max Morin787eeed2016-06-23 10:42:07 +02001682 if (sampleRate == -1) {
1683 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1684 "failed to retrieve the sample rate");
1685 return -1;
1686 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001687
Max Morin787eeed2016-06-23 10:42:07 +02001688 *samplesPerSec = sampleRate;
niklase@google.com470e71d2011-07-07 08:21:25 +00001689
Max Morin787eeed2016-06-23 10:42:07 +02001690 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id,
1691 "output: samplesPerSec=%u", *samplesPerSec);
1692 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001693}
1694
1695// ----------------------------------------------------------------------------
1696// SetPlayoutSampleRate
1697// ----------------------------------------------------------------------------
1698
Max Morin787eeed2016-06-23 10:42:07 +02001699int32_t AudioDeviceModuleImpl::SetPlayoutSampleRate(
1700 const uint32_t samplesPerSec) {
1701 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001702
Max Morin787eeed2016-06-23 10:42:07 +02001703 if (_ptrAudioDevice->SetPlayoutSampleRate(samplesPerSec) != 0) {
1704 return -1;
1705 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001706
Max Morin787eeed2016-06-23 10:42:07 +02001707 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001708}
1709
1710// ----------------------------------------------------------------------------
1711// PlayoutSampleRate
1712// ----------------------------------------------------------------------------
1713
Max Morin787eeed2016-06-23 10:42:07 +02001714int32_t AudioDeviceModuleImpl::PlayoutSampleRate(
1715 uint32_t* samplesPerSec) const {
1716 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001717
Max Morin787eeed2016-06-23 10:42:07 +02001718 int32_t sampleRate = _audioDeviceBuffer.PlayoutSampleRate();
niklase@google.com470e71d2011-07-07 08:21:25 +00001719
Max Morin787eeed2016-06-23 10:42:07 +02001720 if (sampleRate == -1) {
1721 WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
1722 "failed to retrieve the sample rate");
1723 return -1;
1724 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001725
Max Morin787eeed2016-06-23 10:42:07 +02001726 *samplesPerSec = sampleRate;
niklase@google.com470e71d2011-07-07 08:21:25 +00001727
Max Morin787eeed2016-06-23 10:42:07 +02001728 WEBRTC_TRACE(kTraceStateInfo, kTraceAudioDevice, _id,
1729 "output: samplesPerSec=%u", *samplesPerSec);
1730 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001731}
1732
1733// ----------------------------------------------------------------------------
1734// ResetAudioDevice
1735// ----------------------------------------------------------------------------
1736
Max Morin787eeed2016-06-23 10:42:07 +02001737int32_t AudioDeviceModuleImpl::ResetAudioDevice() {
1738 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001739
Max Morin787eeed2016-06-23 10:42:07 +02001740 if (_ptrAudioDevice->ResetAudioDevice() == -1) {
1741 return -1;
1742 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001743
Max Morin787eeed2016-06-23 10:42:07 +02001744 return (0);
niklase@google.com470e71d2011-07-07 08:21:25 +00001745}
1746
1747// ----------------------------------------------------------------------------
1748// SetLoudspeakerStatus
1749// ----------------------------------------------------------------------------
1750
Max Morin787eeed2016-06-23 10:42:07 +02001751int32_t AudioDeviceModuleImpl::SetLoudspeakerStatus(bool enable) {
1752 CHECK_INITIALIZED();
niklase@google.com470e71d2011-07-07 08:21:25 +00001753
Max Morin787eeed2016-06-23 10:42:07 +02001754 if (_ptrAudioDevice->SetLoudspeakerStatus(enable) != 0) {
1755 return -1;
1756 }
niklase@google.com470e71d2011-07-07 08:21:25 +00001757
Max Morin787eeed2016-06-23 10:42:07 +02001758 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +00001759}
1760
1761// ----------------------------------------------------------------------------
1762// GetLoudspeakerStatus
1763// ----------------------------------------------------------------------------
1764
henrikac14f5ff2015-09-23 14:08:33 +02001765int32_t AudioDeviceModuleImpl::GetLoudspeakerStatus(bool* enabled) const {
henrika@webrtc.orga954c072014-12-09 16:22:09 +00001766 CHECK_INITIALIZED();
henrikac14f5ff2015-09-23 14:08:33 +02001767 if (_ptrAudioDevice->GetLoudspeakerStatus(*enabled) != 0) {
1768 return -1;
1769 }
1770 return 0;
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +00001771}
1772
henrikac14f5ff2015-09-23 14:08:33 +02001773bool AudioDeviceModuleImpl::BuiltInAECIsEnabled() const {
1774 CHECK_INITIALIZED_BOOL();
1775 return _ptrAudioDevice->BuiltInAECIsEnabled();
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +00001776}
1777
henrika@webrtc.orga954c072014-12-09 16:22:09 +00001778bool AudioDeviceModuleImpl::BuiltInAECIsAvailable() const {
1779 CHECK_INITIALIZED_BOOL();
1780 return _ptrAudioDevice->BuiltInAECIsAvailable();
1781}
1782
henrikac14f5ff2015-09-23 14:08:33 +02001783int32_t AudioDeviceModuleImpl::EnableBuiltInAEC(bool enable) {
1784 CHECK_INITIALIZED();
1785 return _ptrAudioDevice->EnableBuiltInAEC(enable);
1786}
1787
1788bool AudioDeviceModuleImpl::BuiltInAGCIsAvailable() const {
1789 CHECK_INITIALIZED_BOOL();
1790 return _ptrAudioDevice->BuiltInAGCIsAvailable();
1791}
1792
1793int32_t AudioDeviceModuleImpl::EnableBuiltInAGC(bool enable) {
1794 CHECK_INITIALIZED();
1795 return _ptrAudioDevice->EnableBuiltInAGC(enable);
1796}
1797
1798bool AudioDeviceModuleImpl::BuiltInNSIsAvailable() const {
1799 CHECK_INITIALIZED_BOOL();
1800 return _ptrAudioDevice->BuiltInNSIsAvailable();
1801}
1802
1803int32_t AudioDeviceModuleImpl::EnableBuiltInNS(bool enable) {
1804 CHECK_INITIALIZED();
1805 return _ptrAudioDevice->EnableBuiltInNS(enable);
1806}
1807
henrikaba35d052015-07-14 17:04:08 +02001808int AudioDeviceModuleImpl::GetPlayoutAudioParameters(
1809 AudioParameters* params) const {
1810 return _ptrAudioDevice->GetPlayoutAudioParameters(params);
1811}
1812
1813int AudioDeviceModuleImpl::GetRecordAudioParameters(
1814 AudioParameters* params) const {
1815 return _ptrAudioDevice->GetRecordAudioParameters(params);
1816}
1817
niklase@google.com470e71d2011-07-07 08:21:25 +00001818// ============================================================================
1819// Private Methods
1820// ============================================================================
1821
1822// ----------------------------------------------------------------------------
1823// Platform
1824// ----------------------------------------------------------------------------
1825
Max Morin787eeed2016-06-23 10:42:07 +02001826AudioDeviceModuleImpl::PlatformType AudioDeviceModuleImpl::Platform() const {
1827 return _platformType;
niklase@google.com470e71d2011-07-07 08:21:25 +00001828}
1829
1830// ----------------------------------------------------------------------------
1831// PlatformAudioLayer
1832// ----------------------------------------------------------------------------
1833
Max Morin787eeed2016-06-23 10:42:07 +02001834AudioDeviceModule::AudioLayer AudioDeviceModuleImpl::PlatformAudioLayer()
1835 const {
1836 return _platformAudioLayer;
niklase@google.com470e71d2011-07-07 08:21:25 +00001837}
1838
1839} // namespace webrtc