1 /*
2 * Copyright (c) 2023 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 #include "audio_state_manager.h"
17 #include "audio_policy_log.h"
18 #include "audio_utils.h"
19
20 #include "bundle_mgr_interface.h"
21 #include "bundle_mgr_proxy.h"
22 #include "iservice_registry.h"
23 #include "system_ability_definition.h"
24 #include "ipc_skeleton.h"
25
26 using namespace std;
27
28 namespace OHOS {
29 namespace AudioStandard {
30
31 static constexpr unsigned int GET_BUNDLE_TIME_OUT_SECONDS = 10;
32 const int32_t AUDIO_UID = 1041;
33 const int32_t ANCO_SERVICE_BROKER_UID = 5557;
34
SetPreferredMediaRenderDevice(const std::shared_ptr<AudioDeviceDescriptor> & deviceDescriptor)35 void AudioStateManager::SetPreferredMediaRenderDevice(const std::shared_ptr<AudioDeviceDescriptor> &deviceDescriptor)
36 {
37 std::lock_guard<std::mutex> lock(mutex_);
38 preferredMediaRenderDevice_ = deviceDescriptor;
39 }
40
SetPreferredCallRenderDevice(const std::shared_ptr<AudioDeviceDescriptor> & deviceDescriptor,const int32_t uid,const std::string caller)41 void AudioStateManager::SetPreferredCallRenderDevice(const std::shared_ptr<AudioDeviceDescriptor> &deviceDescriptor,
42 const int32_t uid, const std::string caller)
43 {
44 std::lock_guard<std::mutex> lock(mutex_);
45
46 int32_t callerUid = uid;
47 auto callerPid = IPCSkeleton::GetCallingPid();
48 std::string bundleName = GetBundleNameFromUid(callerUid);
49 AUDIO_INFO_LOG(
50 "deviceType: %{public}d, uid: %{public}d, callerPid: %{public}d, bundle name: %{public}s, caller: %{public}s",
51 deviceDescriptor->deviceType_, callerUid, callerPid, bundleName.c_str(), caller.c_str());
52 if (audioClientInfoMgrCallback_ != nullptr) {
53 audioClientInfoMgrCallback_->OnCheckClientInfo(bundleName, callerUid, callerPid);
54 }
55 AUDIO_INFO_LOG("check result uid: %{public}d", callerUid);
56 if (deviceDescriptor->deviceType_ == DEVICE_TYPE_NONE) {
57 if (callerUid == CLEAR_UID) {
58 // clear all
59 forcedDeviceMapList_.clear();
60 } else if (callerUid == SYSTEM_UID) {
61 // clear equal ownerUid_ and SYSTEM_UID
62 RemoveForcedDeviceMapData(ownerUid_);
63 RemoveForcedDeviceMapData(SYSTEM_UID);
64 } else {
65 // clear equal uid
66 RemoveForcedDeviceMapData(callerUid);
67 }
68 } else {
69 std::map<int32_t, std::shared_ptr<AudioDeviceDescriptor>> currentDeviceMap;
70 if (callerUid == SYSTEM_UID && ownerUid_ != 0) {
71 RemoveForcedDeviceMapData(ownerUid_);
72 currentDeviceMap = {{ownerUid_, deviceDescriptor}};
73 } else {
74 RemoveForcedDeviceMapData(callerUid);
75 currentDeviceMap = {{callerUid, deviceDescriptor}};
76 }
77 forcedDeviceMapList_.push_back(currentDeviceMap);
78 }
79 }
80
SetPreferredCallCaptureDevice(const std::shared_ptr<AudioDeviceDescriptor> & deviceDescriptor)81 void AudioStateManager::SetPreferredCallCaptureDevice(const std::shared_ptr<AudioDeviceDescriptor> &deviceDescriptor)
82 {
83 std::lock_guard<std::mutex> lock(mutex_);
84 preferredCallCaptureDevice_ = deviceDescriptor;
85 }
86
SetPreferredRingRenderDevice(const std::shared_ptr<AudioDeviceDescriptor> & deviceDescriptor)87 void AudioStateManager::SetPreferredRingRenderDevice(const std::shared_ptr<AudioDeviceDescriptor> &deviceDescriptor)
88 {
89 std::lock_guard<std::mutex> lock(mutex_);
90 preferredRingRenderDevice_ = deviceDescriptor;
91 }
92
SetPreferredRecordCaptureDevice(const std::shared_ptr<AudioDeviceDescriptor> & deviceDescriptor)93 void AudioStateManager::SetPreferredRecordCaptureDevice(const std::shared_ptr<AudioDeviceDescriptor> &deviceDescriptor)
94 {
95 std::lock_guard<std::mutex> lock(mutex_);
96 preferredRecordCaptureDevice_ = deviceDescriptor;
97 }
98
SetPreferredToneRenderDevice(const std::shared_ptr<AudioDeviceDescriptor> & deviceDescriptor)99 void AudioStateManager::SetPreferredToneRenderDevice(const std::shared_ptr<AudioDeviceDescriptor> &deviceDescriptor)
100 {
101 std::lock_guard<std::mutex> lock(mutex_);
102 preferredToneRenderDevice_ = deviceDescriptor;
103 }
104
ExcludeOutputDevices(AudioDeviceUsage audioDevUsage,vector<shared_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)105 void AudioStateManager::ExcludeOutputDevices(AudioDeviceUsage audioDevUsage,
106 vector<shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
107 {
108 if (audioDevUsage == MEDIA_OUTPUT_DEVICES) {
109 lock_guard<shared_mutex> lock(mediaExcludedDevicesMutex_);
110 for (const auto &desc : audioDeviceDescriptors) {
111 CHECK_AND_CONTINUE_LOG(desc != nullptr, "Invalid device descriptor");
112 mediaExcludedDevices_.insert(desc);
113 }
114 } else if (audioDevUsage == CALL_OUTPUT_DEVICES) {
115 lock_guard<shared_mutex> lock(callExcludedDevicesMutex_);
116 for (const auto &desc : audioDeviceDescriptors) {
117 CHECK_AND_CONTINUE_LOG(desc != nullptr, "Invalid device descriptor");
118 callExcludedDevices_.insert(desc);
119 }
120 }
121 }
122
UnexcludeOutputDevices(AudioDeviceUsage audioDevUsage,vector<shared_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)123 void AudioStateManager::UnexcludeOutputDevices(AudioDeviceUsage audioDevUsage,
124 vector<shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
125 {
126 if (audioDevUsage == MEDIA_OUTPUT_DEVICES) {
127 lock_guard<shared_mutex> lock(mediaExcludedDevicesMutex_);
128 for (const auto &desc : audioDeviceDescriptors) {
129 CHECK_AND_CONTINUE_LOG(desc != nullptr, "Invalid device descriptor");
130 auto it = mediaExcludedDevices_.find(desc);
131 if (it != mediaExcludedDevices_.end()) {
132 mediaExcludedDevices_.erase(it);
133 }
134 }
135 } else if (audioDevUsage == CALL_OUTPUT_DEVICES) {
136 lock_guard<shared_mutex> lock(callExcludedDevicesMutex_);
137 for (const auto &desc : audioDeviceDescriptors) {
138 CHECK_AND_CONTINUE_LOG(desc != nullptr, "Invalid device descriptor");
139 auto it = callExcludedDevices_.find(desc);
140 if (it != callExcludedDevices_.end()) {
141 callExcludedDevices_.erase(it);
142 }
143 }
144 }
145 }
146
GetPreferredMediaRenderDevice()147 shared_ptr<AudioDeviceDescriptor> AudioStateManager::GetPreferredMediaRenderDevice()
148 {
149 std::lock_guard<std::mutex> lock(mutex_);
150 shared_ptr<AudioDeviceDescriptor> devDesc = make_shared<AudioDeviceDescriptor>(preferredMediaRenderDevice_);
151 return devDesc;
152 }
153
GetPreferredCallRenderDevice()154 shared_ptr<AudioDeviceDescriptor> AudioStateManager::GetPreferredCallRenderDevice()
155 {
156 std::lock_guard<std::mutex> lock(mutex_);
157 if (ownerUid_ == 0) {
158 if (!forcedDeviceMapList_.empty()) {
159 AUDIO_INFO_LOG("ownerUid_: 0, deviceType: %{public}d, Uid: %{public}d",
160 forcedDeviceMapList_.rbegin()->begin()->second->deviceType_,
161 forcedDeviceMapList_.rbegin()->begin()->first);
162 return make_shared<AudioDeviceDescriptor>(std::move(forcedDeviceMapList_.rbegin()->begin()->second));
163 }
164 } else {
165 for (auto it = forcedDeviceMapList_.begin(); it != forcedDeviceMapList_.end(); ++it) {
166 if (ownerUid_ == it->begin()->first) {
167 AUDIO_INFO_LOG("deviceType: %{public}d, ownerUid_: %{public}d", it->begin()->second->deviceType_,
168 ownerUid_);
169 return make_shared<AudioDeviceDescriptor>(std::move(it->begin()->second));
170 }
171 }
172 for (auto it = forcedDeviceMapList_.begin(); it != forcedDeviceMapList_.end(); ++it) {
173 if (SYSTEM_UID == it->begin()->first) {
174 AUDIO_INFO_LOG("bluetooth already force selected, deviceType: %{public}d",
175 it->begin()->second->deviceType_);
176 return make_shared<AudioDeviceDescriptor>(std::move(it->begin()->second));
177 }
178 }
179 }
180 return std::make_shared<AudioDeviceDescriptor>();
181 }
182
GetPreferredCallCaptureDevice()183 shared_ptr<AudioDeviceDescriptor> AudioStateManager::GetPreferredCallCaptureDevice()
184 {
185 std::lock_guard<std::mutex> lock(mutex_);
186 shared_ptr<AudioDeviceDescriptor> devDesc = make_shared<AudioDeviceDescriptor>(preferredCallCaptureDevice_);
187 return devDesc;
188 }
189
GetPreferredRingRenderDevice()190 shared_ptr<AudioDeviceDescriptor> AudioStateManager::GetPreferredRingRenderDevice()
191 {
192 std::lock_guard<std::mutex> lock(mutex_);
193 shared_ptr<AudioDeviceDescriptor> devDesc = make_shared<AudioDeviceDescriptor>(preferredRingRenderDevice_);
194 return devDesc;
195 }
196
GetPreferredRecordCaptureDevice()197 shared_ptr<AudioDeviceDescriptor> AudioStateManager::GetPreferredRecordCaptureDevice()
198 {
199 std::lock_guard<std::mutex> lock(mutex_);
200 shared_ptr<AudioDeviceDescriptor> devDesc = make_shared<AudioDeviceDescriptor>(preferredRecordCaptureDevice_);
201 return devDesc;
202 }
203
GetPreferredToneRenderDevice()204 shared_ptr<AudioDeviceDescriptor> AudioStateManager::GetPreferredToneRenderDevice()
205 {
206 std::lock_guard<std::mutex> lock(mutex_);
207 shared_ptr<AudioDeviceDescriptor> devDesc = make_shared<AudioDeviceDescriptor>(preferredToneRenderDevice_);
208 return devDesc;
209 }
210
UpdatePreferredMediaRenderDeviceConnectState(ConnectState state)211 void AudioStateManager::UpdatePreferredMediaRenderDeviceConnectState(ConnectState state)
212 {
213 CHECK_AND_RETURN_LOG(preferredMediaRenderDevice_ != nullptr, "preferredMediaRenderDevice_ is nullptr");
214 preferredMediaRenderDevice_->connectState_ = state;
215 }
216
UpdatePreferredCallRenderDeviceConnectState(ConnectState state)217 void AudioStateManager::UpdatePreferredCallRenderDeviceConnectState(ConnectState state)
218 {
219 CHECK_AND_RETURN_LOG(preferredCallRenderDevice_ != nullptr, "preferredCallRenderDevice_ is nullptr");
220 preferredCallRenderDevice_->connectState_ = state;
221 }
222
UpdatePreferredCallCaptureDeviceConnectState(ConnectState state)223 void AudioStateManager::UpdatePreferredCallCaptureDeviceConnectState(ConnectState state)
224 {
225 CHECK_AND_RETURN_LOG(preferredCallCaptureDevice_ != nullptr, "preferredCallCaptureDevice_ is nullptr");
226 preferredCallCaptureDevice_->connectState_ = state;
227 }
228
UpdatePreferredRecordCaptureDeviceConnectState(ConnectState state)229 void AudioStateManager::UpdatePreferredRecordCaptureDeviceConnectState(ConnectState state)
230 {
231 CHECK_AND_RETURN_LOG(preferredRecordCaptureDevice_ != nullptr, "preferredRecordCaptureDevice_ is nullptr");
232 preferredRecordCaptureDevice_->connectState_ = state;
233 }
234
GetExcludedDevices(AudioDeviceUsage usage)235 vector<shared_ptr<AudioDeviceDescriptor>> AudioStateManager::GetExcludedDevices(AudioDeviceUsage usage)
236 {
237 vector<shared_ptr<AudioDeviceDescriptor>> devices;
238 if (usage == MEDIA_OUTPUT_DEVICES) {
239 shared_lock<shared_mutex> lock(mediaExcludedDevicesMutex_);
240 for (const auto &desc : mediaExcludedDevices_) {
241 devices.push_back(make_shared<AudioDeviceDescriptor>(*desc));
242 }
243 } else if (usage == CALL_OUTPUT_DEVICES) {
244 shared_lock<shared_mutex> lock(callExcludedDevicesMutex_);
245 vector<shared_ptr<AudioDeviceDescriptor>> devices;
246 for (const auto &desc : callExcludedDevices_) {
247 devices.push_back(make_shared<AudioDeviceDescriptor>(*desc));
248 }
249 }
250
251 return devices;
252 }
253
IsExcludedDevice(AudioDeviceUsage audioDevUsage,const shared_ptr<AudioDeviceDescriptor> & audioDeviceDescriptor)254 bool AudioStateManager::IsExcludedDevice(AudioDeviceUsage audioDevUsage,
255 const shared_ptr<AudioDeviceDescriptor> &audioDeviceDescriptor)
256 {
257 CHECK_AND_RETURN_RET(audioDevUsage == MEDIA_OUTPUT_DEVICES || audioDevUsage == CALL_OUTPUT_DEVICES, false);
258
259 if (audioDevUsage == MEDIA_OUTPUT_DEVICES) {
260 shared_lock<shared_mutex> lock(mediaExcludedDevicesMutex_);
261 return mediaExcludedDevices_.contains(audioDeviceDescriptor);
262 } else if (audioDevUsage == CALL_OUTPUT_DEVICES) {
263 shared_lock<shared_mutex> lock(callExcludedDevicesMutex_);
264 return callExcludedDevices_.contains(audioDeviceDescriptor);
265 }
266
267 return false;
268 }
269
SetAudioSceneOwnerUid(const int32_t uid)270 void AudioStateManager::SetAudioSceneOwnerUid(const int32_t uid)
271 {
272 AUDIO_INFO_LOG("ownerUid_: %{public}d, uid: %{public}d", ownerUid_, uid);
273 ownerUid_ = uid;
274 if (uid == AUDIO_UID) {
275 ownerUid_ = ANCO_SERVICE_BROKER_UID;
276 }
277 }
278
SetAudioClientInfoMgrCallback(sptr<IStandardAudioPolicyManagerListener> & callback)279 int32_t AudioStateManager::SetAudioClientInfoMgrCallback(sptr<IStandardAudioPolicyManagerListener> &callback)
280 {
281 audioClientInfoMgrCallback_ = callback;
282 return 0;
283 }
284
GetBundleNameFromUid(int32_t uid)285 const std::string AudioStateManager::GetBundleNameFromUid(int32_t uid)
286 {
287 AudioXCollie audioXCollie("AudioRecoveryDevice::GetBundleNameFromUid",
288 GET_BUNDLE_TIME_OUT_SECONDS);
289 std::string bundleName {""};
290 WatchTimeout guard("SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager():GetBundleNameFromUid");
291 auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
292 CHECK_AND_RETURN_RET_LOG(systemAbilityManager != nullptr, "", "systemAbilityManager is nullptr");
293 guard.CheckCurrTimeout();
294
295 sptr<IRemoteObject> remoteObject = systemAbilityManager->CheckSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
296 CHECK_AND_RETURN_RET_LOG(remoteObject != nullptr, "", "remoteObject is nullptr");
297
298 sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = OHOS::iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
299 CHECK_AND_RETURN_RET_LOG(bundleMgrProxy != nullptr, "", "bundleMgrProxy is nullptr");
300
301 WatchTimeout reguard("bundleMgrProxy->GetNameForUid:GetBundleNameFromUid");
302 bundleMgrProxy->GetNameForUid(uid, bundleName);
303 reguard.CheckCurrTimeout();
304
305 return bundleName;
306 }
307
RemoveForcedDeviceMapData(int32_t uid)308 void AudioStateManager::RemoveForcedDeviceMapData(int32_t uid)
309 {
310 if (forcedDeviceMapList_.empty()) {
311 return;
312 }
313 auto it = forcedDeviceMapList_.begin();
314 while (it != forcedDeviceMapList_.end()) {
315 if (uid == it->begin()->first) {
316 it = forcedDeviceMapList_.erase(it);
317 } else {
318 it++;
319 }
320 }
321 }
322 } // namespace AudioStandard
323 } // namespace OHOS
324