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

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

Issue 1971443002: Implement Audio Focus Manager for desktop. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix leak in unit tests Created 4 years, 5 months 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/browser/media/session/audio_focus_manager.h"
6
7 #include "content/browser/media/session/media_session.h"
8 #include "content/public/browser/web_contents.h"
9
10 namespace content {
11
12 namespace {
13
14 const double kDuckingVolumeMultiplier = 0.2;
15 const double kDefaultVolumeMultiplier = 1.0;
16
17 } // anonymous namespace
18
19 AudioFocusManager::AudioFocusEntry::AudioFocusEntry(
20 WebContents* web_contents,
21 AudioFocusManager* audio_focus_manager,
22 AudioFocusType type)
23 : WebContentsObserver(web_contents),
24 audio_focus_manager_(audio_focus_manager) {}
25
26 AudioFocusManager::AudioFocusType
27 AudioFocusManager::AudioFocusEntry::type() const {
28 return type_;
29 }
30
31 void AudioFocusManager::AudioFocusEntry::WebContentsDestroyed() {
32 audio_focus_manager_->OnWebContentsDestroyed(web_contents());
33 // |this| will be destroyed now.
34 }
35
36 // static
37 AudioFocusManager* AudioFocusManager::GetInstance() {
38 return base::Singleton<AudioFocusManager>::get();
39 }
40
41 void AudioFocusManager::RequestAudioFocus(MediaSession* media_session,
42 AudioFocusType type) {
43 WebContents* web_contents = media_session->web_contents();
44
45 if (type == AudioFocusType::GainTransientMayDuck) {
46 MaybeRemoveFocusEntry(web_contents);
47 transient_entries_[web_contents].reset(
48 new AudioFocusEntry(web_contents, this, type));
49 MaybeStartDucking();
50 return;
51 }
52
53 DCHECK(type == AudioFocusType::Gain);
54 RequestAudioFocusGain(web_contents);
55 }
56
57 void AudioFocusManager::AbandonAudioFocus(MediaSession* media_session) {
58 AbandonAudioFocusInternal(media_session->web_contents());
59 }
60
61 AudioFocusManager::AudioFocusManager() = default;
62
63 AudioFocusManager::~AudioFocusManager() = default;
64
65 void AudioFocusManager::RequestAudioFocusGain(WebContents* web_contents) {
66 MaybeRemoveTransientEntry(web_contents);
67
68 if (focus_entry_) {
69 if (focus_entry_->web_contents() == web_contents)
70 return;
71
72 MediaSession* other_session =
73 MediaSession::Get(focus_entry_->web_contents());
74 if (other_session->IsActive())
75 other_session->Suspend(MediaSession::SuspendType::SYSTEM);
76 }
77
78 focus_entry_.reset(
79 new AudioFocusEntry(web_contents, this, AudioFocusType::Gain));
80 MaybeStartDucking();
81 }
82
83 void AudioFocusManager::OnWebContentsDestroyed(WebContents* web_contents) {
84 AbandonAudioFocusInternal(web_contents);
85 }
86
87 void AudioFocusManager::AbandonAudioFocusInternal(WebContents* web_contents) {
88 MaybeRemoveTransientEntry(web_contents);
89 MaybeRemoveFocusEntry(web_contents);
90 }
91
92 void AudioFocusManager::MaybeStartDucking() const {
93 if (TransientMayDuckEntriesCount() != 1 || !focus_entry_)
94 return;
95
96 // TODO(mlamouri): add StartDuck to MediaSession.
97 MediaSession::Get(focus_entry_->web_contents())
98 ->SetVolumeMultiplier(kDuckingVolumeMultiplier);
99 }
100
101 void AudioFocusManager::MaybeStopDucking() const {
102 if (TransientMayDuckEntriesCount() != 0 || !focus_entry_)
103 return;
104
105 // TODO(mlamouri): add StopDuck to MediaSession.
106 MediaSession::Get(focus_entry_->web_contents())
107 ->SetVolumeMultiplier(kDefaultVolumeMultiplier);
108 }
109
110 int AudioFocusManager::TransientMayDuckEntriesCount() const {
111 return transient_entries_.size();
112 }
113
114 void AudioFocusManager::MaybeRemoveTransientEntry(WebContents* web_contents) {
115 transient_entries_.erase(web_contents);
116 MaybeStopDucking();
117 }
118
119 void AudioFocusManager::MaybeRemoveFocusEntry(WebContents* web_contents) {
120 if (focus_entry_ && focus_entry_->web_contents() == web_contents) {
121 MediaSession::Get(focus_entry_->web_contents())
122 ->SetVolumeMultiplier(kDefaultVolumeMultiplier);
123 focus_entry_.reset();
124 }
125 }
126
127 } // 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