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

Side by Side Diff: chromecast/media/cma/backend/alsa/post_processing_pipeline_parser.cc

Issue 2958393002: Add a simple, safe gain PostProcessor. (Closed)
Patch Set: Unrelated cleanup Created 3 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromecast/media/cma/backend/alsa/post_processing_pipeline_parser.h" 5 #include "chromecast/media/cma/backend/alsa/post_processing_pipeline_parser.h"
6 6
7 #include "base/files/file_path.h" 7 #include "base/files/file_path.h"
8 #include "base/files/file_util.h" 8 #include "base/files/file_util.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/values.h" 10 #include "base/values.h"
11 #include "chromecast/base/serializers.h" 11 #include "chromecast/base/serializers.h"
12 #include "chromecast/media/base/audio_device_ids.h" 12 #include "chromecast/media/base/audio_device_ids.h"
13 #include "chromecast/media/cma/backend/alsa/cast_audio_json.h"
13 #include "media/audio/audio_device_description.h" 14 #include "media/audio/audio_device_description.h"
14 15
15 namespace chromecast { 16 namespace chromecast {
16 namespace media { 17 namespace media {
17 18
18 namespace { 19 namespace {
19 20
20 const char kPostProcessorsKey[] = "postprocessors"; 21 const char kPostProcessorsKey[] = "postprocessors";
21 const char kOutputStreamsKey[] = "output_streams"; 22 const char kOutputStreamsKey[] = "output_streams";
22 const char kMixPipelineKey[] = "mix"; 23 const char kMixPipelineKey[] = "mix";
23 const char kLinearizePipelineKey[] = "linearize"; 24 const char kLinearizePipelineKey[] = "linearize";
24 const char kProcessorsKey[] = "processors"; 25 const char kProcessorsKey[] = "processors";
25 const char kStreamsKey[] = "streams"; 26 const char kStreamsKey[] = "streams";
26 27
27 } // namespace 28 } // namespace
28 29
29 const char kCastAudioConfigFilePath[] = "/etc/cast_audio.json";
30
31 StreamPipelineDescriptor::StreamPipelineDescriptor( 30 StreamPipelineDescriptor::StreamPipelineDescriptor(
32 const base::ListValue* pipeline_in, 31 const base::ListValue* pipeline_in,
33 const std::unordered_set<std::string>& stream_types_in) 32 const std::unordered_set<std::string>& stream_types_in)
34 : pipeline(pipeline_in), stream_types(stream_types_in) {} 33 : pipeline(pipeline_in), stream_types(stream_types_in) {}
35 34
36 StreamPipelineDescriptor::~StreamPipelineDescriptor() = default; 35 StreamPipelineDescriptor::~StreamPipelineDescriptor() = default;
37 36
38 StreamPipelineDescriptor::StreamPipelineDescriptor( 37 StreamPipelineDescriptor::StreamPipelineDescriptor(
39 const StreamPipelineDescriptor& other) 38 const StreamPipelineDescriptor& other)
40 : StreamPipelineDescriptor(other.pipeline, other.stream_types) {} 39 : StreamPipelineDescriptor(other.pipeline, other.stream_types) {}
41 40
42 PostProcessingPipelineParser::PostProcessingPipelineParser( 41 PostProcessingPipelineParser::PostProcessingPipelineParser(
43 const std::string& json) 42 const std::string& json)
44 : postprocessor_config_(nullptr) { 43 : postprocessor_config_(nullptr) {
45 if (json.empty() && 44 if (json.empty() &&
46 !base::PathExists(base::FilePath(kCastAudioConfigFilePath))) { 45 !base::PathExists(base::FilePath(kCastAudioJsonFilePath))) {
47 LOG(WARNING) << "Could not open post-processing config in " 46 LOG(WARNING) << "Could not open post-processing config in "
48 << kCastAudioConfigFilePath << "."; 47 << kCastAudioJsonFilePath << ".";
49 return; 48 return;
50 } 49 }
51 50
52 if (json.empty()) { 51 if (json.empty()) {
53 config_dict_ = base::DictionaryValue::From( 52 config_dict_ = base::DictionaryValue::From(
54 DeserializeJsonFromFile(base::FilePath(kCastAudioConfigFilePath))); 53 DeserializeJsonFromFile(base::FilePath(kCastAudioJsonFilePath)));
55 } else { 54 } else {
56 config_dict_ = base::DictionaryValue::From(DeserializeFromJson(json)); 55 config_dict_ = base::DictionaryValue::From(DeserializeFromJson(json));
57 } 56 }
58 57
59 CHECK(config_dict_) << "Invalid JSON in " << kCastAudioConfigFilePath; 58 CHECK(config_dict_) << "Invalid JSON in " << kCastAudioJsonFilePath;
60 if (!config_dict_->GetDictionary(kPostProcessorsKey, 59 if (!config_dict_->GetDictionary(kPostProcessorsKey,
61 &postprocessor_config_)) { 60 &postprocessor_config_)) {
62 LOG(WARNING) << "No post-processor config found."; 61 LOG(WARNING) << "No post-processor config found.";
63 } 62 }
64 } 63 }
65 64
66 PostProcessingPipelineParser::~PostProcessingPipelineParser() = default; 65 PostProcessingPipelineParser::~PostProcessingPipelineParser() = default;
67 66
68 std::vector<StreamPipelineDescriptor> 67 std::vector<StreamPipelineDescriptor>
69 PostProcessingPipelineParser::GetStreamPipelines() { 68 PostProcessingPipelineParser::GetStreamPipelines() {
(...skipping 21 matching lines...) Expand all
91 CHECK(streams_list->GetString(stream, &stream_name)); 90 CHECK(streams_list->GetString(stream, &stream_name));
92 CHECK(streams_set.insert(stream_name).second) 91 CHECK(streams_set.insert(stream_name).second)
93 << "Duplicate stream type: " << stream_name; 92 << "Duplicate stream type: " << stream_name;
94 } 93 }
95 94
96 descriptors.emplace_back(processors_list, std::move(streams_set)); 95 descriptors.emplace_back(processors_list, std::move(streams_set));
97 } 96 }
98 return descriptors; 97 return descriptors;
99 } 98 }
100 99
101 std::string PostProcessingPipelineParser::GetFilePath() {
102 return kCastAudioConfigFilePath;
103 }
104
105 const base::ListValue* PostProcessingPipelineParser::GetMixPipeline() { 100 const base::ListValue* PostProcessingPipelineParser::GetMixPipeline() {
106 return GetPipelineByKey(kMixPipelineKey); 101 return GetPipelineByKey(kMixPipelineKey);
107 } 102 }
108 103
109 const base::ListValue* PostProcessingPipelineParser::GetLinearizePipeline() { 104 const base::ListValue* PostProcessingPipelineParser::GetLinearizePipeline() {
110 return GetPipelineByKey(kLinearizePipelineKey); 105 return GetPipelineByKey(kLinearizePipelineKey);
111 } 106 }
112 107
113 const base::ListValue* PostProcessingPipelineParser::GetPipelineByKey( 108 const base::ListValue* PostProcessingPipelineParser::GetPipelineByKey(
114 const std::string& key) { 109 const std::string& key) {
115 const base::DictionaryValue* stream_dict; 110 const base::DictionaryValue* stream_dict;
116 if (!postprocessor_config_ || 111 if (!postprocessor_config_ ||
117 !postprocessor_config_->GetDictionary(key, &stream_dict)) { 112 !postprocessor_config_->GetDictionary(key, &stream_dict)) {
118 LOG(WARNING) << "No post-processor description found for \"" << key 113 LOG(WARNING) << "No post-processor description found for \"" << key
119 << "\" in " << kCastAudioConfigFilePath 114 << "\" in " << kCastAudioJsonFilePath
120 << ". Using passthrough."; 115 << ". Using passthrough.";
121 return nullptr; 116 return nullptr;
122 } 117 }
123 const base::ListValue* out_list; 118 const base::ListValue* out_list;
124 CHECK(stream_dict->GetList(kProcessorsKey, &out_list)); 119 CHECK(stream_dict->GetList(kProcessorsKey, &out_list));
125 120
126 return out_list; 121 return out_list;
127 } 122 }
128 123
129 } // namepsace media 124 } // namepsace media
130 } // namespace chromecast 125 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698