From 17149ef1050d589bdd57f798a6107be01b0fc870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=AA=E5=9C=B0=E7=94=BB=E7=8C=AB?= Date: Fri, 18 Oct 2024 08:13:37 +0000 Subject: [PATCH 1/5] update content/browser/media/session/media_session_impl.cc. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 雪地画猫 --- .../media/session/media_session_impl.cc | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc index dcff7f0189..26baa0cd7e 100644 --- a/content/browser/media/session/media_session_impl.cc +++ b/content/browser/media/session/media_session_impl.cc @@ -496,16 +496,32 @@ bool MediaSessionImpl::AddPlayer(MediaSessionPlayerObserver* observer, } } - State old_audio_focus_state = audio_focus_state_; - RequestSystemAudioFocus(required_audio_focus_type); - - if (audio_focus_state_ != State::ACTIVE) - return false; + // If this player is paused, then don't actually request audio focus on its + // behalf. Otherwise, we might take focus away from something else, even + // though we don't really need it right now. Note that we don't abandon focus + // when playback is paused; we will continue to hold it. However, if we have + // given it up, e.g. when playback is suspended, or lost it to some other + // request, then we don't want to take it back for a paused player. + // Otherwise, any random update to the player (e.g., metadata as in + // b/40946745) will re-request focus even while paused. + if (!observer->IsPaused(player_id)) { + State old_audio_focus_state = audio_focus_state_; + RequestSystemAudioFocus(required_audio_focus_type); + + if (audio_focus_state_ != State::ACTIVE) { + return false; + } - // The session should be reset if a player is starting while all players are - // suspended. - if (old_audio_focus_state != State::ACTIVE) - normal_players_.clear(); + // The session should be reset if a player is starting while all players + // are suspended. + if (old_audio_focus_state != State::ACTIVE) { + normal_players_.clear(); + } + } else if (audio_focus_state_ == State::INACTIVE) { + // We switch from `INACTIVE` to `SUSPENDED` to indicate that we want to have + // the focus, but don't right now. This makes the session controllable. + audio_focus_state_ = State::SUSPENDED; + } auto iter = normal_players_.find(key); if (iter == normal_players_.end()) @@ -608,6 +624,8 @@ void MediaSessionImpl::OnPlayerPaused(MediaSessionPlayerObserver* observer, // Otherwise, suspend the session. DCHECK(IsActive()); + // The session might not have audio focus if it was paused prior to being + // suspended, which is fine. OnSuspendInternal(SuspendType::kContent, State::SUSPENDED); } @@ -692,6 +710,12 @@ void MediaSessionImpl::Resume(SuspendType suspend_type) { if (audio_focus_state_ != State::ACTIVE) return; + } else { + // System resume implies that we have the focus and should start playing if + // the system was what suspended us. Otherwise, we're suspended. + SetAudioFocusState((suspend_type_ == SuspendType::kSystem) + ? State::ACTIVE + : State::SUSPENDED); } OnResumeInternal(suspend_type); @@ -985,8 +1009,6 @@ void MediaSessionImpl::OnResumeInternal(SuspendType suspend_type) { if (suspend_type == SuspendType::kSystem && suspend_type_ != suspend_type) return; - SetAudioFocusState(State::ACTIVE); - for (const auto& it : normal_players_) it.first.observer->OnResume(it.first.player_id); -- Gitee From 676a639575d965602dceab18b08e6ca7af1476ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=AA=E5=9C=B0=E7=94=BB=E7=8C=AB?= Date: Fri, 18 Oct 2024 08:15:05 +0000 Subject: [PATCH 2/5] update content/browser/media/session/media_session_controller.h. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 雪地画猫 --- content/browser/media/session/media_session_controller.h | 1 + 1 file changed, 1 insertion(+) diff --git a/content/browser/media/session/media_session_controller.h b/content/browser/media/session/media_session_controller.h index f58424ed86..0970a25233 100644 --- a/content/browser/media/session/media_session_controller.h +++ b/content/browser/media/session/media_session_controller.h @@ -75,6 +75,7 @@ class CONTENT_EXPORT MediaSessionController bool IsPictureInPictureAvailable(int player_id) const override; bool HasAudio(int player_id) const override; bool HasVideo(int player_id) const override; + bool IsPaused(int player_id) const override; std::string GetAudioOutputSinkId(int player_id) const override; bool SupportsAudioOutputDeviceSwitching(int player_id) const override; media::MediaContentType GetMediaContentType() const override; -- Gitee From b31f708844d8aa8998f5578cd27ac3e9720b0332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=AA=E5=9C=B0=E7=94=BB=E7=8C=AB?= Date: Fri, 18 Oct 2024 08:15:48 +0000 Subject: [PATCH 3/5] update content/browser/media/session/media_session_controller.cc. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 雪地画猫 --- content/browser/media/session/media_session_controller.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/browser/media/session/media_session_controller.cc b/content/browser/media/session/media_session_controller.cc index 7dc38071e3..68821c5350 100644 --- a/content/browser/media/session/media_session_controller.cc +++ b/content/browser/media/session/media_session_controller.cc @@ -306,6 +306,11 @@ bool MediaSessionController::HasVideo(int player_id) const { return has_video_; } +bool MediaSessionController::IsPaused(int player_id) const { + DCHECK_EQ(player_id_, player_id); + return is_paused_; +} + std::string MediaSessionController::GetAudioOutputSinkId(int player_id) const { DCHECK_EQ(player_id_, player_id); return audio_output_sink_id_; -- Gitee From 286a57ab2e331895a0e8ee3acee64eb9d7ecf128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=AA=E5=9C=B0=E7=94=BB=E7=8C=AB?= Date: Fri, 18 Oct 2024 08:16:43 +0000 Subject: [PATCH 4/5] update content/browser/media/session/media_session_player_observer.h. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 雪地画猫 --- content/browser/media/session/media_session_player_observer.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/browser/media/session/media_session_player_observer.h b/content/browser/media/session/media_session_player_observer.h index 8c8bab4eb2..dd30a2ed4b 100644 --- a/content/browser/media/session/media_session_player_observer.h +++ b/content/browser/media/session/media_session_player_observer.h @@ -75,6 +75,9 @@ class MediaSessionPlayerObserver { // Returns true if the |player_id| has video tracks. virtual bool HasVideo(int player_id) const = 0; + // Returns true if `player_id` is paused. + virtual bool IsPaused(int player_id) const = 0; + #if defined(OHOS_MEDIA_POLICY) // Set to use the given |player_id| to control the HTML play of the media virtual void OnSetHtmlPlayEnabled(int player_id, bool enabled) {} -- Gitee From 5a443ab6ac7f55aa0ae7def7f1a49c482738dde0 Mon Sep 17 00:00:00 2001 From: y00699229 Date: Fri, 18 Oct 2024 16:34:24 +0800 Subject: [PATCH 5/5] add code Signed-off-by: y00699229 --- content/browser/media/session/pepper_player_delegate.cc | 4 ++++ content/browser/media/session/pepper_player_delegate.h | 1 + 2 files changed, 5 insertions(+) diff --git a/content/browser/media/session/pepper_player_delegate.cc b/content/browser/media/session/pepper_player_delegate.cc index 3ce26e1642..52ba63f5a3 100644 --- a/content/browser/media/session/pepper_player_delegate.cc +++ b/content/browser/media/session/pepper_player_delegate.cc @@ -119,6 +119,10 @@ bool PepperPlayerDelegate::HasVideo(int player_id) const { return true; } +bool PepperPlayerDelegate::IsPaused(int player_id) const { + return false; +} + std::string PepperPlayerDelegate::GetAudioOutputSinkId(int player_id) const { // This operation is not supported for pepper players. return ""; diff --git a/content/browser/media/session/pepper_player_delegate.h b/content/browser/media/session/pepper_player_delegate.h index 787843f1a3..4147aff5a5 100644 --- a/content/browser/media/session/pepper_player_delegate.h +++ b/content/browser/media/session/pepper_player_delegate.h @@ -48,6 +48,7 @@ class PepperPlayerDelegate : public MediaSessionPlayerObserver { RenderFrameHost* render_frame_host() const override; bool HasAudio(int player_id) const override; bool HasVideo(int player_id) const override; + bool IsPaused(int player_id) const override; std::string GetAudioOutputSinkId(int player_id) const override; bool SupportsAudioOutputDeviceSwitching(int player_id) const override; media::MediaContentType GetMediaContentType() const override; -- Gitee