OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/media/session/media_session_impl.h" | 5 #include "content/browser/media/session/media_session_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include "content/browser/media/session/audio_focus_delegate.h" | 8 #include "content/browser/media/session/audio_focus_delegate.h" |
9 #include "content/browser/media/session/media_session_controller.h" | 9 #include "content/browser/media/session/media_session_controller.h" |
10 #include "content/browser/media/session/media_session_player_observer.h" | 10 #include "content/browser/media/session/media_session_player_observer.h" |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 SetAudioFocusState(audio_focus_state); | 291 SetAudioFocusState(audio_focus_state); |
292 | 292 |
293 if (audio_focus_state_ != State::ACTIVE) | 293 if (audio_focus_state_ != State::ACTIVE) |
294 return; | 294 return; |
295 } | 295 } |
296 | 296 |
297 OnResumeInternal(suspend_type); | 297 OnResumeInternal(suspend_type); |
298 } | 298 } |
299 | 299 |
300 void MediaSessionImpl::Suspend(SuspendType suspend_type) { | 300 void MediaSessionImpl::Suspend(SuspendType suspend_type) { |
301 DCHECK(!IsSuspended()); | 301 if (IsSuspended()) |
| 302 return; |
302 | 303 |
303 OnSuspendInternal(suspend_type, State::SUSPENDED); | 304 OnSuspendInternal(suspend_type, State::SUSPENDED); |
304 } | 305 } |
305 | 306 |
306 void MediaSessionImpl::Stop(SuspendType suspend_type) { | 307 void MediaSessionImpl::Stop(SuspendType suspend_type) { |
307 DCHECK(audio_focus_state_ != State::INACTIVE); | 308 DCHECK(audio_focus_state_ != State::INACTIVE); |
308 DCHECK(suspend_type != SuspendType::CONTENT); | 309 DCHECK(suspend_type != SuspendType::CONTENT); |
309 DCHECK(!HasPepper()); | 310 DCHECK(!HasPepper()); |
310 | 311 |
311 // TODO(mlamouri): merge the logic between UI and SYSTEM. | 312 // TODO(mlamouri): merge the logic between UI and SYSTEM. |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 !pepper_players_.empty() || !one_shot_players_.empty()) { | 504 !pepper_players_.empty() || !one_shot_players_.empty()) { |
504 return; | 505 return; |
505 } | 506 } |
506 delegate_->AbandonAudioFocus(); | 507 delegate_->AbandonAudioFocus(); |
507 | 508 |
508 SetAudioFocusState(State::INACTIVE); | 509 SetAudioFocusState(State::INACTIVE); |
509 NotifyAboutStateChange(); | 510 NotifyAboutStateChange(); |
510 } | 511 } |
511 | 512 |
512 void MediaSessionImpl::NotifyAboutStateChange() { | 513 void MediaSessionImpl::NotifyAboutStateChange() { |
| 514 bool is_actually_suspended = IsSuspended(); |
| 515 // Compute the actual playback state using both the MediaSessionService state |
| 516 // and real state. |
| 517 // |
| 518 // TODO(zqzhang): Maybe also compute for IsControllable()? See |
| 519 // https://crbug.com/674983 |
| 520 if (routed_service_ && |
| 521 routed_service_->playback_state() == |
| 522 blink::mojom::MediaSessionPlaybackState::PLAYING) { |
| 523 is_actually_suspended = false; |
| 524 } |
| 525 |
513 media_session_state_listeners_.Notify(audio_focus_state_); | 526 media_session_state_listeners_.Notify(audio_focus_state_); |
514 for (auto& observer : observers_) | 527 for (auto& observer : observers_) |
515 observer.MediaSessionStateChanged(IsControllable(), IsSuspended()); | 528 observer.MediaSessionStateChanged(IsControllable(), is_actually_suspended); |
516 } | 529 } |
517 | 530 |
518 void MediaSessionImpl::SetAudioFocusState(State audio_focus_state) { | 531 void MediaSessionImpl::SetAudioFocusState(State audio_focus_state) { |
519 if (audio_focus_state == audio_focus_state_) | 532 if (audio_focus_state == audio_focus_state_) |
520 return; | 533 return; |
521 | 534 |
522 audio_focus_state_ = audio_focus_state; | 535 audio_focus_state_ = audio_focus_state; |
523 switch (audio_focus_state_) { | 536 switch (audio_focus_state_) { |
524 case State::ACTIVE: | 537 case State::ACTIVE: |
525 uma_helper_.OnSessionActive(); | 538 uma_helper_.OnSessionActive(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 } | 572 } |
560 | 573 |
561 // MediaSessionService-related methods | 574 // MediaSessionService-related methods |
562 | 575 |
563 void MediaSessionImpl::OnServiceCreated(MediaSessionServiceImpl* service) { | 576 void MediaSessionImpl::OnServiceCreated(MediaSessionServiceImpl* service) { |
564 services_[service->GetRenderFrameHost()] = service; | 577 services_[service->GetRenderFrameHost()] = service; |
565 } | 578 } |
566 | 579 |
567 void MediaSessionImpl::OnServiceDestroyed(MediaSessionServiceImpl* service) { | 580 void MediaSessionImpl::OnServiceDestroyed(MediaSessionServiceImpl* service) { |
568 services_.erase(service->GetRenderFrameHost()); | 581 services_.erase(service->GetRenderFrameHost()); |
| 582 if (routed_service_ == service) { |
| 583 routed_service_ = nullptr; |
| 584 UpdateRoutedService(); |
| 585 } |
| 586 } |
| 587 |
| 588 void MediaSessionImpl::OnMediaSessionPlaybackStateChanged( |
| 589 MediaSessionServiceImpl* service) { |
| 590 if (service != routed_service_) |
| 591 return; |
| 592 NotifyAboutStateChange(); |
569 } | 593 } |
570 | 594 |
571 void MediaSessionImpl::OnMediaSessionMetadataChanged( | 595 void MediaSessionImpl::OnMediaSessionMetadataChanged( |
572 MediaSessionServiceImpl* service) { | 596 MediaSessionServiceImpl* service) { |
573 if (service != routed_service_) | 597 if (service != routed_service_) |
574 return; | 598 return; |
575 | 599 |
576 NotifyMediaSessionMetadataChange(routed_service_->metadata()); | 600 NotifyMediaSessionMetadataChange(routed_service_->metadata()); |
577 } | 601 } |
578 | 602 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 if (!IsServiceActiveForRenderFrameHost(frame)) | 675 if (!IsServiceActiveForRenderFrameHost(frame)) |
652 continue; | 676 continue; |
653 best_frame = frame; | 677 best_frame = frame; |
654 min_depth = depth; | 678 min_depth = depth; |
655 } | 679 } |
656 | 680 |
657 return best_frame ? services_[best_frame] : nullptr; | 681 return best_frame ? services_[best_frame] : nullptr; |
658 } | 682 } |
659 | 683 |
660 } // namespace content | 684 } // namespace content |
OLD | NEW |