diff options
Diffstat (limited to 'chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc')
-rw-r--r-- | chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc b/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc index e71abab05ec..871c566c89f 100644 --- a/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc +++ b/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc @@ -255,6 +255,8 @@ void FuchsiaAudioRenderer::SetLatencyHint( void FuchsiaAudioRenderer::SetPreservesPitch(bool preserves_pitch) {} +void FuchsiaAudioRenderer::SetAutoplayInitiated(bool autoplay_initiated) {} + void FuchsiaAudioRenderer::StartTicking() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); @@ -285,7 +287,7 @@ void FuchsiaAudioRenderer::StopTicking() { audio_consumer_->Stop(); base::AutoLock lock(timeline_lock_); - UpdateTimelineAfterStop(); + UpdateTimelineOnStop(); SetPlaybackState(PlaybackState::kStopped); } @@ -294,9 +296,17 @@ void FuchsiaAudioRenderer::SetPlaybackRate(double playback_rate) { audio_consumer_->SetRate(playback_rate); + // AudioConsumer will update media timeline asynchronously. That update is + // processed in OnAudioConsumerStatusChanged(). This might cause the clock to + // go back. It's not desirable, e.g. because VideoRenderer could drop some + // video frames that should be shown when the stream is resumed. To avoid this + // issue update the timeline synchronously. OnAudioConsumerStatusChanged() + // will still process the update from AudioConsumer to save the position when + // the stream was actually paused, but that update would not move the clock + // backward. if (playback_rate == 0.0) { base::AutoLock lock(timeline_lock_); - UpdateTimelineAfterStop(); + UpdateTimelineOnStop(); } } @@ -310,8 +320,8 @@ void FuchsiaAudioRenderer::SetMediaTime(base::TimeDelta time) { // Reset reference timestamp. This is necessary to ensure that the correct // value is returned from GetWallClockTimes() until playback is resumed: - // the interface requires to return 0 wall clock between SetMediaTime() and - // StartTicking(). + // GetWallClockTimes() is required to return 0 wall clock between + // SetMediaTime() and StartTicking(). reference_time_ = base::TimeTicks(); } @@ -460,7 +470,7 @@ void FuchsiaAudioRenderer::ScheduleReadDemuxerStream() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); if (!demuxer_stream_ || read_timer_.IsRunning() || is_demuxer_read_pending_ || - GetPlaybackState() == PlaybackState::kEndOfStream || + is_at_end_of_stream_ || num_pending_packets_ >= stream_sink_buffers_.size()) { return; } @@ -525,13 +535,10 @@ void FuchsiaAudioRenderer::OnDemuxerStreamReadDone( } if (buffer->end_of_stream()) { - { - base::AutoLock lock(timeline_lock_); - SetPlaybackState(PlaybackState::kEndOfStream); - } + is_at_end_of_stream_ = true; stream_sink_->EndOfStream(); - // No more data is going to be biffered. Update buffering state to ensure + // No more data is going to be buffered. Update buffering state to ensure // RendererImpl starts playback in case it was waiting for buffering to // finish. SetBufferState(BUFFERING_HAVE_ENOUGH); @@ -608,13 +615,13 @@ void FuchsiaAudioRenderer::SetBufferState(BufferingState buffer_state) { void FuchsiaAudioRenderer::FlushInternal() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(GetPlaybackState() == PlaybackState::kStopped || - GetPlaybackState() == PlaybackState::kEndOfStream); + DCHECK(GetPlaybackState() == PlaybackState::kStopped || is_at_end_of_stream_); stream_sink_->DiscardAllPacketsNoReply(); SetBufferState(BUFFERING_HAVE_NOTHING); last_packet_timestamp_ = base::TimeDelta::Min(); read_timer_.Stop(); + is_at_end_of_stream_ = false; if (is_demuxer_read_pending_) { drop_next_demuxer_read_result_ = true; @@ -627,12 +634,10 @@ void FuchsiaAudioRenderer::OnEndOfStream() { } bool FuchsiaAudioRenderer::IsTimeMoving() { - return (state_ == PlaybackState::kPlaying || - state_ == PlaybackState::kEndOfStream) && - (media_delta_ > 0); + return state_ == PlaybackState::kPlaying && media_delta_ > 0; } -void FuchsiaAudioRenderer::UpdateTimelineAfterStop() { +void FuchsiaAudioRenderer::UpdateTimelineOnStop() { if (!IsTimeMoving()) return; |