| Index: content/browser/media/session/media_session_controllers_manager.cc
|
| diff --git a/content/browser/media/session/media_session_controllers_manager.cc b/content/browser/media/session/media_session_controllers_manager.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0b93dc89ac069538987ba63c78d0bb4637084c2b
|
| --- /dev/null
|
| +++ b/content/browser/media/session/media_session_controllers_manager.cc
|
| @@ -0,0 +1,94 @@
|
| +// Copyright 2016 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 "content/browser/media/session/media_session_controllers_manager.h"
|
| +
|
| +#include "base/command_line.h"
|
| +#include "content/browser/media/session/media_session.h"
|
| +#include "content/browser/media/session/media_session_controller.h"
|
| +#include "content/browser/media/session/media_session_observer.h"
|
| +#include "media/base/media_switches.h"
|
| +
|
| +namespace content {
|
| +
|
| +namespace {
|
| +
|
| +bool IsDefaultMediaSessionEnabled() {
|
| +#if defined(OS_ANDROID)
|
| + return true;
|
| +#else
|
| + return base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kEnableDefaultMediaSession);
|
| +#endif
|
| +}
|
| +
|
| +} // anonymous namespace
|
| +
|
| +MediaSessionControllersManager::MediaSessionControllersManager(
|
| + MediaWebContentsObserver* media_web_contents_observer)
|
| + : media_web_contents_observer_(media_web_contents_observer) {
|
| +}
|
| +
|
| +MediaSessionControllersManager::~MediaSessionControllersManager() = default;
|
| +
|
| +void MediaSessionControllersManager::RenderFrameDeleted(
|
| + RenderFrameHost* render_frame_host) {
|
| + if (!IsDefaultMediaSessionEnabled())
|
| + return;
|
| +
|
| + for (auto it = controllers_map_.begin(); it != controllers_map_.end();) {
|
| + if (it->first.first == render_frame_host)
|
| + it = controllers_map_.erase(it);
|
| + else
|
| + ++it;
|
| + }
|
| +}
|
| +
|
| +bool MediaSessionControllersManager::RequestPlay(const MediaPlayerId& id,
|
| + bool has_audio, bool is_remote, base::TimeDelta duration) {
|
| + if (!IsDefaultMediaSessionEnabled())
|
| + return true;
|
| +
|
| + // Since we don't remove session instances on pause, there may be an existing
|
| + // instance for this playback attempt.
|
| + //
|
| + // In this case, try to reinitialize it with the new settings. If they are
|
| + // the same, this is a no-op. If the reinitialize fails, destroy the
|
| + // controller. A later playback attempt will create a new controller.
|
| + auto it = controllers_map_.find(id);
|
| + if (it != controllers_map_.end()) {
|
| + if (it->second->Initialize(has_audio, is_remote, duration))
|
| + return true;
|
| + controllers_map_.erase(it);
|
| + return false;
|
| + }
|
| +
|
| + scoped_ptr<MediaSessionController> controller(
|
| + new MediaSessionController(id, media_web_contents_observer_));
|
| +
|
| + if (!controller->Initialize(has_audio, is_remote, duration))
|
| + return false;
|
| +
|
| + controllers_map_[id] = std::move(controller);
|
| + return true;
|
| +}
|
| +
|
| +void MediaSessionControllersManager::OnPause(const MediaPlayerId& id) {
|
| + if (!IsDefaultMediaSessionEnabled())
|
| + return;
|
| +
|
| + auto it = controllers_map_.find(id);
|
| + if (it == controllers_map_.end())
|
| + return;
|
| +
|
| + it->second->OnPlaybackPaused();
|
| +}
|
| +
|
| +void MediaSessionControllersManager::OnEnd(const MediaPlayerId& id) {
|
| + if (!IsDefaultMediaSessionEnabled())
|
| + return;
|
| + controllers_map_.erase(id);
|
| +}
|
| +
|
| +} // namespace content
|
|
|