1 /*
2  * Copyright (c) 2021-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 SERVICE_CONFIG_AUDIO_CONCURRENCY_PARSER_H
17 #define SERVICE_CONFIG_AUDIO_CONCURRENCY_PARSER_H
18 
19 #include <map>
20 #include <string>
21 #include <libxml/parser.h>
22 #include <libxml/tree.h>
23 #include "audio_errors.h"
24 #include "audio_info.h"
25 #include "audio_policy_log.h"
26 
27 namespace OHOS {
28 namespace AudioStandard {
29 
30 enum ConcurrencyAction {
31     PLAY_BOTH,
32     CONCEDE_INCOMING,
33     CONCEDE_EXISTING,
34 };
35 
36 class AudioConcurrencyParser {
37 public:
38     static constexpr char AUDIO_CONCURRENCY_CONFIG_FILE[] = "vendor/etc/audio/audio_concurrency_config.xml";
AudioConcurrencyParser()39     AudioConcurrencyParser()
40     {
41         AUDIO_INFO_LOG("AudioConcurrencyParser ctor");
42     }
~AudioConcurrencyParser()43     virtual ~AudioConcurrencyParser()
44     {
45         if (doc_ != nullptr) {
46             xmlFreeDoc(doc_);
47             AUDIO_DEBUG_LOG("xml doc freed in dtor");
48         }
49         AUDIO_DEBUG_LOG("AudioConcurrencyParser dtor");
50     }
51     int32_t LoadConfig(std::map<std::pair<AudioPipeType, AudioPipeType>, ConcurrencyAction> &concurrencyMap);
52 
53 private:
54     void ParseInternal(xmlNode *node, std::map<std::pair<AudioPipeType, AudioPipeType>,
55         ConcurrencyAction> &concurrencyMap);
56     void ParseIncoming(const std::string &existing, xmlNode *node,
57         std::map<std::pair<AudioPipeType, AudioPipeType>, ConcurrencyAction> &concurrencyMap);
58     xmlDoc *doc_ = nullptr;
59     std::map<std::string, AudioPipeType> audioPipeTypeMap_ = {
60         {"primary out", PIPE_TYPE_NORMAL_OUT},
61         {"primary in", PIPE_TYPE_NORMAL_IN},
62         {"lowlatency out", PIPE_TYPE_LOWLATENCY_OUT},
63         {"lowlatency in", PIPE_TYPE_LOWLATENCY_IN},
64         {"offload", PIPE_TYPE_OFFLOAD},
65         {"multichannel", PIPE_TYPE_MULTICHANNEL},
66         {"direct", PIPE_TYPE_DIRECT_MUSIC},
67         {"call out", PIPE_TYPE_CALL_OUT},
68         {"call in", PIPE_TYPE_CALL_IN}
69     };
70 };
71 } // namespace AudioStandard
72 } // namespace OHOS
73 #endif // SERVICE_CONFIG_AUDIO_CONCURRENCY_PARSER_H