• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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