12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef MEDIA_AUDIO_PULSE_PULSE_INPUT_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MEDIA_AUDIO_PULSE_PULSE_INPUT_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch#include <pulse/pulseaudio.h> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/thread_checker.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "media/audio/agc_audio_stream.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/audio_device_name.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/audio_io.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/audio/audio_parameters.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/audio_block_fifo.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AudioManagerPulse; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class PulseAudioInputStream : public AgcAudioStream<AudioInputStream> { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PulseAudioInputStream(AudioManagerPulse* audio_manager, 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_name, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AudioParameters& params, 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pa_threaded_mainloop* mainloop, 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pa_context* context); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~PulseAudioInputStream(); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Implementation of AudioInputStream. 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool Open() OVERRIDE; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Start(AudioInputCallback* callback) OVERRIDE; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Stop() OVERRIDE; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Close() OVERRIDE; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual double GetMaxVolume() OVERRIDE; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetVolume(double volume) OVERRIDE; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual double GetVolume() OVERRIDE; 40ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch virtual bool IsMuted() OVERRIDE; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PulseAudio Callbacks. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void ReadCallback(pa_stream* handle, size_t length, void* user_data); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void StreamNotifyCallback(pa_stream* stream, void* user_data); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void VolumeCallback(pa_context* context, const pa_source_info* info, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int error, void* user_data); 48ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch static void MuteCallback(pa_context* context, 49ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch const pa_source_info* info, 50ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch int error, 51ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch void* user_data); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helper for the ReadCallback. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReadData(); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 56ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch // Utility method used by GetVolume() and IsMuted(). 57ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch bool GetSourceInformation(pa_source_info_cb_t callback); 58ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AudioManagerPulse* audio_manager_; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AudioInputCallback* callback_; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string device_name_; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AudioParameters params_; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int channels_; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double volume_; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool stream_started_; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 67ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch // Set to true in IsMuted() if user has muted the selected microphone in the 68ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch // sound settings UI. 69ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch bool muted_; 70ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Holds the data from the OS. 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AudioBlockFifo fifo_; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PulseAudio API structs. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pa_threaded_mainloop* pa_mainloop_; // Weak. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pa_context* pa_context_; // Weak. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pa_stream* handle_; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Flag indicating the state of the context has been changed. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool context_state_changed_; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::ThreadChecker thread_checker_; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PulseAudioInputStream); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace media 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // MEDIA_AUDIO_PULSE_PULSE_INPUT_H_ 90