1 /*
2  * Copyright (c) 2023 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_USAGE_STRATEGY_PARSER_H
17 #define AUDIO_USAGE_STRATEGY_PARSER_H
18 
19 #include <list>
20 #include <unordered_map>
21 #include <string>
22 #include <sstream>
23 #include <libxml/parser.h>
24 #include <libxml/tree.h>
25 
26 #include "audio_policy_log.h"
27 #include "audio_info.h"
28 #include "iport_observer.h"
29 #include "parser.h"
30 
31 namespace OHOS {
32 namespace AudioStandard {
33 using namespace std;
34 
35 class AudioUsageStrategyParser : public Parser {
36 public:
37     static constexpr char DEVICE_CONFIG_FILE[] = "system/etc/audio/audio_usage_strategy.xml";
38 
39     bool LoadConfiguration() final;
40     bool Parse() final;
41     void Destroy() final;
42 
AudioUsageStrategyParser()43     AudioUsageStrategyParser()
44     {
45         AUDIO_DEBUG_LOG("AudioUsageStrategyParser ctor");
46     }
47 
~AudioUsageStrategyParser()48     virtual ~AudioUsageStrategyParser()
49     {
50         AUDIO_DEBUG_LOG("AudioUsageStrategyParser dtor");
51         Destroy();
52     }
53 
54     std::unordered_map<StreamUsage, std::string> renderConfigMap_;
55     std::unordered_map<SourceType, std::string> capturerConfigMap_;
56 
57 private:
58     bool ParseInternal(xmlNode *node);
59     void ParserStreamUsageList(xmlNode *node);
60     void ParserSourceTypeList(xmlNode *node);
61     void ParserStreamUsageInfo(const std::string &strategyName, const std::string &streamUsage);
62     void ParserStreamUsage(const std::vector<std::string> &buf, const std::string &routerName);
63     void ParserSourceTypeInfo(const std::string &sourceType, const std::string &nameSourceType);
64     void ParserSourceTypes(const std::vector<std::string> &buf, const std::string &sourceTypes);
65 
66     std::vector<std::string> split(const std::string &line, const std::string &sep);
67 
68     const unordered_map<string, StreamUsage> streamUsageMap = {
69         {"STREAM_USAGE_UNKNOWN", STREAM_USAGE_UNKNOWN},
70         {"STREAM_USAGE_MEDIA", STREAM_USAGE_MEDIA},
71         {"STREAM_USAGE_MUSIC", STREAM_USAGE_MUSIC},
72         {"STREAM_USAGE_VOICE_COMMUNICATION", STREAM_USAGE_VOICE_COMMUNICATION},
73         {"STREAM_USAGE_VOICE_ASSISTANT", STREAM_USAGE_VOICE_ASSISTANT},
74         {"STREAM_USAGE_VOICE_CALL_ASSISTANT", STREAM_USAGE_VOICE_CALL_ASSISTANT},
75         {"STREAM_USAGE_ALARM", STREAM_USAGE_ALARM},
76         {"STREAM_USAGE_VOICE_MESSAGE", STREAM_USAGE_VOICE_MESSAGE},
77         {"STREAM_USAGE_NOTIFICATION_RINGTONE", STREAM_USAGE_NOTIFICATION_RINGTONE},
78         {"STREAM_USAGE_RINGTONE", STREAM_USAGE_RINGTONE},
79         {"STREAM_USAGE_NOTIFICATION", STREAM_USAGE_NOTIFICATION},
80         {"STREAM_USAGE_ACCESSIBILITY", STREAM_USAGE_ACCESSIBILITY},
81         {"STREAM_USAGE_SYSTEM", STREAM_USAGE_SYSTEM},
82         {"STREAM_USAGE_MOVIE", STREAM_USAGE_MOVIE},
83         {"STREAM_USAGE_GAME", STREAM_USAGE_GAME},
84         {"STREAM_USAGE_AUDIOBOOK", STREAM_USAGE_AUDIOBOOK},
85         {"STREAM_USAGE_NAVIGATION", STREAM_USAGE_NAVIGATION},
86         {"STREAM_USAGE_DTMF", STREAM_USAGE_DTMF},
87         {"STREAM_USAGE_ENFORCED_TONE", STREAM_USAGE_ENFORCED_TONE},
88         {"STREAM_USAGE_ULTRASONIC", STREAM_USAGE_ULTRASONIC},
89         {"STREAM_USAGE_VIDEO_COMMUNICATION", STREAM_USAGE_VIDEO_COMMUNICATION},
90         {"STREAM_USAGE_RANGING", STREAM_USAGE_RANGING},
91         {"STREAM_USAGE_VOICE_MODEM_COMMUNICATION", STREAM_USAGE_VOICE_MODEM_COMMUNICATION},
92         {"STREAM_USAGE_VOICE_RINGTONE", STREAM_USAGE_VOICE_RINGTONE},
93     };
94 
95     const unordered_map<string, SourceType> sourceTypeMap = {
96         {"SOURCE_TYPE_MIC", SOURCE_TYPE_MIC},
97         {"SOURCE_TYPE_CAMCORDER", SOURCE_TYPE_CAMCORDER},
98         {"SOURCE_TYPE_VOICE_RECOGNITION", SOURCE_TYPE_VOICE_RECOGNITION},
99         {"SOURCE_TYPE_PLAYBACK_CAPTURE", SOURCE_TYPE_PLAYBACK_CAPTURE},
100         {"SOURCE_TYPE_WAKEUP", SOURCE_TYPE_WAKEUP},
101         {"SOURCE_TYPE_VOICE_COMMUNICATION", SOURCE_TYPE_VOICE_COMMUNICATION},
102         {"SOURCE_TYPE_VOICE_CALL", SOURCE_TYPE_VOICE_CALL},
103         {"SOURCE_TYPE_ULTRASONIC", SOURCE_TYPE_ULTRASONIC},
104         {"SOURCE_TYPE_VIRTUAL_CAPTURE", SOURCE_TYPE_VIRTUAL_CAPTURE},
105         {"SOURCE_TYPE_VOICE_MESSAGE", SOURCE_TYPE_VOICE_MESSAGE},
106         {"SOURCE_TYPE_VOICE_TRANSCRIPTION", SOURCE_TYPE_VOICE_TRANSCRIPTION},
107         {"SOURCE_TYPE_UNPROCESSED", SOURCE_TYPE_UNPROCESSED},
108     };
109 
110     xmlDoc *doc_;
111 };
112 } // namespace AudioStandard
113 } // namespace OHOS
114 #endif // AUDIO_USAGE_STRATEGY_PARSER_H
115