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 "content/browser/media/session/media_session.h" | 7 #include "content/browser/media/session/media_session.h" |
8 #include "content/public/test/mock_render_process_host.h" | 8 #include "content/public/test/mock_render_process_host.h" |
9 #include "content/public/test/test_browser_context.h" | 9 #include "content/public/test/test_browser_context.h" |
10 #include "content/public/test/test_browser_thread.h" | 10 #include "content/public/test/test_browser_thread.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 browser_context_.reset(new TestBrowserContext()); | 25 browser_context_.reset(new TestBrowserContext()); |
26 } | 26 } |
27 | 27 |
28 void TearDown() override { | 28 void TearDown() override { |
29 browser_context_.reset(); | 29 browser_context_.reset(); |
30 SiteInstanceImpl::set_render_process_host_factory(nullptr); | 30 SiteInstanceImpl::set_render_process_host_factory(nullptr); |
31 rph_factory_.reset(); | 31 rph_factory_.reset(); |
32 } | 32 } |
33 | 33 |
34 WebContents* GetAudioFocusedContent() const { | 34 WebContents* GetAudioFocusedContent() const { |
35 if (!AudioFocusManager::GetInstance()->focus_entry_) | 35 const auto& audio_focus_stack = |
36 return nullptr; | 36 AudioFocusManager::GetInstance()->audio_focus_stack_; |
37 return AudioFocusManager::GetInstance()->focus_entry_->web_contents(); | 37 for (auto iter = audio_focus_stack.rbegin(); |
| 38 iter != audio_focus_stack.rend(); ++iter) { |
| 39 if ((*iter)->type() == AudioFocusManager::AudioFocusType::Gain) |
| 40 return (*iter)->web_contents(); |
| 41 } |
| 42 return nullptr; |
38 } | 43 } |
39 | 44 |
40 int GetTransientMaybeDuckCount() const { | 45 int GetTransientMaybeDuckCount() const { |
41 return AudioFocusManager::GetInstance()->TransientMayDuckEntriesCount(); | 46 int count = 0; |
| 47 const auto& audio_focus_stack = |
| 48 AudioFocusManager::GetInstance()->audio_focus_stack_; |
| 49 for (auto iter = audio_focus_stack.rbegin(); |
| 50 iter != audio_focus_stack.rend(); ++iter) { |
| 51 if ((*iter)->type() == |
| 52 AudioFocusManager::AudioFocusType::GainTransientMayDuck) { |
| 53 ++count; |
| 54 } else { |
| 55 break; |
| 56 } |
| 57 } |
| 58 |
| 59 return count; |
42 } | 60 } |
43 | 61 |
44 double IsSessionDucking(MediaSession* session) { | 62 double IsSessionDucking(MediaSession* session) { |
45 return session->is_ducking_; // Quack! Quack! | 63 return session->is_ducking_; // Quack! Quack! |
46 } | 64 } |
47 | 65 |
| 66 void SetAudioFocusState(MediaSession* session, |
| 67 MediaSession::State audio_focus_state) { |
| 68 session->audio_focus_state_ = audio_focus_state; |
| 69 } |
| 70 |
48 WebContents* CreateWebContents() { | 71 WebContents* CreateWebContents() { |
49 return TestWebContents::Create(browser_context_.get(), | 72 return TestWebContents::Create(browser_context_.get(), |
50 SiteInstance::SiteInstance::Create(browser_context_.get())); | 73 SiteInstance::SiteInstance::Create(browser_context_.get())); |
51 } | 74 } |
52 | 75 |
53 private: | 76 private: |
54 base::MessageLoopForUI message_loop_; | 77 base::MessageLoopForUI message_loop_; |
55 TestBrowserThread ui_thread_; | 78 TestBrowserThread ui_thread_; |
56 | 79 |
57 std::unique_ptr<MockRenderProcessHostFactory> rph_factory_; | 80 std::unique_ptr<MockRenderProcessHostFactory> rph_factory_; |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 | 272 |
250 AudioFocusManager::GetInstance()->RequestAudioFocus( | 273 AudioFocusManager::GetInstance()->RequestAudioFocus( |
251 media_session_1, AudioFocusManager::AudioFocusType::Gain); | 274 media_session_1, AudioFocusManager::AudioFocusType::Gain); |
252 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 275 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
253 | 276 |
254 AudioFocusManager::GetInstance()->RequestAudioFocus( | 277 AudioFocusManager::GetInstance()->RequestAudioFocus( |
255 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 278 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
256 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 279 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
257 } | 280 } |
258 | 281 |
259 TEST_F(AudioFocusManagerTest, DuckWhenStarting) { | 282 TEST_F(AudioFocusManagerTest, GainSuspendsTransient) { |
260 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); | 283 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
261 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); | 284 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
262 | 285 |
263 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); | 286 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
264 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); | 287 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
265 | 288 |
| 289 SetAudioFocusState(media_session_2, MediaSession::State::ACTIVE); |
| 290 |
266 AudioFocusManager::GetInstance()->RequestAudioFocus( | 291 AudioFocusManager::GetInstance()->RequestAudioFocus( |
267 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 292 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
268 | 293 |
269 AudioFocusManager::GetInstance()->RequestAudioFocus( | 294 AudioFocusManager::GetInstance()->RequestAudioFocus( |
270 media_session_1, AudioFocusManager::AudioFocusType::Gain); | 295 media_session_1, AudioFocusManager::AudioFocusType::Gain); |
271 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 296 ASSERT_TRUE(media_session_2->IsSuspended()); |
| 297 |
| 298 // Clean up |
| 299 SetAudioFocusState(media_session_2, MediaSession::State::INACTIVE); |
272 } | 300 } |
273 | 301 |
274 TEST_F(AudioFocusManagerTest, DuckWithMultipleTransients) { | 302 TEST_F(AudioFocusManagerTest, DuckWithMultipleTransients) { |
275 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); | 303 std::unique_ptr<WebContents> web_contents_1(CreateWebContents()); |
276 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); | 304 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
277 | 305 |
278 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); | 306 std::unique_ptr<WebContents> web_contents_2(CreateWebContents()); |
279 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); | 307 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
280 | 308 |
281 std::unique_ptr<WebContents> web_contents_3(CreateWebContents()); | 309 std::unique_ptr<WebContents> web_contents_3(CreateWebContents()); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 | 365 |
338 AudioFocusManager::GetInstance()->RequestAudioFocus( | 366 AudioFocusManager::GetInstance()->RequestAudioFocus( |
339 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); | 367 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
340 ASSERT_TRUE(IsSessionDucking(media_session_1)); | 368 ASSERT_TRUE(IsSessionDucking(media_session_1)); |
341 | 369 |
342 web_contents_2.reset(); | 370 web_contents_2.reset(); |
343 ASSERT_FALSE(IsSessionDucking(media_session_1)); | 371 ASSERT_FALSE(IsSessionDucking(media_session_1)); |
344 } | 372 } |
345 | 373 |
346 } // namespace content | 374 } // namespace content |
OLD | NEW |