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.h" | 5 #include "content/browser/media/session/media_session.h" |
6 | 6 |
7 #include "content/browser/media/session/audio_focus_delegate.h" | 7 #include "content/browser/media/session/audio_focus_delegate.h" |
| 8 #include "content/browser/media/session/media_session_observer.h" |
8 #include "content/browser/media/session/media_session_player_observer.h" | 9 #include "content/browser/media/session/media_session_player_observer.h" |
9 #include "content/browser/web_contents/web_contents_impl.h" | 10 #include "content/browser/web_contents/web_contents_impl.h" |
10 #include "content/public/browser/web_contents.h" | 11 #include "content/public/browser/web_contents.h" |
11 #include "content/public/browser/web_contents_delegate.h" | 12 #include "content/public/browser/web_contents_delegate.h" |
12 #include "media/base/media_content_type.h" | 13 #include "media/base/media_content_type.h" |
13 | 14 |
14 namespace content { | 15 namespace content { |
15 | 16 |
16 namespace { | 17 namespace { |
17 | 18 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 session->Initialize(); | 53 session->Initialize(); |
53 } | 54 } |
54 return session; | 55 return session; |
55 } | 56 } |
56 | 57 |
57 MediaSession::~MediaSession() { | 58 MediaSession::~MediaSession() { |
58 DCHECK(players_.empty()); | 59 DCHECK(players_.empty()); |
59 DCHECK(audio_focus_state_ == State::INACTIVE); | 60 DCHECK(audio_focus_state_ == State::INACTIVE); |
60 } | 61 } |
61 | 62 |
| 63 void MediaSession::AddObserver(MediaSessionObserver* observer) { |
| 64 LOG(INFO) << "MediaSession::AddObserver()"; |
| 65 observers_.AddObserver(observer); |
| 66 } |
| 67 |
| 68 void MediaSession::RemoveObserver(MediaSessionObserver* observer) { |
| 69 LOG(INFO) << "MediaSession::RemoveObserver()"; |
| 70 observers_.RemoveObserver(observer); |
| 71 owned_observers_.erase(observer); |
| 72 } |
| 73 |
| 74 void MediaSession::PassObserverOwnership(std::unique_ptr<MediaSessionObserver> o
bserver) { |
| 75 LOG(INFO) << "MediaSession::PassObserverOwnership()"; |
| 76 DCHECK(!owned_observers_.count(observer.get())); |
| 77 owned_observers_[observer.get()] = std::move(observer); |
| 78 } |
| 79 |
62 void MediaSession::WebContentsDestroyed() { | 80 void MediaSession::WebContentsDestroyed() { |
63 // This should only work for tests. In production, all the players should have | 81 // This should only work for tests. In production, all the players should have |
64 // already been removed before WebContents is destroyed. | 82 // already been removed before WebContents is destroyed. |
65 | 83 |
66 // TODO(zqzhang): refactor MediaSession, maybe move the interface used to talk | 84 // TODO(zqzhang): refactor MediaSession, maybe move the interface used to talk |
67 // with AudioFocusManager out to a seperate class. The AudioFocusManager unit | 85 // with AudioFocusManager out to a seperate class. The AudioFocusManager unit |
68 // tests then could mock the interface and abandon audio focus when | 86 // tests then could mock the interface and abandon audio focus when |
69 // WebContents is destroyed. See https://crbug.com/651069 | 87 // WebContents is destroyed. See https://crbug.com/651069 |
70 players_.clear(); | 88 players_.clear(); |
71 pepper_players_.clear(); | 89 pepper_players_.clear(); |
72 AbandonSystemAudioFocusIfNeeded(); | 90 AbandonSystemAudioFocusIfNeeded(); |
73 } | 91 } |
74 | 92 |
75 void MediaSession::SetMetadata(const base::Optional<MediaMetadata>& metadata) { | 93 void MediaSession::SetMetadata(const base::Optional<MediaMetadata>& metadata) { |
76 metadata_ = metadata; | 94 metadata_ = metadata; |
77 static_cast<WebContentsImpl*>(web_contents()) | 95 |
78 ->OnMediaSessionMetadataChanged(); | 96 for (auto& observer : observers_) |
| 97 observer.MediaSessionMetadataChanged(metadata_); |
79 } | 98 } |
80 | 99 |
81 bool MediaSession::AddPlayer(MediaSessionPlayerObserver* observer, | 100 bool MediaSession::AddPlayer(MediaSessionPlayerObserver* observer, |
82 int player_id, | 101 int player_id, |
83 media::MediaContentType media_content_type) { | 102 media::MediaContentType media_content_type) { |
84 if (media_content_type == media::MediaContentType::Pepper) | 103 if (media_content_type == media::MediaContentType::Pepper) |
85 return AddPepperPlayer(observer, player_id); | 104 return AddPepperPlayer(observer, player_id); |
86 | 105 |
87 observer->OnSetVolumeMultiplier(player_id, GetVolumeMultiplier()); | 106 observer->OnSetVolumeMultiplier(player_id, GetVolumeMultiplier()); |
88 | 107 |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 !pepper_players_.empty()) { | 415 !pepper_players_.empty()) { |
397 return; | 416 return; |
398 } | 417 } |
399 delegate_->AbandonAudioFocus(); | 418 delegate_->AbandonAudioFocus(); |
400 | 419 |
401 SetAudioFocusState(State::INACTIVE); | 420 SetAudioFocusState(State::INACTIVE); |
402 UpdateWebContents(); | 421 UpdateWebContents(); |
403 } | 422 } |
404 | 423 |
405 void MediaSession::UpdateWebContents() { | 424 void MediaSession::UpdateWebContents() { |
| 425 // TODO in this CL: make media_session_state_listeners inherit from MediaSessi
onObserver. |
406 media_session_state_listeners_.Notify(audio_focus_state_); | 426 media_session_state_listeners_.Notify(audio_focus_state_); |
407 static_cast<WebContentsImpl*>(web_contents())->OnMediaSessionStateChanged(); | 427 for (auto& observer : observers_) |
| 428 observer.MediaSessionStateChanged(IsControllable(), IsSuspended()); |
408 } | 429 } |
409 | 430 |
410 void MediaSession::SetAudioFocusState(State audio_focus_state) { | 431 void MediaSession::SetAudioFocusState(State audio_focus_state) { |
411 if (audio_focus_state == audio_focus_state_) | 432 if (audio_focus_state == audio_focus_state_) |
412 return; | 433 return; |
413 | 434 |
414 audio_focus_state_ = audio_focus_state; | 435 audio_focus_state_ = audio_focus_state; |
415 switch (audio_focus_state_) { | 436 switch (audio_focus_state_) { |
416 case State::ACTIVE: | 437 case State::ACTIVE: |
417 uma_helper_.OnSessionActive(); | 438 uma_helper_.OnSessionActive(); |
(...skipping 14 matching lines...) Expand all Loading... |
432 DCHECK(success); | 453 DCHECK(success); |
433 | 454 |
434 pepper_players_.insert(PlayerIdentifier(observer, player_id)); | 455 pepper_players_.insert(PlayerIdentifier(observer, player_id)); |
435 | 456 |
436 observer->OnSetVolumeMultiplier(player_id, GetVolumeMultiplier()); | 457 observer->OnSetVolumeMultiplier(player_id, GetVolumeMultiplier()); |
437 | 458 |
438 return true; | 459 return true; |
439 } | 460 } |
440 | 461 |
441 } // namespace content | 462 } // namespace content |
OLD | NEW |