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 |