Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: content/browser/media/session/audio_focus_manager.cc

Issue 2453623003: Decouple MediaSession messages from WebContents (full patch) (Closed)
Patch Set: nit Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/audio_focus_manager.h" 5 #include "content/browser/media/session/audio_focus_manager.h"
6 6
7 #include "base/memory/ptr_util.h" 7 #include "base/memory/ptr_util.h"
8 #include "content/browser/media/session/media_session.h" 8 #include "content/browser/media/session/media_session_impl.h"
9 #include "content/public/browser/web_contents.h" 9 #include "content/public/browser/web_contents.h"
10 10
11 namespace content { 11 namespace content {
12 12
13 // static 13 // static
14 AudioFocusManager* AudioFocusManager::GetInstance() { 14 AudioFocusManager* AudioFocusManager::GetInstance() {
15 return base::Singleton<AudioFocusManager>::get(); 15 return base::Singleton<AudioFocusManager>::get();
16 } 16 }
17 17
18 void AudioFocusManager::RequestAudioFocus(MediaSession* media_session, 18 void AudioFocusManager::RequestAudioFocus(MediaSessionImpl* media_session,
19 AudioFocusType type) { 19 AudioFocusType type) {
20 if (!audio_focus_stack_.empty() && 20 if (!audio_focus_stack_.empty() &&
21 audio_focus_stack_.back() == media_session && 21 audio_focus_stack_.back() == media_session &&
22 audio_focus_stack_.back()->audio_focus_type() == type && 22 audio_focus_stack_.back()->audio_focus_type() == type &&
23 audio_focus_stack_.back()->IsActive()) { 23 audio_focus_stack_.back()->IsActive()) {
24 // Early returning if |media_session| is already on top (has focus) and is 24 // Early returning if |media_session| is already on top (has focus) and is
25 // active. 25 // active.
26 return; 26 return;
27 } 27 }
28 28
29 MaybeRemoveFocusEntry(media_session); 29 MaybeRemoveFocusEntry(media_session);
30 30
31 // TODO(zqzhang): It seems like MediaSession is exposed to AudioFocusManager 31 // TODO(zqzhang): It seems like MediaSessionImpl is exposed to
32 // AudioFocusManager
32 // too much. Maybe it's better to do some abstraction and refactoring to clean 33 // too much. Maybe it's better to do some abstraction and refactoring to clean
33 // up the relation between AudioFocusManager and MediaSession. 34 // up the relation between AudioFocusManager and MediaSessionImpl.
34 // See https://crbug.com/651069 35 // See https://crbug.com/651069
35 if (type == AudioFocusType::GainTransientMayDuck) { 36 if (type == AudioFocusType::GainTransientMayDuck) {
36 for (const auto old_session : audio_focus_stack_) { 37 for (const auto old_session : audio_focus_stack_) {
37 old_session->StartDucking(); 38 old_session->StartDucking();
38 } 39 }
39 } else { 40 } else {
40 for (const auto old_session : audio_focus_stack_) { 41 for (const auto old_session : audio_focus_stack_) {
41 if (old_session->IsActive()) { 42 if (old_session->IsActive()) {
42 if (old_session->HasPepper()) 43 if (old_session->HasPepper())
43 old_session->StartDucking(); 44 old_session->StartDucking();
44 else 45 else
45 old_session->Suspend(MediaSession::SuspendType::SYSTEM); 46 old_session->Suspend(MediaSessionImpl::SuspendType::SYSTEM);
46 } 47 }
47 } 48 }
48 } 49 }
49 50
50 audio_focus_stack_.push_back(media_session); 51 audio_focus_stack_.push_back(media_session);
51 audio_focus_stack_.back()->StopDucking(); 52 audio_focus_stack_.back()->StopDucking();
52 } 53 }
53 54
54 void AudioFocusManager::AbandonAudioFocus(MediaSession* media_session) { 55 void AudioFocusManager::AbandonAudioFocus(MediaSessionImpl* media_session) {
55 if (audio_focus_stack_.empty()) 56 if (audio_focus_stack_.empty())
56 return; 57 return;
57 58
58 if (audio_focus_stack_.back() != media_session) { 59 if (audio_focus_stack_.back() != media_session) {
59 MaybeRemoveFocusEntry(media_session); 60 MaybeRemoveFocusEntry(media_session);
60 return; 61 return;
61 } 62 }
62 63
63 audio_focus_stack_.pop_back(); 64 audio_focus_stack_.pop_back();
64 if (audio_focus_stack_.empty()) 65 if (audio_focus_stack_.empty())
65 return; 66 return;
66 67
67 // Allow the top-most MediaSession having Pepper to unduck pepper even if it's 68 // Allow the top-most MediaSessionImpl having Pepper to unduck pepper even if
69 // it's
68 // not active. 70 // not active.
69 for (auto iter = audio_focus_stack_.rbegin(); 71 for (auto iter = audio_focus_stack_.rbegin();
70 iter != audio_focus_stack_.rend(); ++iter) { 72 iter != audio_focus_stack_.rend(); ++iter) {
71 if (!(*iter)->HasPepper()) 73 if (!(*iter)->HasPepper())
72 continue; 74 continue;
73 75
74 MediaSession* pepper_session = *iter; 76 MediaSessionImpl* pepper_session = *iter;
75 pepper_session->StopDucking(); 77 pepper_session->StopDucking();
76 MaybeRemoveFocusEntry(pepper_session); 78 MaybeRemoveFocusEntry(pepper_session);
77 audio_focus_stack_.push_back(pepper_session); 79 audio_focus_stack_.push_back(pepper_session);
78 return; 80 return;
79 } 81 }
80 // Only try to unduck the new MediaSession on top. The session might be still 82 // Only try to unduck the new MediaSessionImpl on top. The session might be
83 // still
81 // inactive but it will not be resumed (so it doesn't surprise the user). 84 // inactive but it will not be resumed (so it doesn't surprise the user).
82 audio_focus_stack_.back()->StopDucking(); 85 audio_focus_stack_.back()->StopDucking();
83 } 86 }
84 87
85 AudioFocusManager::AudioFocusManager() = default; 88 AudioFocusManager::AudioFocusManager() = default;
86 89
87 AudioFocusManager::~AudioFocusManager() = default; 90 AudioFocusManager::~AudioFocusManager() = default;
88 91
89 void AudioFocusManager::MaybeRemoveFocusEntry(MediaSession* media_session) { 92 void AudioFocusManager::MaybeRemoveFocusEntry(MediaSessionImpl* media_session) {
90 audio_focus_stack_.remove(media_session); 93 audio_focus_stack_.remove(media_session);
91 } 94 }
92 95
93 } // namespace content 96 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/media/session/audio_focus_manager.h ('k') | content/browser/media/session/audio_focus_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698