1 /*
2 * Copyright (c) 2021-2022 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 #include "audio_concurrency_parser.h"
16
17 namespace OHOS {
18 namespace AudioStandard {
19
LoadConfig(std::map<std::pair<AudioPipeType,AudioPipeType>,ConcurrencyAction> & concurrencyMap)20 int32_t AudioConcurrencyParser::LoadConfig(std::map<std::pair<AudioPipeType, AudioPipeType>,
21 ConcurrencyAction> &concurrencyMap)
22 {
23 AUDIO_INFO_LOG("start.");
24 CHECK_AND_RETURN_RET_LOG(curNode_->Config(AUDIO_CONCURRENCY_CONFIG_FILE, nullptr, 0) == SUCCESS, ERROR,
25 "AudioConcurrencyParser loadXmlFile Failed!");
26 if (!curNode_->CompareName("audioConcurrencyPolicy")) {
27 AUDIO_ERR_LOG("Missing tag - audioConcurrencyPolicy");
28 curNode_->FreeDoc();
29 return ERR_OPERATION_FAILED;
30 }
31 ParseInternal(concurrencyMap, curNode_);
32 return SUCCESS;
33 }
34
ParseInternal(std::map<std::pair<AudioPipeType,AudioPipeType>,ConcurrencyAction> & concurrencyMap,std::shared_ptr<AudioXmlNode> curNode)35 void AudioConcurrencyParser::ParseInternal(std::map<std::pair<AudioPipeType, AudioPipeType>,
36 ConcurrencyAction> &concurrencyMap, std::shared_ptr<AudioXmlNode> curNode)
37 {
38 for (; curNode->IsNodeValid(); curNode->MoveToNext()) {
39 if (curNode->CompareName("existingStream")) {
40 std::string existingStream;
41 curNode->GetProp("name", existingStream);
42 AUDIO_DEBUG_LOG("existingStream: %{public}s", existingStream.c_str());
43
44 std::shared_ptr<AudioXmlNode> childrenNode = curNode->GetChildrenNode();
45 ParseIncoming(existingStream, childrenNode, concurrencyMap);
46 } else {
47 std::shared_ptr<AudioXmlNode> childrenNode = curNode->GetChildrenNode();
48 ParseInternal(concurrencyMap, childrenNode);
49 }
50 }
51 return;
52 }
53
ParseIncoming(const std::string & existing,std::shared_ptr<AudioXmlNode> curNode,std::map<std::pair<AudioPipeType,AudioPipeType>,ConcurrencyAction> & concurrencyMap)54 void AudioConcurrencyParser::ParseIncoming(const std::string &existing, std::shared_ptr<AudioXmlNode> curNode,
55 std::map<std::pair<AudioPipeType, AudioPipeType>, ConcurrencyAction> &concurrencyMap)
56 {
57 while (curNode->IsNodeValid()) {
58 if (curNode->CompareName("incomingStream")) {
59 std::string incoming;
60 std::string action;
61 curNode->GetProp("name", incoming);
62 curNode->GetProp("action", action);
63 AUDIO_DEBUG_LOG("existing: %{public}s %{public}d, incoming: %{public}s %{public}d, action: %{public}s",
64 existing.c_str(), audioPipeTypeMap_[existing], incoming.c_str(),
65 audioPipeTypeMap_[incoming], action.c_str());
66 std::pair<AudioPipeType, AudioPipeType> concurrencyPair =
67 std::make_pair(audioPipeTypeMap_[existing], audioPipeTypeMap_[incoming]);
68 ConcurrencyAction concurrencyAction = (action == "play both" || action == "mix") ? PLAY_BOTH :
69 (action == "concede existing" ? CONCEDE_EXISTING : CONCEDE_INCOMING);
70 concurrencyMap.emplace(concurrencyPair, concurrencyAction);
71 }
72 curNode->MoveToNext();
73 }
74 }
75 } // namespace AudioStandard
76 } // namespace OHOS