| 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, base::TimeDelta playback_delay, |
| 602 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 |