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 WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_IMPL_H
12#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_IMPL_H
13
14#if defined(WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE)
15
16#include "webrtc/base/checks.h"
17#include "webrtc/base/scoped_ptr.h"
18#include "webrtc/modules/audio_device/audio_device_buffer.h"
19#include "webrtc/modules/audio_device/include/audio_device.h"
20
21namespace webrtc {
22
23class AudioDeviceGeneric;
24class AudioManager;
25class CriticalSectionWrapper;
26
27class AudioDeviceModuleImpl : public AudioDeviceModule {
28 public:
29  enum PlatformType {
30    kPlatformNotSupported = 0,
31    kPlatformWin32 = 1,
32    kPlatformWinCe = 2,
33    kPlatformLinux = 3,
34    kPlatformMac = 4,
35    kPlatformAndroid = 5,
36    kPlatformIOS = 6
37  };
38
39  int32_t CheckPlatform();
40  int32_t CreatePlatformSpecificObjects();
41  int32_t AttachAudioBuffer();
42
43  AudioDeviceModuleImpl(const int32_t id, const AudioLayer audioLayer);
44  virtual ~AudioDeviceModuleImpl();
45
46  int64_t TimeUntilNextProcess() override;
47  int32_t Process() override;
48
49  // Factory methods (resource allocation/deallocation)
50  static AudioDeviceModule* Create(
51      const int32_t id,
52      const AudioLayer audioLayer = kPlatformDefaultAudio);
53
54  // Retrieve the currently utilized audio layer
55  int32_t ActiveAudioLayer(AudioLayer* audioLayer) const override;
56
57  // Error handling
58  ErrorCode LastError() const override;
59  int32_t RegisterEventObserver(AudioDeviceObserver* eventCallback) override;
60
61  // Full-duplex transportation of PCM audio
62  int32_t RegisterAudioCallback(AudioTransport* audioCallback) override;
63
64  // Main initializaton and termination
65  int32_t Init() override;
66  int32_t Terminate() override;
67  bool Initialized() const override;
68
69  // Device enumeration
70  int16_t PlayoutDevices() override;
71  int16_t RecordingDevices() override;
72  int32_t PlayoutDeviceName(uint16_t index,
73                            char name[kAdmMaxDeviceNameSize],
74                            char guid[kAdmMaxGuidSize]) override;
75  int32_t RecordingDeviceName(uint16_t index,
76                              char name[kAdmMaxDeviceNameSize],
77                              char guid[kAdmMaxGuidSize]) override;
78
79  // Device selection
80  int32_t SetPlayoutDevice(uint16_t index) override;
81  int32_t SetPlayoutDevice(WindowsDeviceType device) override;
82  int32_t SetRecordingDevice(uint16_t index) override;
83  int32_t SetRecordingDevice(WindowsDeviceType device) override;
84
85  // Audio transport initialization
86  int32_t PlayoutIsAvailable(bool* available) override;
87  int32_t InitPlayout() override;
88  bool PlayoutIsInitialized() const override;
89  int32_t RecordingIsAvailable(bool* available) override;
90  int32_t InitRecording() override;
91  bool RecordingIsInitialized() const override;
92
93  // Audio transport control
94  int32_t StartPlayout() override;
95  int32_t StopPlayout() override;
96  bool Playing() const override;
97  int32_t StartRecording() override;
98  int32_t StopRecording() override;
99  bool Recording() const override;
100
101  // Microphone Automatic Gain Control (AGC)
102  int32_t SetAGC(bool enable) override;
103  bool AGC() const override;
104
105  // Volume control based on the Windows Wave API (Windows only)
106  int32_t SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight) override;
107  int32_t WaveOutVolume(uint16_t* volumeLeft,
108                        uint16_t* volumeRight) const override;
109
110  // Audio mixer initialization
111  int32_t InitSpeaker() override;
112  bool SpeakerIsInitialized() const override;
113  int32_t InitMicrophone() override;
114  bool MicrophoneIsInitialized() const override;
115
116  // Speaker volume controls
117  int32_t SpeakerVolumeIsAvailable(bool* available) override;
118  int32_t SetSpeakerVolume(uint32_t volume) override;
119  int32_t SpeakerVolume(uint32_t* volume) const override;
120  int32_t MaxSpeakerVolume(uint32_t* maxVolume) const override;
121  int32_t MinSpeakerVolume(uint32_t* minVolume) const override;
122  int32_t SpeakerVolumeStepSize(uint16_t* stepSize) const override;
123
124  // Microphone volume controls
125  int32_t MicrophoneVolumeIsAvailable(bool* available) override;
126  int32_t SetMicrophoneVolume(uint32_t volume) override;
127  int32_t MicrophoneVolume(uint32_t* volume) const override;
128  int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const override;
129  int32_t MinMicrophoneVolume(uint32_t* minVolume) const override;
130  int32_t MicrophoneVolumeStepSize(uint16_t* stepSize) const override;
131
132  // Speaker mute control
133  int32_t SpeakerMuteIsAvailable(bool* available) override;
134  int32_t SetSpeakerMute(bool enable) override;
135  int32_t SpeakerMute(bool* enabled) const override;
136
137  // Microphone mute control
138  int32_t MicrophoneMuteIsAvailable(bool* available) override;
139  int32_t SetMicrophoneMute(bool enable) override;
140  int32_t MicrophoneMute(bool* enabled) const override;
141
142  // Microphone boost control
143  int32_t MicrophoneBoostIsAvailable(bool* available) override;
144  int32_t SetMicrophoneBoost(bool enable) override;
145  int32_t MicrophoneBoost(bool* enabled) const override;
146
147  // Stereo support
148  int32_t StereoPlayoutIsAvailable(bool* available) const override;
149  int32_t SetStereoPlayout(bool enable) override;
150  int32_t StereoPlayout(bool* enabled) const override;
151  int32_t StereoRecordingIsAvailable(bool* available) const override;
152  int32_t SetStereoRecording(bool enable) override;
153  int32_t StereoRecording(bool* enabled) const override;
154  int32_t SetRecordingChannel(const ChannelType channel) override;
155  int32_t RecordingChannel(ChannelType* channel) const override;
156
157  // Delay information and control
158  int32_t SetPlayoutBuffer(const BufferType type, uint16_t sizeMS = 0) override;
159  int32_t PlayoutBuffer(BufferType* type, uint16_t* sizeMS) const override;
160  int32_t PlayoutDelay(uint16_t* delayMS) const override;
161  int32_t RecordingDelay(uint16_t* delayMS) const override;
162
163  // CPU load
164  int32_t CPULoad(uint16_t* load) const override;
165
166  // Recording of raw PCM data
167  int32_t StartRawOutputFileRecording(
168      const char pcmFileNameUTF8[kAdmMaxFileNameSize]) override;
169  int32_t StopRawOutputFileRecording() override;
170  int32_t StartRawInputFileRecording(
171      const char pcmFileNameUTF8[kAdmMaxFileNameSize]) override;
172  int32_t StopRawInputFileRecording() override;
173
174  // Native sample rate controls (samples/sec)
175  int32_t SetRecordingSampleRate(const uint32_t samplesPerSec) override;
176  int32_t RecordingSampleRate(uint32_t* samplesPerSec) const override;
177  int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) override;
178  int32_t PlayoutSampleRate(uint32_t* samplesPerSec) const override;
179
180  // Mobile device specific functions
181  int32_t ResetAudioDevice() override;
182  int32_t SetLoudspeakerStatus(bool enable) override;
183  int32_t GetLoudspeakerStatus(bool* enabled) const override;
184
185  bool BuiltInAECIsEnabled() const override;
186  bool BuiltInAECIsAvailable() const override;
187  int32_t EnableBuiltInAEC(bool enable) override;
188  bool BuiltInAGCIsAvailable() const override;
189  int32_t EnableBuiltInAGC(bool enable) override;
190  bool BuiltInNSIsAvailable() const override;
191  int32_t EnableBuiltInNS(bool enable) override;
192
193  int GetPlayoutAudioParameters(AudioParameters* params) const override;
194  int GetRecordAudioParameters(AudioParameters* params) const override;
195
196  int32_t Id() { return _id; }
197#if defined(WEBRTC_ANDROID)
198  // Only use this acccessor for test purposes on Android.
199  AudioManager* GetAndroidAudioManagerForTest() {
200    return _audioManagerAndroid.get();
201  }
202#endif
203  AudioDeviceBuffer* GetAudioDeviceBuffer() { return &_audioDeviceBuffer; }
204
205 private:
206  PlatformType Platform() const;
207  AudioLayer PlatformAudioLayer() const;
208
209  CriticalSectionWrapper& _critSect;
210  CriticalSectionWrapper& _critSectEventCb;
211  CriticalSectionWrapper& _critSectAudioCb;
212
213  AudioDeviceObserver* _ptrCbAudioDeviceObserver;
214
215  AudioDeviceGeneric* _ptrAudioDevice;
216
217  AudioDeviceBuffer _audioDeviceBuffer;
218#if defined(WEBRTC_ANDROID)
219  rtc::scoped_ptr<AudioManager> _audioManagerAndroid;
220#endif
221  int32_t _id;
222  AudioLayer _platformAudioLayer;
223  int64_t _lastProcessTime;
224  PlatformType _platformType;
225  bool _initialized;
226  mutable ErrorCode _lastError;
227};
228
229}  // namespace webrtc
230
231#endif  // defined(WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE)
232
233#endif  // WEBRTC_MODULES_INTERFACE_AUDIO_DEVICE_IMPL_H_
234