Commit 25a04cd1 authored by Ken MacKay's avatar Ken MacKay Committed by Commit Bot

[Chromecast] Factor out volume loading

Bug: internal b/163708246
Change-Id: I7868fe3e507af53fa82206652c5dec130efd468c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2351390
Commit-Queue: Kenneth MacKay <kmackay@chromium.org>
Reviewed-by: default avatarYuchen Liu <yucliu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#798018}
parent a0e3ad86
...@@ -139,6 +139,18 @@ cast_source_set("volume_map") { ...@@ -139,6 +139,18 @@ cast_source_set("volume_map") {
] ]
} }
cast_source_set("saved_volumes") {
sources = [
"saved_volumes.cc",
"saved_volumes.h",
]
deps = [
":cast_audio_json",
"//base",
"//chromecast/public",
]
}
cast_source_set("for_mixer_audio") { cast_source_set("for_mixer_audio") {
sources = [ sources = [
"audio_decoder_for_mixer.cc", "audio_decoder_for_mixer.cc",
...@@ -152,6 +164,7 @@ cast_source_set("for_mixer_audio") { ...@@ -152,6 +164,7 @@ cast_source_set("for_mixer_audio") {
":audio_buildflags", ":audio_buildflags",
":cast_audio_json", ":cast_audio_json",
":public", ":public",
":saved_volumes",
":volume_map", ":volume_map",
"//base", "//base",
"//chromecast/base", "//chromecast/base",
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromecast/media/cma/backend/saved_volumes.h"
#include <string>
#include "base/json/json_file_value_serializer.h"
#include "base/logging.h"
#include "base/values.h"
#include "chromecast/media/cma/backend/cast_audio_json.h"
namespace chromecast {
namespace media {
namespace {
constexpr float kDefaultMediaDbFS = -25.0f;
constexpr float kDefaultAlarmDbFS = -20.0f;
constexpr float kDefaultCommunicationDbFS = -25.0f;
constexpr char kKeyMediaDbFS[] = "dbfs.media";
constexpr char kKeyAlarmDbFS[] = "dbfs.alarm";
constexpr char kKeyCommunicationDbFS[] = "dbfs.communication";
constexpr char kKeyDefaultVolume[] = "default_volume";
std::string ContentTypeToDbFSKey(AudioContentType type) {
switch (type) {
case AudioContentType::kAlarm:
return kKeyAlarmDbFS;
case AudioContentType::kCommunication:
return kKeyCommunicationDbFS;
default:
return kKeyMediaDbFS;
}
}
} // namespace
base::flat_map<AudioContentType, double> LoadSavedVolumes(
const base::FilePath& storage_path) {
auto types = {AudioContentType::kMedia, AudioContentType::kAlarm,
AudioContentType::kCommunication};
base::flat_map<AudioContentType, double> volumes;
volumes[AudioContentType::kMedia] = kDefaultMediaDbFS;
volumes[AudioContentType::kAlarm] = kDefaultAlarmDbFS;
volumes[AudioContentType::kCommunication] = kDefaultCommunicationDbFS;
JSONFileValueDeserializer deserializer(storage_path);
auto stored_data = deserializer.Deserialize(nullptr, nullptr);
if (stored_data && stored_data->is_dict()) {
for (auto type : types) {
auto v = stored_data->FindDoublePath(ContentTypeToDbFSKey(type));
if (v) {
volumes[type] = v.value();
}
}
return volumes;
}
LOG(INFO) << "No saved volumes found";
// If saved_volumes does not exist, use per-device default if it exists.
JSONFileValueDeserializer cast_audio_deserializer(
media::CastAudioJson::GetFilePath());
auto cast_audio_config = deserializer.Deserialize(nullptr, nullptr);
if (!cast_audio_config || !cast_audio_config->is_dict()) {
return volumes;
}
const base::Value* default_volume_dict =
cast_audio_config->FindDictKey(kKeyDefaultVolume);
if (!default_volume_dict) {
return volumes;
}
for (auto type : types) {
auto v = default_volume_dict->FindDoublePath(ContentTypeToDbFSKey(type));
if (v) {
LOG(INFO) << "Using default volume for " << ContentTypeToDbFSKey(type)
<< " of " << v.value();
volumes[type] = v.value();
}
}
return volumes;
}
} // namespace media
} // namespace chromecast
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMECAST_MEDIA_CMA_BACKEND_SAVED_VOLUMES_H_
#define CHROMECAST_MEDIA_CMA_BACKEND_SAVED_VOLUMES_H_
#include "base/containers/flat_map.h"
#include "base/files/file_path.h"
#include "chromecast/public/volume_control.h"
namespace chromecast {
namespace media {
// Returns the saved volume in dBFS for each stream type loaded from persistent
// storage, or the appropriate default volume if there was no saved volume.
base::flat_map<AudioContentType, double> LoadSavedVolumes(
const base::FilePath& storage_path);
} // namespace media
} // namespace chromecast
#endif // CHROMECAST_MEDIA_CMA_BACKEND_SAVED_VOLUMES_H_
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include "chromecast/base/serializers.h" #include "chromecast/base/serializers.h"
#include "chromecast/media/audio/mixer_service/control_connection.h" #include "chromecast/media/audio/mixer_service/control_connection.h"
#include "chromecast/media/cma/backend/audio_buildflags.h" #include "chromecast/media/cma/backend/audio_buildflags.h"
#include "chromecast/media/cma/backend/cast_audio_json.h" #include "chromecast/media/cma/backend/saved_volumes.h"
#include "chromecast/media/cma/backend/system_volume_control.h" #include "chromecast/media/cma/backend/system_volume_control.h"
#include "chromecast/media/cma/backend/volume_map.h" #include "chromecast/media/cma/backend/volume_map.h"
...@@ -43,10 +43,6 @@ namespace media { ...@@ -43,10 +43,6 @@ namespace media {
namespace { namespace {
constexpr float kDefaultMediaDbFS = -25.0f;
constexpr float kDefaultAlarmDbFS = -20.0f;
constexpr float kDefaultCommunicationDbFS = -25.0f;
#if !BUILDFLAG(SYSTEM_OWNS_VOLUME) #if !BUILDFLAG(SYSTEM_OWNS_VOLUME)
constexpr float kMinDbFS = -120.0f; constexpr float kMinDbFS = -120.0f;
#endif #endif
...@@ -54,7 +50,6 @@ constexpr float kMinDbFS = -120.0f; ...@@ -54,7 +50,6 @@ constexpr float kMinDbFS = -120.0f;
constexpr char kKeyMediaDbFS[] = "dbfs.media"; constexpr char kKeyMediaDbFS[] = "dbfs.media";
constexpr char kKeyAlarmDbFS[] = "dbfs.alarm"; constexpr char kKeyAlarmDbFS[] = "dbfs.alarm";
constexpr char kKeyCommunicationDbFS[] = "dbfs.communication"; constexpr char kKeyCommunicationDbFS[] = "dbfs.communication";
constexpr char kKeyDefaultVolume[] = "default_volume";
#if !BUILDFLAG(SYSTEM_OWNS_VOLUME) #if !BUILDFLAG(SYSTEM_OWNS_VOLUME)
float DbFsToScale(float db) { float DbFsToScale(float db) {
...@@ -86,43 +81,12 @@ class VolumeControlInternal : public SystemVolumeControl::Delegate { ...@@ -86,43 +81,12 @@ class VolumeControlInternal : public SystemVolumeControl::Delegate {
// Load volume map to check that the config file is correct. // Load volume map to check that the config file is correct.
VolumeControl::VolumeToDbFS(0.0f); VolumeControl::VolumeToDbFS(0.0f);
stored_values_.SetDouble(kKeyMediaDbFS, kDefaultMediaDbFS);
stored_values_.SetDouble(kKeyAlarmDbFS, kDefaultAlarmDbFS);
stored_values_.SetDouble(kKeyCommunicationDbFS, kDefaultCommunicationDbFS);
auto types = {AudioContentType::kMedia, AudioContentType::kAlarm,
AudioContentType::kCommunication};
double volume;
storage_path_ = base::GetHomeDir().Append("saved_volumes"); storage_path_ = base::GetHomeDir().Append("saved_volumes");
auto old_stored_data = DeserializeJsonFromFile(storage_path_); base::flat_map<AudioContentType, double> saved_volumes =
base::DictionaryValue* old_stored_dict; LoadSavedVolumes(storage_path_);
if (old_stored_data && old_stored_data->GetAsDictionary(&old_stored_dict)) { for (auto type : {AudioContentType::kMedia, AudioContentType::kAlarm,
for (auto type : types) { AudioContentType::kCommunication}) {
if (old_stored_dict->GetDouble(ContentTypeToDbFSKey(type), &volume)) { stored_values_.SetDouble(ContentTypeToDbFSKey(type), saved_volumes[type]);
stored_values_.SetDouble(ContentTypeToDbFSKey(type), volume);
}
}
} else {
// If saved_volumes does not exist, use per device default if it exists.
auto cast_audio_config =
DeserializeJsonFromFile(CastAudioJson::GetFilePath());
const base::DictionaryValue* cast_audio_dict;
if (cast_audio_config &&
cast_audio_config->GetAsDictionary(&cast_audio_dict)) {
const base::DictionaryValue* default_volume_dict;
if (cast_audio_dict && cast_audio_dict->GetDictionary(
kKeyDefaultVolume, &default_volume_dict)) {
for (auto type : types) {
if (default_volume_dict->GetDouble(ContentTypeToDbFSKey(type),
&volume)) {
stored_values_.SetDouble(ContentTypeToDbFSKey(type), volume);
LOG(INFO) << "Setting default volume for "
<< ContentTypeToDbFSKey(type) << " to " << volume;
}
}
}
}
} }
base::Thread::Options options; base::Thread::Options options;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment