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