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 |