blob: a5b0afd6dfafd6fcc2e1935c4363ce9d2a22f113 [file] [log] [blame]
// Copyright 2018 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 "components/arc/media_session/arc_media_session_bridge.h"
#include "base/feature_list.h"
#include "base/logging.h"
#include "base/no_destructor.h"
#include "components/arc/arc_bridge_service.h"
#include "components/arc/arc_browser_context_keyed_service_factory_base.h"
#include "components/arc/arc_features.h"
#include "content/public/common/service_manager_connection.h"
#include "services/media_session/public/cpp/switches.h"
#include "services/media_session/public/mojom/audio_focus.mojom.h"
#include "services/media_session/public/mojom/constants.mojom.h"
#include "services/service_manager/public/cpp/connector.h"
namespace arc {
namespace {
constexpr char kAudioFocusSourceName[] = "arc";
// Singleton factory for ArcAccessibilityHelperBridge.
class ArcMediaSessionBridgeFactory
: public internal::ArcBrowserContextKeyedServiceFactoryBase<
ArcMediaSessionBridge,
ArcMediaSessionBridgeFactory> {
public:
// Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
static constexpr const char* kName = "ArcMediaSessionBridgeFactory";
static ArcMediaSessionBridgeFactory* GetInstance() {
static base::NoDestructor<ArcMediaSessionBridgeFactory> factory;
return factory.get();
}
ArcMediaSessionBridgeFactory() = default;
~ArcMediaSessionBridgeFactory() override = default;
};
bool IsArcUnifiedAudioFocusEnabled() {
return media_session::IsAudioFocusEnabled() &&
base::FeatureList::IsEnabled(kEnableUnifiedAudioFocusFeature);
}
} // namespace
// static
ArcMediaSessionBridge* ArcMediaSessionBridge::GetForBrowserContext(
content::BrowserContext* context) {
return ArcMediaSessionBridgeFactory::GetForBrowserContext(context);
}
ArcMediaSessionBridge::ArcMediaSessionBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service)
: arc_bridge_service_(bridge_service) {
arc_bridge_service_->media_session()->AddObserver(this);
}
ArcMediaSessionBridge::~ArcMediaSessionBridge() {
arc_bridge_service_->media_session()->RemoveObserver(this);
}
void ArcMediaSessionBridge::OnConnectionReady() {
DVLOG(2) << "ArcMediaSessionBridge::OnConnectionReady";
SetupAudioFocus();
}
void ArcMediaSessionBridge::OnConnectionClosed() {
DVLOG(2) << "ArcMediaSessionBridge::OnConnectionClosed";
}
void ArcMediaSessionBridge::SetupAudioFocus() {
DVLOG(2) << "ArcMediaSessionBridge::SetupAudioFocus";
mojom::MediaSessionInstance* ms_instance = ARC_GET_INSTANCE_FOR_METHOD(
arc_bridge_service_->media_session(), DisableAudioFocus);
if (!ms_instance)
return;
if (!IsArcUnifiedAudioFocusEnabled()) {
DVLOG(2) << "ArcMediaSessionBridge will disable audio focus";
ms_instance->DisableAudioFocus();
return;
}
media_session::mojom::AudioFocusManagerPtr audio_focus_ptr;
content::ServiceManagerConnection::GetForProcess()
->GetConnector()
->BindInterface(media_session::mojom::kServiceName, &audio_focus_ptr);
audio_focus_ptr->SetSourceName(kAudioFocusSourceName);
DVLOG(2) << "ArcMediaSessionBridge will enable audio focus";
ms_instance->EnableAudioFocus(std::move(audio_focus_ptr));
}
} // namespace arc