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