diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java index bf4ee1ce5a06a3..5256a99f9cb038 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java @@ -390,14 +390,14 @@ public void sendStringMessage(String routeId, String message, int callbackId) { */ @Nullable @CalledByNative - public MediaControllerBridge getMediaControllerBridge(String routeId) { + public FlingingControllerBridge getFlingingControllerBridge(String routeId) { MediaRouteProvider provider = mRouteIdsToProviders.get(routeId); if (provider == null) return null; MediaController controller = provider.getMediaController(routeId); if (controller == null) return null; - return new MediaControllerBridge(controller); + return new FlingingControllerBridge(controller); } @VisibleForTesting diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaControllerBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/FlingingControllerBridge.java similarity index 79% rename from chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaControllerBridge.java rename to chrome/android/java/src/org/chromium/chrome/browser/media/router/FlingingControllerBridge.java index 3abcd92e946c33..e814562b7c42c0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaControllerBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/FlingingControllerBridge.java @@ -8,15 +8,15 @@ import org.chromium.base.annotations.JNINamespace; /** - * A wrapper around a MediaController that allows the native code to use it. - * See chrome/browser/media/android/remote/media_controller_bridge.h for the corresponding native - * code. + * A wrapper around a MediaController that allows the native code to use it, and to subscribe to + * status changes. See chrome/browser/media/android/remote/flinging_controller_bridge.h for the + * corresponding native code. */ @JNINamespace("media_router") -public class MediaControllerBridge { +public class FlingingControllerBridge { private final MediaController mMediaController; - public MediaControllerBridge(MediaController mediaController) { + public FlingingControllerBridge(MediaController mediaController) { mMediaController = mediaController; } diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 96fe313a138f72..63dec569551b5d 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni @@ -723,8 +723,8 @@ chrome_java_sources = [ "java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java", "java/src/org/chromium/chrome/browser/media/router/DiscoveryCallback.java", "java/src/org/chromium/chrome/browser/media/router/DiscoveryDelegate.java", + "java/src/org/chromium/chrome/browser/media/router/FlingingControllerBridge.java", "java/src/org/chromium/chrome/browser/media/router/MediaController.java", - "java/src/org/chromium/chrome/browser/media/router/MediaControllerBridge.java", "java/src/org/chromium/chrome/browser/media/router/MediaRoute.java", "java/src/org/chromium/chrome/browser/media/router/MediaRouteChooserDialogManager.java", "java/src/org/chromium/chrome/browser/media/router/MediaRouteControllerDialogManager.java", diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index dbbba00e108ee4..3ed3fcdb052ac3 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn @@ -2338,8 +2338,8 @@ jumbo_split_static_library("browser") { "media/android/cdm/media_drm_license_manager.h", "media/android/cdm/media_drm_storage_factory.cc", "media/android/cdm/media_drm_storage_factory.h", - "media/android/remote/media_controller_bridge.cc", - "media/android/remote/media_controller_bridge.h", + "media/android/remote/flinging_controller_bridge.cc", + "media/android/remote/flinging_controller_bridge.h", "media/android/remote/record_cast_action.cc", "media/android/remote/remote_media_player_bridge.cc", "media/android/remote/remote_media_player_bridge.h", @@ -4475,7 +4475,7 @@ if (is_android) { "../android/java/src/org/chromium/chrome/browser/media/remote/RemoteMediaPlayerBridge.java", "../android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java", "../android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java", - "../android/java/src/org/chromium/chrome/browser/media/router/MediaControllerBridge.java", + "../android/java/src/org/chromium/chrome/browser/media/router/FlingingControllerBridge.java", "../android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java", "../android/java/src/org/chromium/chrome/browser/metrics/PageLoadMetrics.java", "../android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java", diff --git a/chrome/browser/media/android/remote/flinging_controller_bridge.cc b/chrome/browser/media/android/remote/flinging_controller_bridge.cc new file mode 100644 index 00000000000000..b5d1f271b697ac --- /dev/null +++ b/chrome/browser/media/android/remote/flinging_controller_bridge.cc @@ -0,0 +1,73 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/media/android/remote/flinging_controller_bridge.h" + +#include "jni/FlingingControllerBridge_jni.h" + +namespace media_router { + +FlingingControllerBridge::FlingingControllerBridge( + base::android::ScopedJavaGlobalRef controller) + : j_flinging_controller_bridge_(controller) {} + +FlingingControllerBridge::~FlingingControllerBridge() = default; + +void FlingingControllerBridge::Play() { + JNIEnv* env = base::android::AttachCurrentThread(); + DCHECK(env); + + Java_FlingingControllerBridge_play(env, j_flinging_controller_bridge_); +} + +void FlingingControllerBridge::Pause() { + JNIEnv* env = base::android::AttachCurrentThread(); + DCHECK(env); + + Java_FlingingControllerBridge_pause(env, j_flinging_controller_bridge_); +} + +void FlingingControllerBridge::SetMute(bool mute) { + JNIEnv* env = base::android::AttachCurrentThread(); + DCHECK(env); + + Java_FlingingControllerBridge_setMute(env, j_flinging_controller_bridge_, + mute); +} + +void FlingingControllerBridge::SetVolume(float volume) { + JNIEnv* env = base::android::AttachCurrentThread(); + DCHECK(env); + + Java_FlingingControllerBridge_setVolume(env, j_flinging_controller_bridge_, + volume); +} + +void FlingingControllerBridge::Seek(base::TimeDelta time) { + JNIEnv* env = base::android::AttachCurrentThread(); + DCHECK(env); + + Java_FlingingControllerBridge_seek(env, j_flinging_controller_bridge_, + time.InMilliseconds()); +} + +media::MediaController* FlingingControllerBridge::GetMediaController() { + return this; +} + +void FlingingControllerBridge::AddMediaStatusObserver( + media::MediaStatusObserver* observer) { + NOTREACHED(); +} +void FlingingControllerBridge::RemoveMediaStatusObserver( + media::MediaStatusObserver* observer) { + NOTREACHED(); +} + +base::TimeDelta FlingingControllerBridge::GetApproximateCurrentTime() { + // TODO(https://crbug.com/830871): Implement this method. + return base::TimeDelta(); +} + +} // namespace media_router diff --git a/chrome/browser/media/android/remote/flinging_controller_bridge.h b/chrome/browser/media/android/remote/flinging_controller_bridge.h new file mode 100644 index 00000000000000..866e3e5bb65fce --- /dev/null +++ b/chrome/browser/media/android/remote/flinging_controller_bridge.h @@ -0,0 +1,45 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_MEDIA_ANDROID_REMOTE_FLINGING_CONTROLLER_BRIDGE_H_ +#define CHROME_BROWSER_MEDIA_ANDROID_REMOTE_FLINGING_CONTROLLER_BRIDGE_H_ + +#include "base/android/scoped_java_ref.h" +#include "base/time/time.h" +#include "media/base/flinging_controller.h" +#include "media/base/media_controller.h" + +namespace media_router { + +// Allows native code to call into a Java FlingingController. +class FlingingControllerBridge : public media::FlingingController, + public media::MediaController { + public: + explicit FlingingControllerBridge( + base::android::ScopedJavaGlobalRef controller); + ~FlingingControllerBridge() override; + + // FlingingController implementation. + media::MediaController* GetMediaController() override; + void AddMediaStatusObserver(media::MediaStatusObserver* observer) override; + void RemoveMediaStatusObserver(media::MediaStatusObserver* observer) override; + base::TimeDelta GetApproximateCurrentTime() override; + + // MediaController implementation. + void Play() override; + void Pause() override; + void SetMute(bool mute) override; + void SetVolume(float volume) override; + void Seek(base::TimeDelta time) override; + + private: + // Java MediaControllerBridge instance. + base::android::ScopedJavaGlobalRef j_flinging_controller_bridge_; + + DISALLOW_COPY_AND_ASSIGN(FlingingControllerBridge); +}; + +} // namespace media_router + +#endif // CHROME_BROWSER_MEDIA_ANDROID_REMOTE_FLINGING_CONTROLLER_BRIDGE_H_ diff --git a/chrome/browser/media/android/remote/media_controller_bridge.cc b/chrome/browser/media/android/remote/media_controller_bridge.cc deleted file mode 100644 index 7f42cb7183fad1..00000000000000 --- a/chrome/browser/media/android/remote/media_controller_bridge.cc +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/media/android/remote/media_controller_bridge.h" - -#include "jni/MediaControllerBridge_jni.h" - -namespace media_router { - -MediaControllerBridge::MediaControllerBridge( - base::android::ScopedJavaGlobalRef controller) - : j_media_controller_bridge_(controller) {} - -MediaControllerBridge::~MediaControllerBridge() = default; - -void MediaControllerBridge::Play() { - JNIEnv* env = base::android::AttachCurrentThread(); - DCHECK(env); - - Java_MediaControllerBridge_play(env, j_media_controller_bridge_); -} - -void MediaControllerBridge::Pause() { - JNIEnv* env = base::android::AttachCurrentThread(); - DCHECK(env); - - Java_MediaControllerBridge_pause(env, j_media_controller_bridge_); -} - -void MediaControllerBridge::SetMute(bool mute) { - JNIEnv* env = base::android::AttachCurrentThread(); - DCHECK(env); - - Java_MediaControllerBridge_setMute(env, j_media_controller_bridge_, mute); -} - -void MediaControllerBridge::SetVolume(float volume) { - JNIEnv* env = base::android::AttachCurrentThread(); - DCHECK(env); - - Java_MediaControllerBridge_setVolume(env, j_media_controller_bridge_, volume); -} - -void MediaControllerBridge::Seek(base::TimeDelta time) { - JNIEnv* env = base::android::AttachCurrentThread(); - DCHECK(env); - - Java_MediaControllerBridge_seek(env, j_media_controller_bridge_, - time.InMilliseconds()); -} - -} // namespace media_router diff --git a/chrome/browser/media/android/remote/media_controller_bridge.h b/chrome/browser/media/android/remote/media_controller_bridge.h deleted file mode 100644 index a854346202bf22..00000000000000 --- a/chrome/browser/media/android/remote/media_controller_bridge.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_MEDIA_ANDROID_REMOTE_MEDIA_CONTROLLER_BRIDGE_H_ -#define CHROME_BROWSER_MEDIA_ANDROID_REMOTE_MEDIA_CONTROLLER_BRIDGE_H_ - -#include "base/android/scoped_java_ref.h" -#include "base/time/time.h" -#include "media/base/media_controller.h" - -namespace media_router { - -// Allows native code to call into a Java MediaController. -class MediaControllerBridge : public media::MediaController { - public: - explicit MediaControllerBridge( - base::android::ScopedJavaGlobalRef controller); - ~MediaControllerBridge() override; - - // MediaController implementation. - void Play() override; - void Pause() override; - void SetMute(bool mute) override; - void SetVolume(float volume) override; - void Seek(base::TimeDelta time) override; - - private: - // Java MediaControllerBridge instance. - base::android::ScopedJavaGlobalRef j_media_controller_bridge_; - - DISALLOW_COPY_AND_ASSIGN(MediaControllerBridge); -}; - -} // namespace media_router - -#endif // CHROME_BROWSER_MEDIA_ANDROID_REMOTE_MEDIA_CONTROLLER_BRIDGE_H_ diff --git a/chrome/browser/media/android/router/media_router_android.cc b/chrome/browser/media/android/router/media_router_android.cc index 3546db9a64ee2b..41656d2b833012 100644 --- a/chrome/browser/media/android/router/media_router_android.cc +++ b/chrome/browser/media/android/router/media_router_android.cc @@ -316,9 +316,9 @@ void MediaRouterAndroid::RemoveRoute(const MediaRoute::Id& route_id) { observer.OnRoutesUpdated(active_routes_, std::vector()); } -std::unique_ptr MediaRouterAndroid::GetMediaController( - const MediaRoute::Id& route_id) { - return bridge_->GetMediaController(route_id); +std::unique_ptr +MediaRouterAndroid::GetFlingingController(const MediaRoute::Id& route_id) { + return bridge_->GetFlingingController(route_id); } } // namespace media_router diff --git a/chrome/browser/media/android/router/media_router_android.h b/chrome/browser/media/android/router/media_router_android.h index 74e896002c860a..f500f4890abac5 100644 --- a/chrome/browser/media/android/router/media_router_android.h +++ b/chrome/browser/media/android/router/media_router_android.h @@ -65,7 +65,7 @@ class MediaRouterAndroid : public MediaRouterBase { const std::string& search_input, const std::string& domain, MediaSinkSearchResponseCallback sink_callback) override; - std::unique_ptr GetMediaController( + std::unique_ptr GetFlingingController( const MediaRoute::Id& route_id) override; // The methods called by the Java bridge. diff --git a/chrome/browser/media/android/router/media_router_android_bridge.cc b/chrome/browser/media/android/router/media_router_android_bridge.cc index 9a0730662301de..f20ab550c418d1 100644 --- a/chrome/browser/media/android/router/media_router_android_bridge.cc +++ b/chrome/browser/media/android/router/media_router_android_bridge.cc @@ -6,7 +6,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" -#include "chrome/browser/media/android/remote/media_controller_bridge.h" +#include "chrome/browser/media/android/remote/flinging_controller_bridge.h" #include "chrome/browser/media/android/router/media_router_android.h" #include "jni/ChromeMediaRouter_jni.h" #include "media/base/media_controller.h" @@ -120,21 +120,22 @@ void MediaRouterAndroidBridge::StopObservingMediaSinks( jsource_id); } -std::unique_ptr -MediaRouterAndroidBridge::GetMediaController(const MediaRoute::Id& route_id) { +std::unique_ptr +MediaRouterAndroidBridge::GetFlingingController( + const MediaRoute::Id& route_id) { JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef jroute_id = base::android::ConvertUTF8ToJavaString(env, route_id); - ScopedJavaGlobalRef media_controller; + ScopedJavaGlobalRef flinging_controller; - media_controller.Reset(Java_ChromeMediaRouter_getMediaControllerBridge( + flinging_controller.Reset(Java_ChromeMediaRouter_getFlingingControllerBridge( env, java_media_router_, jroute_id)); - if (media_controller.is_null()) + if (flinging_controller.is_null()) return nullptr; - return std::make_unique(media_controller); + return std::make_unique(flinging_controller); } void MediaRouterAndroidBridge::OnSinksReceived( diff --git a/chrome/browser/media/android/router/media_router_android_bridge.h b/chrome/browser/media/android/router/media_router_android_bridge.h index d5e81f9fdac7a9..d4c7891a72e2ad 100644 --- a/chrome/browser/media/android/router/media_router_android_bridge.h +++ b/chrome/browser/media/android/router/media_router_android_bridge.h @@ -10,7 +10,7 @@ #include "chrome/common/media_router/media_route.h" #include "chrome/common/media_router/media_sink.h" #include "chrome/common/media_router/media_source.h" -#include "media/base/media_controller.h" +#include "media/base/flinging_controller.h" #include "url/origin.h" namespace media_router { @@ -44,7 +44,7 @@ class MediaRouterAndroidBridge { virtual void DetachRoute(const MediaRoute::Id& route_id); virtual bool StartObservingMediaSinks(const MediaSource::Id& source_id); virtual void StopObservingMediaSinks(const MediaSource::Id& source_id); - virtual std::unique_ptr GetMediaController( + virtual std::unique_ptr GetFlingingController( const MediaRoute::Id& route_id); // Methods called by the Java counterpart. diff --git a/chrome/browser/media/router/media_router.h b/chrome/browser/media/router/media_router.h index a11f239534b4f2..cf856a5866b232 100644 --- a/chrome/browser/media/router/media_router.h +++ b/chrome/browser/media/router/media_router.h @@ -23,7 +23,7 @@ #include "components/keyed_service/core/keyed_service.h" #include "components/sessions/core/session_id.h" #include "content/public/browser/presentation_service_delegate.h" -#include "media/base/media_controller.h" +#include "media/base/flinging_controller.h" namespace content { class WebContents; @@ -190,9 +190,10 @@ class MediaRouter : public KeyedService { // there is a change to the media routes, subclass MediaRoutesObserver. virtual std::vector GetCurrentRoutes() const = 0; - // Returns a controller that directly sends commands to media within a route. + // Returns a controller that sends commands to media within a route, and + // propagates MediaStatus changes. // Returns a nullptr if no controller can be be found from |route_id|. - virtual std::unique_ptr GetMediaController( + virtual std::unique_ptr GetFlingingController( const MediaRoute::Id& route_id) = 0; #if !defined(OS_ANDROID) diff --git a/chrome/browser/media/router/media_router_base.cc b/chrome/browser/media/router/media_router_base.cc index e5c4a5a7e82001..e08ec6c96e0a65 100644 --- a/chrome/browser/media/router/media_router_base.cc +++ b/chrome/browser/media/router/media_router_base.cc @@ -86,8 +86,8 @@ std::vector MediaRouterBase::GetCurrentRoutes() const { return internal_routes_observer_->current_routes; } -std::unique_ptr MediaRouterBase::GetMediaController( - const MediaRoute::Id& route_id) { +std::unique_ptr +MediaRouterBase::GetFlingingController(const MediaRoute::Id& route_id) { return nullptr; } diff --git a/chrome/browser/media/router/media_router_base.h b/chrome/browser/media/router/media_router_base.h index 330d14eeec5164..0f9916ffcc7040 100644 --- a/chrome/browser/media/router/media_router_base.h +++ b/chrome/browser/media/router/media_router_base.h @@ -17,7 +17,6 @@ #include "chrome/browser/media/router/media_router.h" #include "chrome/browser/media/router/media_routes_observer.h" #include "chrome/common/media_router/media_route.h" -#include "media/base/media_controller.h" #include "third_party/blink/public/platform/modules/presentation/presentation.mojom.h" namespace media_router { @@ -35,7 +34,7 @@ class MediaRouterBase : public MediaRouter { void OnIncognitoProfileShutdown() override; IssueManager* GetIssueManager() final; std::vector GetCurrentRoutes() const override; - std::unique_ptr GetMediaController( + std::unique_ptr GetFlingingController( const MediaRoute::Id& route_id) override; #if !defined(OS_ANDROID) scoped_refptr GetRouteController( diff --git a/chrome/browser/media/router/presentation/presentation_service_delegate_impl.cc b/chrome/browser/media/router/presentation/presentation_service_delegate_impl.cc index 1bab9436e40da3..66f7a24414ce02 100644 --- a/chrome/browser/media/router/presentation/presentation_service_delegate_impl.cc +++ b/chrome/browser/media/router/presentation/presentation_service_delegate_impl.cc @@ -673,8 +673,8 @@ void PresentationServiceDelegateImpl::ClearDefaultPresentationRequest() { observer.OnDefaultPresentationRemoved(); } -std::unique_ptr -PresentationServiceDelegateImpl::GetMediaController( +std::unique_ptr +PresentationServiceDelegateImpl::GetFlingingController( int render_process_id, int render_frame_id, const std::string& presentation_id) { @@ -684,7 +684,7 @@ PresentationServiceDelegateImpl::GetMediaController( if (route_id.empty()) return nullptr; - return router_->GetMediaController(route_id); + return router_->GetFlingingController(route_id); } MediaRoute::Id PresentationServiceDelegateImpl::GetRouteId( diff --git a/chrome/browser/media/router/presentation/presentation_service_delegate_impl.h b/chrome/browser/media/router/presentation/presentation_service_delegate_impl.h index 6f5e2077aaee40..5db27b42a2d1d7 100644 --- a/chrome/browser/media/router/presentation/presentation_service_delegate_impl.h +++ b/chrome/browser/media/router/presentation/presentation_service_delegate_impl.h @@ -25,7 +25,6 @@ #include "content/public/browser/presentation_service_delegate.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" -#include "media/base/media_controller.h" namespace content { class PresentationScreenAvailabilityListener; @@ -110,7 +109,7 @@ class PresentationServiceDelegateImpl void Terminate(int render_process_id, int render_frame_id, const std::string& presentation_id) override; - std::unique_ptr GetMediaController( + std::unique_ptr GetFlingingController( int render_process_id, int render_frame_id, const std::string& presentation_id) override; diff --git a/content/browser/media/flinging_renderer.cc b/content/browser/media/flinging_renderer.cc index b6119358422f8e..fd2490125e5cdf 100644 --- a/content/browser/media/flinging_renderer.cc +++ b/content/browser/media/flinging_renderer.cc @@ -15,7 +15,7 @@ namespace content { FlingingRenderer::FlingingRenderer( - std::unique_ptr controller) + std::unique_ptr controller) : controller_(std::move(controller)) {} FlingingRenderer::~FlingingRenderer() = default; @@ -43,15 +43,15 @@ std::unique_ptr FlingingRenderer::Create( if (!presentation_delegate) return nullptr; - auto media_controller = presentation_delegate->GetMediaController( + auto flinging_controller = presentation_delegate->GetFlingingController( render_frame_host->GetProcess()->GetID(), render_frame_host->GetRoutingID(), presentation_id); - if (!media_controller) + if (!flinging_controller) return nullptr; return base::WrapUnique( - new FlingingRenderer(std::move(media_controller))); + new FlingingRenderer(std::move(flinging_controller))); } // media::Renderer implementation @@ -76,21 +76,21 @@ void FlingingRenderer::Flush(const base::Closure& flush_cb) { void FlingingRenderer::StartPlayingFrom(base::TimeDelta time) { DVLOG(2) << __func__; - controller_->Seek(time); - controller_->Play(); + controller_->GetMediaController()->Seek(time); + controller_->GetMediaController()->Play(); } void FlingingRenderer::SetPlaybackRate(double playback_rate) { DVLOG(2) << __func__; if (playback_rate == 0) - controller_->Pause(); + controller_->GetMediaController()->Pause(); else - controller_->Play(); + controller_->GetMediaController()->Play(); } void FlingingRenderer::SetVolume(float volume) { DVLOG(2) << __func__; - controller_->SetVolume(volume); + controller_->GetMediaController()->SetVolume(volume); } base::TimeDelta FlingingRenderer::GetMediaTime() { diff --git a/content/browser/media/flinging_renderer.h b/content/browser/media/flinging_renderer.h index 38c411cd6d5dc2..f5a0eeedb63901 100644 --- a/content/browser/media/flinging_renderer.h +++ b/content/browser/media/flinging_renderer.h @@ -7,7 +7,7 @@ #include "base/callback.h" #include "content/common/content_export.h" -#include "media/base/media_controller.h" +#include "media/base/flinging_controller.h" #include "media/base/media_resource.h" #include "media/base/renderer.h" #include "media/base/renderer_client.h" @@ -50,9 +50,10 @@ class CONTENT_EXPORT FlingingRenderer : public media::Renderer { private: friend class FlingingRendererTest; - explicit FlingingRenderer(std::unique_ptr controller); + explicit FlingingRenderer( + std::unique_ptr controller); - std::unique_ptr controller_; + std::unique_ptr controller_; DISALLOW_COPY_AND_ASSIGN(FlingingRenderer); }; diff --git a/content/browser/media/flinging_renderer_unittest.cc b/content/browser/media/flinging_renderer_unittest.cc index 680ac22101c185..629e79cc7654b2 100644 --- a/content/browser/media/flinging_renderer_unittest.cc +++ b/content/browser/media/flinging_renderer_unittest.cc @@ -4,6 +4,7 @@ #include "content/browser/media/flinging_renderer.h" +#include "base/time/time.h" #include "base/version.h" #include "media/base/media_controller.h" #include "testing/gmock/include/gmock/gmock.h" @@ -23,14 +24,33 @@ class MockMediaController : public media::MediaController { MOCK_METHOD1(Seek, void(base::TimeDelta)); }; +class MockFlingingController : public media::FlingingController { + public: + explicit MockFlingingController(media::MediaController* media_controller) + : media_controller_(media_controller) {} + + media::MediaController* GetMediaController() { return media_controller_; } + + MOCK_METHOD1(AddMediaStatusObserver, void(media::MediaStatusObserver*)); + MOCK_METHOD1(RemoveMediaStatusObserver, void(media::MediaStatusObserver*)); + MOCK_METHOD0(GetApproximateCurrentTime, base::TimeDelta()); + + private: + media::MediaController* media_controller_; +}; + class FlingingRendererTest : public testing::Test { public: FlingingRendererTest() : media_controller_(new StrictMock()), - renderer_(std::unique_ptr(media_controller_)) {} + flinging_controller_( + new StrictMock(media_controller_.get())), + renderer_( + std::unique_ptr(flinging_controller_)) {} protected: - StrictMock* media_controller_; + std::unique_ptr media_controller_; + StrictMock* flinging_controller_; FlingingRenderer renderer_; }; diff --git a/content/browser/presentation/presentation_service_impl_unittest.cc b/content/browser/presentation/presentation_service_impl_unittest.cc index a635d4413a8fce..ce326a24bd5400 100644 --- a/content/browser/presentation/presentation_service_impl_unittest.cc +++ b/content/browser/presentation/presentation_service_impl_unittest.cc @@ -131,8 +131,8 @@ class MockPresentationServiceDelegate void(int render_process_id, int render_frame_id, const std::string& presentation_id)); - MOCK_METHOD3(GetMediaController, - std::unique_ptr( + MOCK_METHOD3(GetFlingingController, + std::unique_ptr( int render_process_id, int render_frame_id, const std::string& presentation_id)); diff --git a/content/public/browser/presentation_service_delegate.h b/content/public/browser/presentation_service_delegate.h index 03202644b97001..73f8cfeaf69994 100644 --- a/content/public/browser/presentation_service_delegate.h +++ b/content/public/browser/presentation_service_delegate.h @@ -13,7 +13,7 @@ #include "base/callback.h" #include "content/common/content_export.h" #include "content/public/common/presentation_connection_message.h" -#include "media/base/media_controller.h" +#include "media/base/flinging_controller.h" #include "third_party/blink/public/platform/modules/presentation/presentation.mojom.h" namespace content { @@ -170,11 +170,11 @@ class CONTENT_EXPORT ControllerPresentationServiceDelegate int render_frame_id, const std::string& presentation_id) = 0; - // Gets a MediaController for a given presentation ID. + // Gets a FlingingController for a given presentation ID. // |render_process_id|, |render_frame_id|: ID of originating frame. // |presentation_id|: The ID of the presentation for which we want a // Controller. - virtual std::unique_ptr GetMediaController( + virtual std::unique_ptr GetFlingingController( int render_process_id, int render_frame_id, const std::string& presentation_id) = 0; diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn index ac60e9336690a0..7d33caaa13fdf9 100644 --- a/media/base/BUILD.gn +++ b/media/base/BUILD.gn @@ -144,6 +144,7 @@ source_set("base") { "fallback_video_decoder.cc", "fallback_video_decoder.h", "feedback_signal_accumulator.h", + "flinging_controller.h", "hdr_metadata.cc", "hdr_metadata.h", "key_system_names.cc", diff --git a/media/base/flinging_controller.h b/media/base/flinging_controller.h new file mode 100644 index 00000000000000..1bf263454451e6 --- /dev/null +++ b/media/base/flinging_controller.h @@ -0,0 +1,37 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_BASE_FLINGING_CONTROLLER_H_ +#define MEDIA_BASE_FLINGING_CONTROLLER_H_ + +#include "base/time/time.h" +#include "media/base/media_controller.h" +#include "media/base/media_status_observer.h" + +namespace media { + +// Interface that groups all the necessary hooks to control media that is being +// flung to a cast device, as part of RemotePlayback. +// TODO(https://crbug.com/820277): Rename this interface to MediaRouteController +// and change media_router::MediaRouteController to MojoMediaRouteController. +class FlingingController { + public: + virtual ~FlingingController() = default; + + // Gets a MediaContoller owned by |this| to issue simple commands. + virtual MediaController* GetMediaController() = 0; + + // Subscribe or un-subscribe to changes in the media status. + virtual void AddMediaStatusObserver(MediaStatusObserver* observer) = 0; + virtual void RemoveMediaStatusObserver(MediaStatusObserver* observer) = 0; + + // Gets the current media playback time. Implementers may sacrifice precision + // to avoid a round-trip query to cast devices (see + // RemoteMediaPlayer.getApproximateStreamPosition() for example). + virtual base::TimeDelta GetApproximateCurrentTime() = 0; +}; + +} // namespace media + +#endif // MEDIA_BASE_FLINGING_CONTROLLER_H_