| // Copyright (c) 2012 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_UTIL_H_ |
| #define MEDIA_AUDIO_PULSE_PULSE_UTIL_H_ |
| |
| #include <pulse/pulseaudio.h> |
| |
| #include "base/basictypes.h" |
| #include "media/audio/audio_device_name.h" |
| #include "media/base/channel_layout.h" |
| |
| namespace media { |
| |
| class AudioParameters; |
| |
| namespace pulse { |
| |
| // A helper class that acquires pa_threaded_mainloop_lock() while in scope. |
| class AutoPulseLock { |
| public: |
| explicit AutoPulseLock(pa_threaded_mainloop* pa_mainloop) |
| : pa_mainloop_(pa_mainloop) { |
| pa_threaded_mainloop_lock(pa_mainloop_); |
| } |
| |
| ~AutoPulseLock() { |
| pa_threaded_mainloop_unlock(pa_mainloop_); |
| } |
| |
| private: |
| pa_threaded_mainloop* pa_mainloop_; |
| DISALLOW_COPY_AND_ASSIGN(AutoPulseLock); |
| }; |
| |
| // Triggers pa_threaded_mainloop_signal() to avoid deadlocks. |
| void StreamSuccessCallback(pa_stream* s, int error, void* mainloop); |
| void ContextStateCallback(pa_context* context, void* mainloop); |
| |
| pa_sample_format_t BitsToPASampleFormat(int bits_per_sample); |
| |
| pa_channel_map ChannelLayoutToPAChannelMap(ChannelLayout channel_layout); |
| |
| void WaitForOperationCompletion(pa_threaded_mainloop* mainloop, |
| pa_operation* operation); |
| |
| int GetHardwareLatencyInBytes(pa_stream* stream, |
| int sample_rate, |
| int bytes_per_frame); |
| |
| // Create a recording stream for the threaded mainloop, return true if success, |
| // otherwise false. |mainloop| and |context| have to be from a valid Pulse |
| // threaded mainloop and the handle of the created stream will be returned by |
| // |stream|. |
| bool CreateInputStream(pa_threaded_mainloop* mainloop, |
| pa_context* context, |
| pa_stream** stream, |
| const AudioParameters& params, |
| const std::string& device_id, |
| pa_stream_notify_cb_t stream_callback, |
| void* user_data); |
| |
| // Create a playback stream for the threaded mainloop, return true if success, |
| // otherwise false. This function will create a new Pulse threaded mainloop, |
| // and the handles of the mainloop, context and stream will be returned by |
| // |mainloop|, |context| and |stream|. |
| bool CreateOutputStream(pa_threaded_mainloop** mainloop, |
| pa_context** context, |
| pa_stream** stream, |
| const AudioParameters& params, |
| const std::string& device_id, |
| pa_stream_notify_cb_t stream_callback, |
| pa_stream_request_cb_t write_callback, |
| void* user_data); |
| |
| } // namespace pulse |
| |
| } // namespace media |
| |
| #endif // MEDIA_AUDIO_PULSE_PULSE_UTIL_H_ |