1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_AUDIO_DEVICE_AUDIO_MIXER_MANAGER_PULSE_LINUX_H 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_AUDIO_DEVICE_AUDIO_MIXER_MANAGER_PULSE_LINUX_H 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/include/audio_device.h" 15bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/modules/audio_device/linux/pulseaudiosymboltable_linux.h" 16bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 17bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include "webrtc/typedefs.h" 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <pulse/pulseaudio.h> 20bc669ace8f09d73e95f923253ecdadd366f9b7f1pbos@webrtc.org#include <stdint.h> 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef UINT32_MAX 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define UINT32_MAX ((uint32_t)-1) 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AudioMixerManagerLinuxPulse 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 3264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SetPlayStream(pa_stream* playStream); 3364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SetRecStream(pa_stream* recStream); 3464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t OpenSpeaker(uint16_t deviceIndex); 3564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t OpenMicrophone(uint16_t deviceIndex); 3664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SetSpeakerVolume(uint32_t volume); 3764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SpeakerVolume(uint32_t& volume) const; 3864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MaxSpeakerVolume(uint32_t& maxVolume) const; 3964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MinSpeakerVolume(uint32_t& minVolume) const; 4064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SpeakerVolumeStepSize(uint16_t& stepSize) const; 4164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SpeakerVolumeIsAvailable(bool& available); 4264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SpeakerMuteIsAvailable(bool& available); 4364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SetSpeakerMute(bool enable); 4464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t StereoPlayoutIsAvailable(bool& available); 4564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t StereoRecordingIsAvailable(bool& available); 4664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SpeakerMute(bool& enabled) const; 4764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MicrophoneMuteIsAvailable(bool& available); 4864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SetMicrophoneMute(bool enable); 4964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MicrophoneMute(bool& enabled) const; 5064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MicrophoneBoostIsAvailable(bool& available); 5164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SetMicrophoneBoost(bool enable); 5264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MicrophoneBoost(bool& enabled) const; 5364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MicrophoneVolumeIsAvailable(bool& available); 5464a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SetMicrophoneVolume(uint32_t volume); 5564a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MicrophoneVolume(uint32_t& volume) const; 5664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const; 5764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MinMicrophoneVolume(uint32_t& minVolume) const; 5864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t MicrophoneVolumeStepSize(uint16_t& stepSize) const; 5964a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t SetPulseAudioObjects(pa_threaded_mainloop* mainloop, 6064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org pa_context* context); 6164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t Close(); 6264a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t CloseSpeaker(); 6364a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t CloseMicrophone(); 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool SpeakerIsInitialized() const; 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool MicrophoneIsInitialized() const; 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 6864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org AudioMixerManagerLinuxPulse(const int32_t id); 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ~AudioMixerManagerLinuxPulse(); 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static void PaSinkInfoCallback(pa_context *c, const pa_sink_info *i, 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int eol, void *pThis); 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static void PaSinkInputInfoCallback(pa_context *c, 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const pa_sink_input_info *i, int eol, 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void *pThis); 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static void PaSourceInfoCallback(pa_context *c, const pa_source_info *i, 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int eol, void *pThis); 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static void 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PaSetVolumeCallback(pa_context* /*c*/, int success, void* /*pThis*/); 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void PaSinkInfoCallbackHandler(const pa_sink_info *i, int eol); 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void PaSinkInputInfoCallbackHandler(const pa_sink_input_info *i, int eol); 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void PaSourceInfoCallbackHandler(const pa_source_info *i, int eol); 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void ResetCallbackVariables() const; 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void WaitForOperationCompletion(pa_operation* paOperation) const; 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void PaLock() const; 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void PaUnLock() const; 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool GetSinkInputInfo() const; 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool GetSinkInfoByIndex(int device_index)const ; 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool GetSourceInfoByIndex(int device_index) const; 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionWrapper& _critSect; 9664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int32_t _id; 9764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int16_t _paOutputDeviceIndex; 9864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org int16_t _paInputDeviceIndex; 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pa_stream* _paPlayStream; 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pa_stream* _paRecStream; 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pa_threaded_mainloop* _paMainloop; 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pa_context* _paContext; 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 10664a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org mutable uint32_t _paVolume; 10764a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org mutable uint32_t _paMute; 10864a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org mutable uint32_t _paVolSteps; 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _paSpeakerMute; 11064a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org mutable uint32_t _paSpeakerVolume; 11164a144ff1bf67bc85942721aab04c98757b83e3bpbos@webrtc.org mutable uint8_t _paChannels; 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _paObjectsSet; 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mutable bool _callbackValues; 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // MODULES_AUDIO_DEVICE_MAIN_SOURCE_LINUX_AUDIO_MIXER_MANAGER_PULSE_LINUX_H_ 119