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 <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 const scoped_refptr<base::MessageLoopProxy>& message_loop, | 42 const scoped_refptr<base::MessageLoopProxy>& message_loop, |
43 media::AudioRendererSink* sink, | 43 media::AudioRendererSink* sink, |
44 ScopedVector<AudioDecoder> decoders, | 44 ScopedVector<AudioDecoder> decoders, |
45 const SetDecryptorReadyCB& set_decryptor_ready_cb, | 45 const SetDecryptorReadyCB& set_decryptor_ready_cb, |
46 bool increase_preroll_on_underflow) | 46 bool increase_preroll_on_underflow) |
47 : message_loop_(message_loop), | 47 : message_loop_(message_loop), |
48 weak_factory_(this), | 48 weak_factory_(this), |
49 sink_(sink), | 49 sink_(sink), |
50 decoder_selector_(new AudioDecoderSelector( | 50 decoder_selector_(new AudioDecoderSelector( |
51 message_loop, decoders.Pass(), set_decryptor_ready_cb)), | 51 message_loop, decoders.Pass(), set_decryptor_ready_cb)), |
52 now_cb_(base::Bind(&base::Time::Now)), | 52 now_cb_(base::Bind(&base::TimeTicks::Now)), |
53 state_(kUninitialized), | 53 state_(kUninitialized), |
54 sink_playing_(false), | 54 sink_playing_(false), |
55 pending_read_(false), | 55 pending_read_(false), |
56 received_end_of_stream_(false), | 56 received_end_of_stream_(false), |
57 rendered_end_of_stream_(false), | 57 rendered_end_of_stream_(false), |
58 audio_time_buffered_(kNoTimestamp()), | 58 audio_time_buffered_(kNoTimestamp()), |
59 current_time_(kNoTimestamp()), | 59 current_time_(kNoTimestamp()), |
60 underflow_disabled_(false), | 60 underflow_disabled_(false), |
61 increase_preroll_on_underflow_(increase_preroll_on_underflow), | 61 increase_preroll_on_underflow_(increase_preroll_on_underflow), |
62 preroll_aborted_(false), | 62 preroll_aborted_(false), |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 // more audio data or at least use a delayed callback. | 517 // more audio data or at least use a delayed callback. |
518 // | 518 // |
519 // We use the following conditions to determine underflow: | 519 // We use the following conditions to determine underflow: |
520 // 1) Algorithm can not fill the audio callback buffer | 520 // 1) Algorithm can not fill the audio callback buffer |
521 // 2) We have NOT received an end of stream buffer | 521 // 2) We have NOT received an end of stream buffer |
522 // 3) We are in the kPlaying state | 522 // 3) We are in the kPlaying state |
523 // | 523 // |
524 // Otherwise the buffer has data we can send to the device. | 524 // Otherwise the buffer has data we can send to the device. |
525 frames_written = algorithm_->FillBuffer(dest, requested_frames); | 525 frames_written = algorithm_->FillBuffer(dest, requested_frames); |
526 if (frames_written == 0) { | 526 if (frames_written == 0) { |
527 base::Time now = now_cb_.Run(); | 527 const base::TimeTicks now = now_cb_.Run(); |
528 | 528 |
529 if (received_end_of_stream_ && !rendered_end_of_stream_ && | 529 if (received_end_of_stream_ && !rendered_end_of_stream_ && |
530 now >= earliest_end_time_) { | 530 now >= earliest_end_time_) { |
531 rendered_end_of_stream_ = true; | 531 rendered_end_of_stream_ = true; |
532 ended_cb_.Run(); | 532 ended_cb_.Run(); |
533 } else if (!received_end_of_stream_ && state_ == kPlaying && | 533 } else if (!received_end_of_stream_ && state_ == kPlaying && |
534 !underflow_disabled_) { | 534 !underflow_disabled_) { |
535 state_ = kUnderflow; | 535 state_ = kUnderflow; |
536 underflow_cb = underflow_cb_; | 536 underflow_cb = underflow_cb_; |
537 } else { | 537 } else { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 time_cb_.Run(current_time, max_time); | 591 time_cb_.Run(current_time, max_time); |
592 } | 592 } |
593 | 593 |
594 if (!underflow_cb.is_null()) | 594 if (!underflow_cb.is_null()) |
595 underflow_cb.Run(); | 595 underflow_cb.Run(); |
596 | 596 |
597 return frames_written; | 597 return frames_written; |
598 } | 598 } |
599 | 599 |
600 void AudioRendererImpl::UpdateEarliestEndTime_Locked( | 600 void AudioRendererImpl::UpdateEarliestEndTime_Locked( |
601 int frames_filled, base::TimeDelta playback_delay, base::Time time_now) { | 601 int frames_filled, const base::TimeDelta& playback_delay, |
| 602 const base::TimeTicks& time_now) { |
602 if (frames_filled <= 0) | 603 if (frames_filled <= 0) |
603 return; | 604 return; |
604 | 605 |
605 base::TimeDelta predicted_play_time = base::TimeDelta::FromMicroseconds( | 606 base::TimeDelta predicted_play_time = base::TimeDelta::FromMicroseconds( |
606 static_cast<float>(frames_filled) * base::Time::kMicrosecondsPerSecond / | 607 static_cast<float>(frames_filled) * base::Time::kMicrosecondsPerSecond / |
607 audio_parameters_.sample_rate()); | 608 audio_parameters_.sample_rate()); |
608 | 609 |
609 lock_.AssertAcquired(); | 610 lock_.AssertAcquired(); |
610 earliest_end_time_ = std::max( | 611 earliest_end_time_ = std::max( |
611 earliest_end_time_, time_now + playback_delay + predicted_play_time); | 612 earliest_end_time_, time_now + playback_delay + predicted_play_time); |
(...skipping 29 matching lines...) Expand all Loading... |
641 case kUnderflow: | 642 case kUnderflow: |
642 case kRebuffering: | 643 case kRebuffering: |
643 case kStopped: | 644 case kStopped: |
644 if (status != PIPELINE_OK) | 645 if (status != PIPELINE_OK) |
645 error_cb_.Run(status); | 646 error_cb_.Run(status); |
646 return; | 647 return; |
647 } | 648 } |
648 } | 649 } |
649 | 650 |
650 } // namespace media | 651 } // namespace media |
OLD | NEW |