Index: media/audio/pulse/pulse_input.cc |
diff --git a/media/audio/pulse/pulse_input.cc b/media/audio/pulse/pulse_input.cc |
index d5cb94ece22fa09dff7aed7e730d463de037b689..3509d273bcfe6c69744ec09402e1d558ee67f004 100644 |
--- a/media/audio/pulse/pulse_input.cc |
+++ b/media/audio/pulse/pulse_input.cc |
@@ -9,13 +9,15 @@ |
#include "base/logging.h" |
#include "media/audio/pulse/audio_manager_pulse.h" |
#include "media/audio/pulse/pulse_util.h" |
-#include "media/base/seekable_buffer.h" |
namespace media { |
using pulse::AutoPulseLock; |
using pulse::WaitForOperationCompletion; |
+// Number of blocks of buffers used in the |fifo_|. |
+const int kNumberOfBlocksBufferInFifo = 2; |
+ |
PulseAudioInputStream::PulseAudioInputStream(AudioManagerPulse* audio_manager, |
const std::string& device_name, |
const AudioParameters& params, |
@@ -28,6 +30,9 @@ PulseAudioInputStream::PulseAudioInputStream(AudioManagerPulse* audio_manager, |
channels_(0), |
volume_(0.0), |
stream_started_(false), |
+ fifo_(params.channels(), |
+ params.frames_per_buffer(), |
+ kNumberOfBlocksBufferInFifo), |
pa_mainloop_(mainloop), |
pa_context_(context), |
handle_(NULL), |
@@ -35,7 +40,6 @@ PulseAudioInputStream::PulseAudioInputStream(AudioManagerPulse* audio_manager, |
DCHECK(mainloop); |
DCHECK(context); |
CHECK(params_.IsValid()); |
- audio_bus_ = AudioBus::Create(params_); |
} |
PulseAudioInputStream::~PulseAudioInputStream() { |
@@ -54,8 +58,6 @@ bool PulseAudioInputStream::Open() { |
DCHECK(handle_); |
- buffer_.reset(new media::SeekableBuffer(0, 2 * params_.GetBytesPerBuffer())); |
- audio_data_buffer_.reset(new uint8[params_.GetBytesPerBuffer()]); |
return true; |
} |
@@ -74,7 +76,7 @@ void PulseAudioInputStream::Start(AudioInputCallback* callback) { |
// Clean up the old buffer. |
pa_stream_drop(handle_); |
- buffer_->Clear(); |
+ fifo_.Clear(); |
// Start the streaming. |
callback_ = callback; |
@@ -265,23 +267,19 @@ void PulseAudioInputStream::ReadData() { |
if (!data || length == 0) |
break; |
- buffer_->Append(reinterpret_cast<const uint8*>(data), length); |
+ const int number_of_frames = length / params_.GetBytesPerFrame(); |
+ fifo_.Push(data, number_of_frames, params_.bits_per_sample() / 8); |
// Checks if we still have data. |
pa_stream_drop(handle_); |
} while (pa_stream_readable_size(handle_) > 0); |
- int packet_size = params_.GetBytesPerBuffer(); |
- while (buffer_->forward_bytes() >= packet_size) { |
- buffer_->Read(audio_data_buffer_.get(), packet_size); |
- audio_bus_->FromInterleaved(audio_data_buffer_.get(), |
- audio_bus_->frames(), |
- params_.bits_per_sample() / 8); |
- callback_->OnData( |
- this, audio_bus_.get(), hardware_delay, normalized_volume); |
+ while (fifo_.available_blocks()) { |
+ const AudioBus* audio_bus = fifo_.Consume(); |
- if (buffer_->forward_bytes() < packet_size) |
- break; |
+ // Compensate the audio delay caused by the FIFO. |
+ hardware_delay += fifo_.GetAvailableFrames() * params_.GetBytesPerFrame(); |
+ callback_->OnData(this, audio_bus, hardware_delay, normalized_volume); |
// TODO(xians): Remove once PPAPI is using circular buffers. |
DVLOG(1) << "OnData is being called consecutively, sleep 5ms to " |