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