• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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