Chromium Code Reviews| OLD | NEW |
|---|---|
| 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" | |
| 18 #include "chrome/browser/prefs/pref_service.h" | 19 #include "chrome/browser/prefs/pref_service.h" |
| 20 #include "chrome/browser/profiles/profile.h" | |
| 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 Loading... | |
| 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::kAudioOutputEnabled, | |
|
Daniel Erat
2012/08/29 15:37:00
i'm a bit concerned that having both kAudioOutputE
pastarmovj
2012/08/29 16:15:52
How strong do you feel about changing the name her
| |
| 89 true, | |
| 90 PrefService::UNSYNCABLE_PREF); | |
| 91 local_state->RegisterBooleanPref(prefs::kAudioCaptureEnabled, | |
| 92 true, | |
| 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()); |
| 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::kAudioOutputEnabled || | |
| 158 *pref_name == prefs::kAudioCaptureEnabled) { | |
| 159 ApplyAudioPolicy(); | |
| 160 } | |
| 161 } else { | |
| 162 NOTREACHED(); | |
|
Daniel Erat
2012/08/29 15:37:00
nit: NOTREACHED() << "Unexpected notification " <<
pastarmovj
2012/08/29 16:15:52
Done.
| |
| 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::kAudioOutputEnabled, this); | |
| 182 pref_change_registrar_.Add(prefs::kAudioCaptureEnabled, this); | |
| 183 } | |
| 184 | |
| 185 void AudioHandler::ApplyAudioPolicy() { | |
| 186 if (local_state_->GetBoolean(prefs::kAudioOutputEnabled)) { | |
| 187 mixer_->SetMuteLocked(false); | |
| 188 mixer_->SetMuted( | |
| 189 local_state_->GetInteger(prefs::kAudioMute) == kPrefMuteOn); | |
| 190 } else { | |
| 191 mixer_->SetMuted(true); | |
| 192 mixer_->SetMuteLocked(true); | |
| 193 } | |
| 194 FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnMuteToggled()); | |
| 195 if (local_state_->GetBoolean(prefs::kAudioCaptureEnabled)) { | |
| 196 mixer_->SetCaptureMuteLocked(false); | |
| 197 mixer_->SetCaptureMuted(false); | |
| 198 } else { | |
| 199 mixer_->SetCaptureMuted(true); | |
| 200 mixer_->SetCaptureMuteLocked(true); | |
| 201 } | |
| 202 } | |
| 203 | |
| 204 | |
| 140 } // namespace chromeos | 205 } // namespace chromeos |
| OLD | NEW |