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