| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_AUDIO_PULSE_PULSE_UNIFIED_H_ |
| #define MEDIA_AUDIO_PULSE_PULSE_UNIFIED_H_ |
| |
| #include <pulse/pulseaudio.h> |
| #include <string> |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "media/audio/audio_io.h" |
| #include "media/audio/audio_parameters.h" |
| #include "media/base/audio_fifo.h" |
| |
| namespace media { |
| |
| class AudioManagerBase; |
| class SeekableBuffer; |
| |
| class PulseAudioUnifiedStream : public AudioOutputStream { |
| public: |
| PulseAudioUnifiedStream(const AudioParameters& params, |
| const std::string& input_device_id, |
| AudioManagerBase* manager); |
| |
| virtual ~PulseAudioUnifiedStream(); |
| |
| // Implementation of PulseAudioUnifiedStream. |
| virtual bool Open() OVERRIDE; |
| virtual void Close() OVERRIDE; |
| virtual void Start(AudioSourceCallback* callback) OVERRIDE; |
| virtual void Stop() OVERRIDE; |
| virtual void SetVolume(double volume) OVERRIDE; |
| virtual void GetVolume(double* volume) OVERRIDE; |
| |
| private: |
| // Called by PulseAudio when |pa_stream_| change state. If an unexpected |
| // failure state change happens and |source_callback_| is set |
| // this method will forward the error via OnError(). |
| static void StreamNotifyCallback(pa_stream* s, void* user_data); |
| |
| // Called by PulseAudio recording stream when it has data. |
| static void ReadCallback(pa_stream* s, size_t length, void* user_data); |
| |
| // Helpers for ReadCallback() to read and write data. |
| void WriteData(size_t requested_bytes); |
| void ReadData(); |
| |
| // Close() helper function to free internal structs. |
| void Reset(); |
| |
| // AudioParameters from the constructor. |
| const AudioParameters params_; |
| |
| // Device unique ID of the input device. |
| const std::string input_device_id_; |
| |
| // Audio manager that created us. Used to report that we've closed. |
| AudioManagerBase* manager_; |
| |
| // PulseAudio API structs. |
| pa_context* pa_context_; |
| pa_threaded_mainloop* pa_mainloop_; |
| pa_stream* input_stream_; |
| pa_stream* output_stream_; |
| |
| // Float representation of volume from 0.0 to 1.0. |
| float volume_; |
| |
| // Callback to audio data source. Must only be modified while holding a lock |
| // on |pa_mainloop_| via pa_threaded_mainloop_lock(). |
| AudioSourceCallback* source_callback_; |
| |
| scoped_ptr<AudioBus> input_bus_; |
| scoped_ptr<AudioBus> output_bus_; |
| |
| // Used for input to output buffering. |
| scoped_ptr<media::SeekableBuffer> fifo_; |
| |
| // Temporary storage for recorded data. It gets a packet of data from |
| // |fifo_| and deliver the data to OnMoreIOData() callback. |
| scoped_ptr<uint8[]> input_data_buffer_; |
| |
| DISALLOW_COPY_AND_ASSIGN(PulseAudioUnifiedStream); |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_AUDIO_PULSE_PULSE_UNIFIED_H_ |