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