audio_devices_pref_handler_impl.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/audio/audio_devices_pref_handler_impl.h" 6 7#include "base/bind.h" 8#include "base/bind_helpers.h" 9#include "base/logging.h" 10#include "base/prefs/pref_registry_simple.h" 11#include "base/prefs/pref_service.h" 12#include "base/strings/string_number_conversions.h" 13#include "chrome/browser/prefs/scoped_user_pref_update.h" 14#include "chrome/common/chrome_notification_types.h" 15#include "chrome/common/pref_names.h" 16#include "chromeos/audio/cras_audio_handler.h" 17 18namespace chromeos { 19 20namespace { 21 22// Default value for the volume pref, as a percent in the range [0.0, 100.0]. 23const double kDefaultVolumePercent = 75.0; 24 25// Values used for muted preference. 26const int kPrefMuteOff = 0; 27const int kPrefMuteOn = 1; 28 29} // namespace 30 31double AudioDevicesPrefHandlerImpl::GetOutputVolumeValue() { 32 if (!CrasAudioHandler::IsInitialized()) 33 return kDefaultVolumePercent; 34 35 UpdateDevicesVolumePref(); 36 std::string active_device_id = base::Uint64ToString( 37 CrasAudioHandler::Get()->GetActiveOutputNode()); 38 if (!device_volume_settings_->HasKey(active_device_id)) 39 MigrateDeviceVolumeSettings(active_device_id); 40 double volume = kDefaultVolumePercent; 41 device_volume_settings_->GetDouble(active_device_id, &volume); 42 return volume; 43} 44 45void AudioDevicesPrefHandlerImpl::SetOutputVolumeValue(double volume_percent) { 46 std::string active_device_id = base::Uint64ToString( 47 CrasAudioHandler::Get()->GetActiveOutputNode()); 48 if (volume_percent > 100.0) 49 volume_percent = 100.0; 50 if (volume_percent < 0.0) 51 volume_percent = 0.0; 52 device_volume_settings_->SetDouble(active_device_id, volume_percent); 53 SaveDevicesVolumePref(); 54} 55 56bool AudioDevicesPrefHandlerImpl::GetOutputMuteValue() { 57 if (!CrasAudioHandler::IsInitialized()) 58 return false; 59 60 UpdateDevicesVolumePref(); 61 std::string active_device_id = base::Uint64ToString( 62 CrasAudioHandler::Get()->GetActiveOutputNode()); 63 if (!device_mute_settings_->HasKey(active_device_id)) 64 MigrateDeviceMuteSettings(active_device_id); 65 int mute = kPrefMuteOff; 66 device_mute_settings_->GetInteger(active_device_id, &mute); 67 return (mute == kPrefMuteOn); 68} 69 70void AudioDevicesPrefHandlerImpl::SetOutputMuteValue(bool mute) { 71 std::string active_device_id = base::Uint64ToString( 72 CrasAudioHandler::Get()->GetActiveOutputNode()); 73 device_mute_settings_->SetBoolean(active_device_id, 74 mute ? kPrefMuteOn : kPrefMuteOff); 75 SaveDevicesVolumePref(); 76} 77 78bool AudioDevicesPrefHandlerImpl::GetAudioCaptureAllowedValue() { 79 return local_state_->GetBoolean(prefs::kAudioCaptureAllowed); 80} 81 82bool AudioDevicesPrefHandlerImpl::GetAudioOutputAllowedValue() { 83 return local_state_->GetBoolean(prefs::kAudioOutputAllowed); 84} 85 86void AudioDevicesPrefHandlerImpl::AddAudioPrefObserver( 87 AudioPrefObserver* observer) { 88 observers_.AddObserver(observer); 89} 90 91void AudioDevicesPrefHandlerImpl::RemoveAudioPrefObserver( 92 AudioPrefObserver* observer) { 93 observers_.RemoveObserver(observer); 94} 95 96AudioDevicesPrefHandlerImpl::AudioDevicesPrefHandlerImpl( 97 PrefService* local_state) 98 : device_mute_settings_(new base::DictionaryValue()), 99 device_volume_settings_(new base::DictionaryValue()), 100 local_state_(local_state) { 101 InitializePrefObservers(); 102 103 UpdateDevicesMutePref(); 104 UpdateDevicesVolumePref(); 105} 106 107AudioDevicesPrefHandlerImpl::~AudioDevicesPrefHandlerImpl() { 108}; 109 110void AudioDevicesPrefHandlerImpl::InitializePrefObservers() { 111 pref_change_registrar_.Init(local_state_); 112 base::Closure callback = 113 base::Bind(&AudioDevicesPrefHandlerImpl::NotifyAudioPolicyChange, 114 base::Unretained(this)); 115 pref_change_registrar_.Add(prefs::kAudioOutputAllowed, callback); 116 pref_change_registrar_.Add(prefs::kAudioCaptureAllowed, callback); 117} 118 119void AudioDevicesPrefHandlerImpl::UpdateDevicesMutePref() { 120 const base::DictionaryValue* mute_prefs = 121 local_state_->GetDictionary(prefs::kAudioDevicesMute); 122 if (mute_prefs) 123 device_mute_settings_.reset(mute_prefs->DeepCopy()); 124} 125 126void AudioDevicesPrefHandlerImpl::SaveDevicesMutePref() { 127 DictionaryPrefUpdate dict_update(local_state_, prefs::kAudioDevicesMute); 128 base::DictionaryValue::Iterator it(*device_mute_settings_); 129 while (!it.IsAtEnd()) { 130 int mute = kPrefMuteOff; 131 it.value().GetAsInteger(&mute); 132 dict_update->Set(it.key(), new base::FundamentalValue(mute)); 133 it.Advance(); 134 } 135} 136 137void AudioDevicesPrefHandlerImpl::UpdateDevicesVolumePref() { 138 const base::DictionaryValue* volume_prefs = 139 local_state_->GetDictionary(prefs::kAudioDevicesVolumePercent); 140 if (volume_prefs) 141 device_volume_settings_.reset(volume_prefs->DeepCopy()); 142} 143 144void AudioDevicesPrefHandlerImpl::SaveDevicesVolumePref() { 145 DictionaryPrefUpdate dict_update(local_state_, 146 prefs::kAudioDevicesVolumePercent); 147 base::DictionaryValue::Iterator it(*device_volume_settings_); 148 while (!it.IsAtEnd()) { 149 double volume = kDefaultVolumePercent; 150 it.value().GetAsDouble(&volume); 151 dict_update->Set(it.key(), new base::FundamentalValue(volume)); 152 it.Advance(); 153 } 154} 155 156void AudioDevicesPrefHandlerImpl::MigrateDeviceMuteSettings( 157 std::string active_device) { 158 int old_mute = local_state_->GetInteger(prefs::kAudioMute); 159 device_mute_settings_->SetInteger(active_device, old_mute); 160 SaveDevicesMutePref(); 161} 162 163void AudioDevicesPrefHandlerImpl::MigrateDeviceVolumeSettings( 164 std::string active_device) { 165 double old_volume = local_state_->GetDouble(prefs::kAudioVolumePercent); 166 device_volume_settings_->SetDouble(active_device, old_volume); 167 SaveDevicesVolumePref(); 168} 169 170void AudioDevicesPrefHandlerImpl::NotifyAudioPolicyChange() { 171 FOR_EACH_OBSERVER(AudioPrefObserver, 172 observers_, 173 OnAudioPolicyPrefChanged()); 174} 175 176// static 177void AudioDevicesPrefHandlerImpl::RegisterPrefs(PrefRegistrySimple* registry) { 178 registry->RegisterDictionaryPref(prefs::kAudioDevicesVolumePercent); 179 registry->RegisterDictionaryPref(prefs::kAudioDevicesMute); 180 181 // TODO(jennyz,rkc): Move the rest of the preferences registered by 182 // AudioPrefHandlerImpl::RegisterPrefs here once we remove the old audio 183 // handler code. 184} 185 186// static 187AudioDevicesPrefHandler* AudioDevicesPrefHandler::Create( 188 PrefService* local_state) { 189 return new AudioDevicesPrefHandlerImpl(local_state); 190} 191 192} // namespace chromeos 193