Index: content/browser/media/session/media_session_impl.cc |
diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc |
index 1b5e706c47a32b0167e2306d9c7b7dc3cd5b1a41..da00fe3e82645ccb08d659a17907361c540813cc 100644 |
--- a/content/browser/media/session/media_session_impl.cc |
+++ b/content/browser/media/session/media_session_impl.cc |
@@ -8,6 +8,7 @@ |
#include "content/browser/media/session/audio_focus_delegate.h" |
#include "content/browser/media/session/media_session_player_observer.h" |
#include "content/browser/media/session/media_session_service_impl.h" |
+#include "content/browser/media/session/media_session_service_router.h" |
#include "content/browser/web_contents/web_contents_impl.h" |
#include "content/public/browser/media_session.h" |
#include "content/public/browser/media_session_observer.h" |
@@ -89,9 +90,19 @@ void MediaSessionImpl::WebContentsDestroyed() { |
AbandonSystemAudioFocusIfNeeded(); |
} |
-void MediaSessionImpl::SetMediaSessionService( |
- MediaSessionServiceImpl* service) { |
- service_ = service; |
+MediaSessionPlayerObserver* |
+MediaSessionImpl::GetMostMeaningfulPlayerObserver() { |
+ MediaSessionPlayerObserver* player_observer = nullptr; |
+ // TODO(zqzhang): improve the selection of most-meaningful player. See |
+ // https://crbug.com/xxxxxx |
+ if (!normal_players_.empty()) |
+ return player_observer = normal_players_.begin()->observer; |
+ if (!one_shot_players_.empty()) |
+ return player_observer = one_shot_players_.begin()->observer; |
+ if (!pepper_players_.empty()) |
+ return player_observer = pepper_players_.begin()->observer; |
+ |
+ return nullptr; |
} |
void MediaSessionImpl::AddObserver(MediaSessionObserver* observer) { |
@@ -102,13 +113,18 @@ void MediaSessionImpl::RemoveObserver(MediaSessionObserver* observer) { |
observers_.RemoveObserver(observer); |
} |
-void MediaSessionImpl::SetMetadata( |
+void MediaSessionImpl::NotifyMediaSessionMetadataChange( |
const base::Optional<MediaMetadata>& metadata) { |
- metadata_ = metadata; |
for (auto& observer : observers_) |
observer.MediaSessionMetadataChanged(metadata); |
} |
+void MediaSessionImpl::NotifyMediaSessionActionsChange( |
+ const std::set<blink::mojom::MediaSessionAction>& actions) { |
+ for (auto& observer : observers_) |
+ observer.MediaSessionActionsChanged(actions); |
+} |
+ |
bool MediaSessionImpl::AddPlayer(MediaSessionPlayerObserver* observer, |
int player_id, |
media::MediaContentType media_content_type) { |
@@ -150,8 +166,9 @@ bool MediaSessionImpl::AddPlayer(MediaSessionPlayerObserver* observer, |
normal_players_.clear(); |
normal_players_.insert(PlayerIdentifier(observer, player_id)); |
- NotifyAboutStateChange(); |
+ service_router_->MostMeaningfulPlayerObserverMayHaveChanged(); |
+ NotifyAboutStateChange(); |
return true; |
} |
@@ -174,6 +191,7 @@ void MediaSessionImpl::RemovePlayer(MediaSessionPlayerObserver* observer, |
one_shot_players_.erase(it); |
AbandonSystemAudioFocusIfNeeded(); |
+ service_router_->MostMeaningfulPlayerObserverMayHaveChanged(); |
// The session may become controllable after removing a one-shot player. |
// However AbandonSystemAudioFocusIfNeeded will short-return and won't notify |
@@ -207,6 +225,7 @@ void MediaSessionImpl::RemovePlayers(MediaSessionPlayerObserver* observer) { |
} |
AbandonSystemAudioFocusIfNeeded(); |
+ service_router_->MostMeaningfulPlayerObserverMayHaveChanged(); |
// The session may become controllable after removing a one-shot player. |
// However AbandonSystemAudioFocusIfNeeded will short-return and won't notify |
@@ -301,20 +320,13 @@ void MediaSessionImpl::Stop(SuspendType suspend_type) { |
void MediaSessionImpl::DidReceiveAction( |
blink::mojom::MediaSessionAction action) { |
- if (service_) |
- service_->GetClient()->DidReceiveAction(action); |
-} |
- |
-void MediaSessionImpl::OnMediaSessionEnabledAction( |
- blink::mojom::MediaSessionAction action) { |
- for (auto& observer : observers_) |
- observer.MediaSessionEnabledAction(action); |
+ GetMediaSessionServiceRouter()->DidReceiveAction(action); |
} |
-void MediaSessionImpl::OnMediaSessionDisabledAction( |
- blink::mojom::MediaSessionAction action) { |
+void MediaSessionImpl::OnMediaSessionActionsChanged( |
+ const std::set<blink::mojom::MediaSessionAction>& action) { |
for (auto& observer : observers_) |
- observer.MediaSessionDisabledAction(action); |
+ observer.MediaSessionActionsChanged(action); |
} |
void MediaSessionImpl::StartDucking() { |
@@ -470,7 +482,7 @@ MediaSessionImpl::MediaSessionImpl(WebContents* web_contents) |
audio_focus_type_( |
AudioFocusManager::AudioFocusType::GainTransientMayDuck), |
is_ducking_(false), |
- service_(nullptr) { |
+ service_router_(new MediaSessionServiceRouter(this)) { |
#if defined(OS_ANDROID) |
session_android_.reset(new MediaSessionAndroid(this)); |
#endif // defined(OS_ANDROID) |