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