Index: media/filters/audio_renderer_impl.cc |
diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc |
index 0af11e4ef109667b96dfec85ade64d2525ca845b..0436e9c237466cb55ed93bb38647acb7a8d4e4d1 100644 |
--- a/media/filters/audio_renderer_impl.cc |
+++ b/media/filters/audio_renderer_impl.cc |
@@ -97,7 +97,6 @@ void AudioRendererImpl::StartRendering_Locked() { |
DCHECK_NE(algorithm_->playback_rate(), 0); |
lock_.AssertAcquired(); |
- earliest_end_time_ = now_cb_.Run(); |
sink_playing_ = true; |
base::AutoUnlock auto_unlock(lock_); |
@@ -179,7 +178,6 @@ void AudioRendererImpl::ResetDecoderDone() { |
if (buffering_state_ != BUFFERING_HAVE_NOTHING) |
SetBufferingState_Locked(BUFFERING_HAVE_NOTHING); |
- earliest_end_time_ = now_cb_.Run(); |
splicer_->Reset(); |
if (buffer_converter_) |
buffer_converter_->Reset(); |
@@ -581,10 +579,7 @@ int AudioRendererImpl::Render(AudioBus* audio_bus, |
// 1) Algorithm can not fill the audio callback buffer |
// 2) We received an end of stream buffer |
// 3) We haven't already signalled that we've ended |
- // 4) Our estimated earliest end time has expired |
- // |
- // TODO(enal): we should replace (4) with a check that the browser has no |
- // more audio data or at least use a delayed callback. |
+ // 4) We've played all known audio data sent to hardware |
// |
// We use the following conditions to determine underflow: |
// 1) Algorithm can not fill the audio callback buffer |
@@ -602,10 +597,9 @@ int AudioRendererImpl::Render(AudioBus* audio_bus, |
audio_clock_->WroteSilence(requested_frames - frames_written, delay_frames); |
if (frames_written == 0) { |
- const base::TimeTicks now = now_cb_.Run(); |
- |
if (received_end_of_stream_ && !rendered_end_of_stream_ && |
- now >= earliest_end_time_) { |
+ audio_clock_->CurrentMediaTimestamp() == |
+ audio_clock_->last_endpoint_timestamp()) { |
rendered_end_of_stream_ = true; |
ended_cb_.Run(); |
} else if (!received_end_of_stream_ && state_ == kPlaying) { |
@@ -613,10 +607,6 @@ int AudioRendererImpl::Render(AudioBus* audio_bus, |
algorithm_->IncreaseQueueCapacity(); |
SetBufferingState_Locked(BUFFERING_HAVE_NOTHING); |
} |
- } else { |
- // We can't write any data this cycle. For example, we may have |
- // sent all available data to the audio device while not reaching |
- // |earliest_end_time_|. |
} |
} |
@@ -635,11 +625,6 @@ int AudioRendererImpl::Render(AudioBus* audio_bus, |
audio_clock_->CurrentMediaTimestamp(), |
audio_clock_->last_endpoint_timestamp()); |
} |
- |
- if (frames_written > 0) { |
- UpdateEarliestEndTime_Locked( |
- frames_written, playback_delay, now_cb_.Run()); |
- } |
} |
if (!time_cb.is_null()) |
@@ -649,20 +634,6 @@ int AudioRendererImpl::Render(AudioBus* audio_bus, |
return frames_written; |
} |
-void AudioRendererImpl::UpdateEarliestEndTime_Locked( |
- int frames_filled, const base::TimeDelta& playback_delay, |
- const base::TimeTicks& time_now) { |
- DCHECK_GT(frames_filled, 0); |
- |
- base::TimeDelta predicted_play_time = base::TimeDelta::FromMicroseconds( |
- static_cast<float>(frames_filled) * base::Time::kMicrosecondsPerSecond / |
- audio_parameters_.sample_rate()); |
- |
- lock_.AssertAcquired(); |
- earliest_end_time_ = std::max( |
- earliest_end_time_, time_now + playback_delay + predicted_play_time); |
-} |
- |
void AudioRendererImpl::OnRenderError() { |
// UMA data tells us this happens ~0.01% of the time. Trigger an error instead |
// of trying to gracefully fall back to a fake sink. It's very likely |