| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "fuchsia_web/webengine/browser/web_engine_media_resource_provider_impl.h" |
| |
| #include <lib/fidl/cpp/interface_handle.h> |
| #include <lib/sys/cpp/component_context.h> |
| |
| #include "base/command_line.h" |
| #include "base/fuchsia/process_context.h" |
| #include "base/functional/bind.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/document_service.h" |
| #include "content/public/browser/permission_controller.h" |
| #include "content/public/browser/render_frame_host.h" |
| #include "fuchsia_web/webengine/browser/frame_impl.h" |
| #include "media/base/media_switches.h" |
| |
| void WebEngineMediaResourceProviderImpl::Bind( |
| content::RenderFrameHost* frame_host, |
| mojo::PendingReceiver<mojom::WebEngineMediaResourceProvider> receiver) { |
| CHECK(frame_host); |
| // The object will delete itself when connection to the frame is broken. |
| new WebEngineMediaResourceProviderImpl(*frame_host, std::move(receiver)); |
| } |
| |
| WebEngineMediaResourceProviderImpl::WebEngineMediaResourceProviderImpl( |
| content::RenderFrameHost& render_frame_host, |
| mojo::PendingReceiver<mojom::WebEngineMediaResourceProvider> receiver) |
| : DocumentService(render_frame_host, std::move(receiver)) {} |
| |
| WebEngineMediaResourceProviderImpl::~WebEngineMediaResourceProviderImpl() = |
| default; |
| |
| void WebEngineMediaResourceProviderImpl::ShouldUseAudioConsumer( |
| ShouldUseAudioConsumerCallback callback) { |
| auto* frame_impl = FrameImpl::FromRenderFrameHost(&render_frame_host()); |
| DCHECK(frame_impl); |
| std::move(callback).Run( |
| frame_impl->media_settings().has_audio_consumer_session_id()); |
| } |
| |
| void WebEngineMediaResourceProviderImpl::CreateAudioConsumer( |
| fidl::InterfaceRequest<fuchsia::media::AudioConsumer> request) { |
| if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kDisableAudioOutput)) { |
| LOG(WARNING) |
| << "Could not create AudioConsumer because audio output feature flag " |
| "was not enabled."; |
| return; |
| } |
| |
| auto factory = base::ComponentContextForProcess() |
| ->svc() |
| ->Connect<fuchsia::media::SessionAudioConsumerFactory>(); |
| auto* frame_impl = FrameImpl::FromRenderFrameHost(&render_frame_host()); |
| DCHECK(frame_impl); |
| |
| if (!frame_impl->media_settings().has_audio_consumer_session_id()) { |
| LOG(WARNING) << "Renderer tried creating AudioConsumer for a Frame without " |
| "media_session_id()."; |
| return; |
| } |
| |
| factory->CreateAudioConsumer( |
| frame_impl->media_settings().audio_consumer_session_id(), |
| std::move(request)); |
| } |