| Index: media/base/silent_sink_suspender.cc
|
| diff --git a/media/base/silent_sink_suspender.cc b/media/base/silent_sink_suspender.cc
|
| index 2f01ed9fcd990cedd797d3a04224e5285bfff27b..11a852946ff03cec072b5c3979a94705145346c5 100644
|
| --- a/media/base/silent_sink_suspender.cc
|
| +++ b/media/base/silent_sink_suspender.cc
|
| @@ -53,8 +53,15 @@ int SilentSinkSuspender::Render(base::TimeDelta delay,
|
| // the audio data for a future transition out of silence.
|
| if (!dest) {
|
| DCHECK(is_using_fake_sink_);
|
| - DCHECK_EQ(delay, base::TimeDelta());
|
| DCHECK_EQ(prior_frames_skipped, 0);
|
| + // |delay_timestamp| contains the value cached at
|
| + // |latest_output_delay_timestamp_|
|
| + // so we simulate the real sink output, promoting |delay_timestamp| with
|
| + // |elapsedTime|.
|
| + DCHECK_EQ(delay_timestamp, latest_output_delay_timestamp_);
|
| + base::TimeDelta elapsedTime =
|
| + base::TimeTicks::Now() - fake_sink_transition_time_;
|
| + delay_timestamp += elapsedTime;
|
|
|
| // If we have no buffers or a transition is pending, one or more extra
|
| // Render() calls have occurred in before TransitionSinks() can run, so we
|
| @@ -90,6 +97,9 @@ int SilentSinkSuspender::Render(base::TimeDelta delay,
|
| first_silence_time_ = now;
|
| if (now - first_silence_time_ > silence_timeout_) {
|
| is_transition_pending_ = true;
|
| + latest_output_delay_ = delay;
|
| + latest_output_delay_timestamp_ = delay_timestamp;
|
| + fake_sink_transition_time_ = now;
|
| task_runner_->PostTask(
|
| FROM_HERE, base::Bind(sink_transition_callback_.callback(), true));
|
| }
|
| @@ -124,8 +134,8 @@ void SilentSinkSuspender::TransitionSinks(bool use_fake_sink) {
|
| }
|
| fake_sink_.Start(
|
| base::Bind(base::IgnoreResult(&SilentSinkSuspender::Render),
|
| - base::Unretained(this), base::TimeDelta(),
|
| - base::TimeTicks::Now(), 0, nullptr));
|
| + base::Unretained(this), latest_output_delay_,
|
| + latest_output_delay_timestamp_, 0, nullptr));
|
| } else {
|
| fake_sink_.Stop();
|
|
|
|
|