• 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 #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