Chromium Code Reviews| Index: chrome/browser/chromeos/audio/audio_handler.cc |
| diff --git a/chrome/browser/chromeos/audio/audio_handler.cc b/chrome/browser/chromeos/audio/audio_handler.cc |
| index 76eb60a9af31f2e8584ba5b8b559e42073439018..53457129c70943bd50eca58fc913b912d968976d 100644 |
| --- a/chrome/browser/chromeos/audio/audio_handler.cc |
| +++ b/chrome/browser/chromeos/audio/audio_handler.cc |
| @@ -15,9 +15,13 @@ |
| #else |
| #include "chrome/browser/chromeos/audio/audio_mixer_alsa.h" |
| #endif |
| +#include "chrome/browser/chromeos/login/user_manager.h" |
| #include "chrome/browser/prefs/pref_service.h" |
| +#include "chrome/browser/profiles/profile.h" |
| +#include "chrome/common/chrome_notification_types.h" |
| #include "chrome/common/pref_names.h" |
| #include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/notification_service.h" |
| using std::max; |
| using std::min; |
| @@ -90,6 +94,28 @@ void AudioHandler::RegisterPrefs(PrefService* local_state) { |
| local_state->UnregisterPreference(prefs::kAudioVolumeDb); |
| } |
| +// static |
| +void AudioHandler::RegisterUserPrefs(PrefService* user_prefs) { |
| + user_prefs->RegisterBooleanPref(prefs::kAudioOutputDisabled, |
| + false, |
| + PrefService::UNSYNCABLE_PREF); |
| + user_prefs->RegisterBooleanPref(prefs::kAudioCaptureDisabled, |
| + false, |
| + PrefService::UNSYNCABLE_PREF); |
| +} |
| + |
| +void AudioHandler::InitializePrefObservers(PrefService* user_prefs) { |
| + // Don't do this for the login profile. |
| + if (!chromeos::UserManager::Get()->IsUserLoggedIn()) |
|
Mattias Nissler (ping if slow)
2012/08/28 12:24:24
Isn't AudioHandler a singleton? Do you call Initia
pastarmovj
2012/08/28 15:11:50
Moved to local_state as suggested.
|
| + return; |
| + |
| + user_prefs_ = user_prefs; |
| + pref_change_registrar_.Init(user_prefs_); |
| + pref_change_registrar_.Add(prefs::kAudioOutputDisabled, this); |
| + pref_change_registrar_.Add(prefs::kAudioCaptureDisabled, this); |
| + ApplyAudioPolicy(); |
| +} |
| + |
| double AudioHandler::GetVolumePercent() { |
| return mixer_->GetVolumePercent(); |
| } |
| @@ -99,7 +125,7 @@ void AudioHandler::SetVolumePercent(double volume_percent) { |
| if (IsMuted() && volume_percent > 0.0) |
| SetMuted(false); |
| mixer_->SetVolumePercent(volume_percent); |
| - prefs_->SetDouble(prefs::kAudioVolumePercent, volume_percent); |
| + local_state_->SetDouble(prefs::kAudioVolumePercent, volume_percent); |
| FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnVolumeChanged()); |
| } |
| @@ -112,11 +138,23 @@ bool AudioHandler::IsMuted() { |
| } |
| void AudioHandler::SetMuted(bool mute) { |
| - mixer_->SetMuted(mute); |
| - prefs_->SetInteger(prefs::kAudioMute, mute ? kPrefMuteOn : kPrefMuteOff); |
| + if (!mixer_->IsMuteLocked()) { |
| + mixer_->SetMuted(mute); |
| + local_state_->SetInteger(prefs::kAudioMute, |
| + mute ? kPrefMuteOn : kPrefMuteOff); |
| + } |
| FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnMuteToggled()); |
| } |
| +bool AudioHandler::IsMicMuted() { |
| + return mixer_->IsCaptureMuted(); |
| +} |
| + |
| +void AudioHandler::SetMicMuted(bool mute) { |
| + if (!mixer_->IsCaptureMuteLocked()) |
| + mixer_->SetCaptureMuted(mute); |
| +} |
| + |
| void AudioHandler::AddVolumeObserver(VolumeObserver* observer) { |
| volume_observers_.AddObserver(observer); |
| } |
| @@ -125,16 +163,59 @@ void AudioHandler::RemoveVolumeObserver(VolumeObserver* observer) { |
| volume_observers_.RemoveObserver(observer); |
| } |
| +void AudioHandler::Observe(int type, |
| + const content::NotificationSource& source, |
| + const content::NotificationDetails& details) { |
| + if (type == chrome::NOTIFICATION_PROFILE_CREATED) { |
| + Profile* profile = content::Source<Profile>(source).ptr(); |
| + if (!profile->IsOffTheRecord()) |
| + InitializePrefObservers(profile->GetPrefs()); |
|
Mattias Nissler (ping if slow)
2012/08/28 12:24:24
So when a second profile gets created, we override
pastarmovj
2012/08/28 15:11:50
Done.
|
| + } |
| + if (type == chrome::NOTIFICATION_PREF_CHANGED) { |
|
Mattias Nissler (ping if slow)
2012/08/28 12:24:24
else if
pastarmovj
2012/08/28 15:11:50
Done.
|
| + std::string* pref_name = content::Details<std::string>(details).ptr(); |
| + if (*pref_name == prefs::kAudioOutputDisabled || |
| + *pref_name == prefs::kAudioCaptureDisabled) { |
| + ApplyAudioPolicy(); |
| + } |
| + } |
|
Mattias Nissler (ping if slow)
2012/08/28 12:24:24
else {
NOTREACHED() << type;
}
pastarmovj
2012/08/28 15:11:50
Done.
|
| +} |
| + |
| AudioHandler::AudioHandler(AudioMixer* mixer) |
| : mixer_(mixer), |
| - prefs_(g_browser_process->local_state()) { |
| - mixer_->SetVolumePercent(prefs_->GetDouble(prefs::kAudioVolumePercent)); |
| - mixer_->SetMuted(prefs_->GetInteger(prefs::kAudioMute) == kPrefMuteOn); |
| + local_state_(g_browser_process->local_state()) { |
| + mixer_->SetCaptureMuteLocked(false); |
| + mixer_->SetCaptureMuted(false); |
| + mixer_->SetMuteLocked(false); |
| + mixer_->SetMuted(local_state_->GetInteger(prefs::kAudioMute) == kPrefMuteOn); |
| + mixer_->SetVolumePercent(local_state_->GetDouble(prefs::kAudioVolumePercent)); |
| mixer_->Init(); |
| + registrar_.Add(this, |
| + chrome::NOTIFICATION_PROFILE_CREATED, |
| + content::NotificationService::AllSources()); |
| } |
| AudioHandler::~AudioHandler() { |
| mixer_.reset(); |
| }; |
| +void AudioHandler::ApplyAudioPolicy() { |
| + if (user_prefs_->GetBoolean(prefs::kAudioOutputDisabled)) { |
| + mixer_->SetMuted(true); |
| + mixer_->SetMuteLocked(true); |
| + } else { |
| + mixer_->SetMuteLocked(false); |
| + mixer_->SetMuted( |
| + local_state_->GetInteger(prefs::kAudioMute) == kPrefMuteOn); |
| + } |
| + FOR_EACH_OBSERVER(VolumeObserver, volume_observers_, OnMuteToggled()); |
| + if (user_prefs_->GetBoolean(prefs::kAudioCaptureDisabled)) { |
| + mixer_->SetCaptureMuted(true); |
| + mixer_->SetCaptureMuteLocked(true); |
| + } else { |
| + mixer_->SetCaptureMuteLocked(false); |
| + mixer_->SetCaptureMuted(false); |
| + } |
| +} |
| + |
| + |
| } // namespace chromeos |