Commit bed1d89d authored by Sergey Ulanov's avatar Sergey Ulanov Committed by Commit Bot

[Fuchsia] Redirect fuchsia.media.Audio to the agent

Previously CastRunner was implementing Audio protocol to redirect
CreateAudioCapturer() message to the agent that created the component.
The agent also needs to be able to intercept CreateAudioRenderer()
requests, particularly to set stream usage (WebEngine doesn't set
usage for AudioRenderer ATM).

This CL updates the runner to redirect fuchsia.media.Audio protocol,
so then the agent can handle AudioRenderer and AudioCapturer requests
as appropriate.

This affects WebRTC audio output, but not regular media playback which
is handled by the fuchsia.media.AudioConsumer protocol.

Bug: 1059836
Change-Id: If68efdd2e1e4f0cbe84051e22ebaf90c2877b08e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2125610
Commit-Queue: Sergey Ulanov <sergeyu@chromium.org>
Reviewed-by: default avatarDavid Dorwin <ddorwin@chromium.org>
Auto-Submit: Sergey Ulanov <sergeyu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#754698}
parent d77621f1
...@@ -57,8 +57,6 @@ source_set("cast_runner_core") { ...@@ -57,8 +57,6 @@ source_set("cast_runner_core") {
"cast/api_bindings_client.h", "cast/api_bindings_client.h",
"cast/application_controller_impl.cc", "cast/application_controller_impl.cc",
"cast/application_controller_impl.h", "cast/application_controller_impl.h",
"cast/audio_capturer_redirect.cc",
"cast/audio_capturer_redirect.h",
"cast/cast_component.cc", "cast/cast_component.cc",
"cast/cast_component.h", "cast/cast_component.h",
"cast/cast_runner.cc", "cast/cast_runner.cc",
......
// Copyright 2020 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 "fuchsia/runners/cast/audio_capturer_redirect.h"
#include <lib/sys/cpp/component_context.h>
#include <lib/sys/cpp/service_directory.h>
#include "base/fuchsia/default_context.h"
AudioCapturerRedirect::AudioCapturerRedirect(
sys::OutgoingDirectory* outgoing_directory,
CreateCapturerCallback create_capturer_callback)
: binding_(outgoing_directory, this),
create_capturer_callback_(std::move(create_capturer_callback)),
system_audio_(base::fuchsia::ComponentContextForCurrentProcess()
->svc()
->Connect<fuchsia::media::Audio>()) {}
AudioCapturerRedirect::~AudioCapturerRedirect() = default;
void AudioCapturerRedirect::CreateAudioRenderer(
fidl::InterfaceRequest<fuchsia::media::AudioRenderer>
audio_renderer_request) {
system_audio_->CreateAudioRenderer(std::move(audio_renderer_request));
}
void AudioCapturerRedirect::CreateAudioCapturer(
fidl::InterfaceRequest<fuchsia::media::AudioCapturer>
audio_capturer_request,
bool loopback) {
// Loopback capture is not supported.
if (loopback) {
NOTREACHED();
return;
}
create_capturer_callback_.Run(std::move(audio_capturer_request));
}
void AudioCapturerRedirect::SetSystemMute(bool muted) {
system_audio_->SetSystemMute(muted);
}
void AudioCapturerRedirect::SetSystemGain(float gain_db) {
system_audio_->SetSystemGain(gain_db);
}
// Copyright 2020 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 FUCHSIA_RUNNERS_CAST_AUDIO_CAPTURER_REDIRECT_H_
#define FUCHSIA_RUNNERS_CAST_AUDIO_CAPTURER_REDIRECT_H_
#include <fuchsia/media/cpp/fidl.h>
#include "base/callback.h"
#include "base/fuchsia/scoped_service_binding.h"
// fuchsia::media::Audio implementation that redirects CreateAudioCapturer()
// calls to a callback.
// TODO(fxb/47249) Remove this once AudioCapturerFactory is defined and
// implemented.
class AudioCapturerRedirect : public fuchsia::media::Audio {
public:
// Callback to be called for CreateAudioRenderer().
using CreateCapturerCallback = base::RepeatingCallback<void(
fidl::InterfaceRequest<fuchsia::media::AudioCapturer> request)>;
// Publishes fuchsia.media.Audio to |outgoing_directory| The specified
// |create_capturer_callback|. will be called every time CreateAudioCapturer()
// is called. All other calls are redirected to /svc/fuchsia.media.Audio.
AudioCapturerRedirect(sys::OutgoingDirectory* outgoing_directory,
CreateCapturerCallback create_capturer_callback);
~AudioCapturerRedirect() final;
private:
// fuchsia::media::Audio implementation.
void CreateAudioRenderer(fidl::InterfaceRequest<fuchsia::media::AudioRenderer>
audio_renderer_request) final;
void CreateAudioCapturer(fidl::InterfaceRequest<fuchsia::media::AudioCapturer>
audio_capturer_request,
bool loopback) final;
void SetSystemMute(bool muted) final;
void SetSystemGain(float gain_db) final;
base::fuchsia::ScopedServiceBinding<fuchsia::media::Audio> binding_;
CreateCapturerCallback create_capturer_callback_;
fuchsia::media::AudioPtr system_audio_;
};
#endif // FUCHSIA_RUNNERS_CAST_AUDIO_CAPTURER_REDIRECT_H_
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include "base/fuchsia/fuchsia_logging.h" #include "base/fuchsia/fuchsia_logging.h"
#include "base/logging.h" #include "base/logging.h"
#include "fuchsia/base/agent_manager.h" #include "fuchsia/base/agent_manager.h"
#include "fuchsia/runners/cast/audio_capturer_redirect.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace { namespace {
...@@ -281,11 +280,15 @@ void CastRunner::InitializeServiceDirectory() { ...@@ -281,11 +280,15 @@ void CastRunner::InitializeServiceDirectory() {
service_directory_->AddService(name); service_directory_->AddService(name);
} }
// Create AudioCapturerRedirect to intercept CreateAudioCapturer() requests. // Handle fuchsia.media.Audio requests so we can redirect to the agent if
audio_capturer_redirect_ = std::make_unique<AudioCapturerRedirect>( // necessary.
service_directory_->outgoing_directory(), service_directory_->outgoing_directory()->AddPublicService(
base::BindRepeating(&CastRunner::CreateAudioCapturer, std::make_unique<vfs::Service>([this](zx::channel channel,
base::Unretained(this))); async_dispatcher_t* dispatcher) {
this->ConnectAudioProtocol(
fidl::InterfaceRequest<fuchsia::media::Audio>(std::move(channel)));
}),
fuchsia::media::Audio::Name_);
fidl::InterfaceHandle<fuchsia::io::Directory> client_handle; fidl::InterfaceHandle<fuchsia::io::Directory> client_handle;
service_directory_->ConnectClient(client_handle.NewRequest()); service_directory_->ConnectClient(client_handle.NewRequest());
...@@ -390,14 +393,18 @@ size_t CastRunner::GetChildCastRunnerCountForTest() { ...@@ -390,14 +393,18 @@ size_t CastRunner::GetChildCastRunnerCountForTest() {
return isolated_runners_.size(); return isolated_runners_.size();
} }
void CastRunner::CreateAudioCapturer( void CastRunner::ConnectAudioProtocol(
fidl::InterfaceRequest<fuchsia::media::AudioCapturer> request) { fidl::InterfaceRequest<fuchsia::media::Audio> request) {
if (!audio_capturer_component_) // If we have a component that allows AudioCapturer access then redirect the
// fuchsia.media.Audio requests to the corresponding agent.
if (audio_capturer_component_) {
audio_capturer_component_->agent_manager()->ConnectToAgentService(
audio_capturer_component_->application_config().agent_url(),
std::move(request));
return; return;
}
auto audio = // Otherwise use the default fuchsia.media.Audio implementation.
audio_capturer_component_->agent_manager() base::fuchsia::ComponentContextForCurrentProcess()->svc()->Connect(
->ConnectToAgentService<fuchsia::media::Audio>( std::move(request));
audio_capturer_component_->application_config().agent_url());
audio->CreateAudioCapturer(std::move(request), /*loopback=*/false);
} }
\ No newline at end of file
...@@ -26,8 +26,6 @@ class FilteredServiceDirectory; ...@@ -26,8 +26,6 @@ class FilteredServiceDirectory;
} // namespace fuchsia } // namespace fuchsia
} // namespace base } // namespace base
class AudioCapturerRedirect;
// sys::Runner which instantiates Cast activities specified via cast/casts URIs. // sys::Runner which instantiates Cast activities specified via cast/casts URIs.
class CastRunner : public WebContentRunner { class CastRunner : public WebContentRunner {
public: public:
...@@ -93,9 +91,9 @@ class CastRunner : public WebContentRunner { ...@@ -93,9 +91,9 @@ class CastRunner : public WebContentRunner {
CastRunner* CreateChildRunnerForIsolatedComponent( CastRunner* CreateChildRunnerForIsolatedComponent(
CastComponent::CastComponentParams* params); CastComponent::CastComponentParams* params);
// Callback for |audio_capturer_redirect_|. // Handler for fuchsia.media.Audio requests in |service_directory_|.
void CreateAudioCapturer( void ConnectAudioProtocol(
fidl::InterfaceRequest<fuchsia::media::AudioCapturer> request); fidl::InterfaceRequest<fuchsia::media::Audio> request);
// Holds StartComponent() requests while the ApplicationConfig is being // Holds StartComponent() requests while the ApplicationConfig is being
// fetched from the ApplicationConfigManager. // fetched from the ApplicationConfigManager.
...@@ -115,7 +113,6 @@ class CastRunner : public WebContentRunner { ...@@ -115,7 +113,6 @@ class CastRunner : public WebContentRunner {
isolated_runners_; isolated_runners_;
std::unique_ptr<base::fuchsia::FilteredServiceDirectory> service_directory_; std::unique_ptr<base::fuchsia::FilteredServiceDirectory> service_directory_;
std::unique_ptr<AudioCapturerRedirect> audio_capturer_redirect_;
// Last component that was created with permission to access MICROPHONE. // Last component that was created with permission to access MICROPHONE.
CastComponent* audio_capturer_component_ = nullptr; CastComponent* audio_capturer_component_ = nullptr;
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#include "fuchsia/base/test_devtools_list_fetcher.h" #include "fuchsia/base/test_devtools_list_fetcher.h"
#include "fuchsia/base/test_navigation_listener.h" #include "fuchsia/base/test_navigation_listener.h"
#include "fuchsia/base/url_request_rewrite_test_util.h" #include "fuchsia/base/url_request_rewrite_test_util.h"
#include "fuchsia/runners/cast/audio_capturer_redirect.h"
#include "fuchsia/runners/cast/cast_runner.h" #include "fuchsia/runners/cast/cast_runner.h"
#include "fuchsia/runners/cast/fake_application_config_manager.h" #include "fuchsia/runners/cast/fake_application_config_manager.h"
#include "fuchsia/runners/cast/test_api_bindings.h" #include "fuchsia/runners/cast/test_api_bindings.h"
...@@ -711,20 +710,19 @@ TEST_F(CastRunnerIntegrationTest, MicRedirect) { ...@@ -711,20 +710,19 @@ TEST_F(CastRunnerIntegrationTest, MicRedirect) {
app_config_manager_.AddAppConfig(std::move(app_config)); app_config_manager_.AddAppConfig(std::move(app_config));
base::RunLoop run_loop; base::RunLoop run_loop;
std::unique_ptr<AudioCapturerRedirect> redirect;
init_component_state_callback_ = base::BindOnce( init_component_state_callback_ = base::BindOnce(
[](std::unique_ptr<AudioCapturerRedirect>* redirect, [](base::OnceClosure quit_closure, FakeComponentState* component_state) {
base::OnceClosure quit_closure, FakeComponentState* component_state) { component_state->outgoing_directory()->AddPublicService(
*redirect = std::make_unique<AudioCapturerRedirect>( std::make_unique<vfs::Service>(
component_state->outgoing_directory(), [quit_closure = std::move(quit_closure)](
base::BindRepeating( zx::channel channel,
[](base::OnceClosure quit_closure, async_dispatcher_t* dispatcher) mutable {
fidl::InterfaceRequest<fuchsia::media::AudioCapturer> std::move(quit_closure).Run();
request) { std::move(quit_closure).Run(); }, }),
base::Passed(std::move(quit_closure)))); fuchsia::media::Audio::Name_);
}, },
&redirect, base::Passed(run_loop.QuitClosure())); base::Passed(run_loop.QuitClosure()));
CreateComponentContextAndStartComponent(); CreateComponentContextAndStartComponent();
......
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