1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
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 
11 #ifndef MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
12 #define MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
13 
14 #include "webrtc/modules/audio_device/include/audio_device_defines.h"
15 #include "webrtc/modules/include/module.h"
16 
17 namespace webrtc {
18 
19 class AudioDeviceModule : public RefCountedModule {
20  public:
21   enum ErrorCode {
22     kAdmErrNone = 0,
23     kAdmErrArgument = 1
24   };
25 
26   enum AudioLayer {
27     kPlatformDefaultAudio = 0,
28     kWindowsWaveAudio = 1,
29     kWindowsCoreAudio = 2,
30     kLinuxAlsaAudio = 3,
31     kLinuxPulseAudio = 4,
32     kAndroidJavaAudio = 5,
33     kAndroidJavaInputAndOpenSLESOutputAudio = 6,
34     kDummyAudio = 8
35   };
36 
37   enum WindowsDeviceType {
38     kDefaultCommunicationDevice = -1,
39     kDefaultDevice = -2
40   };
41 
42   enum BufferType {
43     kFixedBufferSize  = 0,
44     kAdaptiveBufferSize = 1
45   };
46 
47   enum ChannelType {
48     kChannelLeft = 0,
49     kChannelRight = 1,
50     kChannelBoth = 2
51   };
52 
53  public:
54   // Retrieve the currently utilized audio layer
55   virtual int32_t ActiveAudioLayer(AudioLayer* audioLayer) const = 0;
56 
57   // Error handling
58   virtual ErrorCode LastError() const = 0;
59   virtual int32_t RegisterEventObserver(AudioDeviceObserver* eventCallback) = 0;
60 
61   // Full-duplex transportation of PCM audio
62   virtual int32_t RegisterAudioCallback(AudioTransport* audioCallback) = 0;
63 
64   // Main initialization and termination
65   virtual int32_t Init() = 0;
66   virtual int32_t Terminate() = 0;
67   virtual bool Initialized() const = 0;
68 
69   // Device enumeration
70   virtual int16_t PlayoutDevices() = 0;
71   virtual int16_t RecordingDevices() = 0;
72   virtual int32_t PlayoutDeviceName(uint16_t index,
73                                     char name[kAdmMaxDeviceNameSize],
74                                     char guid[kAdmMaxGuidSize]) = 0;
75   virtual int32_t RecordingDeviceName(uint16_t index,
76                                       char name[kAdmMaxDeviceNameSize],
77                                       char guid[kAdmMaxGuidSize]) = 0;
78 
79   // Device selection
80   virtual int32_t SetPlayoutDevice(uint16_t index) = 0;
81   virtual int32_t SetPlayoutDevice(WindowsDeviceType device) = 0;
82   virtual int32_t SetRecordingDevice(uint16_t index) = 0;
83   virtual int32_t SetRecordingDevice(WindowsDeviceType device) = 0;
84 
85   // Audio transport initialization
86   virtual int32_t PlayoutIsAvailable(bool* available) = 0;
87   virtual int32_t InitPlayout() = 0;
88   virtual bool PlayoutIsInitialized() const = 0;
89   virtual int32_t RecordingIsAvailable(bool* available) = 0;
90   virtual int32_t InitRecording() = 0;
91   virtual bool RecordingIsInitialized() const = 0;
92 
93   // Audio transport control
94   virtual int32_t StartPlayout() = 0;
95   virtual int32_t StopPlayout() = 0;
96   virtual bool Playing() const = 0;
97   virtual int32_t StartRecording() = 0;
98   virtual int32_t StopRecording() = 0;
99   virtual bool Recording() const = 0;
100 
101   // Microphone Automatic Gain Control (AGC)
102   virtual int32_t SetAGC(bool enable) = 0;
103   virtual bool AGC() const = 0;
104 
105   // Volume control based on the Windows Wave API (Windows only)
106   virtual int32_t SetWaveOutVolume(uint16_t volumeLeft,
107                                    uint16_t volumeRight) = 0;
108   virtual int32_t WaveOutVolume(uint16_t* volumeLeft,
109                                 uint16_t* volumeRight) const = 0;
110 
111   // Audio mixer initialization
112   virtual int32_t InitSpeaker() = 0;
113   virtual bool SpeakerIsInitialized() const = 0;
114   virtual int32_t InitMicrophone() = 0;
115   virtual bool MicrophoneIsInitialized() const = 0;
116 
117   // 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;
124 
125   // 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;
132 
133   // 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;
137 
138   // 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;
142 
143   // 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;
147 
148   // 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;
157 
158   // 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;
164 
165   // CPU load
166   virtual int32_t CPULoad(uint16_t* load) const = 0;
167 
168   // 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;
175 
176   // 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;
181 
182   // 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;
186 
187   // Only supported on Android.
188   // TODO(henrika): Make pure virtual after updating Chromium.
BuiltInAECIsAvailable()189   virtual bool BuiltInAECIsAvailable() const { return false; }
BuiltInAGCIsAvailable()190   virtual bool BuiltInAGCIsAvailable() const { return false; }
BuiltInNSIsAvailable()191   virtual bool BuiltInNSIsAvailable() const { return false; }
192 
193   // Enables the built-in audio effects. Only supported on Android.
194   // TODO(henrika): Make pure virtual after updating Chromium.
EnableBuiltInAEC(bool enable)195   virtual int32_t EnableBuiltInAEC(bool enable) { return -1; }
EnableBuiltInAGC(bool enable)196   virtual int32_t EnableBuiltInAGC(bool enable) { return -1; }
EnableBuiltInNS(bool enable)197   virtual int32_t EnableBuiltInNS(bool enable) { return -1; }
198   // Don't use.
BuiltInAECIsEnabled()199   virtual bool BuiltInAECIsEnabled() const { return false; }
200 
201   // Only supported on iOS.
202   // TODO(henrika): Make pure virtual after updating Chromium.
GetPlayoutAudioParameters(AudioParameters * params)203   virtual int GetPlayoutAudioParameters(AudioParameters* params) const {
204     return -1;
205   }
GetRecordAudioParameters(AudioParameters * params)206   virtual int GetRecordAudioParameters(AudioParameters* params) const {
207     return -1;
208   }
209 
210  protected:
~AudioDeviceModule()211   virtual ~AudioDeviceModule() {}
212 };
213 
214 AudioDeviceModule* CreateAudioDeviceModule(
215     int32_t id, AudioDeviceModule::AudioLayer audioLayer);
216 
217 }  // namespace webrtc
218 
219 #endif  // MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
220