• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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