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