// 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_