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_) { |