Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/filters/audio_renderer_impl.h" | 5 #include "media/filters/audio_renderer_impl.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 220 return; | 220 return; |
| 221 sink_->SetVolume(volume); | 221 sink_->SetVolume(volume); |
| 222 } | 222 } |
| 223 | 223 |
| 224 AudioRendererImpl::~AudioRendererImpl() { | 224 AudioRendererImpl::~AudioRendererImpl() { |
| 225 // Stop() should have been called and |algorithm_| should have been destroyed. | 225 // Stop() should have been called and |algorithm_| should have been destroyed. |
| 226 DCHECK(state_ == kUninitialized || state_ == kStopped); | 226 DCHECK(state_ == kUninitialized || state_ == kStopped); |
| 227 DCHECK(!algorithm_.get()); | 227 DCHECK(!algorithm_.get()); |
| 228 } | 228 } |
| 229 | 229 |
| 230 void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) { | 230 void AudioRendererImpl::DecodedAudioReady(AudioDecoder::Status status, |
| 231 const scoped_refptr<Buffer>& buffer) { | |
| 231 base::AutoLock auto_lock(lock_); | 232 base::AutoLock auto_lock(lock_); |
| 232 DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying || | 233 DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying || |
| 233 state_ == kUnderflow || state_ == kRebuffering || state_ == kStopped); | 234 state_ == kUnderflow || state_ == kRebuffering || state_ == kStopped); |
| 234 | 235 |
| 235 CHECK(pending_read_); | 236 CHECK(pending_read_); |
| 236 pending_read_ = false; | 237 pending_read_ = false; |
| 237 | 238 |
| 238 if (buffer && buffer->IsEndOfStream()) { | 239 if (status == AudioDecoder::kDecodeError) { |
| 240 HandleDecodeError(); | |
| 241 return; | |
| 242 } | |
| 243 | |
| 244 if (status == AudioDecoder::kAborted) { | |
| 245 HandleAbortedRead(); | |
| 246 return; | |
| 247 } | |
| 248 | |
| 249 DCHECK_EQ(status, AudioDecoder::kOk); | |
| 250 DCHECK(buffer); | |
| 251 | |
| 252 if (buffer->IsEndOfStream()) { | |
| 239 received_end_of_stream_ = true; | 253 received_end_of_stream_ = true; |
| 240 | 254 |
| 241 // Transition to kPlaying if we are currently handling an underflow since | 255 // Transition to kPlaying if we are currently handling an underflow since |
| 242 // no more data will be arriving. | 256 // no more data will be arriving. |
| 243 if (state_ == kUnderflow || state_ == kRebuffering) | 257 if (state_ == kUnderflow || state_ == kRebuffering) |
| 244 state_ = kPlaying; | 258 state_ = kPlaying; |
| 245 } | 259 } |
| 246 | 260 |
| 247 switch (state_) { | 261 switch (state_) { |
| 248 case kUninitialized: | 262 case kUninitialized: |
| 249 NOTREACHED(); | 263 NOTREACHED(); |
| 250 return; | 264 return; |
| 251 case kPaused: | 265 case kPaused: |
| 252 if (buffer && !buffer->IsEndOfStream()) | 266 if (!buffer->IsEndOfStream()) |
| 253 algorithm_->EnqueueBuffer(buffer); | 267 algorithm_->EnqueueBuffer(buffer); |
| 254 DCHECK(!pending_read_); | 268 DCHECK(!pending_read_); |
| 255 base::ResetAndReturn(&pause_cb_).Run(); | 269 base::ResetAndReturn(&pause_cb_).Run(); |
| 256 return; | 270 return; |
| 257 case kSeeking: | 271 case kSeeking: |
| 258 if (IsBeforeSeekTime(buffer)) { | 272 if (IsBeforeSeekTime(buffer)) { |
| 259 ScheduleRead_Locked(); | 273 ScheduleRead_Locked(); |
| 260 return; | 274 return; |
| 261 } | 275 } |
| 262 if (buffer && !buffer->IsEndOfStream()) { | 276 if (!buffer->IsEndOfStream()) { |
| 263 algorithm_->EnqueueBuffer(buffer); | 277 algorithm_->EnqueueBuffer(buffer); |
| 264 if (!algorithm_->IsQueueFull()) | 278 if (!algorithm_->IsQueueFull()) |
| 265 return; | 279 return; |
| 266 } | 280 } |
| 267 state_ = kPaused; | 281 state_ = kPaused; |
| 268 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); | 282 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); |
| 269 return; | 283 return; |
| 270 case kPlaying: | 284 case kPlaying: |
| 271 case kUnderflow: | 285 case kUnderflow: |
| 272 case kRebuffering: | 286 case kRebuffering: |
| 273 if (buffer && !buffer->IsEndOfStream()) | 287 if (!buffer->IsEndOfStream()) |
| 274 algorithm_->EnqueueBuffer(buffer); | 288 algorithm_->EnqueueBuffer(buffer); |
| 275 return; | 289 return; |
| 276 case kStopped: | 290 case kStopped: |
| 277 return; | 291 return; |
| 278 } | 292 } |
| 279 } | 293 } |
| 280 | 294 |
| 281 void AudioRendererImpl::ScheduleRead_Locked() { | 295 void AudioRendererImpl::ScheduleRead_Locked() { |
| 282 lock_.AssertAcquired(); | 296 lock_.AssertAcquired(); |
| 283 if (pending_read_ || state_ == kPaused) | 297 if (pending_read_ || state_ == kPaused) |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 501 | 515 |
| 502 void AudioRendererImpl::OnRenderError() { | 516 void AudioRendererImpl::OnRenderError() { |
| 503 host()->DisableAudioRenderer(); | 517 host()->DisableAudioRenderer(); |
| 504 } | 518 } |
| 505 | 519 |
| 506 void AudioRendererImpl::DisableUnderflowForTesting() { | 520 void AudioRendererImpl::DisableUnderflowForTesting() { |
| 507 DCHECK(!is_initialized_); | 521 DCHECK(!is_initialized_); |
| 508 underflow_disabled_ = true; | 522 underflow_disabled_ = true; |
| 509 } | 523 } |
| 510 | 524 |
| 525 void AudioRendererImpl::HandleDecodeError() { | |
| 526 switch (state_) { | |
| 527 case kUninitialized: | |
| 528 NOTREACHED(); | |
| 529 return; | |
| 530 case kPaused: | |
| 531 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.
| |
| 532 return; | |
| 533 case kSeeking: | |
| 534 state_ = kPaused; | |
| 535 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_ERROR_DECODE); | |
| 536 return; | |
| 537 case kPlaying: | |
| 538 case kUnderflow: | |
| 539 case kRebuffering: | |
| 540 case kStopped: | |
| 541 host()->SetError(PIPELINE_ERROR_DECODE); | |
| 542 return; | |
| 543 } | |
| 544 } | |
| 545 | |
| 546 void AudioRendererImpl::HandleAbortedRead() { | |
| 547 switch (state_) { | |
| 548 case kUninitialized: | |
| 549 NOTREACHED(); | |
| 550 return; | |
| 551 case kPaused: | |
| 552 base::ResetAndReturn(&pause_cb_).Run(); | |
| 553 return; | |
| 554 case kSeeking: | |
| 555 state_ = kPaused; | |
| 556 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); | |
| 557 return; | |
| 558 case kPlaying: | |
| 559 case kUnderflow: | |
| 560 case kRebuffering: | |
| 561 case kStopped: | |
| 562 return; | |
| 563 } | |
| 564 } | |
| 565 | |
| 511 } // namespace media | 566 } // namespace media |
| OLD | NEW |