Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / audio_device / linux / audio_device_pulse_linux.h
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_PULSE_LINUX_H
12 #define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_PULSE_LINUX_H
13
14 #include "webrtc/modules/audio_device/audio_device_generic.h"
15 #include "webrtc/modules/audio_device/linux/audio_mixer_manager_pulse_linux.h"
16 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
17
18 #include <X11/Xlib.h>
19 #include <pulse/pulseaudio.h>
20
21 // We define this flag if it's missing from our headers, because we want to be
22 // able to compile against old headers but still use PA_STREAM_ADJUST_LATENCY
23 // if run against a recent version of the library.
24 #ifndef PA_STREAM_ADJUST_LATENCY
25 #define PA_STREAM_ADJUST_LATENCY 0x2000U
26 #endif
27 #ifndef PA_STREAM_START_MUTED
28 #define PA_STREAM_START_MUTED 0x1000U
29 #endif
30
31 // Set this constant to 0 to disable latency reading
32 const uint32_t WEBRTC_PA_REPORT_LATENCY = 1;
33
34 // Constants from implementation by Tristan Schmelcher [tschmelcher@google.com]
35
36 // First PulseAudio protocol version that supports PA_STREAM_ADJUST_LATENCY.
37 const uint32_t WEBRTC_PA_ADJUST_LATENCY_PROTOCOL_VERSION = 13;
38
39 // Some timing constants for optimal operation. See
40 // https://tango.0pointer.de/pipermail/pulseaudio-discuss/2008-January/001170.html
41 // for a good explanation of some of the factors that go into this.
42
43 // Playback.
44
45 // For playback, there is a round-trip delay to fill the server-side playback
46 // buffer, so setting too low of a latency is a buffer underflow risk. We will
47 // automatically increase the latency if a buffer underflow does occur, but we
48 // also enforce a sane minimum at start-up time. Anything lower would be
49 // virtually guaranteed to underflow at least once, so there's no point in
50 // allowing lower latencies.
51 const uint32_t WEBRTC_PA_PLAYBACK_LATENCY_MINIMUM_MSECS = 20;
52
53 // Every time a playback stream underflows, we will reconfigure it with target
54 // latency that is greater by this amount.
55 const uint32_t WEBRTC_PA_PLAYBACK_LATENCY_INCREMENT_MSECS = 20;
56
57 // We also need to configure a suitable request size. Too small and we'd burn
58 // CPU from the overhead of transfering small amounts of data at once. Too large
59 // and the amount of data remaining in the buffer right before refilling it
60 // would be a buffer underflow risk. We set it to half of the buffer size.
61 const uint32_t WEBRTC_PA_PLAYBACK_REQUEST_FACTOR = 2;
62
63 // Capture.
64
65 // For capture, low latency is not a buffer overflow risk, but it makes us burn
66 // CPU from the overhead of transfering small amounts of data at once, so we set
67 // a recommended value that we use for the kLowLatency constant (but if the user
68 // explicitly requests something lower then we will honour it).
69 // 1ms takes about 6-7% CPU. 5ms takes about 5%. 10ms takes about 4.x%.
70 const uint32_t WEBRTC_PA_LOW_CAPTURE_LATENCY_MSECS = 10;
71
72 // There is a round-trip delay to ack the data to the server, so the
73 // server-side buffer needs extra space to prevent buffer overflow. 20ms is
74 // sufficient, but there is no penalty to making it bigger, so we make it huge.
75 // (750ms is libpulse's default value for the _total_ buffer size in the
76 // kNoLatencyRequirements case.)
77 const uint32_t WEBRTC_PA_CAPTURE_BUFFER_EXTRA_MSECS = 750;
78
79 const uint32_t WEBRTC_PA_MSECS_PER_SEC = 1000;
80
81 // Init _configuredLatencyRec/Play to this value to disable latency requirements
82 const int32_t WEBRTC_PA_NO_LATENCY_REQUIREMENTS = -1;
83
84 // Set this const to 1 to account for peeked and used data in latency calculation
85 const uint32_t WEBRTC_PA_CAPTURE_BUFFER_LATENCY_ADJUSTMENT = 0;
86
87 namespace webrtc
88 {
89 class EventWrapper;
90 class ThreadWrapper;
91
92 class AudioDeviceLinuxPulse: public AudioDeviceGeneric
93 {
94 public:
95     AudioDeviceLinuxPulse(const int32_t id);
96     virtual ~AudioDeviceLinuxPulse();
97
98     // Retrieve the currently utilized audio layer
99     virtual int32_t ActiveAudioLayer(
100         AudioDeviceModule::AudioLayer& audioLayer) const OVERRIDE;
101
102     // Main initializaton and termination
103     virtual int32_t Init() OVERRIDE;
104     virtual int32_t Terminate() OVERRIDE;
105     virtual bool Initialized() const OVERRIDE;
106
107     // Device enumeration
108     virtual int16_t PlayoutDevices() OVERRIDE;
109     virtual int16_t RecordingDevices() OVERRIDE;
110     virtual int32_t PlayoutDeviceName(
111         uint16_t index,
112         char name[kAdmMaxDeviceNameSize],
113         char guid[kAdmMaxGuidSize]) OVERRIDE;
114     virtual int32_t RecordingDeviceName(
115         uint16_t index,
116         char name[kAdmMaxDeviceNameSize],
117         char guid[kAdmMaxGuidSize]) OVERRIDE;
118
119     // Device selection
120     virtual int32_t SetPlayoutDevice(uint16_t index) OVERRIDE;
121     virtual int32_t SetPlayoutDevice(
122         AudioDeviceModule::WindowsDeviceType device) OVERRIDE;
123     virtual int32_t SetRecordingDevice(uint16_t index) OVERRIDE;
124     virtual int32_t SetRecordingDevice(
125         AudioDeviceModule::WindowsDeviceType device) OVERRIDE;
126
127     // Audio transport initialization
128     virtual int32_t PlayoutIsAvailable(bool& available) OVERRIDE;
129     virtual int32_t InitPlayout() OVERRIDE;
130     virtual bool PlayoutIsInitialized() const OVERRIDE;
131     virtual int32_t RecordingIsAvailable(bool& available) OVERRIDE;
132     virtual int32_t InitRecording() OVERRIDE;
133     virtual bool RecordingIsInitialized() const OVERRIDE;
134
135     // Audio transport control
136     virtual int32_t StartPlayout() OVERRIDE;
137     virtual int32_t StopPlayout() OVERRIDE;
138     virtual bool Playing() const OVERRIDE;
139     virtual int32_t StartRecording() OVERRIDE;
140     virtual int32_t StopRecording() OVERRIDE;
141     virtual bool Recording() const OVERRIDE;
142
143     // Microphone Automatic Gain Control (AGC)
144     virtual int32_t SetAGC(bool enable) OVERRIDE;
145     virtual bool AGC() const OVERRIDE;
146
147     // Volume control based on the Windows Wave API (Windows only)
148     virtual int32_t SetWaveOutVolume(uint16_t volumeLeft,
149                                      uint16_t volumeRight) OVERRIDE;
150     virtual int32_t WaveOutVolume(uint16_t& volumeLeft,
151                                   uint16_t& volumeRight) const OVERRIDE;
152
153     // Audio mixer initialization
154     virtual int32_t InitSpeaker() OVERRIDE;
155     virtual bool SpeakerIsInitialized() const OVERRIDE;
156     virtual int32_t InitMicrophone() OVERRIDE;
157     virtual bool MicrophoneIsInitialized() const OVERRIDE;
158
159     // Speaker volume controls
160     virtual int32_t SpeakerVolumeIsAvailable(bool& available) OVERRIDE;
161     virtual int32_t SetSpeakerVolume(uint32_t volume) OVERRIDE;
162     virtual int32_t SpeakerVolume(uint32_t& volume) const OVERRIDE;
163     virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const OVERRIDE;
164     virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const OVERRIDE;
165     virtual int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const OVERRIDE;
166
167     // Microphone volume controls
168     virtual int32_t MicrophoneVolumeIsAvailable(bool& available) OVERRIDE;
169     virtual int32_t SetMicrophoneVolume(uint32_t volume) OVERRIDE;
170     virtual int32_t MicrophoneVolume(uint32_t& volume) const OVERRIDE;
171     virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const OVERRIDE;
172     virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const OVERRIDE;
173     virtual int32_t MicrophoneVolumeStepSize(
174         uint16_t& stepSize) const OVERRIDE;
175
176     // Speaker mute control
177     virtual int32_t SpeakerMuteIsAvailable(bool& available) OVERRIDE;
178     virtual int32_t SetSpeakerMute(bool enable) OVERRIDE;
179     virtual int32_t SpeakerMute(bool& enabled) const OVERRIDE;
180
181     // Microphone mute control
182     virtual int32_t MicrophoneMuteIsAvailable(bool& available) OVERRIDE;
183     virtual int32_t SetMicrophoneMute(bool enable) OVERRIDE;
184     virtual int32_t MicrophoneMute(bool& enabled) const OVERRIDE;
185
186     // Microphone boost control
187     virtual int32_t MicrophoneBoostIsAvailable(bool& available) OVERRIDE;
188     virtual int32_t SetMicrophoneBoost(bool enable) OVERRIDE;
189     virtual int32_t MicrophoneBoost(bool& enabled) const OVERRIDE;
190
191     // Stereo support
192     virtual int32_t StereoPlayoutIsAvailable(bool& available) OVERRIDE;
193     virtual int32_t SetStereoPlayout(bool enable) OVERRIDE;
194     virtual int32_t StereoPlayout(bool& enabled) const OVERRIDE;
195     virtual int32_t StereoRecordingIsAvailable(bool& available) OVERRIDE;
196     virtual int32_t SetStereoRecording(bool enable) OVERRIDE;
197     virtual int32_t StereoRecording(bool& enabled) const OVERRIDE;
198
199     // Delay information and control
200     virtual int32_t
201         SetPlayoutBuffer(const AudioDeviceModule::BufferType type,
202                          uint16_t sizeMS) OVERRIDE;
203     virtual int32_t PlayoutBuffer(AudioDeviceModule::BufferType& type,
204                                   uint16_t& sizeMS) const OVERRIDE;
205     virtual int32_t PlayoutDelay(uint16_t& delayMS) const OVERRIDE;
206     virtual int32_t RecordingDelay(uint16_t& delayMS) const OVERRIDE;
207
208     // CPU load
209     virtual int32_t CPULoad(uint16_t& load) const OVERRIDE;
210
211 public:
212     virtual bool PlayoutWarning() const OVERRIDE;
213     virtual bool PlayoutError() const OVERRIDE;
214     virtual bool RecordingWarning() const OVERRIDE;
215     virtual bool RecordingError() const OVERRIDE;
216     virtual void ClearPlayoutWarning() OVERRIDE;
217     virtual void ClearPlayoutError() OVERRIDE;
218     virtual void ClearRecordingWarning() OVERRIDE;
219     virtual void ClearRecordingError() OVERRIDE;
220
221 public:
222     virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) OVERRIDE;
223
224 private:
225     void Lock() EXCLUSIVE_LOCK_FUNCTION(_critSect) {
226         _critSect.Enter();
227     }
228     void UnLock() UNLOCK_FUNCTION(_critSect) {
229         _critSect.Leave();
230     }
231     void WaitForOperationCompletion(pa_operation* paOperation) const;
232     void WaitForSuccess(pa_operation* paOperation) const;
233
234 private:
235     bool KeyPressed() const;
236
237 private:
238     static void PaContextStateCallback(pa_context *c, void *pThis);
239     static void PaSinkInfoCallback(pa_context *c, const pa_sink_info *i,
240                                    int eol, void *pThis);
241     static void PaSourceInfoCallback(pa_context *c, const pa_source_info *i,
242                                      int eol, void *pThis);
243     static void PaServerInfoCallback(pa_context *c, const pa_server_info *i,
244                                      void *pThis);
245     static void PaStreamStateCallback(pa_stream *p, void *pThis);
246     void PaContextStateCallbackHandler(pa_context *c);
247     void PaSinkInfoCallbackHandler(const pa_sink_info *i, int eol);
248     void PaSourceInfoCallbackHandler(const pa_source_info *i, int eol);
249     void PaServerInfoCallbackHandler(const pa_server_info *i);
250     void PaStreamStateCallbackHandler(pa_stream *p);
251
252     void EnableWriteCallback();
253     void DisableWriteCallback();
254     static void PaStreamWriteCallback(pa_stream *unused, size_t buffer_space,
255                                       void *pThis);
256     void PaStreamWriteCallbackHandler(size_t buffer_space);
257     static void PaStreamUnderflowCallback(pa_stream *unused, void *pThis);
258     void PaStreamUnderflowCallbackHandler();
259     void EnableReadCallback();
260     void DisableReadCallback();
261     static void PaStreamReadCallback(pa_stream *unused1, size_t unused2,
262                                      void *pThis);
263     void PaStreamReadCallbackHandler();
264     static void PaStreamOverflowCallback(pa_stream *unused, void *pThis);
265     void PaStreamOverflowCallbackHandler();
266     int32_t LatencyUsecs(pa_stream *stream);
267     int32_t ReadRecordedData(const void* bufferData, size_t bufferSize);
268     int32_t ProcessRecordedData(int8_t *bufferData,
269                                 uint32_t bufferSizeInSamples,
270                                 uint32_t recDelay);
271
272     int32_t CheckPulseAudioVersion();
273     int32_t InitSamplingFrequency();
274     int32_t GetDefaultDeviceInfo(bool recDevice, char* name, uint16_t& index);
275     int32_t InitPulseAudio();
276     int32_t TerminatePulseAudio();
277
278     void PaLock();
279     void PaUnLock();
280
281     static bool RecThreadFunc(void*);
282     static bool PlayThreadFunc(void*);
283     bool RecThreadProcess();
284     bool PlayThreadProcess();
285
286 private:
287     AudioDeviceBuffer* _ptrAudioBuffer;
288
289     CriticalSectionWrapper& _critSect;
290     EventWrapper& _timeEventRec;
291     EventWrapper& _timeEventPlay;
292     EventWrapper& _recStartEvent;
293     EventWrapper& _playStartEvent;
294
295     ThreadWrapper* _ptrThreadPlay;
296     ThreadWrapper* _ptrThreadRec;
297     uint32_t _recThreadID;
298     uint32_t _playThreadID;
299     int32_t _id;
300
301     AudioMixerManagerLinuxPulse _mixerManager;
302
303     uint16_t _inputDeviceIndex;
304     uint16_t _outputDeviceIndex;
305     bool _inputDeviceIsSpecified;
306     bool _outputDeviceIsSpecified;
307
308     int sample_rate_hz_;
309     uint8_t _recChannels;
310     uint8_t _playChannels;
311
312     AudioDeviceModule::BufferType _playBufType;
313
314 private:
315     bool _initialized;
316     bool _recording;
317     bool _playing;
318     bool _recIsInitialized;
319     bool _playIsInitialized;
320     bool _startRec;
321     bool _stopRec;
322     bool _startPlay;
323     bool _stopPlay;
324     bool _AGC;
325     bool update_speaker_volume_at_startup_;
326
327 private:
328     uint16_t _playBufDelayFixed; // fixed playback delay
329
330     uint32_t _sndCardPlayDelay;
331     uint32_t _sndCardRecDelay;
332
333     int32_t _writeErrors;
334     uint16_t _playWarning;
335     uint16_t _playError;
336     uint16_t _recWarning;
337     uint16_t _recError;
338
339     uint16_t _deviceIndex;
340     int16_t _numPlayDevices;
341     int16_t _numRecDevices;
342     char* _playDeviceName;
343     char* _recDeviceName;
344     char* _playDisplayDeviceName;
345     char* _recDisplayDeviceName;
346     char _paServerVersion[32];
347
348     int8_t* _playBuffer;
349     size_t _playbackBufferSize;
350     size_t _playbackBufferUnused;
351     size_t _tempBufferSpace;
352     int8_t* _recBuffer;
353     size_t _recordBufferSize;
354     size_t _recordBufferUsed;
355     const void* _tempSampleData;
356     size_t _tempSampleDataSize;
357     int32_t _configuredLatencyPlay;
358     int32_t _configuredLatencyRec;
359
360     // PulseAudio
361     uint16_t _paDeviceIndex;
362     bool _paStateChanged;
363
364     pa_threaded_mainloop* _paMainloop;
365     pa_mainloop_api* _paMainloopApi;
366     pa_context* _paContext;
367
368     pa_stream* _recStream;
369     pa_stream* _playStream;
370     uint32_t _recStreamFlags;
371     uint32_t _playStreamFlags;
372     pa_buffer_attr _playBufferAttr;
373     pa_buffer_attr _recBufferAttr;
374
375     char _oldKeyState[32];
376     Display* _XDisplay;
377 };
378
379 }
380
381 #endif  // MODULES_AUDIO_DEVICE_MAIN_SOURCE_LINUX_AUDIO_DEVICE_PULSE_LINUX_H_