blob: 15f877e60d06dfa8d6a233f249696ab575c7825d [file] [log] [blame]
// 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/containers/cxx20_erase.h"
#include "content/browser/media/session/media_session_controller.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "media/base/media_switches.h"
#include "services/media_session/public/cpp/features.h"
namespace content {
namespace {
bool IsMediaSessionEnabled() {
return base::FeatureList::IsEnabled(
media_session::features::kMediaSessionService) ||
base::FeatureList::IsEnabled(media::kInternalMediaSession);
}
} // namespace
MediaSessionControllersManager::MediaSessionControllersManager(
WebContentsImpl* web_contents)
: web_contents_(web_contents) {}
MediaSessionControllersManager::~MediaSessionControllersManager() = default;
void MediaSessionControllersManager::RenderFrameDeleted(
RenderFrameHost* render_frame_host) {
if (!IsMediaSessionEnabled())
return;
base::EraseIf(
controllers_map_,
[render_frame_host](const ControllersMap::value_type& id_and_controller) {
return render_frame_host->GetGlobalId() ==
id_and_controller.first.frame_routing_id;
});
}
void MediaSessionControllersManager::OnMetadata(
const MediaPlayerId& id,
bool has_audio,
bool has_video,
media::MediaContentType media_content_type) {
if (!IsMediaSessionEnabled())
return;
MediaSessionController* const controller = FindOrCreateController(id);
controller->SetMetadata(has_audio, has_video, media_content_type);
}
bool MediaSessionControllersManager::RequestPlay(const MediaPlayerId& id) {
if (!IsMediaSessionEnabled())
return true;
MediaSessionController* const controller = FindOrCreateController(id);
return controller->OnPlaybackStarted();
}
void MediaSessionControllersManager::OnPause(const MediaPlayerId& id,
bool reached_end_of_stream) {
if (!IsMediaSessionEnabled())
return;
MediaSessionController* const controller = FindOrCreateController(id);
controller->OnPlaybackPaused(reached_end_of_stream);
}
void MediaSessionControllersManager::OnEnd(const MediaPlayerId& id) {
if (!IsMediaSessionEnabled())
return;
controllers_map_.erase(id);
}
void MediaSessionControllersManager::OnMediaPositionStateChanged(
const MediaPlayerId& id,
const media_session::MediaPosition& position) {
if (!IsMediaSessionEnabled())
return;
MediaSessionController* const controller = FindOrCreateController(id);
controller->OnMediaPositionStateChanged(position);
}
void MediaSessionControllersManager::PictureInPictureStateChanged(
bool is_picture_in_picture) {
if (!IsMediaSessionEnabled())
return;
for (auto& entry : controllers_map_)
entry.second->PictureInPictureStateChanged(is_picture_in_picture);
}
void MediaSessionControllersManager::WebContentsMutedStateChanged(bool muted) {
if (!IsMediaSessionEnabled())
return;
for (auto& entry : controllers_map_)
entry.second->WebContentsMutedStateChanged(muted);
}
void MediaSessionControllersManager::OnMediaMutedStatusChanged(
const MediaPlayerId& id,
bool mute) {
if (!IsMediaSessionEnabled())
return;
MediaSessionController* const controller = FindOrCreateController(id);
controller->OnMediaMutedStatusChanged(mute);
}
void MediaSessionControllersManager::OnPictureInPictureAvailabilityChanged(
const MediaPlayerId& id,
bool available) {
if (!IsMediaSessionEnabled())
return;
MediaSessionController* const controller = FindOrCreateController(id);
controller->OnPictureInPictureAvailabilityChanged(available);
}
void MediaSessionControllersManager::OnAudioOutputSinkChanged(
const MediaPlayerId& id,
const std::string& raw_device_id) {
if (!IsMediaSessionEnabled())
return;
MediaSessionController* const controller = FindOrCreateController(id);
controller->OnAudioOutputSinkChanged(raw_device_id);
}
void MediaSessionControllersManager::OnAudioOutputSinkChangingDisabled(
const MediaPlayerId& id) {
if (!IsMediaSessionEnabled())
return;
MediaSessionController* const controller = FindOrCreateController(id);
controller->OnAudioOutputSinkChangingDisabled();
}
MediaSessionController* MediaSessionControllersManager::FindOrCreateController(
const MediaPlayerId& id) {
auto it = controllers_map_.find(id);
if (it == controllers_map_.end()) {
it = controllers_map_
.emplace(id, std::make_unique<MediaSessionController>(
id, web_contents_))
.first;
}
return it->second.get();
}
} // namespace content