1 /*
2 * Copyright (c) 2021-2025 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 #ifndef LOG_TAG
16 #define LOG_TAG "AudioConfigManager"
17 #endif
18
19 #include "audio_config_manager.h"
20 #include <ability_manager_client.h>
21 #include "iservice_registry.h"
22 #include "parameter.h"
23 #include "parameters.h"
24 #include "audio_policy_log.h"
25 #include "audio_manager_listener_stub.h"
26 #include "audio_inner_call.h"
27 #include "media_monitor_manager.h"
28
29 #include "audio_policy_utils.h"
30 #include "audio_policy_service.h"
31
32 namespace OHOS {
33 namespace AudioStandard {
34
35 const int32_t DEFAULT_MAX_OUTPUT_NORMAL_INSTANCES = 128;
36 static const std::string EARPIECE_TYPE_NAME = "DEVICE_TYPE_EARPIECE";
37
Init()38 bool AudioConfigManager::Init()
39 {
40 std::unique_ptr<AudioPolicyParser> audioPolicyConfigParser = make_unique<AudioPolicyParser>(*this);
41 bool ret = audioPolicyConfigParser->LoadConfiguration();
42 if (!ret) {
43 AudioPolicyUtils::GetInstance().WriteServiceStartupError("Audio Policy Config Load Configuration failed");
44 AUDIO_ERR_LOG("Audio Policy Config Load Configuration failed");
45 return ret;
46 }
47 return ret;
48 }
49
OnAudioPolicyXmlParsingCompleted(const std::unordered_map<AdaptersType,AudioAdapterInfo> adapterInfoMap)50 void AudioConfigManager::OnAudioPolicyXmlParsingCompleted(
51 const std::unordered_map<AdaptersType, AudioAdapterInfo> adapterInfoMap)
52 {
53 AUDIO_INFO_LOG("adapterInfo num [%{public}zu]", adapterInfoMap.size());
54 CHECK_AND_RETURN_LOG(!adapterInfoMap.empty(), "failed to parse audiopolicy xml file. Received data is empty");
55 adapterInfoMap_ = adapterInfoMap;
56
57 for (const auto &adapterInfo : adapterInfoMap_) {
58 hasEarpiece_ = std::any_of((adapterInfo.second).deviceInfos_.begin(), (adapterInfo.second).deviceInfos_.end(),
59 [](const auto& deviceInfos) {
60 return deviceInfos.type_ == EARPIECE_TYPE_NAME;
61 });
62 if (hasEarpiece_) {
63 break;
64 }
65 }
66 isAdapterInfoMap_.store(true);
67
68 audioDeviceManager_.UpdateEarpieceStatus(hasEarpiece_);
69 }
70
GetHasEarpiece()71 bool AudioConfigManager::GetHasEarpiece()
72 {
73 return hasEarpiece_;
74 }
75
GetAdapterInfoFlag()76 bool AudioConfigManager::GetAdapterInfoFlag()
77 {
78 return isAdapterInfoMap_.load();
79 }
80
GetAdapterInfoByType(AdaptersType type,AudioAdapterInfo & info)81 bool AudioConfigManager::GetAdapterInfoByType(AdaptersType type, AudioAdapterInfo &info)
82 {
83 auto it = adapterInfoMap_.find(type);
84 if (it == adapterInfoMap_.end()) {
85 AUDIO_ERR_LOG("can not find adapter info");
86 return false;
87 }
88 info = it->second;
89 return true;
90 }
91
92 // Parser callbacks
OnXmlParsingCompleted(const std::unordered_map<ClassType,std::list<AudioModuleInfo>> & xmlData)93 void AudioConfigManager::OnXmlParsingCompleted(const std::unordered_map<ClassType, std::list<AudioModuleInfo>> &xmlData)
94 {
95 AUDIO_INFO_LOG("device class num [%{public}zu]", xmlData.size());
96 CHECK_AND_RETURN_LOG(!xmlData.empty(), "failed to parse xml file. Received data is empty");
97
98 deviceClassInfo_ = xmlData;
99 }
100
GetDeviceClassInfo(std::unordered_map<ClassType,std::list<AudioModuleInfo>> & deviceClassInfo)101 void AudioConfigManager::GetDeviceClassInfo(std::unordered_map<ClassType, std::list<AudioModuleInfo>> &deviceClassInfo)
102 {
103 deviceClassInfo = deviceClassInfo_;
104 }
105
GetModuleListByType(ClassType type,std::list<AudioModuleInfo> & moduleList)106 bool AudioConfigManager::GetModuleListByType(ClassType type, std::list<AudioModuleInfo>& moduleList)
107 {
108 auto modulesPos = deviceClassInfo_.find(type);
109 if (modulesPos != deviceClassInfo_.end()) {
110 moduleList = modulesPos->second;
111 return true;
112 }
113 return false;
114 }
115
OnUpdateRouteSupport(bool isSupported)116 void AudioConfigManager::OnUpdateRouteSupport(bool isSupported)
117 {
118 isUpdateRouteSupported_ = isSupported;
119 }
120
GetUpdateRouteSupport()121 bool AudioConfigManager::GetUpdateRouteSupport()
122 {
123 return isUpdateRouteSupported_;
124 }
125
OnUpdateDefaultAdapter(bool isEnable)126 void AudioConfigManager::OnUpdateDefaultAdapter(bool isEnable)
127 {
128 isDefaultAdapterEnable_ = isEnable;
129 }
130
GetDefaultAdapterEnable()131 bool AudioConfigManager::GetDefaultAdapterEnable()
132 {
133 return isDefaultAdapterEnable_;
134 }
135
OnUpdateAnahsSupport(std::string anahsShowType)136 void AudioConfigManager::OnUpdateAnahsSupport(std::string anahsShowType)
137 {
138 AUDIO_INFO_LOG("OnUpdateAnahsSupport show type: %{public}s", anahsShowType.c_str());
139 AudioPolicyService::GetAudioPolicyService().OnUpdateAnahsSupport(anahsShowType);
140 }
141
OnVolumeGroupParsed(std::unordered_map<std::string,std::string> & volumeGroupData)142 void AudioConfigManager::OnVolumeGroupParsed(std::unordered_map<std::string, std::string>& volumeGroupData)
143 {
144 AUDIO_INFO_LOG("group data num [%{public}zu]", volumeGroupData.size());
145 CHECK_AND_RETURN_LOG(!volumeGroupData.empty(), "failed to parse xml file. Received data is empty");
146
147 volumeGroupData_ = volumeGroupData;
148 }
149
OnInterruptGroupParsed(std::unordered_map<std::string,std::string> & interruptGroupData)150 void AudioConfigManager::OnInterruptGroupParsed(std::unordered_map<std::string, std::string>& interruptGroupData)
151 {
152 AUDIO_INFO_LOG("group data num [%{public}zu]", interruptGroupData.size());
153 CHECK_AND_RETURN_LOG(!interruptGroupData.empty(), "failed to parse xml file. Received data is empty");
154
155 interruptGroupData_ = interruptGroupData;
156 }
157
GetGroupName(const std::string & deviceName,const GroupType type)158 std::string AudioConfigManager::GetGroupName(const std::string& deviceName, const GroupType type)
159 {
160 std::string groupName = GROUP_NAME_NONE;
161 if (type == VOLUME_TYPE) {
162 auto iter = volumeGroupData_.find(deviceName);
163 if (iter != volumeGroupData_.end()) {
164 groupName = iter->second;
165 }
166 } else {
167 auto iter = interruptGroupData_.find(deviceName);
168 if (iter != interruptGroupData_.end()) {
169 groupName = iter->second;
170 }
171 }
172 return groupName;
173 }
174
OnGlobalConfigsParsed(GlobalConfigs & globalConfigs)175 void AudioConfigManager::OnGlobalConfigsParsed(GlobalConfigs &globalConfigs)
176 {
177 globalConfigs_ = globalConfigs;
178 }
179
GetMaxRendererInstances()180 int32_t AudioConfigManager::GetMaxRendererInstances()
181 {
182 auto configIter = std::find_if(globalConfigs_.outputConfigInfos_.begin(), globalConfigs_.outputConfigInfos_.end(),
183 [](const auto& configInfo) {
184 return configInfo.name_ == "normal" && configInfo.value_ != "";
185 });
186 if (configIter != globalConfigs_.outputConfigInfos_.end()) {
187 AUDIO_INFO_LOG("Max output normal instance is %{public}s", configIter->value_.c_str());
188 int32_t convertValue = 0;
189 CHECK_AND_RETURN_RET_LOG(StringConverter(configIter->value_, convertValue),
190 DEFAULT_MAX_OUTPUT_NORMAL_INSTANCES,
191 "convert invalid configInfo.value_: %{public}s", configIter->value_.c_str());
192 return convertValue;
193 }
194 return DEFAULT_MAX_OUTPUT_NORMAL_INSTANCES;
195 }
196
OnVoipConfigParsed(bool enableFastVoip)197 void AudioConfigManager::OnVoipConfigParsed(bool enableFastVoip)
198 {
199 enableFastVoip_ = enableFastVoip;
200 }
201
202
SetNormalVoipFlag(const bool & normalVoipFlag)203 void AudioConfigManager::SetNormalVoipFlag(const bool &normalVoipFlag)
204 {
205 normalVoipFlag_ = normalVoipFlag;
206 }
207
GetNormalVoipFlag()208 bool AudioConfigManager::GetNormalVoipFlag()
209 {
210 return normalVoipFlag_;
211 }
212
GetVoipRendererFlag(const std::string & sinkPortName,const std::string & networkId,const AudioSamplingRate & samplingRate)213 int32_t AudioConfigManager::GetVoipRendererFlag(const std::string &sinkPortName, const std::string &networkId,
214 const AudioSamplingRate &samplingRate)
215 {
216 // VoIP stream has three mode for different products.
217 if (enableFastVoip_ && (sinkPortName == PRIMARY_SPEAKER && networkId == LOCAL_NETWORK_ID)) {
218 if (samplingRate != SAMPLE_RATE_48000 && samplingRate != SAMPLE_RATE_16000) {
219 return AUDIO_FLAG_NORMAL;
220 }
221 return AUDIO_FLAG_VOIP_FAST;
222 } else if (!normalVoipFlag_ && (sinkPortName == PRIMARY_SPEAKER) && (networkId == LOCAL_NETWORK_ID)) {
223 AUDIO_INFO_LOG("Direct VoIP mode is supported for the device");
224 return AUDIO_FLAG_VOIP_DIRECT;
225 }
226
227 return AUDIO_FLAG_NORMAL;
228 }
229
OnAudioLatencyParsed(uint64_t latency)230 void AudioConfigManager::OnAudioLatencyParsed(uint64_t latency)
231 {
232 audioLatencyInMsec_ = latency;
233 }
234
OnSinkLatencyParsed(uint32_t latency)235 void AudioConfigManager::OnSinkLatencyParsed(uint32_t latency)
236 {
237 sinkLatencyInMsec_ = latency;
238 }
239
GetAudioLatencyFromXml() const240 int32_t AudioConfigManager::GetAudioLatencyFromXml() const
241 {
242 return audioLatencyInMsec_;
243 }
244
GetSinkLatencyFromXml() const245 uint32_t AudioConfigManager::GetSinkLatencyFromXml() const
246 {
247 return sinkLatencyInMsec_;
248 }
249
GetAudioAdapterInfos(std::unordered_map<AdaptersType,AudioAdapterInfo> & adapterInfoMap)250 void AudioConfigManager::GetAudioAdapterInfos(std::unordered_map<AdaptersType, AudioAdapterInfo> &adapterInfoMap)
251 {
252 adapterInfoMap = adapterInfoMap_;
253 }
254
GetVolumeGroupData(std::unordered_map<std::string,std::string> & volumeGroupData)255 void AudioConfigManager::GetVolumeGroupData(std::unordered_map<std::string, std::string>& volumeGroupData)
256 {
257 volumeGroupData = volumeGroupData_;
258 }
259
GetInterruptGroupData(std::unordered_map<std::string,std::string> & interruptGroupData)260 void AudioConfigManager::GetInterruptGroupData(std::unordered_map<std::string, std::string>& interruptGroupData)
261 {
262 interruptGroupData = interruptGroupData_;
263 }
264
GetGlobalConfigs(GlobalConfigs & globalConfigs)265 void AudioConfigManager::GetGlobalConfigs(GlobalConfigs &globalConfigs)
266 {
267 globalConfigs = globalConfigs_;
268 }
269
GetVoipConfig()270 bool AudioConfigManager::GetVoipConfig()
271 {
272 return enableFastVoip_;
273 }
274
275 }
276 }