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 21 namespace webrtc { 22 23 class AudioDeviceGeneric; 24 class AudioManager; 25 class CriticalSectionWrapper; 26 27 class 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 Id()196 int32_t Id() { return _id; } 197 #if defined(WEBRTC_ANDROID) 198 // Only use this acccessor for test purposes on Android. GetAndroidAudioManagerForTest()199 AudioManager* GetAndroidAudioManagerForTest() { 200 return _audioManagerAndroid.get(); 201 } 202 #endif GetAudioDeviceBuffer()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