Commit 8a6d66b9 authored by Thomas Guilbert's avatar Thomas Guilbert Committed by Commit Bot

Implement FlingingRenderer::GetMediaTime

This CL uses RemoteMediaPlayer.getApproximateStreamPosition to implement
FlingingRenderer::GetMediaTime().

NOTE: GMS core ignores stream position changes in the MediaStatus, when
we have a pending seek. Calling both Seek() and Play() back to back in
FlingingRenderer::StartPlayingFrom() sometimes causes the stream
position update to be lost. This causes getApproximateStreamPosition to
report a time that is out of sync with the cast device. We already use
the autoplay flag when loading the RemoteMediaPlayer, so removing the
call to MediaController::Play() doest not cause any problems.

Bug: 830871
Change-Id: Ia5a6384cf11a77a6aa49e9669f015f7835c5a775
Reviewed-on: https://chromium-review.googlesource.com/1180511Reviewed-by: default avatarZhiqiang Zhang <zqzhang@chromium.org>
Commit-Queue: Thomas Guilbert <tguilbert@chromium.org>
Cr-Commit-Position: refs/heads/master@{#585655}
parent b2998c3d
...@@ -46,6 +46,11 @@ public class FlingingControllerBridge implements MediaStatusObserver { ...@@ -46,6 +46,11 @@ public class FlingingControllerBridge implements MediaStatusObserver {
mFlingingController.getMediaController().seek(positionInMs); mFlingingController.getMediaController().seek(positionInMs);
} }
@CalledByNative
public long getApproximateCurrentTime() {
return mFlingingController.getApproximateCurrentTime();
}
// MediaStatusObserver implementation. // MediaStatusObserver implementation.
@Override @Override
public void onMediaStatusUpdate(MediaStatusBridge status) { public void onMediaStatusUpdate(MediaStatusBridge status) {
......
...@@ -88,8 +88,13 @@ void FlingingControllerBridge::OnMediaStatusUpdated( ...@@ -88,8 +88,13 @@ void FlingingControllerBridge::OnMediaStatusUpdated(
} }
base::TimeDelta FlingingControllerBridge::GetApproximateCurrentTime() { base::TimeDelta FlingingControllerBridge::GetApproximateCurrentTime() {
// TODO(https://crbug.com/830871): Implement this method. JNIEnv* env = base::android::AttachCurrentThread();
return base::TimeDelta(); DCHECK(env);
long time_in_ms = Java_FlingingControllerBridge_getApproximateCurrentTime(
env, j_flinging_controller_bridge_);
return base::TimeDelta::FromMilliseconds(time_in_ms);
} }
} // namespace media_router } // namespace media_router
...@@ -81,7 +81,6 @@ void FlingingRenderer::Flush(const base::Closure& flush_cb) { ...@@ -81,7 +81,6 @@ void FlingingRenderer::Flush(const base::Closure& flush_cb) {
void FlingingRenderer::StartPlayingFrom(base::TimeDelta time) { void FlingingRenderer::StartPlayingFrom(base::TimeDelta time) {
DVLOG(2) << __func__; DVLOG(2) << __func__;
controller_->GetMediaController()->Seek(time); controller_->GetMediaController()->Seek(time);
controller_->GetMediaController()->Play();
} }
void FlingingRenderer::SetPlaybackRate(double playback_rate) { void FlingingRenderer::SetPlaybackRate(double playback_rate) {
...@@ -98,8 +97,7 @@ void FlingingRenderer::SetVolume(float volume) { ...@@ -98,8 +97,7 @@ void FlingingRenderer::SetVolume(float volume) {
} }
base::TimeDelta FlingingRenderer::GetMediaTime() { base::TimeDelta FlingingRenderer::GetMediaTime() {
// TODO(https://crbug.com/830871): return correct media time. return controller_->GetApproximateCurrentTime();
return base::TimeDelta();
} }
void FlingingRenderer::OnMediaStatusUpdated(const media::MediaStatus& status) { void FlingingRenderer::OnMediaStatusUpdated(const media::MediaStatus& status) {
......
...@@ -61,14 +61,12 @@ class FlingingRendererTest : public testing::Test { ...@@ -61,14 +61,12 @@ class FlingingRendererTest : public testing::Test {
TEST_F(FlingingRendererTest, StartPlayingFromTime) { TEST_F(FlingingRendererTest, StartPlayingFromTime) {
base::TimeDelta seek_time = base::TimeDelta::FromSeconds(10); base::TimeDelta seek_time = base::TimeDelta::FromSeconds(10);
EXPECT_CALL(*media_controller_, Play());
EXPECT_CALL(*media_controller_, Seek(seek_time)); EXPECT_CALL(*media_controller_, Seek(seek_time));
renderer_->StartPlayingFrom(seek_time); renderer_->StartPlayingFrom(seek_time);
} }
TEST_F(FlingingRendererTest, StartPlayingFromBeginning) { TEST_F(FlingingRendererTest, StartPlayingFromBeginning) {
EXPECT_CALL(*media_controller_, Play());
EXPECT_CALL(*media_controller_, Seek(base::TimeDelta())); EXPECT_CALL(*media_controller_, Seek(base::TimeDelta()));
renderer_->StartPlayingFrom(base::TimeDelta()); renderer_->StartPlayingFrom(base::TimeDelta());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment