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 5254f43d7c6cbff73199ddf599a88d73dee94f0c..c074e0c789ee63f94c9390d2f453304a230f70dc 100644 |
--- a/content/browser/media/session/media_session_impl.cc |
+++ b/content/browser/media/session/media_session_impl.cc |
@@ -298,7 +298,8 @@ void MediaSessionImpl::Resume(SuspendType suspend_type) { |
} |
void MediaSessionImpl::Suspend(SuspendType suspend_type) { |
- DCHECK(!IsSuspended()); |
+ if (!IsSuspended()) |
+ return; |
OnSuspendInternal(suspend_type, State::SUSPENDED); |
} |
@@ -510,9 +511,21 @@ void MediaSessionImpl::AbandonSystemAudioFocusIfNeeded() { |
} |
void MediaSessionImpl::NotifyAboutStateChange() { |
+ bool is_actually_suspended = IsSuspended(); |
+ // Compute the actual playback state using both the advertised state and real |
+ // state. |
+ // |
+ // TODO(zqzhang): Maybe also compute for IsControllable()? See |
+ // https://crbug.com/xxxxxx |
+ if (routed_service_ && |
+ routed_service_->playback_state() == |
+ blink::mojom::MediaSessionPlaybackState::PLAYING) { |
+ is_actually_suspended = false; |
+ } |
+ |
media_session_state_listeners_.Notify(audio_focus_state_); |
for (auto& observer : observers_) |
- observer.MediaSessionStateChanged(IsControllable(), IsSuspended()); |
+ observer.MediaSessionStateChanged(IsControllable(), is_actually_suspended); |
} |
void MediaSessionImpl::SetAudioFocusState(State audio_focus_state) { |
@@ -568,6 +581,13 @@ void MediaSessionImpl::OnServiceDestroyed(MediaSessionServiceImpl* service) { |
services_.erase(service->GetRenderFrameHost()); |
} |
+void MediaSessionImpl::OnMediaSessionAdvertisedPlaybackStateChanged( |
+ MediaSessionServiceImpl* service) { |
+ if (service != routed_service_) |
+ return; |
+ NotifyAboutStateChange(); |
+} |
+ |
void MediaSessionImpl::OnMediaSessionMetadataChanged( |
MediaSessionServiceImpl* service) { |
if (service != routed_service_) |