1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #ifndef LOG_TAG
16 #define LOG_TAG "AudioPolicyConfigParser"
17 #endif
18
19 #include <sstream>
20 #include "audio_policy_config_parser.h"
21
22 #include "audio_errors.h"
23 #include "audio_adapter_info.h"
24
25 namespace OHOS {
26 namespace AudioStandard {
27 static const char *ENCODING_EAC3_NAME = "eac3";
28 static const char *FAST_DISTRIBUTE_TAG = "fast_distributed";
29
30 // LCOV_EXCL_START
LoadConfiguration()31 bool AudioPolicyConfigParser::LoadConfiguration()
32 {
33 AUDIO_INFO_LOG("Enter");
34 if (curNode_->Config(CHIP_PROD_CONFIG_FILE, nullptr, 0) != SUCCESS) {
35 if (curNode_->Config(CONFIG_FILE, nullptr, 0) != SUCCESS) {
36 AUDIO_ERR_LOG("LoadConfiguration readFile failed");
37 return false;
38 }
39 }
40
41 AudioPolicyConfigData &config = AudioPolicyConfigData::GetInstance();
42 if (curNode_->CompareName("audioPolicyConfiguration")) {
43 std::string version;
44 curNode_->GetProp("version", version);
45 config.SetVersion(version);
46 }
47
48 if (!ParseInternal(curNode_->GetChildrenNode())) {
49 AUDIO_ERR_LOG("Audio policy config xml parse failed");
50 return false;
51 }
52
53 std::unordered_map<std::string, std::string> volumeGroupMap {};
54 std::unordered_map<std::string, std::string> interruptGroupMap {};
55
56 ConvertAdapterInfoToGroupInfo(volumeGroupMap, interruptGroupMap);
57 ConvertAdapterInfoToAudioModuleInfo();
58
59 volumeGroupMap_ = volumeGroupMap;
60 interruptGroupMap_ = interruptGroupMap;
61
62 configManager_->OnAudioPolicyConfigXmlParsingCompleted();
63 configManager_->OnXmlParsingCompleted(xmlParsedDataMap_);
64 configManager_->OnVolumeGroupParsed(volumeGroupMap_);
65 configManager_->OnInterruptGroupParsed(interruptGroupMap_);
66 configManager_->OnGlobalConfigsParsed(globalConfigs_);
67
68 AUDIO_INFO_LOG("Done");
69 return true;
70 }
71
Destroy()72 void AudioPolicyConfigParser::Destroy()
73 {
74 curNode_->FreeDoc();
75 }
76
ParseInternal(std::shared_ptr<AudioXmlNode> curNode)77 bool AudioPolicyConfigParser::ParseInternal(std::shared_ptr<AudioXmlNode> curNode)
78 {
79 for (; curNode->IsNodeValid(); curNode->MoveToNext()) {
80 if (curNode->IsElementNode()) {
81 switch (GetXmlNodeTypeAsInt(curNode)) {
82 case PolicyXmlNodeType::ADAPTERS:
83 ParseAdapters(curNode->GetCopyNode());
84 break;
85 case PolicyXmlNodeType::VOLUME_GROUPS:
86 ParseGroups(curNode->GetCopyNode(), PolicyXmlNodeType::VOLUME_GROUPS);
87 break;
88 case PolicyXmlNodeType::INTERRUPT_GROUPS:
89 ParseGroups(curNode->GetCopyNode(), PolicyXmlNodeType::INTERRUPT_GROUPS);
90 break;
91 case PolicyXmlNodeType::GLOBAL_CONFIGS:
92 ParseGlobalConfigs(curNode->GetCopyNode());
93 break;
94 default:
95 ParseInternal(curNode->GetChildrenNode());
96 break;
97 }
98 }
99 }
100 return true;
101 }
102
ParseAdapters(std::shared_ptr<AudioXmlNode> curNode)103 void AudioPolicyConfigParser::ParseAdapters(std::shared_ptr<AudioXmlNode> curNode)
104 {
105 curNode->MoveToChildren();
106 AudioPolicyConfigData &config = AudioPolicyConfigData::GetInstance();
107
108 while (curNode->IsNodeValid()) {
109 if (curNode->IsElementNode()) {
110 PolicyAdapterInfo adapterInfo {};
111 std::shared_ptr<PolicyAdapterInfo> adapterInfoPtr = std::make_shared<PolicyAdapterInfo>(adapterInfo);
112 ParseAdapter(curNode->GetCopyNode(), adapterInfoPtr);
113 config.adapterInfoMap.insert({adapterInfoPtr->GetTypeEnum(), adapterInfoPtr});
114 }
115 curNode->MoveToNext();
116 }
117 }
118
ParseAdapter(std::shared_ptr<AudioXmlNode> curNode,std::shared_ptr<PolicyAdapterInfo> & adapterInfo)119 void AudioPolicyConfigParser::ParseAdapter(std::shared_ptr<AudioXmlNode> curNode,
120 std::shared_ptr<PolicyAdapterInfo> &adapterInfo)
121 {
122 std::string adapterName;
123 CHECK_AND_RETURN_LOG(curNode->GetProp("name", adapterName) == SUCCESS, "Get prop name failed");
124 std::string supportScene;
125 curNode->GetProp("supportSelectScene", supportScene);
126
127 adapterInfo->adapterName = adapterName;
128 adapterInfo->adapterSupportScene = supportScene;
129
130 curNode->MoveToChildren();
131 while (curNode->IsNodeValid()) {
132 if (curNode->IsElementNode()) {
133 switch (GetAdapterInfoTypeAsInt(curNode)) {
134 case AdapterInfoType::PIPES:
135 ParsePipes(curNode->GetCopyNode(), adapterInfo);
136 break;
137 case AdapterInfoType::DEVICES:
138 ParseDevices(curNode->GetCopyNode(), adapterInfo);
139 break;
140 default:
141 ParseAdapter(curNode->GetChildrenNode(), adapterInfo);
142 break;
143 }
144 }
145 curNode->MoveToNext();
146 }
147 }
148
ParsePipes(std::shared_ptr<AudioXmlNode> curNode,std::shared_ptr<PolicyAdapterInfo> & adapterInfo)149 void AudioPolicyConfigParser::ParsePipes(std::shared_ptr<AudioXmlNode> curNode,
150 std::shared_ptr<PolicyAdapterInfo> &adapterInfo)
151 {
152 curNode->MoveToChildren();
153 std::list<std::shared_ptr<AdapterPipeInfo>> pipeInfos = {};
154
155 while (curNode->IsNodeValid()) {
156 if (curNode->IsElementNode()) {
157 std::shared_ptr<AdapterPipeInfo> pipeInfoPtr = std::make_shared<AdapterPipeInfo>();
158 pipeInfoPtr->adapterInfo_ = adapterInfo;
159 curNode->GetProp("name", pipeInfoPtr->name_);
160 if (pipeInfoPtr->name_.find(FAST_DISTRIBUTE_TAG) != string::npos) {
161 AUDIO_WARNING_LOG("Fast distribute is not supported");
162 curNode->MoveToNext();
163 continue;
164 }
165 std::string pipeRole;
166 curNode->GetProp("role", pipeRole);
167 pipeInfoPtr->role_ = AudioDefinitionPolicyUtils::pipeRoleStrToEnum[pipeRole];
168 std::string supportDevicesStr;
169 curNode->GetProp("supportDevices", supportDevicesStr);
170 if (supportDevicesStr != "") {
171 SplitStringToList(supportDevicesStr, pipeInfoPtr->supportDevices_, ", ");
172 }
173 ParsePipeInfos(curNode->GetCopyNode(), pipeInfoPtr);
174 pipeInfos.push_back(pipeInfoPtr);
175 }
176 curNode->MoveToNext();
177 }
178 adapterInfo->pipeInfos = std::move(pipeInfos);
179 }
180
ParsePipeInfos(std::shared_ptr<AudioXmlNode> curNode,std::shared_ptr<AdapterPipeInfo> & pipeInfo)181 void AudioPolicyConfigParser::ParsePipeInfos(std::shared_ptr<AudioXmlNode> curNode,
182 std::shared_ptr<AdapterPipeInfo> &pipeInfo)
183 {
184 curNode->MoveToChildren();
185 while (curNode->IsNodeValid()) {
186 if (curNode->IsElementNode()) {
187 switch (GetPipeInfoTypeAsInt(curNode)) {
188 case PipeInfoType::PA_PROP:
189 ParsePaProp(curNode->GetCopyNode(), pipeInfo);
190 break;
191 case PipeInfoType::STREAM_PROP:
192 ParseStreamProps(curNode->GetCopyNode(), pipeInfo);
193 break;
194 case PipeInfoType::ATTRIBUTE:
195 ParseAttributes(curNode->GetCopyNode(), pipeInfo);
196 break;
197 default:
198 ParsePipeInfos(curNode->GetChildrenNode(), pipeInfo);
199 break;
200 }
201 }
202 curNode->MoveToNext();
203 }
204 }
205
ParsePaProp(std::shared_ptr<AudioXmlNode> curNode,std::shared_ptr<AdapterPipeInfo> & pipeInfo)206 void AudioPolicyConfigParser::ParsePaProp(std::shared_ptr<AudioXmlNode> curNode,
207 std::shared_ptr<AdapterPipeInfo> &pipeInfo)
208 {
209 PaPropInfo paProp = {};
210
211 if (!curNode->IsNodeValid() || !curNode->IsElementNode()) {
212 pipeInfo->paProp_ = paProp;
213 return;
214 }
215
216 curNode->GetProp("lib", paProp.lib_);
217 curNode->GetProp("role", paProp.role_);
218 curNode->GetProp("moduleName", paProp.moduleName_);
219 curNode->GetProp("fixed_latency", paProp.fixedLatency_);
220 curNode->GetProp("render_in_idle_state", paProp.renderInIdleState_);
221 pipeInfo->paProp_ = std::move(paProp);
222 }
223
ParseStreamProps(std::shared_ptr<AudioXmlNode> curNode,std::shared_ptr<AdapterPipeInfo> & pipeInfo)224 void AudioPolicyConfigParser::ParseStreamProps(std::shared_ptr<AudioXmlNode> curNode,
225 std::shared_ptr<AdapterPipeInfo> &pipeInfo)
226 {
227 curNode->MoveToChildren();
228 std::list<std::shared_ptr<PipeStreamPropInfo>> streamPropInfos = {};
229
230 while (curNode->IsNodeValid()) {
231 if (curNode->IsElementNode()) {
232 PipeStreamPropInfo streamPropInfo = {};
233 streamPropInfo.pipeInfo_ = pipeInfo;
234 std::string formatStr;
235 curNode->GetProp("format", formatStr);
236 HandleEncodingEac3SupportParsed(pipeInfo, formatStr);
237 streamPropInfo.format_ = AudioDefinitionPolicyUtils::formatStrToEnum[formatStr];
238 std::string sampleRateStr;
239 curNode->GetProp("sampleRates", sampleRateStr);
240 StringConverter(sampleRateStr, streamPropInfo.sampleRate_);
241 std::string channelLayoutStr;
242 curNode->GetProp("channelLayout", channelLayoutStr);
243 streamPropInfo.channelLayout_ = AudioDefinitionPolicyUtils::layoutStrToEnum[channelLayoutStr];
244 streamPropInfo.channels_ = AudioDefinitionPolicyUtils::ConvertLayoutToAudioChannel(
245 streamPropInfo.channelLayout_);
246 std::string bufferSizeStr;
247 curNode->GetProp("bufferSize", bufferSizeStr);
248 StringConverter(bufferSizeStr, streamPropInfo.bufferSize_);
249 std::string supportDevicesStr;
250 curNode->GetProp("supportDevices", supportDevicesStr);
251 if (supportDevicesStr != "") {
252 SplitStringToList(supportDevicesStr, streamPropInfo.supportDevices_, ", ");
253 }
254 streamPropInfos.push_back(std::make_shared<PipeStreamPropInfo>(streamPropInfo));
255 }
256 curNode->MoveToNext();
257 }
258 pipeInfo->streamPropInfos_ = std::move(streamPropInfos);
259 }
260
ParseAttributes(std::shared_ptr<AudioXmlNode> curNode,std::shared_ptr<AdapterPipeInfo> & pipeInfo)261 void AudioPolicyConfigParser::ParseAttributes(std::shared_ptr<AudioXmlNode> curNode,
262 std::shared_ptr<AdapterPipeInfo> &pipeInfo)
263 {
264 curNode->MoveToChildren();
265 std::list<std::shared_ptr<AttributeInfo>> attributeInfos = {};
266
267 while (curNode->IsNodeValid()) {
268 if (curNode->IsElementNode()) {
269 AttributeInfo attributeInfo = {};
270 curNode->GetProp("name", attributeInfo.name_);
271 curNode->GetProp("value", attributeInfo.value_);
272 ParseAttributeByName(attributeInfo, pipeInfo);
273 attributeInfos.push_back(std::make_shared<AttributeInfo>(attributeInfo));
274 }
275 curNode->MoveToNext();
276 }
277 pipeInfo->attributeInfos_ = std::move(attributeInfos);
278 }
279
ParseAttributeByName(AttributeInfo & attributeInfo,std::shared_ptr<AdapterPipeInfo> & pipeInfo)280 void AudioPolicyConfigParser::ParseAttributeByName(AttributeInfo &attributeInfo,
281 std::shared_ptr<AdapterPipeInfo> &pipeInfo)
282 {
283 if (attributeInfo.name_ == "flag") {
284 std::list<std::string> supportFlags = {};
285 std::string tmpValue = attributeInfo.value_;
286 SplitStringToList(tmpValue, supportFlags, "|");
287 for (auto flag : supportFlags) {
288 pipeInfo->supportFlags_ |= AudioDefinitionPolicyUtils::flagStrToEnum[flag];
289 }
290
291 if (pipeInfo->supportFlags_ & AUDIO_OUTPUT_FLAG_VOIP) {
292 AUDIO_INFO_LOG("Use fast voip");
293 configManager_->OnVoipConfigParsed(true);
294 }
295 } else if (attributeInfo.name_ == "preload") {
296 pipeInfo->preloadAttr_ = AudioDefinitionPolicyUtils::preloadStrToEnum[attributeInfo.value_];
297 }
298 }
299
ParseDevices(std::shared_ptr<AudioXmlNode> curNode,std::shared_ptr<PolicyAdapterInfo> & adapterInfo)300 void AudioPolicyConfigParser::ParseDevices(std::shared_ptr<AudioXmlNode> curNode,
301 std::shared_ptr<PolicyAdapterInfo> &adapterInfo)
302 {
303 curNode->MoveToChildren();
304 std::list<std::shared_ptr<AdapterDeviceInfo>> deviceInfos = {};
305
306 while (curNode->IsNodeValid()) {
307 if (curNode->IsElementNode()) {
308 AdapterDeviceInfo deviceInfo {};
309 deviceInfo.adapterInfo_ = adapterInfo;
310 curNode->GetProp("name", deviceInfo.name_);
311 std::string type;
312 curNode->GetProp("type", type);
313 deviceInfo.type_ = AudioDefinitionPolicyUtils::deviceTypeStrToEnum[type];
314 std::string pin;
315 curNode->GetProp("pin", pin);
316 deviceInfo.pin_ = AudioDefinitionPolicyUtils::pinStrToEnum[pin];
317 std::string role;
318 curNode->GetProp("role", role);
319 deviceInfo.role_ = AudioDefinitionPolicyUtils::deviceRoleStrToEnum[role];
320 std::string supportPipeInStr;
321 curNode->GetProp("supportPipes", supportPipeInStr);
322 SplitStringToList(supportPipeInStr, deviceInfo.supportPipes_, ",");
323 deviceInfos.push_back(std::make_shared<AdapterDeviceInfo>(deviceInfo));
324 }
325 curNode->MoveToNext();
326 }
327 adapterInfo->deviceInfos = std::move(deviceInfos);
328 }
329
ParseGroups(std::shared_ptr<AudioXmlNode> curNode,PolicyXmlNodeType type)330 void AudioPolicyConfigParser::ParseGroups(std::shared_ptr<AudioXmlNode> curNode, PolicyXmlNodeType type)
331 {
332 curNode->MoveToChildren();
333
334 while (curNode->IsNodeValid()) {
335 if (curNode->IsElementNode()) {
336 ParseGroup(curNode->GetCopyNode(), type);
337 }
338 curNode->MoveToNext();
339 }
340 }
341
ParseGroup(std::shared_ptr<AudioXmlNode> curNode,PolicyXmlNodeType type)342 void AudioPolicyConfigParser::ParseGroup(std::shared_ptr<AudioXmlNode> curNode, PolicyXmlNodeType type)
343 {
344 curNode->MoveToChildren();
345
346 while (curNode->IsNodeValid()) {
347 if (curNode->IsElementNode()) {
348 std::string groupName;
349 curNode->GetProp("name", groupName);
350 ParseGroupSink(curNode->GetCopyNode(), type, groupName);
351 }
352 curNode->MoveToNext();
353 }
354 }
355
ParseGroupSink(std::shared_ptr<AudioXmlNode> curNode,PolicyXmlNodeType type,std::string & groupName)356 void AudioPolicyConfigParser::ParseGroupSink(
357 std::shared_ptr<AudioXmlNode> curNode, PolicyXmlNodeType type, std::string &groupName)
358 {
359 curNode->MoveToChildren();
360
361 while (curNode->IsNodeValid()) {
362 if (curNode->IsElementNode()) {
363 std::string sinkName;
364 curNode->GetProp("name", sinkName);
365 if (type == PolicyXmlNodeType::VOLUME_GROUPS) {
366 volumeGroupMap_[sinkName] = groupName;
367 } else if (type == PolicyXmlNodeType::INTERRUPT_GROUPS) {
368 interruptGroupMap_[sinkName] = groupName;
369 }
370 }
371 curNode->MoveToNext();
372 }
373 }
374
ParseGlobalConfigs(std::shared_ptr<AudioXmlNode> curNode)375 void AudioPolicyConfigParser::ParseGlobalConfigs(std::shared_ptr<AudioXmlNode> curNode)
376 {
377 curNode->MoveToChildren();
378 while (curNode->IsNodeValid()) {
379 if (curNode->IsElementNode()) {
380 switch (GetGlobalConfigTypeAsInt(curNode)) {
381 case PolicyGlobalConfigType::DEFAULT_OUTPUT:
382 curNode->GetProp("adapter", globalConfigs_.adapter_);
383 curNode->GetProp("pipe", globalConfigs_.pipe_);
384 curNode->GetProp("device", globalConfigs_.device_);
385 break;
386 case PolicyGlobalConfigType::COMMON_CONFIGS:
387 ParseCommonConfigs(curNode->GetCopyNode());
388 break;
389 case PolicyGlobalConfigType::PA_CONFIGS:
390 ParsePAConfigs(curNode->GetCopyNode());
391 break;
392 default:
393 ParseGlobalConfigs(curNode->GetChildrenNode());
394 break;
395 }
396 }
397 curNode->MoveToNext();
398 }
399 }
400
GetGlobalConfigTypeAsInt(std::shared_ptr<AudioXmlNode> curNode)401 PolicyGlobalConfigType AudioPolicyConfigParser::GetGlobalConfigTypeAsInt(std::shared_ptr<AudioXmlNode> curNode)
402 {
403 if (curNode->CompareName("defaultOutput")) {
404 return PolicyGlobalConfigType::DEFAULT_OUTPUT;
405 } else if (curNode->CompareName("commonConfigs")) {
406 return PolicyGlobalConfigType::COMMON_CONFIGS;
407 } else if (curNode->CompareName("paConfigs")) {
408 return PolicyGlobalConfigType::PA_CONFIGS;
409 } else {
410 return PolicyGlobalConfigType::UNKNOWN;
411 }
412 }
413
ParsePAConfigs(std::shared_ptr<AudioXmlNode> curNode)414 void AudioPolicyConfigParser::ParsePAConfigs(std::shared_ptr<AudioXmlNode> curNode)
415 {
416 curNode->MoveToChildren();
417
418 while (curNode->IsNodeValid()) {
419 if (curNode->IsElementNode()) {
420 std::string name;
421 std::string value;
422 curNode->GetProp("name", name);
423 curNode->GetProp("value", value);
424 uint64_t convertValue = 0;
425
426 switch (GetPaConfigType(name)) {
427 case PolicyPAConfigType::FAST_FORMAT:
428 configManager_->OnFastFormatParsed(ConvertToFormat(value));
429 break;
430 case PolicyPAConfigType::AUDIO_LATENCY:
431 CHECK_AND_RETURN_LOG(StringConverter(value, convertValue),
432 "convert invalid value: %{public}s", value.c_str());
433 configManager_->OnAudioLatencyParsed(convertValue);
434 globalConfigs_.globalPaConfigs_.audioLatency_ = value;
435 break;
436 case PolicyPAConfigType::SINK_LATENCY:
437 CHECK_AND_RETURN_LOG(StringConverter(value, convertValue),
438 "convert invalid value: %{public}s", value.c_str());
439 configManager_->OnSinkLatencyParsed(convertValue);
440 globalConfigs_.globalPaConfigs_.sinkLatency_ = value;
441 break;
442 default:
443 ParsePAConfigs(curNode->GetChildrenNode());
444 break;
445 }
446 }
447 curNode->MoveToNext();
448 }
449 }
450
451 // only support s16le and s32le
ConvertToFormat(std::string value)452 AudioSampleFormat AudioPolicyConfigParser::ConvertToFormat(std::string value)
453 {
454 AudioSampleFormat format = SAMPLE_S16LE;
455 if (value == "s16le") {
456 format = SAMPLE_S16LE;
457 }
458
459 if (value == "s32le") {
460 format = SAMPLE_S32LE;
461 }
462 return format;
463 }
464
GetPaConfigType(std::string & name)465 PolicyPAConfigType AudioPolicyConfigParser::GetPaConfigType(std::string &name)
466 {
467 if (name =="audioLatency") {
468 return PolicyPAConfigType::AUDIO_LATENCY;
469 } else if (name =="sinkLatency") {
470 return PolicyPAConfigType::SINK_LATENCY;
471 } else if (name =="fastFormat") {
472 return PolicyPAConfigType::FAST_FORMAT;
473 } else {
474 return PolicyPAConfigType::UNKNOWN;
475 }
476 }
477
478
ParseCommonConfigs(std::shared_ptr<AudioXmlNode> curNode)479 void AudioPolicyConfigParser::ParseCommonConfigs(std::shared_ptr<AudioXmlNode> curNode)
480 {
481 curNode->MoveToChildren();
482 std::list<PolicyConfigInfo> configInfos;
483
484 while (curNode->IsNodeValid()) {
485 if (curNode->IsElementNode()) {
486 PolicyConfigInfo configInfo = {};
487 curNode->GetProp("name", configInfo.name_);
488 curNode->GetProp("value", configInfo.value_);
489 configInfos.push_back(configInfo);
490 if (configInfo.name_ == "updateRouteSupport") {
491 AUDIO_INFO_LOG("update route support: %{public}s", configInfo.value_.c_str());
492 HandleUpdateRouteSupportParsed(configInfo.value_);
493 } else if (configInfo.name_ == "anahsShowType") {
494 AUDIO_INFO_LOG("anahs pc support: %{public}s", configInfo.value_.c_str());
495 HandleUpdateAnahsSupportParsed(configInfo.value_);
496 } else if (configInfo.name_ == "setDefaultAdapter") {
497 AUDIO_INFO_LOG("default adapter support: %{public}s", configInfo.value_.c_str());
498 HandleDefaultAdapterSupportParsed(configInfo.value_);
499 }
500 }
501 curNode->MoveToNext();
502 }
503 globalConfigs_.commonConfigs_ = configInfos;
504 }
505
HandleUpdateRouteSupportParsed(std::string & value)506 void AudioPolicyConfigParser::HandleUpdateRouteSupportParsed(std::string &value)
507 {
508 if (value == "true") {
509 configManager_->OnUpdateRouteSupport(true);
510 shouldOpenMicSpeaker_ = true;
511 } else {
512 configManager_->OnUpdateRouteSupport(false);
513 shouldOpenMicSpeaker_ = false;
514 }
515 }
516
HandleUpdateAnahsSupportParsed(std::string & value)517 void AudioPolicyConfigParser::HandleUpdateAnahsSupportParsed(std::string &value)
518 {
519 std::string anahsShowType = "Dialog";
520 anahsShowType = value;
521 AUDIO_INFO_LOG("HandleUpdateAnahsSupportParsed show type: %{public}s", anahsShowType.c_str());
522 configManager_->OnUpdateAnahsSupport(anahsShowType);
523 }
524
HandleDefaultAdapterSupportParsed(std::string & value)525 void AudioPolicyConfigParser::HandleDefaultAdapterSupportParsed(std::string &value)
526 {
527 if (value == "true") {
528 configManager_->OnUpdateDefaultAdapter(true);
529 shouldSetDefaultAdapter_ = true;
530 } else {
531 configManager_->OnUpdateDefaultAdapter(false);
532 shouldSetDefaultAdapter_ = false;
533 }
534 }
535
HandleEncodingEac3SupportParsed(std::shared_ptr<AdapterPipeInfo> pipeInfo,const std::string & value)536 void AudioPolicyConfigParser::HandleEncodingEac3SupportParsed(std::shared_ptr<AdapterPipeInfo> pipeInfo,
537 const std::string &value)
538 {
539 CHECK_AND_RETURN_LOG(pipeInfo != nullptr, "pipeInfo is nullptr");
540 if (value == ENCODING_EAC3_NAME) {
541 pipeInfo->supportEncodingEac3_ = true;
542 configManager_->OnUpdateEac3Support(true);
543 }
544 }
545
SplitStringToList(std::string & str,std::list<std::string> & result,const char * delim)546 void AudioPolicyConfigParser::SplitStringToList(std::string &str, std::list<std::string> &result, const char *delim)
547 {
548 char *token = std::strtok(&str[0], delim);
549 while (token != nullptr) {
550 result.push_back(token);
551 token = std::strtok(nullptr, delim);
552 }
553 }
554
GetXmlNodeTypeAsInt(std::shared_ptr<AudioXmlNode> curNode)555 PolicyXmlNodeType AudioPolicyConfigParser::GetXmlNodeTypeAsInt(std::shared_ptr<AudioXmlNode> curNode)
556 {
557 if (curNode->CompareName("adapters")) {
558 return PolicyXmlNodeType::ADAPTERS;
559 } else if (curNode->CompareName("volumeGroups")) {
560 return PolicyXmlNodeType::VOLUME_GROUPS;
561 } else if (curNode->CompareName("interruptGroups")) {
562 return PolicyXmlNodeType::INTERRUPT_GROUPS;
563 } else if (curNode->CompareName("globalConfigs")) {
564 return PolicyXmlNodeType::GLOBAL_CONFIGS;
565 } else {
566 return PolicyXmlNodeType::XML_UNKNOWN;
567 }
568 }
569
GetAdapterInfoTypeAsInt(std::shared_ptr<AudioXmlNode> curNode)570 AdapterInfoType AudioPolicyConfigParser::GetAdapterInfoTypeAsInt(std::shared_ptr<AudioXmlNode> curNode)
571 {
572 if (curNode->CompareName("pipes")) {
573 return AdapterInfoType::PIPES;
574 } else if (curNode->CompareName("devices")) {
575 return AdapterInfoType::DEVICES;
576 } else {
577 return AdapterInfoType::UNKNOWN;
578 }
579 }
580
GetPipeInfoTypeAsInt(std::shared_ptr<AudioXmlNode> curNode)581 PipeInfoType AudioPolicyConfigParser::GetPipeInfoTypeAsInt(std::shared_ptr<AudioXmlNode> curNode)
582 {
583 if (curNode->CompareName("paProp")) {
584 return PipeInfoType::PA_PROP;
585 } else if (curNode->CompareName("streamProps")) {
586 return PipeInfoType::STREAM_PROP;
587 } else if (curNode->CompareName("attributes")) {
588 return PipeInfoType::ATTRIBUTE;
589 } else {
590 return PipeInfoType::UNKNOWN;
591 }
592 }
593
594
ConvertAdapterInfoToGroupInfo(std::unordered_map<std::string,std::string> & volumeGroupMap,std::unordered_map<std::string,std::string> & interruptGroupMap)595 void AudioPolicyConfigParser::ConvertAdapterInfoToGroupInfo(
596 std::unordered_map<std::string, std::string> &volumeGroupMap,
597 std::unordered_map<std::string, std::string> &interruptGroupMap)
598 {
599 for (auto &[sinkName, groupName] : volumeGroupMap_) {
600 volumeGroupMap["Speaker"] = groupName;
601 }
602
603 for (auto &[sinkName, groupName] : interruptGroupMap_) {
604 interruptGroupMap["Speaker"] = groupName;
605 }
606 }
607
ConvertAdapterInfoToAudioModuleInfo()608 void AudioPolicyConfigParser::ConvertAdapterInfoToAudioModuleInfo()
609 {
610 AudioPolicyConfigData &config = AudioPolicyConfigData::GetInstance();
611 for (auto &adapterInfoIt : config.adapterInfoMap) {
612 std::list<AudioModuleInfo> audioModuleList = {};
613 bool shouldEnableOffload = false;
614 if (adapterInfoIt.first == AudioAdapterType::TYPE_PRIMARY) {
615 GetOffloadAndOpenMicState(adapterInfoIt.second, shouldEnableOffload);
616 }
617
618 AudioPipeRole currentRole = PIPE_ROLE_NONE;
619 for (auto &pipeInfo : adapterInfoIt.second->pipeInfos) {
620 if (currentRole == pipeInfo->role_) {
621 continue;
622 }
623 currentRole = pipeInfo->role_;
624 CHECK_AND_CONTINUE_LOG(pipeInfo->name_.find(MODULE_SINK_OFFLOAD) == std::string::npos,
625 "skip offload out sink.");
626 AudioModuleInfo audioModuleInfo = {};
627 GetCommontAudioModuleInfo(pipeInfo, audioModuleInfo);
628
629 audioModuleInfo.className = adapterInfoIt.second->adapterName;
630 // The logic here strongly depends on the moduleName in the XML
631 if (pipeInfo->paProp_.moduleName_ != "") {
632 audioModuleInfo.name = pipeInfo->paProp_.moduleName_;
633 } else {
634 audioModuleInfo.name = GetAudioModuleInfoName(pipeInfo->name_, adapterInfoIt.second->deviceInfos);
635 }
636
637 audioModuleInfo.adapterName = adapterInfoIt.second->adapterName;
638 if (adapterInfoIt.first == AudioAdapterType::TYPE_FILE_IO) {
639 audioModuleInfo.adapterName = STR_INIT;
640 audioModuleInfo.format = STR_INIT;
641 audioModuleInfo.className = FILE_CLASS;
642 }
643 audioModuleInfo.sinkLatency = globalConfigs_.globalPaConfigs_.sinkLatency_;
644
645 audioModuleInfo.OpenMicSpeaker = shouldOpenMicSpeaker_ ? "1" : "0";
646 if (adapterInfoIt.first == AudioAdapterType::TYPE_PRIMARY &&
647 shouldEnableOffload && pipeInfo->paProp_.role_ == MODULE_TYPE_SINK) {
648 audioModuleInfo.offloadEnable = "1";
649 }
650 audioModuleList.push_back(audioModuleInfo);
651 }
652 std::list<AudioModuleInfo> audioModuleListTmp = audioModuleList;
653 std::list<AudioModuleInfo> audioModuleListData = {};
654 for (auto audioModuleInfo : audioModuleList) {
655 audioModuleInfo.ports = audioModuleListTmp;
656 audioModuleListData.push_back(audioModuleInfo);
657 AUDIO_WARNING_LOG("name:%{public}s, adapter name:%{public}s, adapter type:%{public}d",
658 audioModuleInfo.name.c_str(), audioModuleInfo.adapterName.c_str(), adapterInfoIt.first);
659 }
660 ClassType classType = GetClassTypeByAdapterType(adapterInfoIt.first);
661 xmlParsedDataMap_[classType] = audioModuleListData;
662 }
663 }
664
GetOffloadAndOpenMicState(std::shared_ptr<PolicyAdapterInfo> & adapterInfo,bool & shouldEnableOffload)665 void AudioPolicyConfigParser::GetOffloadAndOpenMicState(std::shared_ptr<PolicyAdapterInfo> &adapterInfo,
666 bool &shouldEnableOffload)
667 {
668 for (auto &pipeInfo : adapterInfo->pipeInfos) {
669 if (pipeInfo->paProp_.role_ == MODULE_TYPE_SINK &&
670 pipeInfo->name_.find(MODULE_SINK_OFFLOAD) != std::string::npos) {
671 shouldEnableOffload = true;
672 }
673 }
674 }
675
GetCommontAudioModuleInfo(std::shared_ptr<AdapterPipeInfo> & pipeInfo,AudioModuleInfo & audioModuleInfo)676 void AudioPolicyConfigParser::GetCommontAudioModuleInfo(std::shared_ptr<AdapterPipeInfo> &pipeInfo,
677 AudioModuleInfo &audioModuleInfo)
678 {
679 audioModuleInfo.role = pipeInfo->paProp_.role_;
680
681 for (auto &streamPropInfo : pipeInfo->streamPropInfos_) {
682 audioModuleInfo.supportedRate_.insert(streamPropInfo->sampleRate_);
683 audioModuleInfo.supportedChannelLayout_.insert(streamPropInfo->channelLayout_);
684 }
685
686 audioModuleInfo.lib = pipeInfo->paProp_.lib_;
687
688 if (pipeInfo->streamPropInfos_.size() != 0) {
689 audioModuleInfo.rate = std::to_string(pipeInfo->streamPropInfos_.front()->sampleRate_);
690 audioModuleInfo.format = AudioDefinitionPolicyUtils::enumToFormatStr[
691 pipeInfo->streamPropInfos_.front()->format_];
692 audioModuleInfo.channels = std::to_string(pipeInfo->streamPropInfos_.front()->channels_);
693 audioModuleInfo.bufferSize = std::to_string(pipeInfo->streamPropInfos_.front()->bufferSize_);
694 }
695
696 for (auto &attributeInfo : pipeInfo->attributeInfos_) {
697 if (attributeInfo->name_ == "filePath") {
698 audioModuleInfo.fileName = attributeInfo->value_;
699 }
700 }
701
702 audioModuleInfo.fixedLatency = pipeInfo->paProp_.fixedLatency_;
703 audioModuleInfo.renderInIdleState = pipeInfo->paProp_.renderInIdleState_;
704 }
705
GetAudioModuleInfoName(std::string & pipeInfoName,std::list<std::shared_ptr<AdapterDeviceInfo>> & deviceInfos)706 std::string AudioPolicyConfigParser::GetAudioModuleInfoName(std::string &pipeInfoName,
707 std::list<std::shared_ptr<AdapterDeviceInfo>> &deviceInfos)
708 {
709 for (auto &deviceInfo : deviceInfos) {
710 if (std::find(deviceInfo->supportPipes_.begin(), deviceInfo->supportPipes_.end(), pipeInfoName) !=
711 deviceInfo->supportPipes_.end()) {
712 return deviceInfo->name_;
713 }
714 }
715 return "";
716 }
717
GetClassTypeByAdapterType(AudioAdapterType adapterType)718 ClassType AudioPolicyConfigParser::GetClassTypeByAdapterType(AudioAdapterType adapterType)
719 {
720 if (adapterType == AudioAdapterType::TYPE_PRIMARY) {
721 return ClassType::TYPE_PRIMARY;
722 } else if (adapterType == AudioAdapterType::TYPE_A2DP) {
723 return ClassType::TYPE_A2DP;
724 } else if (adapterType == AudioAdapterType::TYPE_HEARING_AID) {
725 return ClassType::TYPE_HEARING_AID;
726 } else if (adapterType == AudioAdapterType::TYPE_REMOTE_AUDIO) {
727 return ClassType::TYPE_REMOTE_AUDIO;
728 } else if (adapterType == AudioAdapterType::TYPE_FILE_IO) {
729 return ClassType::TYPE_FILE_IO;
730 } else if (adapterType == AudioAdapterType::TYPE_USB) {
731 return ClassType::TYPE_USB;
732 } else if (adapterType == AudioAdapterType::TYPE_DP) {
733 return ClassType::TYPE_DP;
734 } else if (adapterType == AudioAdapterType::TYPE_ACCESSORY) {
735 return ClassType::TYPE_ACCESSORY;
736 } else {
737 return ClassType::TYPE_INVALID;
738 }
739 }
740
741 }
742 }
743