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..1fa0d387ea7f981299c5719d35a850f357ed2931 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::kAborted) { |
+ HandleAbortedReadOrDecodeError(false); |
+ return; |
+ } |
+ |
+ if (status == AudioDecoder::kDecodeError) { |
+ HandleAbortedReadOrDecodeError(true); |
+ 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,29 @@ void AudioRendererImpl::DisableUnderflowForTesting() { |
underflow_disabled_ = true; |
} |
+void AudioRendererImpl::HandleAbortedReadOrDecodeError(bool is_decode_error) { |
+ PipelineStatus status = is_decode_error ? PIPELINE_ERROR_DECODE : PIPELINE_OK; |
+ switch (state_) { |
+ case kUninitialized: |
+ NOTREACHED(); |
+ return; |
+ case kPaused: |
+ if (status != PIPELINE_OK) |
+ host_->SetError(status); |
+ base::ResetAndReturn(&pause_cb_).Run(); |
+ return; |
+ case kSeeking: |
+ state_ = kPaused; |
+ base::ResetAndReturn(&seek_cb_).Run(status); |
+ return; |
+ case kPlaying: |
+ case kUnderflow: |
+ case kRebuffering: |
+ case kStopped: |
+ if (status != PIPELINE_OK) |
+ host_->SetError(status); |
+ return; |
+ } |
+} |
+ |
} // namespace media |