audio_device_pulse_linux.h revision 2550988baaf3a50a2eb1a595c26bc7912ad99b30
168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com/* 228f3913ca95de8bd489ce3f6afd891864e8779cbleozwang@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com * 468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com * Use of this source code is governed by a BSD-style license 568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com * that can be found in the LICENSE file in the root of the source 668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com * tree. An additional intellectual property rights grant can be found 768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com * in the file PATENTS. All contributing project authors may 868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com * be found in the AUTHORS file in the root of the source tree. 968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com */ 1068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 1168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#ifndef WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_PULSE_LINUX_H 1268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_PULSE_LINUX_H 1368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 1468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#include "audio_device_generic.h" 1568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#include "audio_mixer_manager_pulse_linux.h" 1668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#include "critical_section_wrapper.h" 1768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 1868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#include <pulse/pulseaudio.h> 1968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 2068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// Set this define to make the code behave like in GTalk/libjingle 2168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com//#define WEBRTC_PA_GTALK 2268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 2368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// We define this flag if it's missing from our headers, because we want to be 2468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// able to compile against old headers but still use PA_STREAM_ADJUST_LATENCY 2568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// if run against a recent version of the library. 2668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#ifndef PA_STREAM_ADJUST_LATENCY 2768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#define PA_STREAM_ADJUST_LATENCY 0x2000U 2868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#endif 2968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#ifndef PA_STREAM_START_MUTED 3068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#define PA_STREAM_START_MUTED 0x1000U 3168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#endif 3268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 3368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// Set this constant to 0 to disable latency reading 342550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.orgconst uint32_t WEBRTC_PA_REPORT_LATENCY = 1; 3568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 3668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// Constants from implementation by Tristan Schmelcher [tschmelcher@google.com] 3768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 3868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// First PulseAudio protocol version that supports PA_STREAM_ADJUST_LATENCY. 392550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.orgconst uint32_t WEBRTC_PA_ADJUST_LATENCY_PROTOCOL_VERSION = 13; 4068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 4168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// Some timing constants for optimal operation. See 4268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// https://tango.0pointer.de/pipermail/pulseaudio-discuss/2008-January/001170.html 4368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// for a good explanation of some of the factors that go into this. 4468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 4568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// Playback. 4668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 4768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// For playback, there is a round-trip delay to fill the server-side playback 4868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// buffer, so setting too low of a latency is a buffer underflow risk. We will 4968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// automatically increase the latency if a buffer underflow does occur, but we 5068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// also enforce a sane minimum at start-up time. Anything lower would be 5168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// virtually guaranteed to underflow at least once, so there's no point in 5268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// allowing lower latencies. 532550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.orgconst uint32_t WEBRTC_PA_PLAYBACK_LATENCY_MINIMUM_MSECS = 20; 5468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 5568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// Every time a playback stream underflows, we will reconfigure it with target 5668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// latency that is greater by this amount. 572550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.orgconst uint32_t WEBRTC_PA_PLAYBACK_LATENCY_INCREMENT_MSECS = 20; 5868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 5968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// We also need to configure a suitable request size. Too small and we'd burn 6068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// CPU from the overhead of transfering small amounts of data at once. Too large 6168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// and the amount of data remaining in the buffer right before refilling it 6268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// would be a buffer underflow risk. We set it to half of the buffer size. 632550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.orgconst uint32_t WEBRTC_PA_PLAYBACK_REQUEST_FACTOR = 2; 6468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 6568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// Capture. 6668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 6768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// For capture, low latency is not a buffer overflow risk, but it makes us burn 6868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// CPU from the overhead of transfering small amounts of data at once, so we set 6968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// a recommended value that we use for the kLowLatency constant (but if the user 7068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// explicitly requests something lower then we will honour it). 7168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// 1ms takes about 6-7% CPU. 5ms takes about 5%. 10ms takes about 4.x%. 722550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.orgconst uint32_t WEBRTC_PA_LOW_CAPTURE_LATENCY_MSECS = 10; 7368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 7468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// There is a round-trip delay to ack the data to the server, so the 7568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// server-side buffer needs extra space to prevent buffer overflow. 20ms is 7668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// sufficient, but there is no penalty to making it bigger, so we make it huge. 7768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// (750ms is libpulse's default value for the _total_ buffer size in the 7868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// kNoLatencyRequirements case.) 792550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.orgconst uint32_t WEBRTC_PA_CAPTURE_BUFFER_EXTRA_MSECS = 750; 8068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 812550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.orgconst uint32_t WEBRTC_PA_MSECS_PER_SEC = 1000; 8268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 8368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// Init _configuredLatencyRec/Play to this value to disable latency requirements 842550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.orgconst int32_t WEBRTC_PA_NO_LATENCY_REQUIREMENTS = -1; 8568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 8668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com// Set this const to 1 to account for peeked and used data in latency calculation 872550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.orgconst uint32_t WEBRTC_PA_CAPTURE_BUFFER_LATENCY_ADJUSTMENT = 0; 8868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 8968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.comnamespace webrtc 9068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com{ 9168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.comclass EventWrapper; 9268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.comclass ThreadWrapper; 9368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 9468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.comclass AudioDeviceLinuxPulse: public AudioDeviceGeneric 9568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com{ 9668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.compublic: 972550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org AudioDeviceLinuxPulse(const int32_t id); 9868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com ~AudioDeviceLinuxPulse(); 9968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 10068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static bool PulseAudioIsSupported(); 10168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 10268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Retrieve the currently utilized audio layer 1032550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t 10468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com ActiveAudioLayer(AudioDeviceModule::AudioLayer& audioLayer) const; 10568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 10668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Main initializaton and termination 1072550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t Init(); 1082550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t Terminate(); 10968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool Initialized() const; 11068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 11168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Device enumeration 1122550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int16_t PlayoutDevices(); 1132550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int16_t RecordingDevices(); 1142550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t PlayoutDeviceName( 1152550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t index, 11628f3913ca95de8bd489ce3f6afd891864e8779cbleozwang@webrtc.org char name[kAdmMaxDeviceNameSize], 11728f3913ca95de8bd489ce3f6afd891864e8779cbleozwang@webrtc.org char guid[kAdmMaxGuidSize]); 1182550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t RecordingDeviceName( 1192550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t index, 12028f3913ca95de8bd489ce3f6afd891864e8779cbleozwang@webrtc.org char name[kAdmMaxDeviceNameSize], 12128f3913ca95de8bd489ce3f6afd891864e8779cbleozwang@webrtc.org char guid[kAdmMaxGuidSize]); 12268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 12368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Device selection 1242550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetPlayoutDevice(uint16_t index); 1252550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetPlayoutDevice( 12668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com AudioDeviceModule::WindowsDeviceType device); 1272550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetRecordingDevice(uint16_t index); 1282550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetRecordingDevice( 12968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com AudioDeviceModule::WindowsDeviceType device); 13068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 13168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Audio transport initialization 1322550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t PlayoutIsAvailable(bool& available); 1332550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t InitPlayout(); 13468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool PlayoutIsInitialized() const; 1352550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t RecordingIsAvailable(bool& available); 1362550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t InitRecording(); 13768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool RecordingIsInitialized() const; 13868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 13968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Audio transport control 1402550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t StartPlayout(); 1412550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t StopPlayout(); 14268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool Playing() const; 1432550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t StartRecording(); 1442550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t StopRecording(); 14568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool Recording() const; 14668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 14768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Microphone Automatic Gain Control (AGC) 1482550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetAGC(bool enable); 14968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool AGC() const; 15068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 15168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Volume control based on the Windows Wave API (Windows only) 1522550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetWaveOutVolume(uint16_t volumeLeft, uint16_t volumeRight); 1532550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t WaveOutVolume(uint16_t& volumeLeft, 1542550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t& volumeRight) const; 15568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 15668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Audio mixer initialization 1572550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SpeakerIsAvailable(bool& available); 1582550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t InitSpeaker(); 15968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool SpeakerIsInitialized() const; 1602550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MicrophoneIsAvailable(bool& available); 1612550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t InitMicrophone(); 16268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool MicrophoneIsInitialized() const; 16368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 16468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Speaker volume controls 1652550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SpeakerVolumeIsAvailable(bool& available); 1662550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetSpeakerVolume(uint32_t volume); 1672550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SpeakerVolume(uint32_t& volume) const; 1682550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const; 1692550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const; 1702550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const; 17168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 17268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Microphone volume controls 1732550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MicrophoneVolumeIsAvailable(bool& available); 1742550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetMicrophoneVolume(uint32_t volume); 1752550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MicrophoneVolume(uint32_t& volume) const; 1762550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const; 1772550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const; 1782550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MicrophoneVolumeStepSize( 1792550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t& stepSize) const; 18068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 18168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Speaker mute control 1822550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SpeakerMuteIsAvailable(bool& available); 1832550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetSpeakerMute(bool enable); 1842550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SpeakerMute(bool& enabled) const; 18568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 18668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Microphone mute control 1872550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MicrophoneMuteIsAvailable(bool& available); 1882550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetMicrophoneMute(bool enable); 1892550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MicrophoneMute(bool& enabled) const; 19068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 19168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Microphone boost control 1922550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MicrophoneBoostIsAvailable(bool& available); 1932550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetMicrophoneBoost(bool enable); 1942550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t MicrophoneBoost(bool& enabled) const; 19568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 19668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Stereo support 1972550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t StereoPlayoutIsAvailable(bool& available); 1982550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetStereoPlayout(bool enable); 1992550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t StereoPlayout(bool& enabled) const; 2002550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t StereoRecordingIsAvailable(bool& available); 2012550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t SetStereoRecording(bool enable); 2022550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t StereoRecording(bool& enabled) const; 20368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 20468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // Delay information and control 2052550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t 20668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com SetPlayoutBuffer(const AudioDeviceModule::BufferType type, 2072550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t sizeMS); 2082550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type, 2092550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t& sizeMS) const; 2102550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t PlayoutDelay(uint16_t& delayMS) const; 2112550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t RecordingDelay(uint16_t& delayMS) const; 21268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 21368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // CPU load 2142550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org virtual int32_t CPULoad(uint16_t& load) const; 21568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 21668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.compublic: 21768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool PlayoutWarning() const; 21868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool PlayoutError() const; 21968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool RecordingWarning() const; 22068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual bool RecordingError() const; 22168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual void ClearPlayoutWarning(); 22268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual void ClearPlayoutError(); 22368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual void ClearRecordingWarning(); 22468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual void ClearRecordingError(); 22568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 22668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.compublic: 22768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer); 22868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 22968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.comprivate: 23068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void Lock() 23168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com { 23268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com _critSect.Enter(); 23368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com } 23468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com ; 23568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void UnLock() 23668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com { 23768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com _critSect.Leave(); 23868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com } 23968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com ; 24068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void WaitForOperationCompletion(pa_operation* paOperation) const; 24168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void WaitForSuccess(pa_operation* paOperation) const; 24268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 24368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.comprivate: 24468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static void PaContextStateCallback(pa_context *c, void *pThis); 24568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static void PaSinkInfoCallback(pa_context *c, const pa_sink_info *i, 24668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com int eol, void *pThis); 24768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static void PaSourceInfoCallback(pa_context *c, const pa_source_info *i, 24868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com int eol, void *pThis); 24968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static void PaServerInfoCallback(pa_context *c, const pa_server_info *i, 25068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void *pThis); 25168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static void PaStreamStateCallback(pa_stream *p, void *pThis); 25268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaContextStateCallbackHandler(pa_context *c); 25368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaSinkInfoCallbackHandler(const pa_sink_info *i, int eol); 25468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaSourceInfoCallbackHandler(const pa_source_info *i, int eol); 25568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaServerInfoCallbackHandler(const pa_server_info *i); 25668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaStreamStateCallbackHandler(pa_stream *p); 25768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 25868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void EnableWriteCallback(); 25968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void DisableWriteCallback(); 26068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static void PaStreamWriteCallback(pa_stream *unused, size_t buffer_space, 26168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void *pThis); 26268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaStreamWriteCallbackHandler(size_t buffer_space); 26368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static void PaStreamUnderflowCallback(pa_stream *unused, void *pThis); 26468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaStreamUnderflowCallbackHandler(); 26568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void EnableReadCallback(); 26668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void DisableReadCallback(); 26768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static void PaStreamReadCallback(pa_stream *unused1, size_t unused2, 26868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void *pThis); 26968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaStreamReadCallbackHandler(); 27068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static void PaStreamOverflowCallback(pa_stream *unused, void *pThis); 27168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaStreamOverflowCallbackHandler(); 2722550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t LatencyUsecs(pa_stream *stream); 2732550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t ReadRecordedData(const void* bufferData, size_t bufferSize); 2742550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t ProcessRecordedData(int8_t *bufferData, 2752550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint32_t bufferSizeInSamples, 2762550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint32_t recDelay); 2772550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org 2782550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t CheckPulseAudioVersion(); 2792550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t InitSamplingFrequency(); 2802550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t GetDefaultDeviceInfo(bool recDevice, char* name, uint16_t& index); 2812550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t InitPulseAudio(); 2822550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t TerminatePulseAudio(); 28368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 28468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaLock(); 28568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com void PaUnLock(); 28668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 28768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static bool RecThreadFunc(void*); 28868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com static bool PlayThreadFunc(void*); 28968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool RecThreadProcess(); 29068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool PlayThreadProcess(); 29168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 29268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.comprivate: 29368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com AudioDeviceBuffer* _ptrAudioBuffer; 29468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 29568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com CriticalSectionWrapper& _critSect; 29668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com EventWrapper& _timeEventRec; 29768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com EventWrapper& _timeEventPlay; 29868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com EventWrapper& _recStartEvent; 29968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com EventWrapper& _playStartEvent; 30068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 30168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com ThreadWrapper* _ptrThreadPlay; 30268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com ThreadWrapper* _ptrThreadRec; 3032550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint32_t _recThreadID; 3042550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint32_t _playThreadID; 3052550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t _id; 30668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 30768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com AudioMixerManagerLinuxPulse _mixerManager; 30868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 3092550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t _inputDeviceIndex; 3102550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t _outputDeviceIndex; 31168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _inputDeviceIsSpecified; 31268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _outputDeviceIsSpecified; 31368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 3142550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint32_t _samplingFreq; 3152550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint8_t _recChannels; 3162550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint8_t _playChannels; 31768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 31868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com AudioDeviceModule::BufferType _playBufType; 31968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 32068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.comprivate: 32168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _initialized; 32268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _recording; 32368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _playing; 32468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _recIsInitialized; 32568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _playIsInitialized; 32668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _startRec; 32768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _stopRec; 32868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _startPlay; 32968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _stopPlay; 33068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _AGC; 331589673f1cbef93921900a835de52d05ad4f3a0e2andrew@webrtc.org bool update_speaker_volume_at_startup_; 33268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 33368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.comprivate: 3342550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t _playBufDelayFixed; // fixed playback delay 33568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 3362550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint32_t _sndCardPlayDelay; 3372550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint32_t _sndCardRecDelay; 33868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 3392550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t _writeErrors; 3402550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t _playWarning; 3412550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t _playError; 3422550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t _recWarning; 3432550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t _recError; 34468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 3452550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t _deviceIndex; 3462550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int16_t _numPlayDevices; 3472550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int16_t _numRecDevices; 34828f3913ca95de8bd489ce3f6afd891864e8779cbleozwang@webrtc.org char* _playDeviceName; 34928f3913ca95de8bd489ce3f6afd891864e8779cbleozwang@webrtc.org char* _recDeviceName; 35028f3913ca95de8bd489ce3f6afd891864e8779cbleozwang@webrtc.org char* _playDisplayDeviceName; 35128f3913ca95de8bd489ce3f6afd891864e8779cbleozwang@webrtc.org char* _recDisplayDeviceName; 35228f3913ca95de8bd489ce3f6afd891864e8779cbleozwang@webrtc.org char _paServerVersion[32]; 35368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 3542550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int8_t* _playBuffer; 35568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com size_t _playbackBufferSize; 35668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com size_t _playbackBufferUnused; 35768efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com size_t _tempBufferSpace; 3582550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int8_t* _recBuffer; 35968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com size_t _recordBufferSize; 36068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com size_t _recordBufferUsed; 36168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com const void* _tempSampleData; 36268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com size_t _tempSampleDataSize; 3632550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t _configuredLatencyPlay; 3642550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org int32_t _configuredLatencyRec; 36568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 36668efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com // PulseAudio 3672550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint16_t _paDeviceIndex; 36868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com bool _paStateChanged; 36968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 37068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com pa_threaded_mainloop* _paMainloop; 37168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com pa_mainloop_api* _paMainloopApi; 37268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com pa_context* _paContext; 37368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 37468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com pa_stream* _recStream; 37568efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com pa_stream* _playStream; 3762550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint32_t _recStreamFlags; 3772550988baaf3a50a2eb1a595c26bc7912ad99b30pbos@webrtc.org uint32_t _playStreamFlags; 37868efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com pa_buffer_attr _playBufferAttr; 37968efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com pa_buffer_attr _recBufferAttr; 38068efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com}; 38168efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 38268efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com} 38368efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com 38468efa21abcae03939dd03ea6ec11fd6f510c8c47xians@google.com#endif // MODULES_AUDIO_DEVICE_MAIN_SOURCE_LINUX_AUDIO_DEVICE_PULSE_LINUX_H_ 385