OLD | NEW |
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/command_line.h" |
7 #include "content/browser/media/session/media_session.h" | 8 #include "content/browser/media/session/media_session.h" |
| 9 #include "content/browser/media/session/media_session_observer.h" |
8 #include "content/public/test/mock_render_process_host.h" | 10 #include "content/public/test/mock_render_process_host.h" |
9 #include "content/public/test/test_browser_context.h" | 11 #include "content/public/test/test_browser_context.h" |
10 #include "content/public/test/test_browser_thread.h" | 12 #include "content/public/test/test_browser_thread.h" |
11 #include "content/test/test_web_contents.h" | 13 #include "content/test/test_web_contents.h" |
| 14 #include "media/base/media_content_type.h" |
| 15 #include "media/base/media_switches.h" |
12 | 16 |
13 namespace content { | 17 namespace content { |
14 | 18 |
| 19 namespace { |
| 20 |
| 21 class MockMediaSessionObserver : public MediaSessionObserver { |
| 22 public: |
| 23 void OnSuspend(int player_id) override {} |
| 24 void OnResume(int player_id) override {} |
| 25 void OnSetVolumeMultiplier( |
| 26 int player_id, double volume_multiplier) override {} |
| 27 }; |
| 28 |
| 29 } // anonymous namespace |
| 30 |
15 using AudioFocusType = AudioFocusManager::AudioFocusType; | 31 using AudioFocusType = AudioFocusManager::AudioFocusType; |
16 using SuspendType = MediaSession::SuspendType; | 32 using SuspendType = MediaSession::SuspendType; |
17 | 33 |
18 class AudioFocusManagerTest : public testing::Test { | 34 class AudioFocusManagerTest : public testing::Test { |
19 public: | 35 public: |
20 AudioFocusManagerTest() : ui_thread_(BrowserThread::UI, &message_loop_) {} | 36 AudioFocusManagerTest() : ui_thread_(BrowserThread::UI, &message_loop_) {} |
21 | 37 |
22 void SetUp() override { | 38 void SetUp() override { |
| 39 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 40 switches::kEnableDefaultMediaSession); |
23 rph_factory_.reset(new MockRenderProcessHostFactory()); | 41 rph_factory_.reset(new MockRenderProcessHostFactory()); |
24 SiteInstanceImpl::set_render_process_host_factory(rph_factory_.get()); | 42 SiteInstanceImpl::set_render_process_host_factory(rph_factory_.get()); |
25 browser_context_.reset(new TestBrowserContext()); | 43 browser_context_.reset(new TestBrowserContext()); |
| 44 pepper_observer_.reset(new MockMediaSessionObserver()); |
26 } | 45 } |
27 | 46 |
28 void TearDown() override { | 47 void TearDown() override { |
29 browser_context_.reset(); | 48 browser_context_.reset(); |
30 SiteInstanceImpl::set_render_process_host_factory(nullptr); | 49 SiteInstanceImpl::set_render_process_host_factory(nullptr); |
31 rph_factory_.reset(); | 50 rph_factory_.reset(); |
32 } | 51 } |
33 | 52 |
34 WebContents* GetAudioFocusedContent() const { | 53 MediaSession* GetAudioFocusedSession() const { |
35 if (!AudioFocusManager::GetInstance()->focus_entry_) | 54 const auto& audio_focus_stack = |
36 return nullptr; | 55 AudioFocusManager::GetInstance()->audio_focus_stack_; |
37 return AudioFocusManager::GetInstance()->focus_entry_->web_contents(); | 56 for (auto iter = audio_focus_stack.rbegin(); |
| 57 iter != audio_focus_stack.rend(); ++iter) { |
| 58 if ((*iter)->audio_focus_type() == |
| 59 AudioFocusManager::AudioFocusType::Gain) |
| 60 return (*iter); |
| 61 } |
| 62 return nullptr; |
38 } | 63 } |
39 | 64 |
40 int GetTransientMaybeDuckCount() const { | 65 int GetTransientMaybeDuckCount() const { |
41 return AudioFocusManager::GetInstance()->TransientMayDuckEntriesCount(); | 66 int count = 0; |
| 67 const auto& audio_focus_stack = |
| 68 AudioFocusManager::GetInstance()->audio_focus_stack_; |
| 69 for (auto iter = audio_focus_stack.rbegin(); |
| 70 iter != audio_focus_stack.rend(); ++iter) { |
| 71 if ((*iter)->audio_focus_type() == |
| 72 AudioFocusManager::AudioFocusType::GainTransientMayDuck) { |
| 73 ++count; |
| 74 } else { |
| 75 break; |
| 76 } |
| 77 } |
| 78 |
| 79 return count; |
42 } | 80 } |
43 | 81 |
44 double IsSessionDucking(MediaSession* session) { | 82 double IsSessionDucking(MediaSession* session) { |
45 return session->is_ducking_; // Quack! Quack! | 83 return session->is_ducking_; // Quack! Quack! |
46 } | 84 } |
47 | 85 |
| 86 void RequestAudioFocus(MediaSession* session, |
| 87 AudioFocusManager::AudioFocusType audio_focus_type) { |
| 88 session->RequestSystemAudioFocus(audio_focus_type); |
| 89 } |
| 90 |
| 91 void AbandonAudioFocus(MediaSession* session) { |
| 92 session->AbandonSystemAudioFocusIfNeeded(); |
| 93 } |
| 94 |
48 WebContents* CreateWebContents() { | 95 WebContents* CreateWebContents() { |
49 return TestWebContents::Create(browser_context_.get(), | 96 return TestWebContents::Create(browser_context_.get(), |
50 SiteInstance::SiteInstance::Create(browser_context_.get())); | 97 SiteInstance::SiteInstance::Create(browser_context_.get())); |
51 } | 98 } |
52 | 99 |
| 100 std::unique_ptr<MediaSessionObserver> pepper_observer_; |
| 101 |
53 private: | 102 private: |
54 base::MessageLoopForUI message_loop_; | 103 base::MessageLoopForUI message_loop_; |
55 TestBrowserThread ui_thread_; | 104 TestBrowserThread ui_thread_; |
56 | 105 |
57 std::unique_ptr<MockRenderProcessHostFactory> rph_factory_; | 106 std::unique_ptr<MockRenderProcessHostFactory> rph_factory_; |
58 std::unique_ptr<TestBrowserContext> browser_context_; | 107 std::unique_ptr<TestBrowserContext> browser_context_; |
59 }; | 108 }; |
60 | 109 |
61 TEST_F(AudioFocusManagerTest, InstanceAvailableAndSame) { | 110 TEST_F(AudioFocusManagerTest, InstanceAvailableAndSame) { |
62 AudioFocusManager* audio_focus_manager = AudioFocusManager::GetInstance(); | 111 AudioFocusManager* audio_focus_manager = AudioFocusManager::GetInstance(); |
63 ASSERT_TRUE(!!audio_focus_manager); | 112 ASSERT_TRUE(!!audio_focus_manager); |
64 ASSERT_EQ(audio_focus_manager, AudioFocusManager::GetInstance()); | 113 ASSERT_EQ(audio_focus_manager, AudioFocusManager::GetInstance()); |
65 } | 114 } |
66 | 115 |
67 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_ReplaceFocusedEntry) { | 116 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_ReplaceFocusedEntry) { |
68 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); | 117 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
69 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); | 118 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
70 | 119 |
71 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); | 120 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
72 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); | 121 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
73 | 122 |
74 std::unique_ptr<WebContents> web_contents_3(CreateWebContents()); | 123 std::unique_ptr<WebContents> web_contents_3(CreateWebContents()); |
75 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get()); | 124 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get()); |
76 | 125 |
77 ASSERT_EQ(nullptr, GetAudioFocusedContent()); | 126 ASSERT_EQ(nullptr, GetAudioFocusedSession()); |
78 | 127 |
79 AudioFocusManager::GetInstance()->RequestAudioFocus( | 128 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain); |
80 media_session_1, AudioFocusManager::AudioFocusType::Gain); | 129 ASSERT_EQ(media_session_1, GetAudioFocusedSession()); |
81 ASSERT_EQ(web_contents_1.get(), GetAudioFocusedContent()); | |
82 | 130 |
83 AudioFocusManager::GetInstance()->RequestAudioFocus( | 131 RequestAudioFocus(media_session_2, AudioFocusManager::AudioFocusType::Gain); |
84 media_session_2, AudioFocusManager::AudioFocusType::Gain); | 132 ASSERT_EQ(media_session_2, GetAudioFocusedSession()); |
85 ASSERT_EQ(web_contents_2.get(), GetAudioFocusedContent()); | |
86 | 133 |
87 AudioFocusManager::GetInstance()->RequestAudioFocus( | 134 RequestAudioFocus(media_session_3, AudioFocusManager::AudioFocusType::Gain); |
88 media_session_3, AudioFocusManager::AudioFocusType::Gain); | 135 ASSERT_EQ(media_session_3, GetAudioFocusedSession()); |
89 ASSERT_EQ(web_contents_3.get(), GetAudioFocusedContent()); | |
90 } | 136 } |
91 | 137 |
92 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_Duplicate) { | 138 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_Duplicate) { |
93 std::unique_ptr<WebContents> web_contents(CreateWebContents()); | 139 std::unique_ptr<WebContents> web_contents(CreateWebContents()); |
94 MediaSession* media_session = MediaSession::Get(web_contents.get()); | 140 MediaSession* media_session = MediaSession::Get(web_contents.get()); |
95 | 141 |
96 ASSERT_EQ(nullptr, GetAudioFocusedContent()); | 142 ASSERT_EQ(nullptr, GetAudioFocusedSession()); |
97 | 143 |
98 AudioFocusManager::GetInstance()->RequestAudioFocus( | 144 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain); |
99 media_session, AudioFocusManager::AudioFocusType::Gain); | 145 ASSERT_EQ(media_session, GetAudioFocusedSession()); |
100 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); | |
101 | 146 |
102 AudioFocusManager::GetInstance()->RequestAudioFocus( | 147 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain); |
103 media_session, AudioFocusManager::AudioFocusType::Gain); | 148 ASSERT_EQ(media_session, GetAudioFocusedSession()); |
104 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); | |
105 } | 149 } |
106 | 150 |
107 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_FromTransient) { | 151 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_FromTransient) { |
108 std::unique_ptr<WebContents> web_contents(CreateWebContents()); | 152 std::unique_ptr<WebContents> web_contents(CreateWebContents()); |
109 MediaSession* media_session = MediaSession::Get(web_contents.get()); | 153 MediaSession* media_session = MediaSession::Get(web_contents.get()); |
110 | 154 |
111 AudioFocusManager::GetInstance()->RequestAudioFocus( | 155 RequestAudioFocus( |
112 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 156 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
113 ASSERT_EQ(nullptr, GetAudioFocusedContent()); | 157 ASSERT_EQ(nullptr, GetAudioFocusedSession()); |
114 ASSERT_EQ(1, GetTransientMaybeDuckCount()); | 158 ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
115 | 159 |
116 AudioFocusManager::GetInstance()->RequestAudioFocus( | 160 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain); |
117 media_session, AudioFocusManager::AudioFocusType::Gain); | 161 ASSERT_EQ(media_session, GetAudioFocusedSession()); |
118 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); | |
119 ASSERT_EQ(0, GetTransientMaybeDuckCount()); | 162 ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
120 } | 163 } |
121 | 164 |
122 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGain) { | 165 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGain) { |
123 std::unique_ptr<WebContents> web_contents(CreateWebContents()); | 166 std::unique_ptr<WebContents> web_contents(CreateWebContents()); |
124 MediaSession* media_session = MediaSession::Get(web_contents.get()); | 167 MediaSession* media_session = MediaSession::Get(web_contents.get()); |
125 | 168 |
126 AudioFocusManager::GetInstance()->RequestAudioFocus( | 169 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain); |
127 media_session, AudioFocusManager::AudioFocusType::Gain); | 170 ASSERT_EQ(media_session, GetAudioFocusedSession()); |
128 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); | |
129 ASSERT_EQ(0, GetTransientMaybeDuckCount()); | 171 ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
130 | 172 |
131 AudioFocusManager::GetInstance()->RequestAudioFocus( | 173 RequestAudioFocus( |
132 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 174 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
133 ASSERT_EQ(nullptr, GetAudioFocusedContent()); | 175 ASSERT_EQ(nullptr, GetAudioFocusedSession()); |
134 ASSERT_EQ(1, GetTransientMaybeDuckCount()); | 176 ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
135 ASSERT_FALSE(IsSessionDucking(media_session)); | 177 ASSERT_FALSE(IsSessionDucking(media_session)); |
136 } | 178 } |
137 | 179 |
138 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGainWhileDucking) { | 180 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGainWhileDucking) { |
139 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); | 181 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
140 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); | 182 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
141 | 183 |
142 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); | 184 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
143 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); | 185 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
144 | 186 |
145 AudioFocusManager::GetInstance()->RequestAudioFocus( | 187 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain); |
146 media_session_1, AudioFocusManager::AudioFocusType::Gain); | |
147 ASSERT_EQ(0, GetTransientMaybeDuckCount()); | 188 ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
148 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 189 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
149 | 190 |
150 AudioFocusManager::GetInstance()->RequestAudioFocus( | 191 RequestAudioFocus( |
151 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 192 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
152 ASSERT_EQ(1, GetTransientMaybeDuckCount()); | 193 ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
153 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 194 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
154 | 195 |
155 AudioFocusManager::GetInstance()->RequestAudioFocus( | 196 RequestAudioFocus( |
156 media_session_1, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 197 media_session_1, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
157 ASSERT_EQ(2, GetTransientMaybeDuckCount()); | 198 ASSERT_EQ(2, GetTransientMaybeDuckCount()); |
158 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 199 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
159 } | 200 } |
160 | 201 |
161 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesFocusedEntry) { | 202 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesFocusedEntry) { |
162 std::unique_ptr<WebContents> web_contents(CreateWebContents()); | 203 std::unique_ptr<WebContents> web_contents(CreateWebContents()); |
163 MediaSession* media_session = MediaSession::Get(web_contents.get()); | 204 MediaSession* media_session = MediaSession::Get(web_contents.get()); |
164 | 205 |
165 AudioFocusManager::GetInstance()->RequestAudioFocus( | 206 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain); |
166 media_session, AudioFocusManager::AudioFocusType::Gain); | 207 ASSERT_EQ(media_session, GetAudioFocusedSession()); |
167 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); | |
168 | 208 |
169 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session); | 209 AbandonAudioFocus(media_session); |
170 ASSERT_EQ(nullptr, GetAudioFocusedContent()); | 210 ASSERT_EQ(nullptr, GetAudioFocusedSession()); |
171 } | 211 } |
172 | 212 |
173 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_NoAssociatedEntry) { | 213 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_NoAssociatedEntry) { |
174 std::unique_ptr<WebContents> web_contents(CreateWebContents()); | 214 std::unique_ptr<WebContents> web_contents(CreateWebContents()); |
175 MediaSession* media_session = MediaSession::Get(web_contents.get()); | 215 MediaSession* media_session = MediaSession::Get(web_contents.get()); |
176 | 216 |
177 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session); | 217 AbandonAudioFocus(media_session); |
178 ASSERT_EQ(nullptr, GetAudioFocusedContent()); | 218 ASSERT_EQ(nullptr, GetAudioFocusedSession()); |
179 } | 219 } |
180 | 220 |
181 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesTransientEntry) { | 221 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesTransientEntry) { |
182 std::unique_ptr<WebContents> web_contents(CreateWebContents()); | 222 std::unique_ptr<WebContents> web_contents(CreateWebContents()); |
183 MediaSession* media_session = MediaSession::Get(web_contents.get()); | 223 MediaSession* media_session = MediaSession::Get(web_contents.get()); |
184 | 224 |
185 AudioFocusManager::GetInstance()->RequestAudioFocus( | 225 RequestAudioFocus( |
186 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 226 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
187 ASSERT_EQ(1, GetTransientMaybeDuckCount()); | 227 ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
188 | 228 |
189 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session); | 229 AbandonAudioFocus(media_session); |
190 ASSERT_EQ(0, GetTransientMaybeDuckCount()); | 230 ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
191 } | 231 } |
192 | 232 |
193 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_WhileDuckingThenResume) { | 233 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_WhileDuckingThenResume) { |
194 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); | 234 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
195 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); | 235 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
196 | 236 |
197 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); | 237 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
198 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); | 238 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
199 | 239 |
200 AudioFocusManager::GetInstance()->RequestAudioFocus( | 240 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain); |
201 media_session_1, AudioFocusManager::AudioFocusType::Gain); | |
202 ASSERT_EQ(0, GetTransientMaybeDuckCount()); | 241 ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
203 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 242 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
204 | 243 |
205 AudioFocusManager::GetInstance()->RequestAudioFocus( | 244 RequestAudioFocus( |
206 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 245 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
207 ASSERT_EQ(1, GetTransientMaybeDuckCount()); | 246 ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
208 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 247 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
209 | 248 |
210 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_1); | 249 AbandonAudioFocus(media_session_1); |
211 ASSERT_EQ(1, GetTransientMaybeDuckCount()); | 250 ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
212 | 251 |
213 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2); | 252 AbandonAudioFocus(media_session_2); |
214 ASSERT_EQ(0, GetTransientMaybeDuckCount()); | 253 ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
215 | 254 |
216 AudioFocusManager::GetInstance()->RequestAudioFocus( | 255 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain); |
217 media_session_1, AudioFocusManager::AudioFocusType::Gain); | |
218 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 256 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
219 } | 257 } |
220 | 258 |
221 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_StopsDucking) { | 259 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_StopsDucking) { |
222 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); | 260 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
223 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); | 261 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
224 | 262 |
225 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); | 263 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
226 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); | 264 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
227 | 265 |
228 AudioFocusManager::GetInstance()->RequestAudioFocus( | 266 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain); |
229 media_session_1, AudioFocusManager::AudioFocusType::Gain); | |
230 ASSERT_EQ(0, GetTransientMaybeDuckCount()); | 267 ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
231 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 268 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
232 | 269 |
233 AudioFocusManager::GetInstance()->RequestAudioFocus( | 270 RequestAudioFocus( |
234 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 271 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
235 ASSERT_EQ(1, GetTransientMaybeDuckCount()); | 272 ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
236 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 273 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
237 | 274 |
238 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2); | 275 AbandonAudioFocus(media_session_2); |
239 ASSERT_EQ(0, GetTransientMaybeDuckCount()); | 276 ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
240 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 277 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
241 } | 278 } |
242 | 279 |
243 TEST_F(AudioFocusManagerTest, DuckWhilePlaying) { | 280 TEST_F(AudioFocusManagerTest, DuckWhilePlaying) { |
244 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); | 281 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
245 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); | 282 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
246 | 283 |
247 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); | 284 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
248 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); | 285 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
249 | 286 |
250 AudioFocusManager::GetInstance()->RequestAudioFocus( | 287 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain); |
251 media_session_1, AudioFocusManager::AudioFocusType::Gain); | |
252 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 288 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
253 | 289 |
254 AudioFocusManager::GetInstance()->RequestAudioFocus( | 290 RequestAudioFocus( |
255 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 291 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
256 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 292 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
257 } | 293 } |
258 | 294 |
259 TEST_F(AudioFocusManagerTest, DuckWhenStarting) { | 295 TEST_F(AudioFocusManagerTest, GainSuspendsTransient) { |
260 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); | 296 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
261 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); | 297 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
262 | 298 |
263 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); | 299 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
264 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); | 300 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
265 | 301 |
266 AudioFocusManager::GetInstance()->RequestAudioFocus( | 302 RequestAudioFocus( |
267 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 303 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
268 | 304 |
269 AudioFocusManager::GetInstance()->RequestAudioFocus( | 305 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain); |
270 media_session_1, AudioFocusManager::AudioFocusType::Gain); | 306 ASSERT_TRUE(media_session_2->IsSuspended()); |
271 ASSERT_TRUE(IsSessionDucking(media_session_1)); | |
272 } | 307 } |
273 | 308 |
274 TEST_F(AudioFocusManagerTest, DuckWithMultipleTransients) { | 309 TEST_F(AudioFocusManagerTest, DuckWithMultipleTransients) { |
275 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); | 310 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
276 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); | 311 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
277 | 312 |
278 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); | 313 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
279 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); | 314 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
280 | 315 |
281 std::unique_ptr<WebContents> web_contents_3(CreateWebContents()); | 316 std::unique_ptr<WebContents> web_contents_3(CreateWebContents()); |
282 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get()); | 317 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get()); |
283 | 318 |
284 AudioFocusManager::GetInstance()->RequestAudioFocus( | 319 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain); |
285 media_session_1, AudioFocusManager::AudioFocusType::Gain); | |
286 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 320 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
287 | 321 |
288 AudioFocusManager::GetInstance()->RequestAudioFocus( | 322 RequestAudioFocus( |
289 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 323 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
290 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 324 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
291 | 325 |
292 AudioFocusManager::GetInstance()->RequestAudioFocus( | 326 RequestAudioFocus( |
293 media_session_3, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 327 media_session_3, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
294 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 328 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
295 | 329 |
296 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2); | 330 AbandonAudioFocus(media_session_2); |
297 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 331 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
298 | 332 |
299 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_3); | 333 AbandonAudioFocus(media_session_3); |
300 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 334 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
301 } | 335 } |
302 | 336 |
303 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesFocus) { | 337 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesFocus) { |
304 std::unique_ptr<WebContents> web_contents(CreateWebContents()); | 338 std::unique_ptr<WebContents> web_contents(CreateWebContents()); |
305 MediaSession* media_session = MediaSession::Get(web_contents.get()); | 339 MediaSession* media_session = MediaSession::Get(web_contents.get()); |
306 | 340 |
307 AudioFocusManager::GetInstance()->RequestAudioFocus( | 341 RequestAudioFocus(media_session, AudioFocusManager::AudioFocusType::Gain); |
308 media_session, AudioFocusManager::AudioFocusType::Gain); | 342 ASSERT_EQ(media_session, GetAudioFocusedSession()); |
309 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); | |
310 | 343 |
311 web_contents.reset(); | 344 web_contents.reset(); |
312 ASSERT_EQ(nullptr, GetAudioFocusedContent()); | 345 ASSERT_EQ(nullptr, GetAudioFocusedSession()); |
313 } | 346 } |
314 | 347 |
315 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesTransients) { | 348 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesTransients) { |
316 std::unique_ptr<WebContents> web_contents(CreateWebContents()); | 349 std::unique_ptr<WebContents> web_contents(CreateWebContents()); |
317 MediaSession* media_session = MediaSession::Get(web_contents.get()); | 350 MediaSession* media_session = MediaSession::Get(web_contents.get()); |
318 | 351 |
319 AudioFocusManager::GetInstance()->RequestAudioFocus( | 352 RequestAudioFocus( |
320 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 353 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
321 ASSERT_EQ(1, GetTransientMaybeDuckCount()); | 354 ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
322 | 355 |
323 web_contents.reset(); | 356 web_contents.reset(); |
324 ASSERT_EQ(0, GetTransientMaybeDuckCount()); | 357 ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
325 } | 358 } |
326 | 359 |
327 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_StopsDucking) { | 360 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_StopsDucking) { |
328 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); | 361 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
329 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); | 362 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
330 | 363 |
331 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); | 364 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
332 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); | 365 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
333 | 366 |
334 AudioFocusManager::GetInstance()->RequestAudioFocus( | 367 RequestAudioFocus(media_session_1, AudioFocusManager::AudioFocusType::Gain); |
335 media_session_1, AudioFocusManager::AudioFocusType::Gain); | |
336 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 368 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
337 | 369 |
338 AudioFocusManager::GetInstance()->RequestAudioFocus( | 370 RequestAudioFocus( |
339 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 371 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
340 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 372 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
341 | 373 |
342 web_contents_2.reset(); | 374 web_contents_2.reset(); |
343 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 375 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
344 } | 376 } |
345 | 377 |
| 378 TEST_F(AudioFocusManagerTest, PepperRequestsGainFocus) { |
| 379 std::unique_ptr<WebContents> web_contents(CreateWebContents()); |
| 380 MediaSession* media_session = MediaSession::Get(web_contents.get()); |
| 381 |
| 382 media_session->AddPlayer( |
| 383 pepper_observer_.get(), 0, media::MediaContentType::Pepper); |
| 384 ASSERT_EQ(media_session, GetAudioFocusedSession()); |
| 385 |
| 386 media_session->RemovePlayer(pepper_observer_.get(), 0); |
| 387 ASSERT_EQ(nullptr, GetAudioFocusedSession()); |
| 388 } |
| 389 |
| 390 TEST_F(AudioFocusManagerTest, GainDucksPepper) { |
| 391 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
| 392 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
| 393 |
| 394 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
| 395 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
| 396 |
| 397 media_session_1->AddPlayer( |
| 398 pepper_observer_.get(), 0, media::MediaContentType::Pepper); |
| 399 |
| 400 RequestAudioFocus( |
| 401 media_session_2, AudioFocusManager::AudioFocusType::Gain); |
| 402 |
| 403 ASSERT_EQ(media_session_2, GetAudioFocusedSession()); |
| 404 ASSERT_TRUE(media_session_1->IsActive()); |
| 405 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
| 406 } |
| 407 |
| 408 TEST_F(AudioFocusManagerTest, AbandoningGainFocusRevokesTopMostPepperSession) { |
| 409 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
| 410 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
| 411 |
| 412 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
| 413 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
| 414 |
| 415 std::unique_ptr<WebContents> web_contents_3(CreateWebContents()); |
| 416 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get()); |
| 417 |
| 418 media_session_1->AddPlayer( |
| 419 pepper_observer_.get(), 0, media::MediaContentType::Pepper); |
| 420 |
| 421 RequestAudioFocus( |
| 422 media_session_2, AudioFocusManager::AudioFocusType::Gain); |
| 423 RequestAudioFocus( |
| 424 media_session_3, AudioFocusManager::AudioFocusType::Gain); |
| 425 |
| 426 ASSERT_EQ(media_session_3, GetAudioFocusedSession()); |
| 427 ASSERT_TRUE(media_session_2->IsReallySuspended()); |
| 428 ASSERT_TRUE(media_session_1->IsActive()); |
| 429 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
| 430 |
| 431 AbandonAudioFocus(media_session_3); |
| 432 ASSERT_EQ(media_session_1, GetAudioFocusedSession()); |
| 433 } |
| 434 |
346 } // namespace content | 435 } // namespace content |
OLD | NEW |