blob: 8751b8e58931d7d3e8a066065300c68487d79ae1 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "modules/audio_device/include/audio_device_defines.h"
15#include "modules/include/module.h"
16#include "rtc_base/scoped_ref_ptr.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000017
18namespace webrtc {
19
henrika@google.com73d65512011-09-07 15:11:18 +000020class AudioDeviceModule : public RefCountedModule {
21 public:
22 enum ErrorCode {
23 kAdmErrNone = 0,
24 kAdmErrArgument = 1
25 };
niklase@google.com470e71d2011-07-07 08:21:25 +000026
henrika@google.com73d65512011-09-07 15:11:18 +000027 enum AudioLayer {
28 kPlatformDefaultAudio = 0,
henrika@google.com73d65512011-09-07 15:11:18 +000029 kWindowsCoreAudio = 2,
30 kLinuxAlsaAudio = 3,
31 kLinuxPulseAudio = 4,
henrika@webrtc.org474d1eb2015-03-09 12:39:53 +000032 kAndroidJavaAudio = 5,
henrika521f7a82016-05-31 07:03:17 -070033 kAndroidOpenSLESAudio = 6,
34 kAndroidJavaInputAndOpenSLESOutputAudio = 7,
henrikab2619892015-05-18 16:49:16 +020035 kDummyAudio = 8
henrika@google.com73d65512011-09-07 15:11:18 +000036 };
niklase@google.com470e71d2011-07-07 08:21:25 +000037
henrika@google.com73d65512011-09-07 15:11:18 +000038 enum WindowsDeviceType {
39 kDefaultCommunicationDevice = -1,
40 kDefaultDevice = -2
41 };
niklase@google.com470e71d2011-07-07 08:21:25 +000042
henrika@google.com73d65512011-09-07 15:11:18 +000043 enum ChannelType {
44 kChannelLeft = 0,
45 kChannelRight = 1,
46 kChannelBoth = 2
47 };
niklase@google.com470e71d2011-07-07 08:21:25 +000048
henrika@google.com73d65512011-09-07 15:11:18 +000049 public:
Peter Boström4adbbcf2016-05-03 15:51:26 -040050 // Create an ADM.
51 static rtc::scoped_refptr<AudioDeviceModule> Create(
52 const int32_t id,
53 const AudioLayer audio_layer);
54
henrika@google.com73d65512011-09-07 15:11:18 +000055 // Retrieve the currently utilized audio layer
56 virtual int32_t ActiveAudioLayer(AudioLayer* audioLayer) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000057
henrika@google.com73d65512011-09-07 15:11:18 +000058 // Error handling
59 virtual ErrorCode LastError() const = 0;
60 virtual int32_t RegisterEventObserver(AudioDeviceObserver* eventCallback) = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000061
henrika@google.com73d65512011-09-07 15:11:18 +000062 // Full-duplex transportation of PCM audio
63 virtual int32_t RegisterAudioCallback(AudioTransport* audioCallback) = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000064
henrika@google.com73d65512011-09-07 15:11:18 +000065 // Main initialization and termination
66 virtual int32_t Init() = 0;
67 virtual int32_t Terminate() = 0;
68 virtual bool Initialized() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000069
henrika@google.com73d65512011-09-07 15:11:18 +000070 // Device enumeration
71 virtual int16_t PlayoutDevices() = 0;
72 virtual int16_t RecordingDevices() = 0;
73 virtual int32_t PlayoutDeviceName(uint16_t index,
74 char name[kAdmMaxDeviceNameSize],
75 char guid[kAdmMaxGuidSize]) = 0;
76 virtual int32_t RecordingDeviceName(uint16_t index,
niklase@google.com470e71d2011-07-07 08:21:25 +000077 char name[kAdmMaxDeviceNameSize],
78 char guid[kAdmMaxGuidSize]) = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000079
henrika@google.com73d65512011-09-07 15:11:18 +000080 // Device selection
81 virtual int32_t SetPlayoutDevice(uint16_t index) = 0;
82 virtual int32_t SetPlayoutDevice(WindowsDeviceType device) = 0;
83 virtual int32_t SetRecordingDevice(uint16_t index) = 0;
84 virtual int32_t SetRecordingDevice(WindowsDeviceType device) = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000085
henrika@google.com73d65512011-09-07 15:11:18 +000086 // Audio transport initialization
87 virtual int32_t PlayoutIsAvailable(bool* available) = 0;
88 virtual int32_t InitPlayout() = 0;
89 virtual bool PlayoutIsInitialized() const = 0;
90 virtual int32_t RecordingIsAvailable(bool* available) = 0;
91 virtual int32_t InitRecording() = 0;
92 virtual bool RecordingIsInitialized() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000093
henrika@google.com73d65512011-09-07 15:11:18 +000094 // Audio transport control
95 virtual int32_t StartPlayout() = 0;
96 virtual int32_t StopPlayout() = 0;
97 virtual bool Playing() const = 0;
98 virtual int32_t StartRecording() = 0;
99 virtual int32_t StopRecording() = 0;
100 virtual bool Recording() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000101
henrika@google.com73d65512011-09-07 15:11:18 +0000102 // Microphone Automatic Gain Control (AGC)
103 virtual int32_t SetAGC(bool enable) = 0;
104 virtual bool AGC() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000105
henrika@google.com73d65512011-09-07 15:11:18 +0000106 // Audio mixer initialization
henrika@google.com73d65512011-09-07 15:11:18 +0000107 virtual int32_t InitSpeaker() = 0;
108 virtual bool SpeakerIsInitialized() const = 0;
henrika@google.com73d65512011-09-07 15:11:18 +0000109 virtual int32_t InitMicrophone() = 0;
110 virtual bool MicrophoneIsInitialized() const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000111
henrika@google.com73d65512011-09-07 15:11:18 +0000112 // Speaker volume controls
113 virtual int32_t SpeakerVolumeIsAvailable(bool* available) = 0;
114 virtual int32_t SetSpeakerVolume(uint32_t volume) = 0;
115 virtual int32_t SpeakerVolume(uint32_t* volume) const = 0;
116 virtual int32_t MaxSpeakerVolume(uint32_t* maxVolume) const = 0;
117 virtual int32_t MinSpeakerVolume(uint32_t* minVolume) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000118
henrika@google.com73d65512011-09-07 15:11:18 +0000119 // Microphone volume controls
120 virtual int32_t MicrophoneVolumeIsAvailable(bool* available) = 0;
121 virtual int32_t SetMicrophoneVolume(uint32_t volume) = 0;
122 virtual int32_t MicrophoneVolume(uint32_t* volume) const = 0;
123 virtual int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const = 0;
124 virtual int32_t MinMicrophoneVolume(uint32_t* minVolume) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000125
henrika@google.com73d65512011-09-07 15:11:18 +0000126 // Speaker mute control
127 virtual int32_t SpeakerMuteIsAvailable(bool* available) = 0;
128 virtual int32_t SetSpeakerMute(bool enable) = 0;
129 virtual int32_t SpeakerMute(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000130
henrika@google.com73d65512011-09-07 15:11:18 +0000131 // Microphone mute control
132 virtual int32_t MicrophoneMuteIsAvailable(bool* available) = 0;
133 virtual int32_t SetMicrophoneMute(bool enable) = 0;
134 virtual int32_t MicrophoneMute(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000135
henrika@google.com73d65512011-09-07 15:11:18 +0000136 // Stereo support
137 virtual int32_t StereoPlayoutIsAvailable(bool* available) const = 0;
138 virtual int32_t SetStereoPlayout(bool enable) = 0;
139 virtual int32_t StereoPlayout(bool* enabled) const = 0;
140 virtual int32_t StereoRecordingIsAvailable(bool* available) const = 0;
141 virtual int32_t SetStereoRecording(bool enable) = 0;
142 virtual int32_t StereoRecording(bool* enabled) const = 0;
143 virtual int32_t SetRecordingChannel(const ChannelType channel) = 0;
144 virtual int32_t RecordingChannel(ChannelType* channel) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000145
henrika98680422017-08-31 06:47:32 -0700146 // Delay information and control
henrika@google.com73d65512011-09-07 15:11:18 +0000147 virtual int32_t PlayoutDelay(uint16_t* delayMS) const = 0;
148 virtual int32_t RecordingDelay(uint16_t* delayMS) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000149
henrika@google.com73d65512011-09-07 15:11:18 +0000150 // Native sample rate controls (samples/sec)
151 virtual int32_t SetRecordingSampleRate(const uint32_t samplesPerSec) = 0;
152 virtual int32_t RecordingSampleRate(uint32_t* samplesPerSec) const = 0;
153 virtual int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) = 0;
154 virtual int32_t PlayoutSampleRate(uint32_t* samplesPerSec) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000155
henrika@google.com73d65512011-09-07 15:11:18 +0000156 // Mobile device specific functions
henrika@google.com73d65512011-09-07 15:11:18 +0000157 virtual int32_t SetLoudspeakerStatus(bool enable) = 0;
158 virtual int32_t GetLoudspeakerStatus(bool* enabled) const = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000159
henrika@webrtc.orga954c072014-12-09 16:22:09 +0000160 // Only supported on Android.
maxmorin88e31a32016-08-16 00:56:09 -0700161 virtual bool BuiltInAECIsAvailable() const = 0;
162 virtual bool BuiltInAGCIsAvailable() const = 0;
163 virtual bool BuiltInNSIsAvailable() const = 0;
henrika@webrtc.orga954c072014-12-09 16:22:09 +0000164
henrikac14f5ff2015-09-23 14:08:33 +0200165 // Enables the built-in audio effects. Only supported on Android.
maxmorin88e31a32016-08-16 00:56:09 -0700166 virtual int32_t EnableBuiltInAEC(bool enable) = 0;
167 virtual int32_t EnableBuiltInAGC(bool enable) = 0;
168 virtual int32_t EnableBuiltInNS(bool enable) = 0;
andrew@webrtc.orga3c6d612011-09-13 17:17:49 +0000169
maxmorin88e31a32016-08-16 00:56:09 -0700170// Only supported on iOS.
171#if defined(WEBRTC_IOS)
172 virtual int GetPlayoutAudioParameters(AudioParameters* params) const = 0;
173 virtual int GetRecordAudioParameters(AudioParameters* params) const = 0;
174#endif // WEBRTC_IOS
henrikaba35d052015-07-14 17:04:08 +0200175
henrika@google.com73d65512011-09-07 15:11:18 +0000176 protected:
maxmorin88e31a32016-08-16 00:56:09 -0700177 ~AudioDeviceModule() override {}
niklase@google.com470e71d2011-07-07 08:21:25 +0000178};
179
180} // namespace webrtc
181
xians@webrtc.org597b4472012-10-11 15:41:55 +0000182#endif // MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_