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

Unified Diff: chromeos/audio/audio_devices_pref_handler_impl.cc

Issue 2510093003: Handle audio node stable device ID change (Closed)
Patch Set: fix a typo Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: chromeos/audio/audio_devices_pref_handler_impl.cc
diff --git a/chromeos/audio/audio_devices_pref_handler_impl.cc b/chromeos/audio/audio_devices_pref_handler_impl.cc
index 3024bfd4c520d9ca7ba89f07fe32136ecce6cff5..b14ecffb78a07a9f097ff96e16114fcda16e11bd 100644
--- a/chromeos/audio/audio_devices_pref_handler_impl.cc
+++ b/chromeos/audio/audio_devices_pref_handler_impl.cc
@@ -29,16 +29,32 @@ const char kActiveKey[] = "active";
const char kActivateByUserKey[] = "activate_by_user";
// Gets the device id string for storing audio preference. The format of
-// device string is a string consisting of 2 parts.
+// device string is a string consisting of 3 parts:
+// |version of stable device ID| :
// |integer from lower 32 bit of device id| :
// |0(output device) or 1(input device)|
// If an audio device has both integrated input and output devices, the first 2
// parts of the string could be identical, only the last part will differentiate
// them.
-std::string GetDeviceIdString(const chromeos::AudioDevice& device) {
+// Note that |version of stable device ID| is present only for devices with
+// stable device ID version >= 2. For devices with version 1, the device id
+// string contains only latter 2 parts - in order to preserve backward
+// compatibility with existing ID from before v2 stable device ID was
+// introduced.
+std::string GetVersionedDeviceIdString(const chromeos::AudioDevice& device,
+ int version) {
+ CHECK(device.stable_device_id_version >= version);
+ DCHECK_GE(device.stable_device_id_version, 1);
+ DCHECK_LE(device.stable_device_id_version, 2);
+
+ bool use_deprecated_id = version == 1 && device.stable_device_id_version == 2;
+ uint64_t stable_device_id = use_deprecated_id
+ ? device.deprecated_stable_device_id
+ : device.stable_device_id;
+ std::string version_prefix = version == 2 ? "2 : " : "";
std::string device_id_string =
- base::Uint64ToString(device.stable_device_id &
- static_cast<uint64_t>(0xffffffff)) +
+ version_prefix + base::Uint64ToString(stable_device_id &
+ static_cast<uint64_t>(0xffffffff)) +
" : " + (device.is_input ? "1" : "0");
// Replace any periods from the device id string with a space, since setting
// names cannot contain periods.
@@ -46,6 +62,33 @@ std::string GetDeviceIdString(const chromeos::AudioDevice& device) {
return device_id_string;
}
+std::string GetDeviceIdString(const chromeos::AudioDevice& device) {
+ return GetVersionedDeviceIdString(device, device.stable_device_id_version);
+}
+
+// Migrates an entry associated with |device|'s v1 stable device ID in
+// |settings| to the key derived from |device|'s v2 stable device ID
+// (which is expected to be equal to |intended_key|), if the entry can
+// be found.
+// Returns whether the migration occurred.
+bool MigrateDeviceIdInSettings(base::DictionaryValue* settings,
+ const std::string& intended_key,
+ const chromeos::AudioDevice& device) {
+ if (device.stable_device_id_version == 1)
+ return false;
+
+ DCHECK_EQ(2, device.stable_device_id_version);
+
+ std::string old_device_id = GetVersionedDeviceIdString(device, 1);
+ std::unique_ptr<base::Value> value;
+ if (!settings->Remove(old_device_id, &value))
+ return false;
+
+ DCHECK_EQ(intended_key, GetDeviceIdString(device));
+ settings->Set(intended_key, std::move(value));
+ return true;
+}
+
} // namespace
namespace chromeos {
@@ -66,6 +109,12 @@ double AudioDevicesPrefHandlerImpl::GetInputGainValue(
void AudioDevicesPrefHandlerImpl::SetVolumeGainValue(
const AudioDevice& device, double value) {
+ // Use this opportunity to remove device record under deprecated device ID,
+ // if one exists.
+ if (device.stable_device_id_version == 2) {
+ std::string old_device_id = GetVersionedDeviceIdString(device, 1);
+ device_volume_settings_->Remove(old_device_id, nullptr);
+ }
device_volume_settings_->SetDouble(GetDeviceIdString(device), value);
SaveDevicesVolumePref();
@@ -74,7 +123,7 @@ void AudioDevicesPrefHandlerImpl::SetVolumeGainValue(
bool AudioDevicesPrefHandlerImpl::GetMuteValue(const AudioDevice& device) {
std::string device_id_str = GetDeviceIdString(device);
if (!device_mute_settings_->HasKey(device_id_str))
- MigrateDeviceMuteSettings(device_id_str);
+ MigrateDeviceMuteSettings(device_id_str, device);
int mute = kPrefMuteOff;
device_mute_settings_->GetInteger(device_id_str, &mute);
@@ -84,6 +133,12 @@ bool AudioDevicesPrefHandlerImpl::GetMuteValue(const AudioDevice& device) {
void AudioDevicesPrefHandlerImpl::SetMuteValue(const AudioDevice& device,
bool mute) {
+ // Use this opportunity to remove device record under deprecated device ID,
+ // if one exists.
+ if (device.stable_device_id_version == 2) {
+ std::string old_device_id = GetVersionedDeviceIdString(device, 1);
+ device_mute_settings_->Remove(old_device_id, nullptr);
+ }
device_mute_settings_->SetInteger(GetDeviceIdString(device),
mute ? kPrefMuteOn : kPrefMuteOff);
SaveDevicesMutePref();
@@ -97,6 +152,12 @@ void AudioDevicesPrefHandlerImpl::SetDeviceActive(const AudioDevice& device,
if (active)
dict->SetBoolean(kActivateByUserKey, activate_by_user);
+ // Use this opportunity to remove device record under deprecated device ID,
+ // if one exists.
+ if (device.stable_device_id_version == 2) {
+ std::string old_device_id = GetVersionedDeviceIdString(device, 1);
+ device_state_settings_->Remove(old_device_id, nullptr);
+ }
device_state_settings_->Set(GetDeviceIdString(device), std::move(dict));
SaveDevicesStatePref();
}
@@ -105,8 +166,10 @@ bool AudioDevicesPrefHandlerImpl::GetDeviceActive(const AudioDevice& device,
bool* active,
bool* activate_by_user) {
const std::string device_id_str = GetDeviceIdString(device);
- if (!device_state_settings_->HasKey(device_id_str))
+ if (!device_state_settings_->HasKey(device_id_str) &&
+ !MigrateDevicesStatePref(device_id_str, device)) {
return false;
+ }
base::DictionaryValue* dict = NULL;
if (!device_state_settings_->GetDictionary(device_id_str, &dict)) {
@@ -146,7 +209,7 @@ double AudioDevicesPrefHandlerImpl::GetVolumeGainPrefValue(
const AudioDevice& device) {
std::string device_id_str = GetDeviceIdString(device);
if (!device_volume_settings_->HasKey(device_id_str))
- MigrateDeviceVolumeSettings(device_id_str);
+ MigrateDeviceVolumeGainSettings(device_id_str, device);
// TODO(jennyz, rkc): Return a meaningful input gain default value, when
// cras has added support for normalizing input gain range.
@@ -200,6 +263,7 @@ void AudioDevicesPrefHandlerImpl::LoadDevicesMutePref() {
void AudioDevicesPrefHandlerImpl::SaveDevicesMutePref() {
DictionaryPrefUpdate dict_update(local_state_, prefs::kAudioDevicesMute);
+ dict_update->Clear();
dict_update->MergeDictionary(device_mute_settings_.get());
}
@@ -213,6 +277,7 @@ void AudioDevicesPrefHandlerImpl::LoadDevicesVolumePref() {
void AudioDevicesPrefHandlerImpl::SaveDevicesVolumePref() {
DictionaryPrefUpdate dict_update(local_state_,
prefs::kAudioDevicesVolumePercent);
+ dict_update->Clear();
dict_update->MergeDictionary(device_volume_settings_.get());
}
@@ -225,21 +290,45 @@ void AudioDevicesPrefHandlerImpl::LoadDevicesStatePref() {
void AudioDevicesPrefHandlerImpl::SaveDevicesStatePref() {
DictionaryPrefUpdate dict_update(local_state_, prefs::kAudioDevicesState);
- base::DictionaryValue::Iterator it(*device_state_settings_);
+ dict_update->Clear();
dict_update->MergeDictionary(device_state_settings_.get());
}
+bool AudioDevicesPrefHandlerImpl::MigrateDevicesStatePref(
+ const std::string& device_key,
+ const AudioDevice& device) {
+ if (!MigrateDeviceIdInSettings(device_state_settings_.get(), device_key,
+ device)) {
+ return false;
+ }
+
+ SaveDevicesStatePref();
+ return true;
+}
+
void AudioDevicesPrefHandlerImpl::MigrateDeviceMuteSettings(
- const std::string& active_device) {
- int old_mute = local_state_->GetInteger(prefs::kAudioMute);
- device_mute_settings_->SetInteger(active_device, old_mute);
+ const std::string& device_key,
+ const AudioDevice& device) {
+ if (!MigrateDeviceIdInSettings(device_mute_settings_.get(), device_key,
+ device)) {
+ // If there was no recorded value for deprecated device ID, use value from
+ // global mute pref.
+ int old_mute = local_state_->GetInteger(prefs::kAudioMute);
+ device_mute_settings_->SetInteger(device_key, old_mute);
+ }
SaveDevicesMutePref();
}
-void AudioDevicesPrefHandlerImpl::MigrateDeviceVolumeSettings(
- const std::string& active_device) {
- double old_volume = local_state_->GetDouble(prefs::kAudioVolumePercent);
- device_volume_settings_->SetDouble(active_device, old_volume);
+void AudioDevicesPrefHandlerImpl::MigrateDeviceVolumeGainSettings(
+ const std::string& device_key,
+ const AudioDevice& device) {
+ if (!MigrateDeviceIdInSettings(device_volume_settings_.get(), device_key,
+ device)) {
+ // If there was no recorded value for deprecated device ID, use value from
+ // global vloume pref.
+ double old_volume = local_state_->GetDouble(prefs::kAudioVolumePercent);
+ device_volume_settings_->SetDouble(device_key, old_volume);
+ }
SaveDevicesVolumePref();
}
« no previous file with comments | « chromeos/audio/audio_devices_pref_handler_impl.h ('k') | chromeos/audio/audio_devices_pref_handler_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698