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

Side by Side Diff: chrome/browser/chromeos/audio/audio_handler.cc

Issue 10873085: Implement two new policies to control muting the audio I/O. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased to ToT. Created 8 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/chromeos/audio/audio_handler.h" 5 #include "chrome/browser/chromeos/audio/audio_handler.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/singleton.h" 11 #include "base/memory/singleton.h"
12 #include "chrome/browser/browser_process.h" 12 #include "chrome/browser/browser_process.h"
13 #if defined(USE_CRAS) 13 #if defined(USE_CRAS)
14 #include "chrome/browser/chromeos/audio/audio_mixer_cras.h" 14 #include "chrome/browser/chromeos/audio/audio_mixer_cras.h"
15 #else 15 #else
16 #include "chrome/browser/chromeos/audio/audio_mixer_alsa.h" 16 #include "chrome/browser/chromeos/audio/audio_mixer_alsa.h"
17 #endif 17 #endif
18 #include "chrome/browser/prefs/pref_service.h" 18 #include "chrome/browser/prefs/pref_service.h"
19 #include "chrome/common/chrome_notification_types.h"
19 #include "chrome/common/pref_names.h" 20 #include "chrome/common/pref_names.h"
20 #include "content/public/browser/browser_thread.h" 21 #include "content/public/browser/browser_thread.h"
22 #include "content/public/browser/notification_service.h"
21 23
22 using std::max; 24 using std::max;
23 using std::min; 25 using std::min;
24 26
25 namespace chromeos { 27 namespace chromeos {
26 28
27 namespace { 29 namespace {
28 30
29 // Default value for the volume pref, as a percent in the range [0.0, 100.0]. 31 // Default value for the volume pref, as a percent in the range [0.0, 100.0].
30 const double kDefaultVolumePercent = 75.0; 32 const double kDefaultVolumePercent = 75.0;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 void AudioHandler::RegisterPrefs(PrefService* local_state) { 75 void AudioHandler::RegisterPrefs(PrefService* local_state) {
74 if (!local_state->FindPreference(prefs::kAudioVolumePercent)) 76 if (!local_state->FindPreference(prefs::kAudioVolumePercent))
75 local_state->RegisterDoublePref(prefs::kAudioVolumePercent, 77 local_state->RegisterDoublePref(prefs::kAudioVolumePercent,
76 kDefaultVolumePercent, 78 kDefaultVolumePercent,
77 PrefService::UNSYNCABLE_PREF); 79 PrefService::UNSYNCABLE_PREF);
78 if (!local_state->FindPreference(prefs::kAudioMute)) 80 if (!local_state->FindPreference(prefs::kAudioMute))
79 local_state->RegisterIntegerPref(prefs::kAudioMute, 81 local_state->RegisterIntegerPref(prefs::kAudioMute,
80 kPrefMuteOff, 82 kPrefMuteOff,
81 PrefService::UNSYNCABLE_PREF); 83 PrefService::UNSYNCABLE_PREF);
82 84
85 // Register the prefs backing the audio muting policies.
86 local_state->RegisterBooleanPref(prefs::kAudioOutputAllowed,
87 true,
88 PrefService::UNSYNCABLE_PREF);
89 local_state->RegisterBooleanPref(prefs::kAudioCaptureAllowed,
90 true,
91 PrefService::UNSYNCABLE_PREF);
92
83 // Register the old decibel-based pref so we can clear it. 93 // Register the old decibel-based pref so we can clear it.
84 // TODO(derat): Remove this after R20: http://crbug.com/112039 94 // TODO(derat): Remove this after R20: http://crbug.com/112039
85 if (!local_state->FindPreference(prefs::kAudioVolumeDb)) 95 if (!local_state->FindPreference(prefs::kAudioVolumeDb))
86 local_state->RegisterDoublePref(prefs::kAudioVolumeDb, 96 local_state->RegisterDoublePref(prefs::kAudioVolumeDb,
87 0, 97 0,
88 PrefService::UNSYNCABLE_PREF); 98 PrefService::UNSYNCABLE_PREF);
89 local_state->ClearPref(prefs::kAudioVolumeDb); 99 local_state->ClearPref(prefs::kAudioVolumeDb);
90 local_state->UnregisterPreference(prefs::kAudioVolumeDb); 100 local_state->UnregisterPreference(prefs::kAudioVolumeDb);
91 } 101 }
92 102
93 double AudioHandler::GetVolumePercent() { 103 double AudioHandler::GetVolumePercent() {
94 return mixer_->GetVolumePercent(); 104 return mixer_->GetVolumePercent();
95 } 105 }
96 106
97 void AudioHandler::SetVolumePercent(double volume_percent) { 107 void AudioHandler::SetVolumePercent(double volume_percent) {
98 volume_percent = min(max(volume_percent, 0.0), 100.0); 108 volume_percent = min(max(volume_percent, 0.0), 100.0);
99 if (IsMuted() && volume_percent > 0.0) 109 if (IsMuted() && volume_percent > 0.0)
100 SetMuted(false); 110 SetMuted(false);
101 mixer_->SetVolumePercent(volume_percent); 111 mixer_->SetVolumePercent(volume_percent);
102 prefs_->SetDouble(prefs::kAudioVolumePercent, volume_percent); 112 local_state_->SetDouble(prefs::kAudioVolumePercent, volume_percent);
103 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnVolumeChanged()); 113 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnVolumeChanged());
104 } 114 }
105 115
106 void AudioHandler::AdjustVolumeByPercent(double adjust_by_percent) { 116 void AudioHandler::AdjustVolumeByPercent(double adjust_by_percent) {
107 SetVolumePercent(mixer_->GetVolumePercent() + adjust_by_percent); 117 SetVolumePercent(mixer_->GetVolumePercent() + adjust_by_percent);
108 } 118 }
109 119
110 bool AudioHandler::IsMuted() { 120 bool AudioHandler::IsMuted() {
111 return mixer_->IsMuted(); 121 return mixer_->IsMuted();
112 } 122 }
113 123
114 void AudioHandler::SetMuted(bool mute) { 124 void AudioHandler::SetMuted(bool mute) {
115 mixer_->SetMuted(mute); 125 if (!mixer_->IsMuteLocked()) {
116 prefs_->SetInteger(prefs::kAudioMute, mute ? kPrefMuteOn : kPrefMuteOff); 126 mixer_->SetMuted(mute);
117 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnMuteToggled()); 127 local_state_->SetInteger(prefs::kAudioMute,
128 mute ? kPrefMuteOn : kPrefMuteOff);
129 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnMuteToggled());
130 }
131 }
132
133 bool AudioHandler::IsCaptureMuted() {
134 return mixer_->IsCaptureMuted();
135 }
136
137 void AudioHandler::SetCaptureMuted(bool mute) {
138 if (!mixer_->IsCaptureMuteLocked())
139 mixer_->SetCaptureMuted(mute);
118 } 140 }
119 141
120 void AudioHandler::AddVolumeObserver(VolumeObserver* observer) { 142 void AudioHandler::AddVolumeObserver(VolumeObserver* observer) {
121 volume_observers_.AddObserver(observer); 143 volume_observers_.AddObserver(observer);
122 } 144 }
123 145
124 void AudioHandler::RemoveVolumeObserver(VolumeObserver* observer) { 146 void AudioHandler::RemoveVolumeObserver(VolumeObserver* observer) {
125 volume_observers_.RemoveObserver(observer); 147 volume_observers_.RemoveObserver(observer);
126 } 148 }
127 149
150 void AudioHandler::Observe(int type,
151 const content::NotificationSource& source,
152 const content::NotificationDetails& details) {
153 if (type == chrome::NOTIFICATION_PREF_CHANGED) {
154 std::string* pref_name = content::Details<std::string>(details).ptr();
155 if (*pref_name == prefs::kAudioOutputAllowed ||
156 *pref_name == prefs::kAudioCaptureAllowed) {
157 ApplyAudioPolicy();
158 }
159 } else {
160 NOTREACHED() << "Unexpected notification type : " << type;
161 }
162 }
163
128 AudioHandler::AudioHandler(AudioMixer* mixer) 164 AudioHandler::AudioHandler(AudioMixer* mixer)
129 : mixer_(mixer), 165 : mixer_(mixer),
130 prefs_(g_browser_process->local_state()) { 166 local_state_(g_browser_process->local_state()) {
131 mixer_->SetVolumePercent(prefs_->GetDouble(prefs::kAudioVolumePercent)); 167 InitializePrefObservers();
132 mixer_->SetMuted(prefs_->GetInteger(prefs::kAudioMute) == kPrefMuteOn); 168 ApplyAudioPolicy();
169 mixer_->SetVolumePercent(local_state_->GetDouble(prefs::kAudioVolumePercent));
133 mixer_->Init(); 170 mixer_->Init();
134 } 171 }
135 172
136 AudioHandler::~AudioHandler() { 173 AudioHandler::~AudioHandler() {
137 mixer_.reset(); 174 mixer_.reset();
138 }; 175 };
139 176
177 void AudioHandler::InitializePrefObservers() {
178 pref_change_registrar_.Init(local_state_);
179 pref_change_registrar_.Add(prefs::kAudioOutputAllowed, this);
180 pref_change_registrar_.Add(prefs::kAudioCaptureAllowed, this);
181 }
182
183 void AudioHandler::ApplyAudioPolicy() {
184 mixer_->SetMuteLocked(false);
185 if (local_state_->GetBoolean(prefs::kAudioOutputAllowed)) {
186 mixer_->SetMuted(
187 local_state_->GetInteger(prefs::kAudioMute) == kPrefMuteOn);
188 } else {
189 mixer_->SetMuted(true);
190 mixer_->SetMuteLocked(true);
191 }
192 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnMuteToggled());
193 mixer_->SetCaptureMuteLocked(false);
194 if (local_state_->GetBoolean(prefs::kAudioCaptureAllowed)) {
195 mixer_->SetCaptureMuted(false);
196 } else {
197 mixer_->SetCaptureMuted(true);
198 mixer_->SetCaptureMuteLocked(true);
199 }
200 }
201
140 } // namespace chromeos 202 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/audio/audio_handler.h ('k') | chrome/browser/chromeos/audio/audio_mixer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698