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_ALSA_LINUX_H 12 #define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_ALSA_LINUX_H 13 14 #include "webrtc/base/platform_thread.h" 15 #include "webrtc/modules/audio_device/audio_device_generic.h" 16 #include "webrtc/modules/audio_device/linux/audio_mixer_manager_alsa_linux.h" 17 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 18 19 #if defined(USE_X11) 20 #include <X11/Xlib.h> 21 #endif 22 #include <alsa/asoundlib.h> 23 #include <sys/ioctl.h> 24 #include <sys/soundcard.h> 25 26 27 namespace webrtc 28 { 29 class EventWrapper; 30 31 class AudioDeviceLinuxALSA : public AudioDeviceGeneric 32 { 33 public: 34 AudioDeviceLinuxALSA(const int32_t id); 35 virtual ~AudioDeviceLinuxALSA(); 36 37 // Retrieve the currently utilized audio layer 38 int32_t ActiveAudioLayer( 39 AudioDeviceModule::AudioLayer& audioLayer) const override; 40 41 // Main initializaton and termination 42 int32_t Init() override; 43 int32_t Terminate() override; 44 bool Initialized() const override; 45 46 // Device enumeration 47 int16_t PlayoutDevices() override; 48 int16_t RecordingDevices() override; 49 int32_t PlayoutDeviceName(uint16_t index, 50 char name[kAdmMaxDeviceNameSize], 51 char guid[kAdmMaxGuidSize]) override; 52 int32_t RecordingDeviceName(uint16_t index, 53 char name[kAdmMaxDeviceNameSize], 54 char guid[kAdmMaxGuidSize]) override; 55 56 // Device selection 57 int32_t SetPlayoutDevice(uint16_t index) override; 58 int32_t SetPlayoutDevice( 59 AudioDeviceModule::WindowsDeviceType device) override; 60 int32_t SetRecordingDevice(uint16_t index) override; 61 int32_t SetRecordingDevice( 62 AudioDeviceModule::WindowsDeviceType device) override; 63 64 // Audio transport initialization 65 int32_t PlayoutIsAvailable(bool& available) override; 66 int32_t InitPlayout() override; 67 bool PlayoutIsInitialized() const override; 68 int32_t RecordingIsAvailable(bool& available) override; 69 int32_t InitRecording() override; 70 bool RecordingIsInitialized() const override; 71 72 // Audio transport control 73 int32_t StartPlayout() override; 74 int32_t StopPlayout() override; 75 bool Playing() const override; 76 int32_t StartRecording() override; 77 int32_t StopRecording() override; 78 bool Recording() const override; 79 80 // Microphone Automatic Gain Control (AGC) 81 int32_t SetAGC(bool enable) override; 82 bool AGC() const override; 83 84 // Volume control based on the Windows Wave API (Windows only) 85 int32_t SetWaveOutVolume(uint16_t volumeLeft, 86 uint16_t volumeRight) override; 87 int32_t WaveOutVolume(uint16_t& volumeLeft, 88 uint16_t& volumeRight) const override; 89 90 // Audio mixer initialization 91 int32_t InitSpeaker() override; 92 bool SpeakerIsInitialized() const override; 93 int32_t InitMicrophone() override; 94 bool MicrophoneIsInitialized() const override; 95 96 // Speaker volume controls 97 int32_t SpeakerVolumeIsAvailable(bool& available) override; 98 int32_t SetSpeakerVolume(uint32_t volume) override; 99 int32_t SpeakerVolume(uint32_t& volume) const override; 100 int32_t MaxSpeakerVolume(uint32_t& maxVolume) const override; 101 int32_t MinSpeakerVolume(uint32_t& minVolume) const override; 102 int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const override; 103 104 // Microphone volume controls 105 int32_t MicrophoneVolumeIsAvailable(bool& available) override; 106 int32_t SetMicrophoneVolume(uint32_t volume) override; 107 int32_t MicrophoneVolume(uint32_t& volume) const override; 108 int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const override; 109 int32_t MinMicrophoneVolume(uint32_t& minVolume) const override; 110 int32_t MicrophoneVolumeStepSize(uint16_t& stepSize) const override; 111 112 // Speaker mute control 113 int32_t SpeakerMuteIsAvailable(bool& available) override; 114 int32_t SetSpeakerMute(bool enable) override; 115 int32_t SpeakerMute(bool& enabled) const override; 116 117 // Microphone mute control 118 int32_t MicrophoneMuteIsAvailable(bool& available) override; 119 int32_t SetMicrophoneMute(bool enable) override; 120 int32_t MicrophoneMute(bool& enabled) const override; 121 122 // Microphone boost control 123 int32_t MicrophoneBoostIsAvailable(bool& available) override; 124 int32_t SetMicrophoneBoost(bool enable) override; 125 int32_t MicrophoneBoost(bool& enabled) const override; 126 127 // Stereo support 128 int32_t StereoPlayoutIsAvailable(bool& available) override; 129 int32_t SetStereoPlayout(bool enable) override; 130 int32_t StereoPlayout(bool& enabled) const override; 131 int32_t StereoRecordingIsAvailable(bool& available) override; 132 int32_t SetStereoRecording(bool enable) override; 133 int32_t StereoRecording(bool& enabled) const override; 134 135 // Delay information and control 136 int32_t SetPlayoutBuffer(const AudioDeviceModule::BufferType type, 137 uint16_t sizeMS) override; 138 int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type, 139 uint16_t& sizeMS) const override; 140 int32_t PlayoutDelay(uint16_t& delayMS) const override; 141 int32_t RecordingDelay(uint16_t& delayMS) const override; 142 143 // CPU load 144 int32_t CPULoad(uint16_t& load) const override; 145 146 public: 147 bool PlayoutWarning() const override; 148 bool PlayoutError() const override; 149 bool RecordingWarning() const override; 150 bool RecordingError() const override; 151 void ClearPlayoutWarning() override; 152 void ClearPlayoutError() override; 153 void ClearRecordingWarning() override; 154 void ClearRecordingError() override; 155 156 public: 157 void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) override; 158 159 private: 160 int32_t GetDevicesInfo(const int32_t function, 161 const bool playback, 162 const int32_t enumDeviceNo = 0, 163 char* enumDeviceName = NULL, 164 const int32_t ednLen = 0) const; 165 int32_t ErrorRecovery(int32_t error, snd_pcm_t* deviceHandle); 166 167 private: 168 bool KeyPressed() const; 169 170 private: 171 void Lock() EXCLUSIVE_LOCK_FUNCTION(_critSect) { _critSect.Enter(); }; 172 void UnLock() UNLOCK_FUNCTION(_critSect) { _critSect.Leave(); }; 173 private: 174 inline int32_t InputSanityCheckAfterUnlockedPeriod() const; 175 inline int32_t OutputSanityCheckAfterUnlockedPeriod() const; 176 177 private: 178 static bool RecThreadFunc(void*); 179 static bool PlayThreadFunc(void*); 180 bool RecThreadProcess(); 181 bool PlayThreadProcess(); 182 183 private: 184 AudioDeviceBuffer* _ptrAudioBuffer; 185 186 CriticalSectionWrapper& _critSect; 187 188 // TODO(pbos): Make plain members and start/stop instead of resetting these 189 // pointers. A thread can be reused. 190 rtc::scoped_ptr<rtc::PlatformThread> _ptrThreadRec; 191 rtc::scoped_ptr<rtc::PlatformThread> _ptrThreadPlay; 192 193 int32_t _id; 194 195 AudioMixerManagerLinuxALSA _mixerManager; 196 197 uint16_t _inputDeviceIndex; 198 uint16_t _outputDeviceIndex; 199 bool _inputDeviceIsSpecified; 200 bool _outputDeviceIsSpecified; 201 202 snd_pcm_t* _handleRecord; 203 snd_pcm_t* _handlePlayout; 204 205 snd_pcm_uframes_t _recordingBuffersizeInFrame; 206 snd_pcm_uframes_t _recordingPeriodSizeInFrame; 207 snd_pcm_uframes_t _playoutBufferSizeInFrame; 208 snd_pcm_uframes_t _playoutPeriodSizeInFrame; 209 210 ssize_t _recordingBufferSizeIn10MS; 211 ssize_t _playoutBufferSizeIn10MS; 212 uint32_t _recordingFramesIn10MS; 213 uint32_t _playoutFramesIn10MS; 214 215 uint32_t _recordingFreq; 216 uint32_t _playoutFreq; 217 uint8_t _recChannels; 218 uint8_t _playChannels; 219 220 int8_t* _recordingBuffer; // in byte 221 int8_t* _playoutBuffer; // in byte 222 uint32_t _recordingFramesLeft; 223 uint32_t _playoutFramesLeft; 224 225 AudioDeviceModule::BufferType _playBufType; 226 227 private: 228 bool _initialized; 229 bool _recording; 230 bool _playing; 231 bool _recIsInitialized; 232 bool _playIsInitialized; 233 bool _AGC; 234 235 snd_pcm_sframes_t _recordingDelay; 236 snd_pcm_sframes_t _playoutDelay; 237 238 uint16_t _playWarning; 239 uint16_t _playError; 240 uint16_t _recWarning; 241 uint16_t _recError; 242 243 uint16_t _playBufDelay; // playback delay 244 uint16_t _playBufDelayFixed; // fixed playback delay 245 246 char _oldKeyState[32]; 247 #if defined(USE_X11) 248 Display* _XDisplay; 249 #endif 250 }; 251 252 } 253 254 #endif // MODULES_AUDIO_DEVICE_MAIN_SOURCE_LINUX_AUDIO_DEVICE_ALSA_LINUX_H_ 255