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 "AudioRouterCenter"
17 #endif
18
19 #include "audio_router_center.h"
20 #include "audio_policy_service.h"
21 #include "audio_zone_service.h"
22 #include "audio_scene_manager.h"
23
24 using namespace std;
25
26 namespace OHOS {
27 namespace AudioStandard {
28
29 const string MEDIA_RENDER_ROUTERS = "MediaRenderRouters";
30 const string CALL_RENDER_ROUTERS = "CallRenderRouters";
31 const string RECORD_CAPTURE_ROUTERS = "RecordCaptureRouters";
32 const string CALL_CAPTURE_ROUTERS = "CallCaptureRouters";
33 const string RING_RENDER_ROUTERS = "RingRenderRouters";
34 const string TONE_RENDER_ROUTERS = "ToneRenderRouters";
35
FetchMediaRenderDevice(StreamUsage streamUsage,int32_t clientUID,RouterType & routerType,const RouterType & bypassType)36 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchMediaRenderDevice(
37 StreamUsage streamUsage, int32_t clientUID, RouterType &routerType, const RouterType &bypassType)
38 {
39 for (auto &router : mediaRenderRouters_) {
40 if (router->GetRouterType() == bypassType) {
41 AUDIO_INFO_LOG("Fetch media render device bypass %{public}d", bypassType);
42 continue;
43 }
44 shared_ptr<AudioDeviceDescriptor> desc = router->GetMediaRenderDevice(streamUsage, clientUID);
45 if ((desc != nullptr) && (desc->deviceType_ != DEVICE_TYPE_NONE)) {
46 routerType = router->GetRouterType();
47 return desc;
48 }
49 }
50 return make_shared<AudioDeviceDescriptor>();
51 }
52
FetchCallRenderDevice(StreamUsage streamUsage,int32_t clientUID,RouterType & routerType,const RouterType & bypassType,const RouterType & bypassWithSco)53 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchCallRenderDevice(StreamUsage streamUsage, int32_t clientUID,
54 RouterType &routerType, const RouterType &bypassType, const RouterType &bypassWithSco)
55 {
56 for (auto &router : callRenderRouters_) {
57 if (router->GetRouterType() == bypassType || router->GetRouterType() == bypassWithSco) {
58 AUDIO_INFO_LOG("Fetch call render device bypass %{public}d, bypassWithSco %{public}d",
59 bypassType, bypassWithSco);
60 continue;
61 }
62 shared_ptr<AudioDeviceDescriptor> desc = router->GetCallRenderDevice(streamUsage, clientUID);
63 if ((desc != nullptr) && (desc->deviceType_ != DEVICE_TYPE_NONE)) {
64 routerType = router->GetRouterType();
65 return desc;
66 }
67 }
68 return make_shared<AudioDeviceDescriptor>();
69 }
70
FetchRingRenderDevices(StreamUsage streamUsage,int32_t clientUID,RouterType & routerType)71 vector<shared_ptr<AudioDeviceDescriptor>> AudioRouterCenter::FetchRingRenderDevices(StreamUsage streamUsage,
72 int32_t clientUID, RouterType &routerType)
73 {
74 for (auto &router : ringRenderRouters_) {
75 CHECK_AND_CONTINUE_LOG(router != nullptr, "Invalid router.");
76 vector<shared_ptr<AudioDeviceDescriptor>> descs = router->GetRingRenderDevices(streamUsage, clientUID);
77 CHECK_AND_CONTINUE_LOG(!descs.empty(), "FetchRingRenderDevices is empty.");
78 if (descs.front() != nullptr && descs.front()->deviceType_ != DEVICE_TYPE_NONE) {
79 AUDIO_INFO_LOG("RingRender streamUsage %{public}d clientUID %{public}d"
80 " fetch descs front:%{public}d", streamUsage, clientUID, descs.front()->deviceType_);
81 routerType = router->GetRouterType();
82 if (descs.size() > 1 && VolumeUtils::IsPCVolumeEnable()) {
83 vector<shared_ptr<AudioDeviceDescriptor>> newDescs;
84 newDescs.push_back(descs.front());
85 return newDescs;
86 }
87 return descs;
88 }
89 }
90 vector<shared_ptr<AudioDeviceDescriptor>> descs;
91 if (streamUsage == STREAM_USAGE_RINGTONE || streamUsage == STREAM_USAGE_VOICE_RINGTONE) {
92 AudioRingerMode curRingerMode = AudioPolicyManagerFactory::GetAudioPolicyManager().GetRingerMode();
93 if (curRingerMode == RINGER_MODE_NORMAL) {
94 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
95 } else {
96 descs.push_back(make_shared<AudioDeviceDescriptor>());
97 }
98 } else {
99 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
100 }
101 return descs;
102 }
103
HasScoDevice()104 bool AudioRouterCenter::HasScoDevice()
105 {
106 vector<shared_ptr<AudioDeviceDescriptor>> descs =
107 AudioDeviceManager::GetAudioDeviceManager().GetCommRenderPrivacyDevices();
108 for (auto &desc : descs) {
109 if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) {
110 return true;
111 }
112 }
113
114 vector<shared_ptr<AudioDeviceDescriptor>> publicDescs =
115 AudioDeviceManager::GetAudioDeviceManager().GetCommRenderPublicDevices();
116 for (auto &desc : publicDescs) {
117 if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO && desc->deviceCategory_ == BT_CAR) {
118 return true;
119 }
120 }
121 return false;
122 }
123
NeedSkipSelectAudioOutputDeviceRefined(StreamUsage streamUsage,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & descs)124 bool AudioRouterCenter::NeedSkipSelectAudioOutputDeviceRefined(StreamUsage streamUsage,
125 std::vector<std::shared_ptr<AudioDeviceDescriptor>> &descs)
126 {
127 if (AudioPolicyManagerFactory::GetAudioPolicyManager().GetRingerMode() == RINGER_MODE_NORMAL) {
128 return false;
129 }
130 if (!Util::IsRingerOrAlarmerStreamUsage(streamUsage)) {
131 return false;
132 }
133 if (descs.size() != 1) {
134 return false;
135 }
136 CHECK_AND_RETURN_RET(descs.front() != nullptr, false);
137 if (descs.front()->deviceType_ == DEVICE_TYPE_SPEAKER) {
138 return false;
139 }
140 AUDIO_INFO_LOG("Don't add ring ext device when ringer mode is not normal and no speaker added");
141 return true;
142 }
143
GetBypassWithSco(AudioScene audioScene)144 RouterType AudioRouterCenter::GetBypassWithSco(AudioScene audioScene)
145 {
146 RouterType bypassWithSco = RouterType::ROUTER_TYPE_NONE;
147 if (audioScene == AUDIO_SCENE_DEFAULT && AudioDeviceManager::GetAudioDeviceManager().GetScoState()) {
148 AUDIO_INFO_LOG("Audio scene default and sco state is true, bypassWithSco set to user select");
149 bypassWithSco = RouterType::ROUTER_TYPE_USER_SELECT;
150 }
151 return bypassWithSco;
152 }
153
IsMediaFollowCallStrategy(AudioScene audioScene)154 bool AudioRouterCenter::IsMediaFollowCallStrategy(AudioScene audioScene)
155 {
156 if (audioScene == AUDIO_SCENE_PHONE_CALL) {
157 return true;
158 }
159 if (audioScene == AUDIO_SCENE_PHONE_CHAT) {
160 return true;
161 }
162 if ((audioScene == AUDIO_SCENE_RINGING || audioScene == AUDIO_SCENE_VOICE_RINGING) &&
163 HasScoDevice()) {
164 return true;
165 }
166 return false;
167 }
168
FetchOutputDevicesInner(FetchDeviceInfo info,RouterType & routerType,const RouterType & bypassType,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & descs)169 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioRouterCenter::FetchOutputDevicesInner(
170 FetchDeviceInfo info, RouterType &routerType, const RouterType &bypassType,
171 std::vector<std::shared_ptr<AudioDeviceDescriptor>> &descs)
172 {
173 StreamUsage streamUsage = info.streamUsage;
174 int32_t clientUID = info.clientUID;
175 std::string caller = info.caller;
176 StreamUsage callStreamUsage = streamUsage;
177 if (renderConfigMap_[streamUsage] == MEDIA_RENDER_ROUTERS ||
178 renderConfigMap_[streamUsage] == TONE_RENDER_ROUTERS) {
179 bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
180 AudioScene audioScene = AudioSceneManager::GetInstance().GetAudioScene(hasSystemPermission);
181 shared_ptr<AudioDeviceDescriptor> desc = make_shared<AudioDeviceDescriptor>();
182 if (IsMediaFollowCallStrategy(audioScene)) {
183 callStreamUsage = AudioStreamCollector::GetAudioStreamCollector().GetLastestRunningCallStreamUsage();
184 callStreamUsage = (callStreamUsage == STREAM_USAGE_UNKNOWN) ? STREAM_USAGE_VOICE_COMMUNICATION :
185 callStreamUsage;
186 AUDIO_INFO_LOG("Media follow call strategy, replace usage %{public}d to %{public}d", streamUsage,
187 callStreamUsage);
188 desc = FetchCallRenderDevice(callStreamUsage, clientUID, routerType, bypassType,
189 GetBypassWithSco(audioScene));
190 } else {
191 desc = FetchMediaRenderDevice(streamUsage, clientUID, routerType, bypassType);
192 }
193 descs.push_back(move(desc));
194 } else if (renderConfigMap_[streamUsage] == RING_RENDER_ROUTERS) {
195 DealRingRenderRouters(descs, streamUsage, clientUID, routerType);
196 } else if (renderConfigMap_[streamUsage] == CALL_RENDER_ROUTERS) {
197 descs.push_back(FetchCallRenderDevice(streamUsage, clientUID, routerType, bypassType));
198 } else {
199 AUDIO_INFO_LOG("streamUsage %{public}d didn't config router strategy, skipped", streamUsage);
200 descs.push_back(make_shared<AudioDeviceDescriptor>());
201 return descs;
202 }
203 if (audioDeviceRefinerCb_ != nullptr &&
204 !NeedSkipSelectAudioOutputDeviceRefined(streamUsage, descs)) {
205 audioDeviceRefinerCb_->OnAudioOutputDeviceRefined(descs, routerType,
206 callStreamUsage, clientUID, PIPE_TYPE_NORMAL_OUT);
207 }
208 if (descs.size() > 0 && descs[0] != nullptr) {
209 int32_t audioId_ = descs[0]->deviceId_;
210 DeviceType type = descs[0]->deviceType_;
211 descs[0]->routerType_ = routerType;
212 AUDIO_PRERELEASE_LOGI("[%{public}s] usage:%{public}d uid:%{public}d size:[%{public}zu], 1st type:[%{public}d], "
213 "id:[%{public}d], router:%{public}d ", caller.c_str(), streamUsage,
214 clientUID, descs.size(), type, audioId_, routerType);
215 }
216 return descs;
217 }
218
FetchOutputDevices(StreamUsage streamUsage,int32_t clientUID,std::string caller,const RouterType & bypassType)219 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioRouterCenter::FetchOutputDevices(StreamUsage streamUsage,
220 int32_t clientUID, std::string caller, const RouterType &bypassType)
221 {
222 vector<shared_ptr<AudioDeviceDescriptor>> descs;
223 RouterType routerType = ROUTER_TYPE_NONE;
224 int32_t zoneId = AudioZoneService::GetInstance().FindAudioZone(clientUID, STREAM_USAGE_INVALID);
225 if (zoneId != 0) {
226 vector<shared_ptr<AudioDeviceDescriptor>> zoneDescs =
227 AudioZoneService::GetInstance().FetchOutputDevices(zoneId, streamUsage, clientUID, routerType);
228 CHECK_AND_RETURN_RET(zoneDescs.size() == 0, zoneDescs);
229 }
230 if (streamUsage == STREAM_USAGE_ULTRASONIC &&
231 AudioStreamCollector::GetAudioStreamCollector().GetRunningStreamUsageNoUltrasonic() == STREAM_USAGE_INVALID) {
232 AUDIO_INFO_LOG("Stream ULTRASONIC always choose spk");
233 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
234 return descs;
235 }
236 FetchDeviceInfo info = {
237 .streamUsage = streamUsage,
238 .clientUID = clientUID,
239 .caller = caller,
240 };
241 return FetchOutputDevicesInner(info, routerType, bypassType, descs);
242 }
243
NotifyDistributedOutputChange(bool isRemote)244 int32_t AudioRouterCenter::NotifyDistributedOutputChange(bool isRemote)
245 {
246 CHECK_AND_RETURN_RET(audioDeviceRefinerCb_, SUCCESS);
247 return audioDeviceRefinerCb_->OnDistributedOutputChange(isRemote);
248 }
249
DealRingRenderRouters(std::vector<std::shared_ptr<AudioDeviceDescriptor>> & descs,StreamUsage streamUsage,int32_t clientUID,RouterType & routerType)250 void AudioRouterCenter::DealRingRenderRouters(std::vector<std::shared_ptr<AudioDeviceDescriptor>> &descs,
251 StreamUsage streamUsage, int32_t clientUID, RouterType &routerType)
252 {
253 bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
254 AudioScene audioScene = AudioSceneManager::GetInstance().GetAudioScene(hasSystemPermission);
255 StreamUsage callStreamUsage =
256 AudioStreamCollector::GetAudioStreamCollector().GetLastestRunningCallStreamUsage();
257 bool isVoipStream = AudioStreamCollector::GetAudioStreamCollector().IsCallStreamUsage(callStreamUsage);
258 AUDIO_INFO_LOG("ring render router streamUsage:%{public}d, audioScene:%{public}d, isVoipStream:%{public}d.",
259 streamUsage, audioScene, isVoipStream);
260 if (audioScene == AUDIO_SCENE_PHONE_CALL || audioScene == AUDIO_SCENE_PHONE_CHAT ||
261 (audioScene == AUDIO_SCENE_VOICE_RINGING && isVoipStream)) {
262 shared_ptr<AudioDeviceDescriptor> desc = make_shared<AudioDeviceDescriptor>();
263 if (desc->deviceType_ == DEVICE_TYPE_NONE) {
264 AUDIO_INFO_LOG("Ring follow call strategy, replace usage %{public}d to %{public}d", streamUsage,
265 callStreamUsage);
266 desc = FetchCallRenderDevice(callStreamUsage, clientUID, routerType);
267 }
268 descs.push_back(move(desc));
269 } else if ((audioScene == AUDIO_SCENE_RINGING || audioScene == AUDIO_SCENE_VOICE_RINGING) &&
270 streamUsage == STREAM_USAGE_ALARM) {
271 AUDIO_INFO_LOG("alarm follow ring strategy, replace usage alarm to ringtone");
272 descs = FetchRingRenderDevices(STREAM_USAGE_RINGTONE, clientUID, routerType);
273 } else {
274 descs = FetchRingRenderDevices(streamUsage, clientUID, routerType);
275 }
276 }
277
278
IsConfigRouterStrategy(SourceType sourceType)279 bool AudioRouterCenter::IsConfigRouterStrategy(SourceType sourceType)
280 {
281 if (capturerConfigMap_[sourceType] == "RecordCaptureRouters" ||
282 capturerConfigMap_[sourceType] == "CallCaptureRouters" ||
283 capturerConfigMap_[sourceType] == "VoiceMessages") {
284 return true;
285 }
286 return false;
287 }
288
FetchCapturerInputDevice(SourceType sourceType,int32_t clientUID,RouterType & routerType,const uint32_t sessionID)289 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchCapturerInputDevice(SourceType sourceType,
290 int32_t clientUID, RouterType &routerType, const uint32_t sessionID)
291 {
292 bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
293 AudioScene audioScene = AudioSceneManager::GetInstance().GetAudioScene(hasSystemPermission);
294 if (capturerConfigMap_[sourceType] == "RecordCaptureRouters") {
295 if (audioScene != AUDIO_SCENE_DEFAULT) {
296 return FetchCallCaptureDevice(sourceType, clientUID, routerType, sessionID);
297 } else {
298 return FetchRecordCaptureDevice(sourceType, clientUID, routerType, sessionID);
299 }
300 } else if (capturerConfigMap_[sourceType] == "CallCaptureRouters") {
301 if (audioScene != AUDIO_SCENE_DEFAULT) {
302 return FetchCallCaptureDevice(sourceType, clientUID, routerType, sessionID);
303 } else {
304 return FetchRecordCaptureDevice(sourceType, clientUID, routerType, sessionID);
305 }
306 } else if (capturerConfigMap_[sourceType] == "VoiceMessages") {
307 if (audioScene != AUDIO_SCENE_DEFAULT) {
308 return FetchCallCaptureDevice(sourceType, clientUID, routerType, sessionID);
309 } else {
310 return FetchVoiceMessageCaptureDevice(sourceType, clientUID, routerType, sessionID);
311 }
312 }
313 return make_shared<AudioDeviceDescriptor>();
314 }
315
FetchInputDevice(SourceType sourceType,int32_t clientUID,const uint32_t sessionID)316 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchInputDevice(SourceType sourceType, int32_t clientUID,
317 const uint32_t sessionID)
318 {
319 shared_ptr<AudioDeviceDescriptor> desc = make_shared<AudioDeviceDescriptor>();
320 RouterType routerType = ROUTER_TYPE_NONE;
321 int32_t zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(clientUID);
322 if (zoneId != 0) {
323 AUDIO_INFO_LOG("FetchInputDevice zoneId %{public}d", zoneId);
324 return AudioZoneService::GetInstance().FetchInputDevice(zoneId, sourceType, clientUID);
325 }
326 if (sourceType == SOURCE_TYPE_ULTRASONIC &&
327 AudioStreamCollector::GetAudioStreamCollector().GetRunningSourceTypeNoUltrasonic() == SOURCE_TYPE_INVALID) {
328 AUDIO_INFO_LOG("Source ULTRASONIC always choose mic");
329 return AudioDeviceManager::GetAudioDeviceManager().GetCaptureDefaultDevice();
330 }
331 if (IsConfigRouterStrategy(sourceType)) {
332 desc = FetchCapturerInputDevice(sourceType, clientUID, routerType, sessionID);
333 } else {
334 AUDIO_INFO_LOG("sourceType %{public}d didn't config router strategy, skipped", sourceType);
335 return desc;
336 }
337 vector<shared_ptr<AudioDeviceDescriptor>> descs;
338 descs.push_back(make_shared<AudioDeviceDescriptor>(*desc));
339 if (audioDeviceRefinerCb_ != nullptr) {
340 audioDeviceRefinerCb_->OnAudioInputDeviceRefined(descs, routerType, sourceType, clientUID, PIPE_TYPE_NORMAL_IN);
341 }
342 if (descs.size() > 0 && descs[0] != nullptr) {
343 int32_t audioId_ = descs[0]->deviceId_;
344 DeviceType type = descs[0]->deviceType_;
345 AUDIO_PRERELEASE_LOGI("source:%{public}d uid:%{public}d fetch type:%{public}d id:%{public}d router:%{public}d",
346 sourceType, clientUID, type, audioId_, routerType);
347 }
348 return move(descs[0]);
349 }
350
FetchCallCaptureDevice(SourceType sourceType,int32_t clientUID,RouterType & routerType,const uint32_t sessionID)351 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchCallCaptureDevice(SourceType sourceType,
352 int32_t clientUID, RouterType &routerType, const uint32_t sessionID)
353 {
354 for (auto &router : callCaptureRouters_) {
355 shared_ptr<AudioDeviceDescriptor> desc = router->GetCallCaptureDevice(sourceType, clientUID, sessionID);
356 if ((desc != nullptr) && (desc->deviceType_ != DEVICE_TYPE_NONE)) {
357 routerType = router->GetRouterType();
358 return desc;
359 }
360 }
361 return make_shared<AudioDeviceDescriptor>();
362 }
363
FetchRecordCaptureDevice(SourceType sourceType,int32_t clientUID,RouterType & routerType,const uint32_t sessionID)364 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchRecordCaptureDevice(SourceType sourceType,
365 int32_t clientUID, RouterType &routerType, const uint32_t sessionID)
366 {
367 for (auto &router : recordCaptureRouters_) {
368 shared_ptr<AudioDeviceDescriptor> desc = router->GetRecordCaptureDevice(sourceType, clientUID, sessionID);
369 if (desc == nullptr) {
370 continue;
371 }
372 if (desc->deviceType_ != DEVICE_TYPE_NONE) {
373 routerType = router->GetRouterType();
374 return desc;
375 }
376 }
377 return make_shared<AudioDeviceDescriptor>();
378 }
379
FetchVoiceMessageCaptureDevice(SourceType sourceType,int32_t clientUID,RouterType & routerType,const uint32_t sessionID)380 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchVoiceMessageCaptureDevice(SourceType sourceType,
381 int32_t clientUID, RouterType &routerType, const uint32_t sessionID)
382 {
383 for (auto &router : voiceMessageRouters_) {
384 shared_ptr<AudioDeviceDescriptor> desc = router->GetRecordCaptureDevice(sourceType, clientUID, sessionID);
385 if ((desc != nullptr) && (desc->deviceType_ != DEVICE_TYPE_NONE)) {
386 routerType = router->GetRouterType();
387 return desc;
388 }
389 }
390 return make_shared<AudioDeviceDescriptor>();
391 }
392
SetAudioDeviceRefinerCallback(const sptr<IRemoteObject> & object)393 int32_t AudioRouterCenter::SetAudioDeviceRefinerCallback(const sptr<IRemoteObject> &object)
394 {
395 sptr<IStandardAudioRoutingManagerListener> listener = iface_cast<IStandardAudioRoutingManagerListener>(object);
396 if (listener != nullptr) {
397 audioDeviceRefinerCb_ = listener;
398 return SUCCESS;
399 } else {
400 return ERROR;
401 }
402 }
403
UnsetAudioDeviceRefinerCallback()404 int32_t AudioRouterCenter::UnsetAudioDeviceRefinerCallback()
405 {
406 audioDeviceRefinerCb_ = nullptr;
407 return SUCCESS;
408 }
409
isCallRenderRouter(StreamUsage streamUsage)410 bool AudioRouterCenter::isCallRenderRouter(StreamUsage streamUsage)
411 {
412 return renderConfigMap_[streamUsage] == CALL_RENDER_ROUTERS;
413 }
414
GetSplitInfo(std::string & splitInfo)415 int32_t AudioRouterCenter::GetSplitInfo(std::string &splitInfo)
416 {
417 if (audioDeviceRefinerCb_ == nullptr) {
418 AUDIO_INFO_LOG("nullptr");
419 return ERROR;
420 }
421
422 return audioDeviceRefinerCb_->GetSplitInfoRefined(splitInfo);
423 }
424 } // namespace AudioStandard
425 } // namespace OHOS
426