Chromium Code Reviews| Index: media/filters/audio_renderer_impl.cc |
| diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc |
| index 4af31fcf018291fc50db1c17be5162f501869b9a..8dfeeda57c4f3e9dbd233fc086e22f193e26c0d2 100644 |
| --- a/media/filters/audio_renderer_impl.cc |
| +++ b/media/filters/audio_renderer_impl.cc |
| @@ -227,7 +227,8 @@ AudioRendererImpl::~AudioRendererImpl() { |
| DCHECK(!algorithm_.get()); |
| } |
| -void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) { |
| +void AudioRendererImpl::DecodedAudioReady(AudioDecoder::Status status, |
| + const scoped_refptr<Buffer>& buffer) { |
| base::AutoLock auto_lock(lock_); |
| DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying || |
| state_ == kUnderflow || state_ == kRebuffering || state_ == kStopped); |
| @@ -235,7 +236,20 @@ void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) { |
| CHECK(pending_read_); |
| pending_read_ = false; |
| - if (buffer && buffer->IsEndOfStream()) { |
| + if (status == AudioDecoder::kDecodeError) { |
| + HandleDecodeError(); |
| + return; |
| + } |
| + |
| + if (status == AudioDecoder::kAborted) { |
| + HandleAbortedRead(); |
| + return; |
| + } |
| + |
| + DCHECK_EQ(status, AudioDecoder::kOk); |
| + DCHECK(buffer); |
| + |
| + if (buffer->IsEndOfStream()) { |
| received_end_of_stream_ = true; |
| // Transition to kPlaying if we are currently handling an underflow since |
| @@ -249,7 +263,7 @@ void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) { |
| NOTREACHED(); |
| return; |
| case kPaused: |
| - if (buffer && !buffer->IsEndOfStream()) |
| + if (!buffer->IsEndOfStream()) |
| algorithm_->EnqueueBuffer(buffer); |
| DCHECK(!pending_read_); |
| base::ResetAndReturn(&pause_cb_).Run(); |
| @@ -259,7 +273,7 @@ void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) { |
| ScheduleRead_Locked(); |
| return; |
| } |
| - if (buffer && !buffer->IsEndOfStream()) { |
| + if (!buffer->IsEndOfStream()) { |
| algorithm_->EnqueueBuffer(buffer); |
| if (!algorithm_->IsQueueFull()) |
| return; |
| @@ -270,7 +284,7 @@ void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) { |
| case kPlaying: |
| case kUnderflow: |
| case kRebuffering: |
| - if (buffer && !buffer->IsEndOfStream()) |
| + if (!buffer->IsEndOfStream()) |
| algorithm_->EnqueueBuffer(buffer); |
| return; |
| case kStopped: |
| @@ -508,4 +522,45 @@ void AudioRendererImpl::DisableUnderflowForTesting() { |
| underflow_disabled_ = true; |
| } |
| +void AudioRendererImpl::HandleDecodeError() { |
| + switch (state_) { |
| + case kUninitialized: |
| + NOTREACHED(); |
| + return; |
| + case kPaused: |
| + base::ResetAndReturn(&pause_cb_).Run(); |
|
Ami GONE FROM CHROMIUM
2012/06/26 00:33:21
does the error get dropped at this point?
acolwell GONE FROM CHROMIUM
2012/07/12 01:19:38
Done.
|
| + return; |
| + case kSeeking: |
| + state_ = kPaused; |
| + base::ResetAndReturn(&seek_cb_).Run(PIPELINE_ERROR_DECODE); |
| + return; |
| + case kPlaying: |
| + case kUnderflow: |
| + case kRebuffering: |
| + case kStopped: |
| + host()->SetError(PIPELINE_ERROR_DECODE); |
| + return; |
| + } |
| +} |
| + |
| +void AudioRendererImpl::HandleAbortedRead() { |
| + switch (state_) { |
| + case kUninitialized: |
| + NOTREACHED(); |
| + return; |
| + case kPaused: |
| + base::ResetAndReturn(&pause_cb_).Run(); |
| + return; |
| + case kSeeking: |
| + state_ = kPaused; |
| + base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); |
| + return; |
| + case kPlaying: |
| + case kUnderflow: |
| + case kRebuffering: |
| + case kStopped: |
| + return; |
| + } |
| +} |
| + |
| } // namespace media |