Home | History | Annotate | Download | only in pulse
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef MEDIA_AUDIO_PULSE_PULSE_INPUT_H_
      6 #define MEDIA_AUDIO_PULSE_PULSE_INPUT_H_
      7 
      8 #include <pulse/pulseaudio.h>
      9 #include <string>
     10 
     11 #include "base/threading/thread_checker.h"
     12 #include "media/audio/agc_audio_stream.h"
     13 #include "media/audio/audio_device_name.h"
     14 #include "media/audio/audio_io.h"
     15 #include "media/audio/audio_parameters.h"
     16 #include "media/base/audio_block_fifo.h"
     17 
     18 namespace media {
     19 
     20 class AudioManagerPulse;
     21 
     22 class PulseAudioInputStream : public AgcAudioStream<AudioInputStream> {
     23  public:
     24   PulseAudioInputStream(AudioManagerPulse* audio_manager,
     25                         const std::string& device_name,
     26                         const AudioParameters& params,
     27                         pa_threaded_mainloop* mainloop,
     28                         pa_context* context);
     29 
     30   virtual ~PulseAudioInputStream();
     31 
     32   // Implementation of AudioInputStream.
     33   virtual bool Open() OVERRIDE;
     34   virtual void Start(AudioInputCallback* callback) OVERRIDE;
     35   virtual void Stop() OVERRIDE;
     36   virtual void Close() OVERRIDE;
     37   virtual double GetMaxVolume() OVERRIDE;
     38   virtual void SetVolume(double volume) OVERRIDE;
     39   virtual double GetVolume() OVERRIDE;
     40   virtual bool IsMuted() OVERRIDE;
     41 
     42  private:
     43   // PulseAudio Callbacks.
     44   static void ReadCallback(pa_stream* handle, size_t length, void* user_data);
     45   static void StreamNotifyCallback(pa_stream* stream, void* user_data);
     46   static void VolumeCallback(pa_context* context, const pa_source_info* info,
     47                              int error, void* user_data);
     48   static void MuteCallback(pa_context* context,
     49                            const pa_source_info* info,
     50                            int error,
     51                            void* user_data);
     52 
     53   // Helper for the ReadCallback.
     54   void ReadData();
     55 
     56   // Utility method used by GetVolume() and IsMuted().
     57   bool GetSourceInformation(pa_source_info_cb_t callback);
     58 
     59   AudioManagerPulse* audio_manager_;
     60   AudioInputCallback* callback_;
     61   std::string device_name_;
     62   AudioParameters params_;
     63   int channels_;
     64   double volume_;
     65   bool stream_started_;
     66 
     67   // Set to true in IsMuted() if user has muted the selected microphone in the
     68   // sound settings UI.
     69   bool muted_;
     70 
     71   // Holds the data from the OS.
     72   AudioBlockFifo fifo_;
     73 
     74   // PulseAudio API structs.
     75   pa_threaded_mainloop* pa_mainloop_; // Weak.
     76   pa_context* pa_context_;  // Weak.
     77   pa_stream* handle_;
     78 
     79   // Flag indicating the state of the context has been changed.
     80   bool context_state_changed_;
     81 
     82   base::ThreadChecker thread_checker_;
     83 
     84   DISALLOW_COPY_AND_ASSIGN(PulseAudioInputStream);
     85 };
     86 
     87 }  // namespace media
     88 
     89 #endif  // MEDIA_AUDIO_PULSE_PULSE_INPUT_H_
     90