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
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/include/audio_device_defines.h"
15bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/interface/module.h"
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AudioDeviceModule : public RefCountedModule {
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  enum ErrorCode {
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kAdmErrNone = 0,
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kAdmErrArgument = 1
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  };
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  enum AudioLayer {
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kPlatformDefaultAudio = 0,
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kWindowsWaveAudio = 1,
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kWindowsCoreAudio = 2,
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kLinuxAlsaAudio = 3,
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kLinuxPulseAudio = 4,
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kDummyAudio = 5
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  };
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  enum WindowsDeviceType {
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kDefaultCommunicationDevice = -1,
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kDefaultDevice = -2
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  };
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  enum BufferType {
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kFixedBufferSize  = 0,
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kAdaptiveBufferSize = 1
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  };
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  enum ChannelType {
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kChannelLeft = 0,
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kChannelRight = 1,
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    kChannelBoth = 2
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  };
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Retrieve the currently utilized audio layer
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t ActiveAudioLayer(AudioLayer* audioLayer) const = 0;
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Error handling
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual ErrorCode LastError() const = 0;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t RegisterEventObserver(AudioDeviceObserver* eventCallback) = 0;
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Full-duplex transportation of PCM audio
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t RegisterAudioCallback(AudioTransport* audioCallback) = 0;
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Main initialization and termination
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t Init() = 0;
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t Terminate() = 0;
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual bool Initialized() const = 0;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Device enumeration
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int16_t PlayoutDevices() = 0;
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int16_t RecordingDevices() = 0;
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t PlayoutDeviceName(uint16_t index,
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    char name[kAdmMaxDeviceNameSize],
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    char guid[kAdmMaxGuidSize]) = 0;
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t RecordingDeviceName(uint16_t index,
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      char name[kAdmMaxDeviceNameSize],
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      char guid[kAdmMaxGuidSize]) = 0;
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Device selection
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetPlayoutDevice(uint16_t index) = 0;
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetPlayoutDevice(WindowsDeviceType device) = 0;
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetRecordingDevice(uint16_t index) = 0;
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetRecordingDevice(WindowsDeviceType device) = 0;
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Audio transport initialization
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t PlayoutIsAvailable(bool* available) = 0;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t InitPlayout() = 0;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual bool PlayoutIsInitialized() const = 0;
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t RecordingIsAvailable(bool* available) = 0;
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t InitRecording() = 0;
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual bool RecordingIsInitialized() const = 0;
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Audio transport control
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StartPlayout() = 0;
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StopPlayout() = 0;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual bool Playing() const = 0;
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StartRecording() = 0;
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StopRecording() = 0;
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual bool Recording() const = 0;
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Microphone Automatic Gain Control (AGC)
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetAGC(bool enable) = 0;
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual bool AGC() const = 0;
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Volume control based on the Windows Wave API (Windows only)
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetWaveOutVolume(uint16_t volumeLeft,
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   uint16_t volumeRight) = 0;
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t WaveOutVolume(uint16_t* volumeLeft,
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                uint16_t* volumeRight) const = 0;
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Audio mixer initialization
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t InitSpeaker() = 0;
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual bool SpeakerIsInitialized() const = 0;
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t InitMicrophone() = 0;
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual bool MicrophoneIsInitialized() const = 0;
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Speaker volume controls
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SpeakerVolumeIsAvailable(bool* available) = 0;
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetSpeakerVolume(uint32_t volume) = 0;
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SpeakerVolume(uint32_t* volume) const = 0;
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MaxSpeakerVolume(uint32_t* maxVolume) const = 0;
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MinSpeakerVolume(uint32_t* minVolume) const = 0;
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SpeakerVolumeStepSize(uint16_t* stepSize) const = 0;
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Microphone volume controls
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MicrophoneVolumeIsAvailable(bool* available) = 0;
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetMicrophoneVolume(uint32_t volume) = 0;
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MicrophoneVolume(uint32_t* volume) const = 0;
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const = 0;
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MinMicrophoneVolume(uint32_t* minVolume) const = 0;
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MicrophoneVolumeStepSize(uint16_t* stepSize) const = 0;
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Speaker mute control
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SpeakerMuteIsAvailable(bool* available) = 0;
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetSpeakerMute(bool enable) = 0;
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SpeakerMute(bool* enabled) const = 0;
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Microphone mute control
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MicrophoneMuteIsAvailable(bool* available) = 0;
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetMicrophoneMute(bool enable) = 0;
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MicrophoneMute(bool* enabled) const = 0;
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Microphone boost control
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MicrophoneBoostIsAvailable(bool* available) = 0;
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetMicrophoneBoost(bool enable) = 0;
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t MicrophoneBoost(bool* enabled) const = 0;
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Stereo support
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StereoPlayoutIsAvailable(bool* available) const = 0;
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetStereoPlayout(bool enable) = 0;
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StereoPlayout(bool* enabled) const = 0;
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StereoRecordingIsAvailable(bool* available) const = 0;
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetStereoRecording(bool enable) = 0;
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StereoRecording(bool* enabled) const = 0;
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetRecordingChannel(const ChannelType channel) = 0;
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t RecordingChannel(ChannelType* channel) const = 0;
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Delay information and control
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetPlayoutBuffer(const BufferType type,
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   uint16_t sizeMS = 0) = 0;
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t PlayoutBuffer(BufferType* type, uint16_t* sizeMS) const = 0;
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t PlayoutDelay(uint16_t* delayMS) const = 0;
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t RecordingDelay(uint16_t* delayMS) const = 0;
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // CPU load
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t CPULoad(uint16_t* load) const = 0;
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Recording of raw PCM data
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StartRawOutputFileRecording(
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const char pcmFileNameUTF8[kAdmMaxFileNameSize]) = 0;
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StopRawOutputFileRecording() = 0;
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StartRawInputFileRecording(
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      const char pcmFileNameUTF8[kAdmMaxFileNameSize]) = 0;
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t StopRawInputFileRecording() = 0;
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Native sample rate controls (samples/sec)
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetRecordingSampleRate(const uint32_t samplesPerSec) = 0;
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t RecordingSampleRate(uint32_t* samplesPerSec) const = 0;
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) = 0;
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t PlayoutSampleRate(uint32_t* samplesPerSec) const = 0;
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Mobile device specific functions
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t ResetAudioDevice() = 0;
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t SetLoudspeakerStatus(bool enable) = 0;
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t GetLoudspeakerStatus(bool* enabled) const = 0;
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // *Experimental - not recommended for use.*
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Enables the Windows Core Audio built-in AEC. Fails on other platforms.
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Must be called before InitRecording(). When enabled:
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // 1. StartPlayout() must be called before StartRecording().
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // 2. StopRecording() should be called before StopPlayout().
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //    The reverse order may cause garbage audio to be rendered or the
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //    capture side to halt until StopRecording() is called.
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual int32_t EnableBuiltInAEC(bool enable) { return -1; }
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual bool BuiltInAECIsEnabled() const { return false; }
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected:
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual ~AudioDeviceModule() {};
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgAudioDeviceModule* CreateAudioDeviceModule(
20164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org    int32_t id, AudioDeviceModule::AudioLayer audioLayer);
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
206