1 /*
2  * Copyright (c) 2024 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 
16 #ifndef AUDIO_POLICY_PARSER_H
17 #define AUDIO_POLICY_PARSER_H
18 
19 #include <list>
20 #include <libxml/parser.h>
21 #include <libxml/tree.h>
22 #include <unordered_map>
23 #include <string>
24 #include <regex>
25 
26 #include "audio_adapter_info.h"
27 #include "audio_device_info.h"
28 #include "audio_stream_info.h"
29 #include "iport_observer.h"
30 #include "parser.h"
31 
32 namespace OHOS {
33 namespace AudioStandard {
34 class AudioPolicyParser : public Parser {
35 public:
36     static constexpr char CHIP_PROD_CONFIG_FILE[] = "/chip_prod/etc/audio/audio_policy_config.xml";
37     static constexpr char CONFIG_FILE[] = "vendor/etc/audio/audio_policy_config.xml";
38 
39     bool LoadConfiguration() final;
40     bool Parse() final;
41     void Destroy() final;
42 
AudioPolicyParser(IPortObserver & observer)43     explicit AudioPolicyParser(IPortObserver &observer)
44         : portObserver_(observer),
45           doc_(nullptr)
46     {
47     }
48 
~AudioPolicyParser()49     virtual ~AudioPolicyParser()
50     {
51         Destroy();
52     }
53 
54 private:
55     AdapterType GetAdapterTypeAsInt(xmlNode &node);
56     PipeType GetPipeInfoTypeAsInt(xmlNode &node);
57     GlobalConfigType GetGlobalConfigTypeAsInt(xmlNode &node);
58     XmlNodeType GetXmlNodeTypeAsInt(xmlNode &node);
59     DefaultMaxInstanceType GetDefaultMaxInstanceTypeAsInt(xmlNode &node);
60     StreamType GetStreamTypeAsInt(xmlNode &node);
61 
62     bool ParseInternal(xmlNode &node);
63     void ParseAdapters(xmlNode &node);
64     void ParseAdapter(xmlNode &node);
65     void ParsePipes(xmlNode &node, AudioAdapterInfo &adapterInfo);
66     void ParsePipeInfos(xmlNode &node, PipeInfo &pipeInfo);
67     void ParseStreamProps(xmlNode &node, PipeInfo &pipeInfo);
68     void ParseConfigs(xmlNode &node, PipeInfo &pipeInfo);
69     void HandleConfigFlagAndUsage(ConfigInfo &configInfo, PipeInfo &pipeInfo);
70     void ParseDevices(xmlNode &node, AudioAdapterInfo &adapterInfo);
71     void ParseGroups(xmlNode& node, XmlNodeType type);
72     void ParseGroup(xmlNode& node, XmlNodeType type);
73     void ParseGroupSink(xmlNode &node, XmlNodeType type, std::string &groupName);
74     void ParseGlobalConfigs(xmlNode& node);
75     void ParsePAConfigs(xmlNode& node);
76     void ParseDefaultMaxInstances(xmlNode& node);
77     void ParseOutputMaxInstances(xmlNode& node);
78     void ParseInputMaxInstances(xmlNode& node);
79     void ParseCommonConfigs(xmlNode& node);
80 
81     void HandleUpdateRouteSupportParsed(std::string &value);
82     PAConfigType GetPaConfigType(std::string &name);
83 
84     void SplitStringToList(std::string &str, std::list<std::string> &result);
85     void SplitChannelStringToSet(std::string &str, std::set<uint32_t> &result);
86 
87     std::string ExtractPropertyValue(const std::string &propName, xmlNode &node);
88     AdaptersType GetAdaptersType(const std::string &adapterClass);
89 
90     std::string GetAudioModuleInfoName(std::string &pipeInfoName, std::list<AudioPipeDeviceInfo> &deviceInfos);
91     void ConvertAdapterInfoToAudioModuleInfo();
92     void ConvertAdapterInfoToGroupInfo(std::unordered_map<std::string, std::string> &volumeGroupMap,
93         std::unordered_map<std::string, std::string> &interruptGroupMap);
94     void GetCommontAudioModuleInfo(PipeInfo &pipeInfo, AudioModuleInfo &audioModuleInfo);
95     ClassType GetClassTypeByAdapterType(AdaptersType adapterType);
96     void GetOffloadAndOpenMicState(AudioAdapterInfo &adapterInfo, bool &shouldEnableOffload);
97 
98     IPortObserver &portObserver_;
99     xmlDoc *doc_;
100     std::unordered_map<AdaptersType, AudioAdapterInfo> adapterInfoMap_ {};
101     std::unordered_map<ClassType, std::list<AudioModuleInfo>> xmlParsedDataMap_ {};
102     std::unordered_map<std::string, std::string> volumeGroupMap_;
103     std::unordered_map<std::string, std::string> interruptGroupMap_;
104     GlobalConfigs globalConfigs_;
105     bool shouldOpenMicSpeaker_ = false;
106 };
107 } // namespace AudioStandard
108 } // namespace OHOS
109 
110 #endif // AUDIO_POLICY_PARSER_H
111