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

Unified Diff: chromecast/media/cma/backend/alsa/volume_control.cc

Issue 2958393002: Add a simple, safe gain PostProcessor. (Closed)
Patch Set: Move cast_audio.json filepath string to a separate file Created 3 years, 6 months 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: 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 f030c54231cdda23718d55db8a363dd25ace7af2..5aa2f02d8b6868c27e843aa7014ba9d195e4d969 100644
--- a/chromecast/media/cma/backend/alsa/volume_control.cc
+++ b/chromecast/media/cma/backend/alsa/volume_control.cc
@@ -32,6 +32,7 @@
#include "chromecast/media/cma/backend/alsa/alsa_volume_control.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,20 +48,6 @@ 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";
-
-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) {
@@ -80,103 +67,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 {

Powered by Google App Engine
This is Rietveld 408576698