blob: 736ed352846d8bc06d46e37537603911e2a42bd8 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
henrike@webrtc.org70efc322012-02-23 17:45:33 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
xians@webrtc.org597b4472012-10-11 15:41:55 +000011#ifndef MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
12#define MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
pbos@webrtc.org811269d2013-07-11 13:24:38 +000014#include "webrtc/modules/audio_device/include/audio_device_defines.h"
15#include "webrtc/modules/interface/module.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000016
17namespace webrtc {
18
henrika@google.com73d65512011-09-07 15:11:18 +000019class AudioDeviceModule : public RefCountedModule {
20 public:
21 enum ErrorCode {
22 kAdmErrNone = 0,
23 kAdmErrArgument = 1
24 };
niklase@google.com470e71d2011-07-07 08:21:25 +000025
henrika@google.com73d65512011-09-07 15:11:18 +000026 enum AudioLayer {
27 kPlatformDefaultAudio = 0,
28 kWindowsWaveAudio = 1,
29 kWindowsCoreAudio = 2,
30 kLinuxAlsaAudio = 3,
31 kLinuxPulseAudio = 4,
32 kDummyAudio = 5
33 };
niklase@google.com470e71d2011-07-07 08:21:25 +000034
henrika@google.com73d65512011-09-07 15:11:18 +000035 enum WindowsDeviceType {
36 kDefaultCommunicationDevice = -1,
37 kDefaultDevice = -2
38 };
niklase@google.com470e71d2011-07-07 08:21:25 +000039
henrika@google.com73d65512011-09-07 15:11:18 +000040 enum BufferType {
41 kFixedBufferSize = 0,
42 kAdaptiveBufferSize = 1
43 };
niklase@google.com470e71d2011-07-07 08:21:25 +000044
henrika@google.com73d65512011-09-07 15:11:18 +000045 enum ChannelType {
46 kChannelLeft = 0,
47 kChannelRight = 1,
48 kChannelBoth = 2
49 };
niklase@google.com470e71d2011-07-07 08:21:25 +000050
henrika@google.com73d65512011-09-07 15:11:18 +000051 public:
52 // Retrieve the currently utilized audio layer
53 virtual int32_t ActiveAudioLayer(AudioLayer* audioLayer) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000054
henrika@google.com73d65512011-09-07 15:11:18 +000055 // Error handling
56 virtual ErrorCode LastError() const = 0;
57 virtual int32_t RegisterEventObserver(AudioDeviceObserver* eventCallback) = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000058
henrika@google.com73d65512011-09-07 15:11:18 +000059 // Full-duplex transportation of PCM audio
60 virtual int32_t RegisterAudioCallback(AudioTransport* audioCallback) = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000061
henrika@google.com73d65512011-09-07 15:11:18 +000062 // Main initialization and termination
63 virtual int32_t Init() = 0;
64 virtual int32_t Terminate() = 0;
65 virtual bool Initialized() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000066
henrika@google.com73d65512011-09-07 15:11:18 +000067 // Device enumeration
68 virtual int16_t PlayoutDevices() = 0;
69 virtual int16_t RecordingDevices() = 0;
70 virtual int32_t PlayoutDeviceName(uint16_t index,
71 char name[kAdmMaxDeviceNameSize],
72 char guid[kAdmMaxGuidSize]) = 0;
73 virtual int32_t RecordingDeviceName(uint16_t index,
niklase@google.com470e71d2011-07-07 08:21:25 +000074 char name[kAdmMaxDeviceNameSize],
75 char guid[kAdmMaxGuidSize]) = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000076
henrika@google.com73d65512011-09-07 15:11:18 +000077 // Device selection
78 virtual int32_t SetPlayoutDevice(uint16_t index) = 0;
79 virtual int32_t SetPlayoutDevice(WindowsDeviceType device) = 0;
80 virtual int32_t SetRecordingDevice(uint16_t index) = 0;
81 virtual int32_t SetRecordingDevice(WindowsDeviceType device) = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000082
henrika@google.com73d65512011-09-07 15:11:18 +000083 // Audio transport initialization
84 virtual int32_t PlayoutIsAvailable(bool* available) = 0;
85 virtual int32_t InitPlayout() = 0;
86 virtual bool PlayoutIsInitialized() const = 0;
87 virtual int32_t RecordingIsAvailable(bool* available) = 0;
88 virtual int32_t InitRecording() = 0;
89 virtual bool RecordingIsInitialized() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000090
henrika@google.com73d65512011-09-07 15:11:18 +000091 // Audio transport control
92 virtual int32_t StartPlayout() = 0;
93 virtual int32_t StopPlayout() = 0;
94 virtual bool Playing() const = 0;
95 virtual int32_t StartRecording() = 0;
96 virtual int32_t StopRecording() = 0;
97 virtual bool Recording() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000098
henrika@google.com73d65512011-09-07 15:11:18 +000099 // Microphone Automatic Gain Control (AGC)
100 virtual int32_t SetAGC(bool enable) = 0;
101 virtual bool AGC() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000102
henrika@google.com73d65512011-09-07 15:11:18 +0000103 // Volume control based on the Windows Wave API (Windows only)
104 virtual int32_t SetWaveOutVolume(uint16_t volumeLeft,
105 uint16_t volumeRight) = 0;
106 virtual int32_t WaveOutVolume(uint16_t* volumeLeft,
107 uint16_t* volumeRight) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000108
henrika@google.com73d65512011-09-07 15:11:18 +0000109 // Audio mixer initialization
henrika@google.com73d65512011-09-07 15:11:18 +0000110 virtual int32_t InitSpeaker() = 0;
111 virtual bool SpeakerIsInitialized() const = 0;
henrika@google.com73d65512011-09-07 15:11:18 +0000112 virtual int32_t InitMicrophone() = 0;
113 virtual bool MicrophoneIsInitialized() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000114
henrika@google.com73d65512011-09-07 15:11:18 +0000115 // Speaker volume controls
116 virtual int32_t SpeakerVolumeIsAvailable(bool* available) = 0;
117 virtual int32_t SetSpeakerVolume(uint32_t volume) = 0;
118 virtual int32_t SpeakerVolume(uint32_t* volume) const = 0;
119 virtual int32_t MaxSpeakerVolume(uint32_t* maxVolume) const = 0;
120 virtual int32_t MinSpeakerVolume(uint32_t* minVolume) const = 0;
121 virtual int32_t SpeakerVolumeStepSize(uint16_t* stepSize) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000122
henrika@google.com73d65512011-09-07 15:11:18 +0000123 // Microphone volume controls
124 virtual int32_t MicrophoneVolumeIsAvailable(bool* available) = 0;
125 virtual int32_t SetMicrophoneVolume(uint32_t volume) = 0;
126 virtual int32_t MicrophoneVolume(uint32_t* volume) const = 0;
127 virtual int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const = 0;
128 virtual int32_t MinMicrophoneVolume(uint32_t* minVolume) const = 0;
129 virtual int32_t MicrophoneVolumeStepSize(uint16_t* stepSize) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000130
henrika@google.com73d65512011-09-07 15:11:18 +0000131 // Speaker mute control
132 virtual int32_t SpeakerMuteIsAvailable(bool* available) = 0;
133 virtual int32_t SetSpeakerMute(bool enable) = 0;
134 virtual int32_t SpeakerMute(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000135
henrika@google.com73d65512011-09-07 15:11:18 +0000136 // Microphone mute control
137 virtual int32_t MicrophoneMuteIsAvailable(bool* available) = 0;
138 virtual int32_t SetMicrophoneMute(bool enable) = 0;
139 virtual int32_t MicrophoneMute(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000140
henrika@google.com73d65512011-09-07 15:11:18 +0000141 // Microphone boost control
142 virtual int32_t MicrophoneBoostIsAvailable(bool* available) = 0;
143 virtual int32_t SetMicrophoneBoost(bool enable) = 0;
144 virtual int32_t MicrophoneBoost(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000145
henrika@google.com73d65512011-09-07 15:11:18 +0000146 // Stereo support
147 virtual int32_t StereoPlayoutIsAvailable(bool* available) const = 0;
148 virtual int32_t SetStereoPlayout(bool enable) = 0;
149 virtual int32_t StereoPlayout(bool* enabled) const = 0;
150 virtual int32_t StereoRecordingIsAvailable(bool* available) const = 0;
151 virtual int32_t SetStereoRecording(bool enable) = 0;
152 virtual int32_t StereoRecording(bool* enabled) const = 0;
153 virtual int32_t SetRecordingChannel(const ChannelType channel) = 0;
154 virtual int32_t RecordingChannel(ChannelType* channel) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000155
henrika@google.com73d65512011-09-07 15:11:18 +0000156 // Delay information and control
157 virtual int32_t SetPlayoutBuffer(const BufferType type,
158 uint16_t sizeMS = 0) = 0;
159 virtual int32_t PlayoutBuffer(BufferType* type, uint16_t* sizeMS) const = 0;
160 virtual int32_t PlayoutDelay(uint16_t* delayMS) const = 0;
161 virtual int32_t RecordingDelay(uint16_t* delayMS) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000162
henrika@google.com73d65512011-09-07 15:11:18 +0000163 // CPU load
164 virtual int32_t CPULoad(uint16_t* load) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000165
henrika@google.com73d65512011-09-07 15:11:18 +0000166 // Recording of raw PCM data
167 virtual int32_t StartRawOutputFileRecording(
168 const char pcmFileNameUTF8[kAdmMaxFileNameSize]) = 0;
169 virtual int32_t StopRawOutputFileRecording() = 0;
170 virtual int32_t StartRawInputFileRecording(
171 const char pcmFileNameUTF8[kAdmMaxFileNameSize]) = 0;
172 virtual int32_t StopRawInputFileRecording() = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000173
henrika@google.com73d65512011-09-07 15:11:18 +0000174 // Native sample rate controls (samples/sec)
175 virtual int32_t SetRecordingSampleRate(const uint32_t samplesPerSec) = 0;
176 virtual int32_t RecordingSampleRate(uint32_t* samplesPerSec) const = 0;
177 virtual int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) = 0;
178 virtual int32_t PlayoutSampleRate(uint32_t* samplesPerSec) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000179
henrika@google.com73d65512011-09-07 15:11:18 +0000180 // Mobile device specific functions
181 virtual int32_t ResetAudioDevice() = 0;
182 virtual int32_t SetLoudspeakerStatus(bool enable) = 0;
183 virtual int32_t GetLoudspeakerStatus(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000184
henrika@webrtc.orga954c072014-12-09 16:22:09 +0000185 // Only supported on Android.
186 virtual bool BuiltInAECIsAvailable() const = 0;
187
188 // Enables the built-in AEC. Only supported on Windows and Android.
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000189 //
henrika@webrtc.orga954c072014-12-09 16:22:09 +0000190 // For usage on Windows (requires Core Audio):
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000191 // Must be called before InitRecording(). When enabled:
192 // 1. StartPlayout() must be called before StartRecording().
193 // 2. StopRecording() should be called before StopPlayout().
194 // The reverse order may cause garbage audio to be rendered or the
andrew@webrtc.orgb524f442011-09-13 18:04:30 +0000195 // capture side to halt until StopRecording() is called.
henrika@webrtc.orga954c072014-12-09 16:22:09 +0000196 virtual int32_t EnableBuiltInAEC(bool enable) = 0;
197
198 // Don't use.
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000199 virtual bool BuiltInAECIsEnabled() const { return false; }
200
henrika@google.com73d65512011-09-07 15:11:18 +0000201 protected:
202 virtual ~AudioDeviceModule() {};
niklase@google.com470e71d2011-07-07 08:21:25 +0000203};
204
henrike@webrtc.org70efc322012-02-23 17:45:33 +0000205AudioDeviceModule* CreateAudioDeviceModule(
pbos@webrtc.org25509882013-04-09 10:30:35 +0000206 int32_t id, AudioDeviceModule::AudioLayer audioLayer);
henrike@webrtc.org70efc322012-02-23 17:45:33 +0000207
niklase@google.com470e71d2011-07-07 08:21:25 +0000208} // namespace webrtc
209
xians@webrtc.org597b4472012-10-11 15:41:55 +0000210#endif // MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_