| 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/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 Loading... |
| 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 |
| OLD | NEW |