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

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: style 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 WebContents* web_contents = media_session->web_contents();
59
60 MaybeRemoveTransientEntry(web_contents);
61 MaybeRemoveFocusEntry(web_contents);
62 }
63
64 AudioFocusManager::AudioFocusManager() = default;
65
66 AudioFocusManager::~AudioFocusManager() = default;
67
68 void AudioFocusManager::RequestAudioFocusGain(WebContents* web_contents) {
69 MaybeRemoveTransientEntry(web_contents);
70
71 if (focus_entry_) {
72 if (focus_entry_->web_contents() == web_contents)
73 return;
74
75 MediaSession* other_session =
76 MediaSession::Get(focus_entry_->web_contents());
77 if (other_session->IsActive())
78 other_session->Suspend(MediaSession::SuspendType::SYSTEM);
79 }
80
81 focus_entry_.reset(
82 new AudioFocusEntry(web_contents, this, AudioFocusType::Gain));
83 MaybeStartDucking();
84 }
85
86 void AudioFocusManager::OnWebContentsDestroyed(WebContents* web_contents) {
Zhiqiang Zhang (Slow) 2016/07/08 15:26:26 Nit: maybe reuse AbandonAudioFocus()?
mlamouri (slow - plz ping) 2016/07/08 17:41:35 Done. I've added AbandonAudioFocusInternal() that
87 MaybeRemoveTransientEntry(web_contents);
88 MaybeRemoveFocusEntry(web_contents);
89 }
90
91 void AudioFocusManager::MaybeStartDucking() const {
92 if (TransientMayDuckEntriesCount() != 1 || !focus_entry_)
93 return;
94
95 // TODO(mlamouri): add StartDuck to MediaSession.
96 MediaSession::Get(focus_entry_->web_contents())
97 ->SetVolumeMultiplier(kDuckingVolumeMultiplier);
98 }
99
100 void AudioFocusManager::MaybeStopDucking() const {
101 if (TransientMayDuckEntriesCount() != 0 || !focus_entry_)
102 return;
103
104 // TODO(mlamouri): add StopDuck to MediaSession.
105 MediaSession::Get(focus_entry_->web_contents())
106 ->SetVolumeMultiplier(kDefaultVolumeMultiplier);
107 }
108
109 int AudioFocusManager::TransientMayDuckEntriesCount() const {
110 return transient_entries_.size();
111 }
112
113 void AudioFocusManager::MaybeRemoveTransientEntry(WebContents* web_contents) {
114 transient_entries_.erase(web_contents);
115 MaybeStopDucking();
116 }
117
118 void AudioFocusManager::MaybeRemoveFocusEntry(WebContents* web_contents) {
119 if (focus_entry_ && focus_entry_->web_contents() == web_contents) {
120 MediaSession::Get(focus_entry_->web_contents())
121 ->SetVolumeMultiplier(kDefaultVolumeMultiplier);
122 focus_entry_.reset();
123 }
124 }
125
126 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698