| Index: media/filters/audio_renderer_impl.cc
|
| diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc
|
| index 9b0c098b191ecbdfae2fa85e03c60f2f855aed0b..49ceb51c36ecd1a61afdede43a0cd9bd272798d8 100644
|
| --- a/media/filters/audio_renderer_impl.cc
|
| +++ b/media/filters/audio_renderer_impl.cc
|
| @@ -14,6 +14,7 @@
|
| #include "base/logging.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/single_thread_task_runner.h"
|
| +#include "base/time/default_tick_clock.h"
|
| #include "media/base/audio_buffer.h"
|
| #include "media/base/audio_buffer_converter.h"
|
| #include "media/base/audio_hardware_config.h"
|
| @@ -52,6 +53,7 @@ AudioRendererImpl::AudioRendererImpl(
|
| decoders.Pass(),
|
| set_decryptor_ready_cb)),
|
| hardware_config_(hardware_config),
|
| + tick_clock_(new base::DefaultTickClock()),
|
| state_(kUninitialized),
|
| buffering_state_(BUFFERING_HAVE_NOTHING),
|
| rendering_(false),
|
| @@ -72,7 +74,7 @@ AudioRendererImpl::~AudioRendererImpl() {
|
| DCHECK(!algorithm_.get());
|
| }
|
|
|
| -void AudioRendererImpl::StartRendering() {
|
| +void AudioRendererImpl::StartTicking() {
|
| DVLOG(1) << __FUNCTION__;
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| DCHECK(!rendering_);
|
| @@ -102,7 +104,7 @@ void AudioRendererImpl::StartRendering_Locked() {
|
| sink_->Play();
|
| }
|
|
|
| -void AudioRendererImpl::StopRendering() {
|
| +void AudioRendererImpl::StopTicking() {
|
| DVLOG(1) << __FUNCTION__;
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| DCHECK(rendering_);
|
| @@ -130,17 +132,6 @@ void AudioRendererImpl::StopRendering_Locked() {
|
| sink_->Pause();
|
| }
|
|
|
| -void AudioRendererImpl::SetMediaTime(base::TimeDelta time) {
|
| - DVLOG(1) << __FUNCTION__ << "(" << time.InMicroseconds() << ")";
|
| - DCHECK(task_runner_->BelongsToCurrentThread());
|
| -
|
| - base::AutoLock auto_lock(lock_);
|
| - DCHECK(!rendering_);
|
| - DCHECK_EQ(state_, kFlushed);
|
| -
|
| - start_timestamp_ = time;
|
| -}
|
| -
|
| void AudioRendererImpl::Flush(const base::Closure& callback) {
|
| DVLOG(1) << __FUNCTION__;
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| @@ -244,6 +235,28 @@ void AudioRendererImpl::StartPlaying() {
|
| AttemptRead_Locked();
|
| }
|
|
|
| +void AudioRendererImpl::SetMediaTime(base::TimeDelta timestamp) {
|
| + DVLOG(1) << __FUNCTION__ << "(" << timestamp.InMicroseconds() << ")";
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| +
|
| + base::AutoLock auto_lock(lock_);
|
| + DCHECK(!rendering_);
|
| + DCHECK_EQ(state_, kFlushed);
|
| + start_timestamp_ = timestamp;
|
| +}
|
| +
|
| +base::TimeDelta AudioRendererImpl::CurrentMediaTime() {
|
| + DVLOG(1) << __FUNCTION__;
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| +
|
| + base::AutoLock auto_lock(lock_);
|
| + base::TimeDelta timestamp = audio_clock_->CurrentMediaTimestamp(
|
| + tick_clock_->NowTicks() - last_render_ticks_);
|
| + if (timestamp == kNoTimestamp())
|
| + return start_timestamp_;
|
| + return timestamp;
|
| +}
|
| +
|
| void AudioRendererImpl::Initialize(DemuxerStream* stream,
|
| const PipelineStatusCB& init_cb,
|
| const StatisticsCB& statistics_cb,
|
| @@ -369,6 +382,11 @@ void AudioRendererImpl::SetVolume(float volume) {
|
| sink_->SetVolume(volume);
|
| }
|
|
|
| +void AudioRendererImpl::SetTickClockForTesting(
|
| + scoped_ptr<base::TickClock> tick_clock) {
|
| + tick_clock_.swap(tick_clock);
|
| +}
|
| +
|
| void AudioRendererImpl::DecodedAudioReady(
|
| AudioBufferStream::Status status,
|
| const scoped_refptr<AudioBuffer>& buffer) {
|
| @@ -565,6 +583,7 @@ int AudioRendererImpl::Render(AudioBus* audio_bus,
|
| base::Closure time_cb;
|
| {
|
| base::AutoLock auto_lock(lock_);
|
| + last_render_ticks_ = tick_clock_->NowTicks();
|
|
|
| // Ensure Stop() hasn't destroyed our |algorithm_| on the pipeline thread.
|
| if (!algorithm_) {
|
|
|