blob: 11490557f7f0ec37d0ed992ee7ca39ac944a0619 [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
henrika@google.com73d65512011-09-07 15:11:18 +000011#ifndef MODULES_AUDIO_DEVICE_MAIN_INTERFACE_AUDIO_DEVICE_H_
12#define MODULES_AUDIO_DEVICE_MAIN_INTERFACE_AUDIO_DEVICE_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
14#include "module.h"
15#include "audio_device_defines.h"
16
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
110 virtual int32_t SpeakerIsAvailable(bool* available) = 0;
111 virtual int32_t InitSpeaker() = 0;
112 virtual bool SpeakerIsInitialized() const = 0;
113 virtual int32_t MicrophoneIsAvailable(bool* available) = 0;
114 virtual int32_t InitMicrophone() = 0;
115 virtual bool MicrophoneIsInitialized() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000116
henrika@google.com73d65512011-09-07 15:11:18 +0000117 // Speaker volume controls
118 virtual int32_t SpeakerVolumeIsAvailable(bool* available) = 0;
119 virtual int32_t SetSpeakerVolume(uint32_t volume) = 0;
120 virtual int32_t SpeakerVolume(uint32_t* volume) const = 0;
121 virtual int32_t MaxSpeakerVolume(uint32_t* maxVolume) const = 0;
122 virtual int32_t MinSpeakerVolume(uint32_t* minVolume) const = 0;
123 virtual int32_t SpeakerVolumeStepSize(uint16_t* stepSize) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000124
henrika@google.com73d65512011-09-07 15:11:18 +0000125 // Microphone volume controls
126 virtual int32_t MicrophoneVolumeIsAvailable(bool* available) = 0;
127 virtual int32_t SetMicrophoneVolume(uint32_t volume) = 0;
128 virtual int32_t MicrophoneVolume(uint32_t* volume) const = 0;
129 virtual int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const = 0;
130 virtual int32_t MinMicrophoneVolume(uint32_t* minVolume) const = 0;
131 virtual int32_t MicrophoneVolumeStepSize(uint16_t* stepSize) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000132
henrika@google.com73d65512011-09-07 15:11:18 +0000133 // Speaker mute control
134 virtual int32_t SpeakerMuteIsAvailable(bool* available) = 0;
135 virtual int32_t SetSpeakerMute(bool enable) = 0;
136 virtual int32_t SpeakerMute(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000137
henrika@google.com73d65512011-09-07 15:11:18 +0000138 // Microphone mute control
139 virtual int32_t MicrophoneMuteIsAvailable(bool* available) = 0;
140 virtual int32_t SetMicrophoneMute(bool enable) = 0;
141 virtual int32_t MicrophoneMute(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000142
henrika@google.com73d65512011-09-07 15:11:18 +0000143 // Microphone boost control
144 virtual int32_t MicrophoneBoostIsAvailable(bool* available) = 0;
145 virtual int32_t SetMicrophoneBoost(bool enable) = 0;
146 virtual int32_t MicrophoneBoost(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000147
henrika@google.com73d65512011-09-07 15:11:18 +0000148 // Stereo support
149 virtual int32_t StereoPlayoutIsAvailable(bool* available) const = 0;
150 virtual int32_t SetStereoPlayout(bool enable) = 0;
151 virtual int32_t StereoPlayout(bool* enabled) const = 0;
152 virtual int32_t StereoRecordingIsAvailable(bool* available) const = 0;
153 virtual int32_t SetStereoRecording(bool enable) = 0;
154 virtual int32_t StereoRecording(bool* enabled) const = 0;
155 virtual int32_t SetRecordingChannel(const ChannelType channel) = 0;
156 virtual int32_t RecordingChannel(ChannelType* channel) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000157
henrika@google.com73d65512011-09-07 15:11:18 +0000158 // Delay information and control
159 virtual int32_t SetPlayoutBuffer(const BufferType type,
160 uint16_t sizeMS = 0) = 0;
161 virtual int32_t PlayoutBuffer(BufferType* type, uint16_t* sizeMS) const = 0;
162 virtual int32_t PlayoutDelay(uint16_t* delayMS) const = 0;
163 virtual int32_t RecordingDelay(uint16_t* delayMS) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000164
henrika@google.com73d65512011-09-07 15:11:18 +0000165 // CPU load
166 virtual int32_t CPULoad(uint16_t* load) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000167
henrika@google.com73d65512011-09-07 15:11:18 +0000168 // Recording of raw PCM data
169 virtual int32_t StartRawOutputFileRecording(
170 const char pcmFileNameUTF8[kAdmMaxFileNameSize]) = 0;
171 virtual int32_t StopRawOutputFileRecording() = 0;
172 virtual int32_t StartRawInputFileRecording(
173 const char pcmFileNameUTF8[kAdmMaxFileNameSize]) = 0;
174 virtual int32_t StopRawInputFileRecording() = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000175
henrika@google.com73d65512011-09-07 15:11:18 +0000176 // Native sample rate controls (samples/sec)
177 virtual int32_t SetRecordingSampleRate(const uint32_t samplesPerSec) = 0;
178 virtual int32_t RecordingSampleRate(uint32_t* samplesPerSec) const = 0;
179 virtual int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) = 0;
180 virtual int32_t PlayoutSampleRate(uint32_t* samplesPerSec) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000181
henrika@google.com73d65512011-09-07 15:11:18 +0000182 // Mobile device specific functions
183 virtual int32_t ResetAudioDevice() = 0;
184 virtual int32_t SetLoudspeakerStatus(bool enable) = 0;
185 virtual int32_t GetLoudspeakerStatus(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000186
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000187 // *Experimental - not recommended for use.*
188 // Enables the Windows Core Audio built-in AEC. Fails on other platforms.
189 //
190 // Must be called before InitRecording(). When enabled:
191 // 1. StartPlayout() must be called before StartRecording().
192 // 2. StopRecording() should be called before StopPlayout().
193 // The reverse order may cause garbage audio to be rendered or the
andrew@webrtc.orgb524f442011-09-13 18:04:30 +0000194 // capture side to halt until StopRecording() is called.
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000195 virtual int32_t EnableBuiltInAEC(bool enable) { return -1; }
196 virtual bool BuiltInAECIsEnabled() const { return false; }
197
henrika@google.com73d65512011-09-07 15:11:18 +0000198 protected:
199 virtual ~AudioDeviceModule() {};
niklase@google.com470e71d2011-07-07 08:21:25 +0000200};
201
henrike@webrtc.org70efc322012-02-23 17:45:33 +0000202AudioDeviceModule* CreateAudioDeviceModule(
203 WebRtc_Word32 id, AudioDeviceModule::AudioLayer audioLayer);
204
niklase@google.com470e71d2011-07-07 08:21:25 +0000205} // namespace webrtc
206
henrika@google.com73d65512011-09-07 15:11:18 +0000207#endif // MODULES_AUDIO_DEVICE_MAIN_INTERFACE_AUDIO_DEVICE_H_