summaryrefslogtreecommitdiff
path: root/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc')
-rw-r--r--chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc37
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;