Index: chromecast/media/cma/backend/alsa/volume_control.cc |
diff --git a/chromecast/media/cma/backend/alsa/volume_control.cc b/chromecast/media/cma/backend/alsa/volume_control.cc |
index 7ab987577020a86cc5875d5d60b2069a08bb468a..41468474667704f221984952d43f43cd1f1b8c5c 100644 |
--- a/chromecast/media/cma/backend/alsa/volume_control.cc |
+++ b/chromecast/media/cma/backend/alsa/volume_control.cc |
@@ -30,8 +30,10 @@ |
#include "chromecast/base/serializers.h" |
#include "chromecast/media/cma/backend/alsa/alsa_features.h" |
#include "chromecast/media/cma/backend/alsa/alsa_volume_control.h" |
+#include "chromecast/media/cma/backend/alsa/cast_audio_json.h" |
#include "chromecast/media/cma/backend/alsa/post_processing_pipeline_parser.h" |
#include "chromecast/media/cma/backend/alsa/stream_mixer_alsa.h" |
+#include "chromecast/media/cma/backend/alsa/volume_map.h" |
namespace chromecast { |
namespace media { |
@@ -47,22 +49,8 @@ constexpr float kMinDbFS = -120.0f; |
constexpr char kKeyMediaDbFS[] = "dbfs.media"; |
constexpr char kKeyAlarmDbFS[] = "dbfs.alarm"; |
constexpr char kKeyCommunicationDbFS[] = "dbfs.communication"; |
-constexpr char kKeyVolumeMap[] = "volume_map"; |
-constexpr char kKeyLevel[] = "level"; |
-constexpr char kKeyDb[] = "db"; |
constexpr char kKeyDefaultVolume[] = "default_volume"; |
-struct LevelToDb { |
- float level; |
- float db; |
-}; |
- |
-const LevelToDb kDefaultVolumeMap[] = {{0.0f, kMinDbFS}, |
- {0.01f, -58.0f}, |
- {0.090909f, -48.0f}, |
- {0.818182f, -8.0f}, |
- {1.0f, 0.0f}}; |
- |
float DbFsToScale(float db) { |
if (db <= kMinDbFS) { |
return 0.0f; |
@@ -81,103 +69,6 @@ std::string ContentTypeToDbFSKey(AudioContentType type) { |
} |
} |
-class VolumeMap { |
- public: |
- VolumeMap() { |
- auto cast_audio_config = DeserializeJsonFromFile( |
- base::FilePath(PostProcessingPipelineParser::GetFilePath())); |
- const base::DictionaryValue* cast_audio_dict; |
- if (!cast_audio_config || |
- !cast_audio_config->GetAsDictionary(&cast_audio_dict)) { |
- LOG(WARNING) << "No cast audio config found; using default volume map."; |
- volume_map_.insert(volume_map_.end(), kDefaultVolumeMap, |
- kDefaultVolumeMap + arraysize(kDefaultVolumeMap)); |
- return; |
- } |
- |
- const base::ListValue* volume_map_list; |
- if (!cast_audio_dict->GetList(kKeyVolumeMap, &volume_map_list)) { |
- LOG(WARNING) << "No volume map found; using default volume map."; |
- volume_map_.insert(volume_map_.end(), kDefaultVolumeMap, |
- kDefaultVolumeMap + arraysize(kDefaultVolumeMap)); |
- return; |
- } |
- |
- double prev_level = -1.0; |
- for (size_t i = 0; i < volume_map_list->GetSize(); ++i) { |
- const base::DictionaryValue* volume_map_entry; |
- CHECK(volume_map_list->GetDictionary(i, &volume_map_entry)); |
- |
- double level; |
- CHECK(volume_map_entry->GetDouble(kKeyLevel, &level)); |
- CHECK_GE(level, 0.0); |
- CHECK_LE(level, 1.0); |
- CHECK_GT(level, prev_level); |
- prev_level = level; |
- |
- double db; |
- CHECK(volume_map_entry->GetDouble(kKeyDb, &db)); |
- CHECK_LE(db, 0.0); |
- if (level == 1.0) { |
- CHECK_EQ(db, 0.0); |
- } |
- |
- volume_map_.push_back({level, db}); |
- } |
- |
- if (volume_map_.empty()) { |
- LOG(FATAL) << "No entries in volume map."; |
- return; |
- } |
- |
- if (volume_map_[0].level > 0.0) { |
- volume_map_.insert(volume_map_.begin(), {0.0, kMinDbFS}); |
- } |
- |
- if (volume_map_.rbegin()->level < 1.0) { |
- volume_map_.push_back({1.0, 0.0}); |
- } |
- } |
- |
- float VolumeToDbFS(float volume) { |
- if (volume <= volume_map_[0].level) { |
- return volume_map_[0].db; |
- } |
- for (size_t i = 1; i < volume_map_.size(); ++i) { |
- if (volume < volume_map_[i].level) { |
- const float x_range = volume_map_[i].level - volume_map_[i - 1].level; |
- const float y_range = volume_map_[i].db - volume_map_[i - 1].db; |
- const float x_pos = volume - volume_map_[i - 1].level; |
- |
- return volume_map_[i - 1].db + x_pos * y_range / x_range; |
- } |
- } |
- return volume_map_[volume_map_.size() - 1].db; |
- } |
- |
- // static |
- float DbFSToVolume(float db) { |
- if (db <= volume_map_[0].db) { |
- return volume_map_[0].level; |
- } |
- for (size_t i = 1; i < volume_map_.size(); ++i) { |
- if (db < volume_map_[i].db) { |
- const float x_range = volume_map_[i].db - volume_map_[i - 1].db; |
- const float y_range = volume_map_[i].level - volume_map_[i - 1].level; |
- const float x_pos = db - volume_map_[i - 1].db; |
- |
- return volume_map_[i - 1].level + x_pos * y_range / x_range; |
- } |
- } |
- return volume_map_[volume_map_.size() - 1].level; |
- } |
- |
- private: |
- std::vector<LevelToDb> volume_map_; |
- |
- DISALLOW_COPY_AND_ASSIGN(VolumeMap); |
-}; |
- |
base::LazyInstance<VolumeMap>::Leaky g_volume_map = LAZY_INSTANCE_INITIALIZER; |
class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
@@ -209,8 +100,8 @@ class VolumeControlInternal : public AlsaVolumeControl::Delegate { |
} |
} else { |
// If saved_volumes does not exist, use per device default if it exists. |
- auto cast_audio_config = DeserializeJsonFromFile( |
- base::FilePath(PostProcessingPipelineParser::GetFilePath())); |
+ auto cast_audio_config = |
+ DeserializeJsonFromFile(base::FilePath(kCastAudioJsonFilePath)); |
const base::DictionaryValue* cast_audio_dict; |
if (cast_audio_config && |
cast_audio_config->GetAsDictionary(&cast_audio_dict)) { |