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 <string>
      9 
     10 #include "base/threading/thread_checker.h"
     11 #include "media/audio/agc_audio_stream.h"
     12 #include "media/audio/audio_device_name.h"
     13 #include "media/audio/audio_io.h"
     14 #include "media/audio/audio_parameters.h"
     15 
     16 struct pa_context;
     17 struct pa_source_info;
     18 struct pa_stream;
     19 struct pa_threaded_mainloop;
     20 
     21 namespace media {
     22 
     23 class AudioManagerPulse;
     24 class SeekableBuffer;
     25 
     26 class PulseAudioInputStream : public AgcAudioStream<AudioInputStream> {
     27  public:
     28   PulseAudioInputStream(AudioManagerPulse* audio_manager,
     29                         const std::string& device_name,
     30                         const AudioParameters& params,
     31                         pa_threaded_mainloop* mainloop,
     32                         pa_context* context);
     33 
     34   virtual ~PulseAudioInputStream();
     35 
     36   // Implementation of AudioInputStream.
     37   virtual bool Open() OVERRIDE;
     38   virtual void Start(AudioInputCallback* callback) OVERRIDE;
     39   virtual void Stop() OVERRIDE;
     40   virtual void Close() OVERRIDE;
     41   virtual double GetMaxVolume() OVERRIDE;
     42   virtual void SetVolume(double volume) OVERRIDE;
     43   virtual double GetVolume() OVERRIDE;
     44 
     45  private:
     46   // PulseAudio Callbacks.
     47   static void ReadCallback(pa_stream* handle, size_t length, void* user_data);
     48   static void StreamNotifyCallback(pa_stream* stream, void* user_data);
     49   static void VolumeCallback(pa_context* context, const pa_source_info* info,
     50                              int error, void* user_data);
     51 
     52   // Helper for the ReadCallback.
     53   void ReadData();
     54 
     55   AudioManagerPulse* audio_manager_;
     56   AudioInputCallback* callback_;
     57   std::string device_name_;
     58   AudioParameters params_;
     59   int channels_;
     60   double volume_;
     61   bool stream_started_;
     62 
     63   // Holds the data from the OS.
     64   scoped_ptr<media::SeekableBuffer> buffer_;
     65 
     66   // Temporary storage for recorded data. It gets a packet of data from
     67   // |buffer_| and deliver the data to OnData() callback.
     68   scoped_ptr<uint8[]> audio_data_buffer_;
     69 
     70   // PulseAudio API structs.
     71   pa_threaded_mainloop* pa_mainloop_; // Weak.
     72   pa_context* pa_context_;  // Weak.
     73   pa_stream* handle_;
     74 
     75   // Flag indicating the state of the context has been changed.
     76   bool context_state_changed_;
     77 
     78   scoped_ptr<AudioBus> audio_bus_;
     79 
     80   base::ThreadChecker thread_checker_;
     81 
     82   DISALLOW_COPY_AND_ASSIGN(PulseAudioInputStream);
     83 };
     84 
     85 }  // namespace media
     86 
     87 #endif  // MEDIA_AUDIO_PULSE_PULSE_INPUT_H_
     88