Index: media/base/audio_buffer_queue.cc |
diff --git a/media/base/audio_buffer_queue.cc b/media/base/audio_buffer_queue.cc |
index dfa655a3be33498c11f125d12ff32d68626cacc0..a8e1f575a20d8bfa978ea237fa84b3bafe464496 100644 |
--- a/media/base/audio_buffer_queue.cc |
+++ b/media/base/audio_buffer_queue.cc |
@@ -35,7 +35,8 @@ void AudioBufferQueue::Append(const scoped_refptr<AudioBuffer>& buffer_in) { |
int AudioBufferQueue::ReadFrames(int frames, |
int dest_frame_offset, |
AudioBus* dest) { |
- DCHECK_GE(dest->frames(), frames + dest_frame_offset); |
+ if (!dest->is_raw_format()) |
+ DCHECK_GE(dest->frames(), frames + dest_frame_offset); |
return InternalRead(frames, true, 0, dest_frame_offset, dest); |
} |
@@ -60,6 +61,35 @@ int AudioBufferQueue::InternalRead(int frames, |
int source_frame_offset, |
int dest_frame_offset, |
AudioBus* dest) { |
+ if (!buffers_.size()) |
+ return 0; |
+ |
+ if ((*buffers_.begin())->sample_format() == kSampleFormatRaw) { |
+ DCHECK(!dest_frame_offset); |
+ DCHECK(!source_frame_offset); |
+ |
+ scoped_refptr<AudioBuffer> buffer = buffers_.front(); |
+ int taken = buffer->frame_count(); |
+ |
+ // if |dest| is NULL, there's no need to copy. |
+ if (dest) |
+ buffer->ReadFrames(buffer->frame_count(), 0, dest->data_size(), dest); |
+ |
+ if (advance_position) { |
+ // Update the appropriate values since |taken| frames have been copied |
+ // out. |
+ frames_ -= taken; |
+ DCHECK_GE(frames_, 0); |
+ |
+ // Remove any buffers before the current buffer as there is no going |
+ // backwards. |
+ buffers_.pop_front(); |
+ current_buffer_ = buffers_.begin(); |
+ } |
+ |
+ return taken; |
+ } |
+ |
// Counts how many frames are actually read from the buffer queue. |
int taken = 0; |
BufferQueue::iterator current_buffer = current_buffer_; |