Commit 853a716e authored by Miyoung Shin's avatar Miyoung Shin Committed by Commit Bot

Convert AudioFocusManager to new Mojo types

This CL converts AudioFocusManager{Ptr, Request} in chrome,
components, content and services to the new Mojo type, and uses
pending_remote<AudioFocusManager> in media_session.mojom.

Bug: 955171
Change-Id: If94cf50ca0e051f4e0864fa5efd01e3595e70205
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1849732Reviewed-by: default avatarMounir Lamouri <mlamouri@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Commit-Queue: Miyoung Shin <myid.shin@igalia.com>
Cr-Commit-Position: refs/heads/master@{#704942}
parent 0e15a031
......@@ -315,8 +315,9 @@ AccessibilityManager::AccessibilityManager() {
weak_ptr_factory_.GetWeakPtr())));
// Connect to the media session service.
content::GetSystemConnector()->BindInterface(
media_session::mojom::kServiceName, &audio_focus_manager_ptr_);
content::GetSystemConnector()->Connect(
media_session::mojom::kServiceName,
audio_focus_manager_.BindNewPipeAndPassReceiver());
ash::AcceleratorController::SetVolumeAdjustmentSoundCallback(
base::BindRepeating(&AccessibilityManager::PlayVolumeAdjustSound,
......@@ -1369,7 +1370,7 @@ void AccessibilityManager::PostLoadChromeVox() {
base::Unretained(this))));
}
audio_focus_manager_ptr_->SetEnforcementMode(
audio_focus_manager_->SetEnforcementMode(
media_session::mojom::EnforcementMode::kNone);
InitializeFocusRings(extension_id);
......@@ -1396,7 +1397,7 @@ void AccessibilityManager::PostUnloadChromeVox() {
// Stop speech.
content::TtsController::GetInstance()->Stop();
audio_focus_manager_ptr_->SetEnforcementMode(
audio_focus_manager_->SetEnforcementMode(
media_session::mojom::EnforcementMode::kDefault);
}
......
......@@ -29,6 +29,7 @@
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/browser/extension_system.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/media_session/public/mojom/audio_focus.mojom.h"
#include "ui/accessibility/ax_enums.mojom-forward.h"
#include "ui/base/ime/chromeos/input_method_manager.h"
......@@ -492,7 +493,7 @@ class AccessibilityManager
caret_bounds_observer_for_test_;
// Used to set the audio focus enforcement type for ChromeVox.
media_session::mojom::AudioFocusManagerPtr audio_focus_manager_ptr_;
mojo::Remote<media_session::mojom::AudioFocusManager> audio_focus_manager_;
base::WeakPtrFactory<AccessibilityManager> weak_ptr_factory_{this};
......
......@@ -13,6 +13,7 @@
#include "components/arc/arc_features.h"
#include "components/arc/session/arc_bridge_service.h"
#include "content/public/browser/system_connector.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/media_session/public/cpp/features.h"
#include "services/media_session/public/mojom/audio_focus.mojom.h"
#include "services/media_session/public/mojom/constants.mojom.h"
......@@ -87,15 +88,16 @@ void ArcMediaSessionBridge::SetupAudioFocus() {
return;
}
media_session::mojom::AudioFocusManagerPtr audio_focus_ptr;
content::GetSystemConnector()->BindInterface(
media_session::mojom::kServiceName, &audio_focus_ptr);
mojo::Remote<media_session::mojom::AudioFocusManager> audio_focus;
content::GetSystemConnector()->Connect(
media_session::mojom::kServiceName,
audio_focus.BindNewPipeAndPassReceiver());
audio_focus_ptr->SetSource(base::UnguessableToken::Create(),
kAudioFocusSourceName);
audio_focus->SetSource(base::UnguessableToken::Create(),
kAudioFocusSourceName);
DVLOG(2) << "ArcMediaSessionBridge will enable audio focus";
ms_instance->EnableAudioFocus(std::move(audio_focus_ptr));
ms_instance->EnableAudioFocus(audio_focus.Unbind());
}
} // namespace arc
......@@ -13,7 +13,8 @@ interface MediaSessionInstance {
// Enable audio focus integration on the Android side and register the
// unified AudioPolicy. The audio policy will send audio focus requests
// to |service|.
EnableAudioFocus@1(media_session.mojom.AudioFocusManager service);
EnableAudioFocus@1(
pending_remote<media_session.mojom.AudioFocusManager> service);
// Disable audio focus integration if it is enabled.
DisableAudioFocus@2();
......
......@@ -60,7 +60,7 @@ void MediaInternalsAudioFocusHelper::SendAudioFocusState() {
return;
// Get the audio focus state from the media session service.
audio_focus_ptr_->GetFocusRequests(base::BindOnce(
audio_focus_->GetFocusRequests(base::BindOnce(
&MediaInternalsAudioFocusHelper::DidGetAudioFocusRequestList,
base::Unretained(this)));
}
......@@ -93,7 +93,7 @@ void MediaInternalsAudioFocusHelper::SetEnabled(bool enabled) {
EnsureServiceConnection();
if (!enabled) {
audio_focus_ptr_.reset();
audio_focus_.reset();
audio_focus_debug_ptr_.reset();
receiver_.reset();
}
......@@ -111,10 +111,10 @@ bool MediaInternalsAudioFocusHelper::EnsureServiceConnection() {
return false;
// Connect to the media session service.
if (!audio_focus_ptr_.is_bound()) {
connector->BindInterface(media_session::mojom::kServiceName,
mojo::MakeRequest(&audio_focus_ptr_));
audio_focus_ptr_.set_connection_error_handler(base::BindRepeating(
if (!audio_focus_.is_bound()) {
connector->Connect(media_session::mojom::kServiceName,
audio_focus_.BindNewPipeAndPassReceiver());
audio_focus_.set_disconnect_handler(base::BindRepeating(
&MediaInternalsAudioFocusHelper::OnMojoError, base::Unretained(this)));
}
......@@ -129,7 +129,7 @@ bool MediaInternalsAudioFocusHelper::EnsureServiceConnection() {
// Add the observer to receive audio focus events.
if (!receiver_.is_bound()) {
audio_focus_ptr_->AddObserver(receiver_.BindNewPipeAndPassRemote());
audio_focus_->AddObserver(receiver_.BindNewPipeAndPassRemote());
receiver_.set_disconnect_handler(base::BindRepeating(
&MediaInternalsAudioFocusHelper::OnMojoError, base::Unretained(this)));
......@@ -139,7 +139,7 @@ bool MediaInternalsAudioFocusHelper::EnsureServiceConnection() {
}
void MediaInternalsAudioFocusHelper::OnMojoError() {
audio_focus_ptr_.reset();
audio_focus_.reset();
receiver_.reset();
}
......
......@@ -10,6 +10,7 @@
#include "base/macros.h"
#include "base/values.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/media_session/public/mojom/audio_focus.mojom.h"
namespace content {
......@@ -62,8 +63,8 @@ class MediaInternalsAudioFocusHelper
const media_session::mojom::AudioFocusRequestStatePtr& state,
const std::string& provided_state) const;
// Holds a pointer to the media session service and it's debug interface.
media_session::mojom::AudioFocusManagerPtr audio_focus_ptr_;
// Holds a remote to the media session service and it's debug interface.
mojo::Remote<media_session::mojom::AudioFocusManager> audio_focus_;
media_session::mojom::AudioFocusManagerDebugPtr audio_focus_debug_ptr_;
// Must only be accessed on the UI thread.
......
......@@ -25,6 +25,7 @@
#include "media/base/channel_layout.h"
#include "media/base/media_log.h"
#include "media/base/media_switches.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/media_session/public/cpp/features.h"
#include "services/media_session/public/mojom/audio_focus.mojom.h"
#include "services/media_session/public/mojom/constants.mojom.h"
......@@ -341,8 +342,9 @@ class MediaInternalsAudioFocusTest : public RenderViewHostTestHarness,
base::Unretained(this));
run_loop_ = std::make_unique<base::RunLoop>();
content::GetSystemConnector()->BindInterface(
media_session::mojom::kServiceName, &audio_focus_ptr_);
content::GetSystemConnector()->Connect(
media_session::mojom::kServiceName,
audio_focus_.BindNewPipeAndPassReceiver());
content::MediaInternals::GetInstance()->AddUpdateCallback(update_cb_);
}
......@@ -404,14 +406,14 @@ class MediaInternalsAudioFocusTest : public RenderViewHostTestHarness,
std::string GetRequestIdForTopFocusRequest() {
std::string result;
audio_focus_ptr_->GetFocusRequests(base::BindOnce(
audio_focus_->GetFocusRequests(base::BindOnce(
[](std::string* out, std::vector<AudioFocusRequestStatePtr> requests) {
DCHECK(!requests.empty());
*out = requests.back()->request_id.value().ToString();
},
&result));
audio_focus_ptr_.FlushForTesting();
audio_focus_.FlushForTesting();
return result;
}
......@@ -424,7 +426,7 @@ class MediaInternalsAudioFocusTest : public RenderViewHostTestHarness,
base::Lock lock_;
std::unique_ptr<base::RunLoop> run_loop_;
media_session::mojom::AudioFocusManagerPtr audio_focus_ptr_;
mojo::Remote<media_session::mojom::AudioFocusManager> audio_focus_;
};
TEST_F(MediaInternalsAudioFocusTest, AudioFocusStateIsUpdated) {
......
......@@ -12,6 +12,7 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/system_connector.h"
#include "media/base/media_switches.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/media_session/public/cpp/features.h"
#include "services/media_session/public/mojom/audio_focus.mojom.h"
#include "services/media_session/public/mojom/constants.mojom.h"
......@@ -60,14 +61,14 @@ class AudioFocusDelegateDefault : public AudioFocusDelegate {
// Finishes an async audio focus request.
void FinishAudioFocusRequest(AudioFocusType type, bool success);
// Ensures that |audio_focus_ptr_| is connected.
// Ensures that |audio_focus_| is connected.
void EnsureServiceConnection();
// Holds the latest MediaSessionInfo for |media_session_|.
media_session::mojom::MediaSessionInfoPtr session_info_;
// Holds a pointer to the Media Session service.
media_session::mojom::AudioFocusManagerPtr audio_focus_ptr_;
// Holds a remote to the Media Session service.
mojo::Remote<media_session::mojom::AudioFocusManager> audio_focus_;
// If the media session has acquired audio focus then this will contain a
// pointer to that requests AudioFocusRequestClient.
......@@ -118,7 +119,7 @@ AudioFocusDelegateDefault::RequestAudioFocus(AudioFocusType audio_focus_type) {
mojo::PendingRemote<media_session::mojom::MediaSession> media_session =
media_session_->AddRemote();
audio_focus_ptr_->RequestGroupedAudioFocus(
audio_focus_->RequestGroupedAudioFocus(
request_id_, request_client_remote_.BindNewPipeAndPassReceiver(),
std::move(media_session), session_info_.Clone(), audio_focus_type,
GetAudioFocusGroupId(media_session_),
......@@ -140,7 +141,7 @@ void AudioFocusDelegateDefault::AbandonAudioFocus() {
request_client_remote_->AbandonAudioFocus();
request_client_remote_.reset();
audio_focus_ptr_.reset();
audio_focus_.reset();
}
base::Optional<media_session::mojom::AudioFocusType>
......@@ -176,19 +177,18 @@ void AudioFocusDelegateDefault::EnsureServiceConnection() {
return;
}
if (audio_focus_ptr_.is_bound() && !audio_focus_ptr_.encountered_error())
if (audio_focus_.is_bound() && audio_focus_.is_connected())
return;
audio_focus_ptr_.reset();
audio_focus_.reset();
// Connect to the Media Session service and bind |audio_focus_ptr_| to it.
GetSystemConnector()->BindInterface(media_session::mojom::kServiceName,
mojo::MakeRequest(&audio_focus_ptr_));
// Connect to the Media Session service and bind |audio_focus_| to it.
GetSystemConnector()->Connect(media_session::mojom::kServiceName,
audio_focus_.BindNewPipeAndPassReceiver());
// We associate all media sessions with the browser context so we can filter
// by browser context in the UI.
audio_focus_ptr_->SetSource(media_session_->GetSourceId(),
kAudioFocusSourceName);
audio_focus_->SetSource(media_session_->GetSourceId(), kAudioFocusSourceName);
}
// static
......
......@@ -14,6 +14,7 @@
#include "content/shell/browser/shell.h"
#include "media/base/media_content_type.h"
#include "media/base/media_switches.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/media_session/public/cpp/features.h"
#include "services/media_session/public/cpp/test/audio_focus_test_util.h"
#include "services/media_session/public/cpp/test/mock_media_session.h"
......@@ -36,8 +37,8 @@ class AudioFocusDelegateDefaultBrowserTest : public ContentBrowserTest {
void SetUpOnMainThread() override {
ContentBrowserTest::SetUpOnMainThread();
GetSystemConnector()->BindInterface(media_session::mojom::kServiceName,
mojo::MakeRequest(&audio_focus_ptr_));
GetSystemConnector()->Connect(media_session::mojom::kServiceName,
audio_focus_.BindNewPipeAndPassReceiver());
}
void SetUpCommandLine(base::CommandLine* command_line) override {
......@@ -48,14 +49,14 @@ class AudioFocusDelegateDefaultBrowserTest : public ContentBrowserTest {
}
void CheckSessionSourceName() {
audio_focus_ptr_->GetFocusRequests(base::BindOnce(
audio_focus_->GetFocusRequests(base::BindOnce(
[](std::vector<media_session::mojom::AudioFocusRequestStatePtr>
requests) {
for (auto& request : requests)
EXPECT_EQ(kExpectedSourceName, request->source_name.value());
}));
audio_focus_ptr_.FlushForTesting();
audio_focus_.FlushForTesting();
}
void Run(WebContents* start_contents,
......@@ -155,12 +156,12 @@ class AudioFocusDelegateDefaultBrowserTest : public ContentBrowserTest {
std::unique_ptr<TestAudioFocusObserver> CreateObserver() {
std::unique_ptr<TestAudioFocusObserver> observer =
std::make_unique<TestAudioFocusObserver>();
audio_focus_ptr_->AddObserver(observer->BindNewPipeAndPassRemote());
audio_focus_ptr_.FlushForTesting();
audio_focus_->AddObserver(observer->BindNewPipeAndPassRemote());
audio_focus_.FlushForTesting();
return observer;
}
media_session::mojom::AudioFocusManagerPtr audio_focus_ptr_;
mojo::Remote<media_session::mojom::AudioFocusManager> audio_focus_;
base::test::ScopedFeatureList scoped_feature_list_;
};
......
......@@ -221,7 +221,7 @@ void AudioFocusManager::SetSource(const base::UnguessableToken& identity,
const std::string& name) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
auto& context = bindings_.dispatch_context();
auto& context = receivers_.current_context();
context->identity = identity;
context->source_name = name;
}
......@@ -288,10 +288,10 @@ void AudioFocusManager::SuspendAllSessions() {
}
void AudioFocusManager::BindToInterface(
mojom::AudioFocusManagerRequest request) {
mojo::PendingReceiver<mojom::AudioFocusManager> receiver) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
bindings_.AddBinding(this, std::move(request),
std::make_unique<BindingContext>());
receivers_.Add(this, std::move(receiver),
std::make_unique<ReceiverContext>());
}
void AudioFocusManager::BindToDebugInterface(
......@@ -415,12 +415,12 @@ bool AudioFocusManager::IsFocusEntryPresent(
const std::string& AudioFocusManager::GetBindingSourceName() const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return bindings_.dispatch_context()->source_name;
return receivers_.current_context()->source_name;
}
const base::UnguessableToken& AudioFocusManager::GetBindingIdentity() const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return bindings_.dispatch_context()->identity;
return receivers_.current_context()->identity;
}
bool AudioFocusManager::IsSessionOnTopOfAudioFocusStack(
......
......@@ -13,7 +13,8 @@
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"
#include "services/media_session/media_controller.h"
#include "services/media_session/public/mojom/audio_focus.mojom.h"
......@@ -88,8 +89,9 @@ class AudioFocusManager : public mojom::AudioFocusManager,
const base::UnguessableToken& receiver_id) override;
void SuspendAllSessions() override;
// Bind to a mojom::AudioFocusManagerRequest.
void BindToInterface(mojom::AudioFocusManagerRequest request);
// Bind to a receiver of mojom::AudioFocusManager.
void BindToInterface(
mojo::PendingReceiver<mojom::AudioFocusManager> receiver);
// Bind to a mojom::AudioFocusManagerDebugRequest.
void BindToDebugInterface(mojom::AudioFocusManagerDebugRequest request);
......@@ -106,8 +108,8 @@ class AudioFocusManager : public mojom::AudioFocusManager,
class SourceObserverHolder;
// BindingContext stores associated metadata for mojo binding.
struct BindingContext {
// ReceiverContext stores associated metadata for mojo binding.
struct ReceiverContext {
// The source name is associated with a binding when a client calls
// |SetSourceName|. It is used to provide more granularity than a
// service_manager::Identity for metrics and for identifying where an audio
......@@ -156,9 +158,9 @@ class AudioFocusManager : public mojom::AudioFocusManager,
// |MediaSession| over mojo.
MediaController active_media_controller_;
// Holds mojo bindings for the Audio Focus Manager API.
mojo::BindingSet<mojom::AudioFocusManager, std::unique_ptr<BindingContext>>
bindings_;
// Holds mojo receivers for the Audio Focus Manager API.
mojo::ReceiverSet<mojom::AudioFocusManager, std::unique_ptr<ReceiverContext>>
receivers_;
// Holds mojo bindings for the Audio Focus Manager Debug API.
mojo::BindingSet<mojom::AudioFocusManagerDebug> debug_bindings_;
......
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