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 c8841cdc339793ad06ea545b205fdb65f9dedb8a..702a8ca9f7470c4d8e5bb009097fd080d183cfc1 100644 |
| --- a/media/filters/audio_renderer_impl.cc |
| +++ b/media/filters/audio_renderer_impl.cc |
| @@ -72,10 +72,8 @@ void AudioRendererImpl::Pause(const base::Closure& callback) { |
| state_ = kPaused; |
| // Pause only when we've completed our pending read. |
| - if (!pending_read_) { |
| - pause_cb_.Run(); |
| - pause_cb_.Reset(); |
| - } |
| + if (!pending_read_) |
| + base::ResetAndReturn(&pause_cb_).Run(); |
| } |
| if (stopped_) |
| @@ -234,7 +232,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); |
| @@ -242,7 +241,20 @@ void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) { |
| CHECK(pending_read_); |
| pending_read_ = false; |
| - if (buffer && buffer->IsEndOfStream()) { |
| + if (status == AudioDecoder::kDecodeError) { |
|
Ami GONE FROM CHROMIUM
2012/07/12 17:10:26
swap order to match enum
acolwell GONE FROM CHROMIUM
2012/07/12 21:59:58
Done.
|
| + 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 |
| @@ -256,7 +268,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(); |
| @@ -266,7 +278,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; |
| @@ -277,7 +289,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: |
| @@ -515,4 +527,46 @@ void AudioRendererImpl::DisableUnderflowForTesting() { |
| underflow_disabled_ = true; |
| } |
| +void AudioRendererImpl::HandleDecodeError() { |
| + switch (state_) { |
| + case kUninitialized: |
| + NOTREACHED(); |
| + return; |
| + case kPaused: |
| + host_->SetError(PIPELINE_ERROR_DECODE); |
| + base::ResetAndReturn(&pause_cb_).Run(); |
| + 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() { |
|
Ami GONE FROM CHROMIUM
2012/07/12 17:10:26
This and the previous method are awfully similar a
acolwell GONE FROM CHROMIUM
2012/07/12 21:59:58
Done. Merged into a single method.
|
| + 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 |