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