Commit fe6bb828 authored by Chris Kuiper's avatar Chris Kuiper Committed by Commit Bot

Add function to set the MediaSession ducking multiplier

This allows an app (Chromecast, e.g.) to change the multiplier and better
control ducking behavior.

Bug: internal b/69630398
Test: Ran on Android Things speaker with different multipliers,
      observed proper ducking volume.

Change-Id: I5078fd11606a5d648aca9b17938c3c8caefd3826
Reviewed-on: https://chromium-review.googlesource.com/942055Reviewed-by: default avatarJochen Eisinger <jochen@chromium.org>
Reviewed-by: default avatarStephen Lanham <slan@chromium.org>
Reviewed-by: default avatarMounir Lamouri <mlamouri@chromium.org>
Commit-Queue: Chris Kuiper <ckuiper@chromium.org>
Cr-Commit-Position: refs/heads/master@{#541209}
parent 7316014f
...@@ -36,6 +36,7 @@ class MockMediaSession : public content::MediaSession { ...@@ -36,6 +36,7 @@ class MockMediaSession : public content::MediaSession {
MOCK_CONST_METHOD0(IsActuallyPaused, bool()); MOCK_CONST_METHOD0(IsActuallyPaused, bool());
MOCK_METHOD0(StartDucking, void()); MOCK_METHOD0(StartDucking, void());
MOCK_METHOD0(StopDucking, void()); MOCK_METHOD0(StopDucking, void());
MOCK_METHOD1(SetDuckingVolumeMultiplier, void(double));
MOCK_METHOD1(DidReceiveAction, void(blink::mojom::MediaSessionAction)); MOCK_METHOD1(DidReceiveAction, void(blink::mojom::MediaSessionAction));
MOCK_METHOD1(AddObserver, void(content::MediaSessionObserver*)); MOCK_METHOD1(AddObserver, void(content::MediaSessionObserver*));
MOCK_METHOD1(RemoveObserver, void(content::MediaSessionObserver*)); MOCK_METHOD1(RemoveObserver, void(content::MediaSessionObserver*));
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <algorithm> #include <algorithm>
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/numerics/ranges.h"
#include "content/browser/media/session/audio_focus_delegate.h" #include "content/browser/media/session/audio_focus_delegate.h"
#include "content/browser/media/session/media_session_controller.h" #include "content/browser/media/session/media_session_controller.h"
#include "content/browser/media/session/media_session_player_observer.h" #include "content/browser/media/session/media_session_player_observer.h"
...@@ -29,8 +30,8 @@ using MediaSessionUserAction = MediaSessionUmaHelper::MediaSessionUserAction; ...@@ -29,8 +30,8 @@ using MediaSessionUserAction = MediaSessionUmaHelper::MediaSessionUserAction;
namespace { namespace {
const double kDefaultVolumeMultiplier = 1.0; const double kUnduckedVolumeMultiplier = 1.0;
const double kDuckingVolumeMultiplier = 0.2; const double kDefaultDuckingVolumeMultiplier = 0.2;
using MapRenderFrameHostToDepth = std::map<RenderFrameHost*, size_t>; using MapRenderFrameHostToDepth = std::map<RenderFrameHost*, size_t>;
...@@ -423,6 +424,10 @@ bool MediaSessionImpl::IsActuallyPaused() const { ...@@ -423,6 +424,10 @@ bool MediaSessionImpl::IsActuallyPaused() const {
return !IsActive(); return !IsActive();
} }
void MediaSessionImpl::SetDuckingVolumeMultiplier(double multiplier) {
ducking_volume_multiplier_ = base::ClampToRange(multiplier, 0.0, 1.0);
}
void MediaSessionImpl::StartDucking() { void MediaSessionImpl::StartDucking() {
if (is_ducking_) if (is_ducking_)
return; return;
...@@ -445,7 +450,7 @@ void MediaSessionImpl::UpdateVolumeMultiplier() { ...@@ -445,7 +450,7 @@ void MediaSessionImpl::UpdateVolumeMultiplier() {
} }
double MediaSessionImpl::GetVolumeMultiplier() const { double MediaSessionImpl::GetVolumeMultiplier() const {
return is_ducking_ ? kDuckingVolumeMultiplier : kDefaultVolumeMultiplier; return is_ducking_ ? ducking_volume_multiplier_ : kUnduckedVolumeMultiplier;
} }
bool MediaSessionImpl::IsActive() const { bool MediaSessionImpl::IsActive() const {
...@@ -532,7 +537,8 @@ void MediaSessionImpl::OnSuspendInternal(SuspendType suspend_type, ...@@ -532,7 +537,8 @@ void MediaSessionImpl::OnSuspendInternal(SuspendType suspend_type,
} }
for (const auto& it : pepper_players_) for (const auto& it : pepper_players_)
it.observer->OnSetVolumeMultiplier(it.player_id, kDuckingVolumeMultiplier); it.observer->OnSetVolumeMultiplier(it.player_id,
ducking_volume_multiplier_);
NotifyAboutStateChange(); NotifyAboutStateChange();
} }
...@@ -558,6 +564,7 @@ MediaSessionImpl::MediaSessionImpl(WebContents* web_contents) ...@@ -558,6 +564,7 @@ MediaSessionImpl::MediaSessionImpl(WebContents* web_contents)
audio_focus_type_( audio_focus_type_(
AudioFocusManager::AudioFocusType::GainTransientMayDuck), AudioFocusManager::AudioFocusType::GainTransientMayDuck),
is_ducking_(false), is_ducking_(false),
ducking_volume_multiplier_(kDefaultDuckingVolumeMultiplier),
routed_service_(nullptr) { routed_service_(nullptr) {
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
session_android_.reset(new MediaSessionAndroid(this)); session_android_.reset(new MediaSessionAndroid(this));
...@@ -713,7 +720,7 @@ void MediaSessionImpl::DidReceiveAction( ...@@ -713,7 +720,7 @@ void MediaSessionImpl::DidReceiveAction(
for (const auto& player : pepper_players_) { for (const auto& player : pepper_players_) {
if (player.observer->render_frame_host() != rfh_of_routed_service) { if (player.observer->render_frame_host() != rfh_of_routed_service) {
player.observer->OnSetVolumeMultiplier(player.player_id, player.observer->OnSetVolumeMultiplier(player.player_id,
kDuckingVolumeMultiplier); ducking_volume_multiplier_);
} }
} }
for (const auto& player : one_shot_players_) { for (const auto& player : one_shot_players_) {
......
...@@ -141,6 +141,9 @@ class MediaSessionImpl : public MediaSession, ...@@ -141,6 +141,9 @@ class MediaSessionImpl : public MediaSession,
// MediaSessionService declared state and guessed state (audio_focus_state_). // MediaSessionService declared state and guessed state (audio_focus_state_).
CONTENT_EXPORT bool IsActuallyPaused() const override; CONTENT_EXPORT bool IsActuallyPaused() const override;
// Set the volume multiplier applied during ducking.
CONTENT_EXPORT void SetDuckingVolumeMultiplier(double multiplier) override;
// Let the media session start ducking such that the volume multiplier is // Let the media session start ducking such that the volume multiplier is
// reduced. // reduced.
CONTENT_EXPORT void StartDucking() override; CONTENT_EXPORT void StartDucking() override;
...@@ -302,6 +305,8 @@ class MediaSessionImpl : public MediaSession, ...@@ -302,6 +305,8 @@ class MediaSessionImpl : public MediaSession,
// StopDucking(). // StopDucking().
bool is_ducking_; bool is_ducking_;
double ducking_volume_multiplier_;
base::CallbackList<void(State)> media_session_state_listeners_; base::CallbackList<void(State)> media_session_state_listeners_;
base::ObserverList<MediaSessionObserver> observers_; base::ObserverList<MediaSessionObserver> observers_;
......
...@@ -44,6 +44,7 @@ namespace { ...@@ -44,6 +44,7 @@ namespace {
const double kDefaultVolumeMultiplier = 1.0; const double kDefaultVolumeMultiplier = 1.0;
const double kDuckingVolumeMultiplier = 0.2; const double kDuckingVolumeMultiplier = 0.2;
const double kDifferentDuckingVolumeMultiplier = 0.018;
class MockAudioFocusDelegate : public AudioFocusDelegate { class MockAudioFocusDelegate : public AudioFocusDelegate {
public: public:
...@@ -314,6 +315,23 @@ IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, ...@@ -314,6 +315,23 @@ IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(2)); EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(2));
} }
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
DuckingUsesConfiguredMultiplier) {
auto player_observer = std::make_unique<MockMediaSessionPlayerObserver>();
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
StartNewPlayer(player_observer.get(), media::MediaContentType::Persistent);
media_session_->SetDuckingVolumeMultiplier(kDifferentDuckingVolumeMultiplier);
SystemStartDucking();
EXPECT_EQ(kDifferentDuckingVolumeMultiplier,
player_observer->GetVolumeMultiplier(0));
EXPECT_EQ(kDifferentDuckingVolumeMultiplier,
player_observer->GetVolumeMultiplier(1));
SystemStopDucking();
EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(0));
EXPECT_EQ(kDefaultVolumeMultiplier, player_observer->GetVolumeMultiplier(1));
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, AudioFocusInitialState) { IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, AudioFocusInitialState) {
EXPECT_FALSE(IsActive()); EXPECT_FALSE(IsActive());
} }
......
...@@ -70,6 +70,9 @@ class MediaSession { ...@@ -70,6 +70,9 @@ class MediaSession {
// Tell the media session a user action has performed. // Tell the media session a user action has performed.
virtual void DidReceiveAction(blink::mojom::MediaSessionAction action) = 0; virtual void DidReceiveAction(blink::mojom::MediaSessionAction action) = 0;
// Set the volume multiplier applied during ducking.
virtual void SetDuckingVolumeMultiplier(double multiplier) = 0;
// Let the media session start ducking such that the volume multiplier is // Let the media session start ducking such that the volume multiplier is
// reduced. // reduced.
virtual void StartDucking() = 0; virtual void StartDucking() = 0;
......
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