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

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: Renamed both policies s/Enabled/Allowed/. 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/chromeos/login/user_manager.h"
Mattias Nissler (ping if slow) 2012/08/31 08:06:51 not longer needed
pastarmovj 2012/09/03 09:53:56 Done.
18 #include "chrome/browser/prefs/pref_service.h" 19 #include "chrome/browser/prefs/pref_service.h"
20 #include "chrome/browser/profiles/profile.h"
Mattias Nissler (ping if slow) 2012/08/31 08:06:51 not needed?
pastarmovj 2012/09/03 09:53:56 Done.
21 #include "chrome/common/chrome_notification_types.h"
19 #include "chrome/common/pref_names.h" 22 #include "chrome/common/pref_names.h"
20 #include "content/public/browser/browser_thread.h" 23 #include "content/public/browser/browser_thread.h"
24 #include "content/public/browser/notification_service.h"
21 25
22 using std::max; 26 using std::max;
23 using std::min; 27 using std::min;
24 28
25 namespace chromeos { 29 namespace chromeos {
26 30
27 namespace { 31 namespace {
28 32
29 // Default value for the volume pref, as a percent in the range [0.0, 100.0]. 33 // Default value for the volume pref, as a percent in the range [0.0, 100.0].
30 const double kDefaultVolumePercent = 75.0; 34 const double kDefaultVolumePercent = 75.0;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 void AudioHandler::RegisterPrefs(PrefService* local_state) { 77 void AudioHandler::RegisterPrefs(PrefService* local_state) {
74 if (!local_state->FindPreference(prefs::kAudioVolumePercent)) 78 if (!local_state->FindPreference(prefs::kAudioVolumePercent))
75 local_state->RegisterDoublePref(prefs::kAudioVolumePercent, 79 local_state->RegisterDoublePref(prefs::kAudioVolumePercent,
76 kDefaultVolumePercent, 80 kDefaultVolumePercent,
77 PrefService::UNSYNCABLE_PREF); 81 PrefService::UNSYNCABLE_PREF);
78 if (!local_state->FindPreference(prefs::kAudioMute)) 82 if (!local_state->FindPreference(prefs::kAudioMute))
79 local_state->RegisterIntegerPref(prefs::kAudioMute, 83 local_state->RegisterIntegerPref(prefs::kAudioMute,
80 kPrefMuteOff, 84 kPrefMuteOff,
81 PrefService::UNSYNCABLE_PREF); 85 PrefService::UNSYNCABLE_PREF);
82 86
87 // Register the prefs backing the audio muting policies.
88 local_state->RegisterBooleanPref(prefs::kAudioOutputAllowed,
89 true,
Daniel Erat 2012/08/31 14:57:46 nit: fix indenting
pastarmovj 2012/09/03 09:53:56 Done.
90 PrefService::UNSYNCABLE_PREF);
91 local_state->RegisterBooleanPref(prefs::kAudioCaptureAllowed,
92 true,
Daniel Erat 2012/08/31 14:57:46 nit: fix indenting
pastarmovj 2012/09/03 09:53:56 Done.
93 PrefService::UNSYNCABLE_PREF);
94
83 // Register the old decibel-based pref so we can clear it. 95 // Register the old decibel-based pref so we can clear it.
84 // TODO(derat): Remove this after R20: http://crbug.com/112039 96 // TODO(derat): Remove this after R20: http://crbug.com/112039
85 if (!local_state->FindPreference(prefs::kAudioVolumeDb)) 97 if (!local_state->FindPreference(prefs::kAudioVolumeDb))
86 local_state->RegisterDoublePref(prefs::kAudioVolumeDb, 98 local_state->RegisterDoublePref(prefs::kAudioVolumeDb,
87 0, 99 0,
88 PrefService::UNSYNCABLE_PREF); 100 PrefService::UNSYNCABLE_PREF);
89 local_state->ClearPref(prefs::kAudioVolumeDb); 101 local_state->ClearPref(prefs::kAudioVolumeDb);
90 local_state->UnregisterPreference(prefs::kAudioVolumeDb); 102 local_state->UnregisterPreference(prefs::kAudioVolumeDb);
91 } 103 }
92 104
93 double AudioHandler::GetVolumePercent() { 105 double AudioHandler::GetVolumePercent() {
94 return mixer_->GetVolumePercent(); 106 return mixer_->GetVolumePercent();
95 } 107 }
96 108
97 void AudioHandler::SetVolumePercent(double volume_percent) { 109 void AudioHandler::SetVolumePercent(double volume_percent) {
98 volume_percent = min(max(volume_percent, 0.0), 100.0); 110 volume_percent = min(max(volume_percent, 0.0), 100.0);
99 if (IsMuted() && volume_percent > 0.0) 111 if (IsMuted() && volume_percent > 0.0)
100 SetMuted(false); 112 SetMuted(false);
101 mixer_->SetVolumePercent(volume_percent); 113 mixer_->SetVolumePercent(volume_percent);
102 prefs_->SetDouble(prefs::kAudioVolumePercent, volume_percent); 114 local_state_->SetDouble(prefs::kAudioVolumePercent, volume_percent);
103 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnVolumeChanged()); 115 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnVolumeChanged());
104 } 116 }
105 117
106 void AudioHandler::AdjustVolumeByPercent(double adjust_by_percent) { 118 void AudioHandler::AdjustVolumeByPercent(double adjust_by_percent) {
107 SetVolumePercent(mixer_->GetVolumePercent() + adjust_by_percent); 119 SetVolumePercent(mixer_->GetVolumePercent() + adjust_by_percent);
108 } 120 }
109 121
110 bool AudioHandler::IsMuted() { 122 bool AudioHandler::IsMuted() {
111 return mixer_->IsMuted(); 123 return mixer_->IsMuted();
112 } 124 }
113 125
114 void AudioHandler::SetMuted(bool mute) { 126 void AudioHandler::SetMuted(bool mute) {
115 mixer_->SetMuted(mute); 127 if (!mixer_->IsMuteLocked()) {
116 prefs_->SetInteger(prefs::kAudioMute, mute ? kPrefMuteOn : kPrefMuteOff); 128 mixer_->SetMuted(mute);
129 local_state_->SetInteger(prefs::kAudioMute,
130 mute ? kPrefMuteOn : kPrefMuteOff);
131 }
117 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnMuteToggled()); 132 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnMuteToggled());
Daniel Erat 2012/08/31 14:57:46 should this be inside the 'if' statement? otherwi
pastarmovj 2012/09/03 09:53:56 Done.
118 } 133 }
119 134
135 bool AudioHandler::IsCaptureMuted() {
136 return mixer_->IsCaptureMuted();
137 }
138
139 void AudioHandler::SetCaptureMuted(bool mute) {
140 if (!mixer_->IsCaptureMuteLocked())
141 mixer_->SetCaptureMuted(mute);
142 }
143
120 void AudioHandler::AddVolumeObserver(VolumeObserver* observer) { 144 void AudioHandler::AddVolumeObserver(VolumeObserver* observer) {
121 volume_observers_.AddObserver(observer); 145 volume_observers_.AddObserver(observer);
122 } 146 }
123 147
124 void AudioHandler::RemoveVolumeObserver(VolumeObserver* observer) { 148 void AudioHandler::RemoveVolumeObserver(VolumeObserver* observer) {
125 volume_observers_.RemoveObserver(observer); 149 volume_observers_.RemoveObserver(observer);
126 } 150 }
127 151
152 void AudioHandler::Observe(int type,
153 const content::NotificationSource& source,
154 const content::NotificationDetails& details) {
155 if (type == chrome::NOTIFICATION_PREF_CHANGED) {
156 std::string* pref_name = content::Details<std::string>(details).ptr();
157 if (*pref_name == prefs::kAudioOutputAllowed ||
158 *pref_name == prefs::kAudioCaptureAllowed) {
159 ApplyAudioPolicy();
160 }
161 } else {
162 NOTREACHED() << "Unexpected notification type : " << type;
163 }
164 }
165
128 AudioHandler::AudioHandler(AudioMixer* mixer) 166 AudioHandler::AudioHandler(AudioMixer* mixer)
129 : mixer_(mixer), 167 : mixer_(mixer),
130 prefs_(g_browser_process->local_state()) { 168 local_state_(g_browser_process->local_state()) {
131 mixer_->SetVolumePercent(prefs_->GetDouble(prefs::kAudioVolumePercent)); 169 InitializePrefObservers();
132 mixer_->SetMuted(prefs_->GetInteger(prefs::kAudioMute) == kPrefMuteOn); 170 ApplyAudioPolicy();
171 mixer_->SetVolumePercent(local_state_->GetDouble(prefs::kAudioVolumePercent));
133 mixer_->Init(); 172 mixer_->Init();
134 } 173 }
135 174
136 AudioHandler::~AudioHandler() { 175 AudioHandler::~AudioHandler() {
137 mixer_.reset(); 176 mixer_.reset();
138 }; 177 };
139 178
179 void AudioHandler::InitializePrefObservers() {
180 pref_change_registrar_.Init(local_state_);
181 pref_change_registrar_.Add(prefs::kAudioOutputAllowed, this);
182 pref_change_registrar_.Add(prefs::kAudioCaptureAllowed, this);
183 }
184
185 void AudioHandler::ApplyAudioPolicy() {
186 if (local_state_->GetBoolean(prefs::kAudioOutputAllowed)) {
187 mixer_->SetMuteLocked(false);
188 mixer_->SetMuted(
189 local_state_->GetInteger(prefs::kAudioMute) == kPrefMuteOn);
190 } else {
191 mixer_->SetMuted(true);
192 mixer_->SetMuteLocked(true);
Daniel Erat 2012/08/31 14:57:46 might be a bit safer to do something like this:
pastarmovj 2012/09/03 09:53:56 Done.
193 }
194 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnMuteToggled());
195 if (local_state_->GetBoolean(prefs::kAudioCaptureAllowed)) {
196 mixer_->SetCaptureMuteLocked(false);
197 mixer_->SetCaptureMuted(false);
198 } else {
199 mixer_->SetCaptureMuted(true);
200 mixer_->SetCaptureMuteLocked(true);
201 }
202 }
203
140 } // namespace chromeos 204 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698