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
22 using namespace std;
23
24 namespace OHOS {
25 namespace AudioStandard {
26
27 const string MEDIA_RENDER_ROUTERS = "MediaRenderRouters";
28 const string CALL_RENDER_ROUTERS = "CallRenderRouters";
29 const string RECORD_CAPTURE_ROUTERS = "RecordCaptureRouters";
30 const string CALL_CAPTURE_ROUTERS = "CallCaptureRouters";
31 const string RING_RENDER_ROUTERS = "RingRenderRouters";
32 const string TONE_RENDER_ROUTERS = "ToneRenderRouters";
33
FetchMediaRenderDevice(StreamUsage streamUsage,int32_t clientUID,RouterType & routerType,const RouterType & bypassType)34 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchMediaRenderDevice(
35 StreamUsage streamUsage, int32_t clientUID, RouterType &routerType, const RouterType &bypassType)
36 {
37 for (auto &router : mediaRenderRouters_) {
38 if (router->GetRouterType() == bypassType) {
39 AUDIO_INFO_LOG("Fetch media render device bypass %{public}d", bypassType);
40 continue;
41 }
42 shared_ptr<AudioDeviceDescriptor> desc = router->GetMediaRenderDevice(streamUsage, clientUID);
43 if (desc->deviceType_ != DEVICE_TYPE_NONE) {
44 routerType = router->GetRouterType();
45 return desc;
46 }
47 }
48 return make_shared<AudioDeviceDescriptor>();
49 }
50
FetchCallRenderDevice(StreamUsage streamUsage,int32_t clientUID,RouterType & routerType,const RouterType & bypassType)51 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchCallRenderDevice(
52 StreamUsage streamUsage, int32_t clientUID, RouterType &routerType, const RouterType &bypassType)
53 {
54 for (auto &router : callRenderRouters_) {
55 if (router->GetRouterType() == bypassType) {
56 AUDIO_INFO_LOG("Fetch call render device bypass %{public}d", bypassType);
57 continue;
58 }
59 shared_ptr<AudioDeviceDescriptor> desc = router->GetCallRenderDevice(streamUsage, clientUID);
60 if (desc->deviceType_ != DEVICE_TYPE_NONE) {
61 routerType = router->GetRouterType();
62 return desc;
63 }
64 }
65 return make_shared<AudioDeviceDescriptor>();
66 }
67
FetchRingRenderDevices(StreamUsage streamUsage,int32_t clientUID,RouterType & routerType)68 vector<shared_ptr<AudioDeviceDescriptor>> AudioRouterCenter::FetchRingRenderDevices(StreamUsage streamUsage,
69 int32_t clientUID, RouterType &routerType)
70 {
71 for (auto &router : ringRenderRouters_) {
72 CHECK_AND_CONTINUE_LOG(router != nullptr, "Invalid router.");
73 vector<shared_ptr<AudioDeviceDescriptor>> descs = router->GetRingRenderDevices(streamUsage, clientUID);
74 CHECK_AND_CONTINUE_LOG(!descs.empty(), "FetchRingRenderDevices is empty.");
75 if (descs.front() != nullptr && descs.front()->deviceType_ != DEVICE_TYPE_NONE) {
76 AUDIO_INFO_LOG("RingRender streamUsage %{public}d clientUID %{public}d"
77 " fetch descs front:%{public}d", streamUsage, clientUID, descs.front()->deviceType_);
78 routerType = router->GetRouterType();
79 return descs;
80 }
81 }
82 vector<shared_ptr<AudioDeviceDescriptor>> descs;
83 if (streamUsage == STREAM_USAGE_RINGTONE || streamUsage == STREAM_USAGE_VOICE_RINGTONE) {
84 AudioRingerMode curRingerMode = AudioPolicyService::GetAudioPolicyService().GetRingerMode();
85 if (curRingerMode == RINGER_MODE_NORMAL) {
86 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
87 } else {
88 descs.push_back(make_shared<AudioDeviceDescriptor>());
89 }
90 } else {
91 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
92 }
93 return descs;
94 }
95
HasScoDevice()96 bool AudioRouterCenter::HasScoDevice()
97 {
98 vector<shared_ptr<AudioDeviceDescriptor>> descs =
99 AudioDeviceManager::GetAudioDeviceManager().GetCommRenderPrivacyDevices();
100 for (auto &desc : descs) {
101 if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) {
102 return true;
103 }
104 }
105
106 vector<shared_ptr<AudioDeviceDescriptor>> publicDescs =
107 AudioDeviceManager::GetAudioDeviceManager().GetCommRenderPublicDevices();
108 for (auto &desc : publicDescs) {
109 if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO && desc->deviceCategory_ == BT_CAR) {
110 return true;
111 }
112 }
113 return false;
114 }
115
NeedSkipSelectAudioOutputDeviceRefined(StreamUsage streamUsage,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & descs)116 bool AudioRouterCenter::NeedSkipSelectAudioOutputDeviceRefined(StreamUsage streamUsage,
117 std::vector<std::shared_ptr<AudioDeviceDescriptor>> &descs)
118 {
119 if (AudioPolicyService::GetAudioPolicyService().GetRingerMode() == RINGER_MODE_NORMAL) {
120 return false;
121 }
122 if (!Util::IsRingerOrAlarmerStreamUsage(streamUsage)) {
123 return false;
124 }
125 if (descs.size() != 1) {
126 return false;
127 }
128 CHECK_AND_RETURN_RET(descs.front() != nullptr, false);
129 if (descs.front()->deviceType_ == DEVICE_TYPE_SPEAKER) {
130 return false;
131 }
132 AUDIO_INFO_LOG("Don't add ring ext device when ringer mode is not normal and no speaker added");
133 return true;
134 }
135
FetchOutputDevices(StreamUsage streamUsage,int32_t clientUID,const RouterType & bypassType)136 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioRouterCenter::FetchOutputDevices(StreamUsage streamUsage,
137 int32_t clientUID, const RouterType &bypassType)
138 {
139 vector<shared_ptr<AudioDeviceDescriptor>> descs;
140 RouterType routerType = ROUTER_TYPE_NONE;
141 if (streamUsage == STREAM_USAGE_ULTRASONIC &&
142 AudioStreamCollector::GetAudioStreamCollector().GetRunningStreamUsageNoUltrasonic() == STREAM_USAGE_INVALID) {
143 AUDIO_INFO_LOG("Stream ULTRASONIC always choose spk");
144 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
145 return descs;
146 }
147 StreamUsage callStreamUsage = streamUsage;
148 if (renderConfigMap_[streamUsage] == MEDIA_RENDER_ROUTERS ||
149 renderConfigMap_[streamUsage] == TONE_RENDER_ROUTERS) {
150 AudioScene audioScene = AudioPolicyService::GetAudioPolicyService().GetAudioScene();
151 shared_ptr<AudioDeviceDescriptor> desc = make_shared<AudioDeviceDescriptor>();
152 if (audioScene == AUDIO_SCENE_PHONE_CALL || audioScene == AUDIO_SCENE_PHONE_CHAT ||
153 ((audioScene == AUDIO_SCENE_RINGING || audioScene == AUDIO_SCENE_VOICE_RINGING) && HasScoDevice()) ||
154 AudioDeviceManager::GetAudioDeviceManager().GetScoState()) {
155 if (desc->deviceType_ == DEVICE_TYPE_NONE) {
156 callStreamUsage = AudioStreamCollector::GetAudioStreamCollector().GetLastestRunningCallStreamUsage();
157 callStreamUsage = (callStreamUsage == STREAM_USAGE_UNKNOWN) ? STREAM_USAGE_VOICE_COMMUNICATION :
158 callStreamUsage;
159 AUDIO_INFO_LOG("Media follow call strategy, replace usage %{public}d to %{public}d", streamUsage,
160 callStreamUsage);
161 desc = FetchCallRenderDevice(callStreamUsage, clientUID, routerType, bypassType);
162 }
163 } else {
164 desc = FetchMediaRenderDevice(streamUsage, clientUID, routerType, bypassType);
165 }
166 descs.push_back(move(desc));
167 } else if (renderConfigMap_[streamUsage] == RING_RENDER_ROUTERS) {
168 DealRingRenderRouters(descs, streamUsage, clientUID, routerType);
169 } else if (renderConfigMap_[streamUsage] == CALL_RENDER_ROUTERS) {
170 descs.push_back(FetchCallRenderDevice(streamUsage, clientUID, routerType, bypassType));
171 } else {
172 AUDIO_INFO_LOG("streamUsage %{public}d didn't config router strategy, skipped", streamUsage);
173 descs.push_back(make_shared<AudioDeviceDescriptor>());
174 return descs;
175 }
176 if (audioDeviceRefinerCb_ != nullptr &&
177 !NeedSkipSelectAudioOutputDeviceRefined(streamUsage, descs)) {
178 audioDeviceRefinerCb_->OnAudioOutputDeviceRefined(descs, routerType,
179 callStreamUsage, clientUID, PIPE_TYPE_NORMAL_OUT);
180 }
181 int32_t audioId_ = descs[0]->deviceId_;
182 DeviceType type = descs[0]->deviceType_;
183 AUDIO_PRERELEASE_LOGI("usage:%{public}d uid:%{public}d size:[%{public}zu], 1st type:[%{public}d], id:[%{public}d],"
184 " router:%{public}d ", streamUsage, clientUID, descs.size(), type, audioId_, routerType);
185 return descs;
186 }
187
DealRingRenderRouters(std::vector<std::shared_ptr<AudioDeviceDescriptor>> & descs,StreamUsage streamUsage,int32_t clientUID,RouterType & routerType)188 void AudioRouterCenter::DealRingRenderRouters(std::vector<std::shared_ptr<AudioDeviceDescriptor>> &descs,
189 StreamUsage streamUsage, int32_t clientUID, RouterType &routerType)
190 {
191 AudioScene audioScene = AudioPolicyService::GetAudioPolicyService().GetAudioScene();
192 StreamUsage callStreamUsage =
193 AudioStreamCollector::GetAudioStreamCollector().GetLastestRunningCallStreamUsage();
194 bool isVoipStream = AudioStreamCollector::GetAudioStreamCollector().IsCallStreamUsage(callStreamUsage);
195 AUDIO_INFO_LOG("ring render router streamUsage:%{public}d, audioScene:%{public}d, isVoipStream:%{public}d.",
196 streamUsage, audioScene, isVoipStream);
197 if (audioScene == AUDIO_SCENE_PHONE_CALL || audioScene == AUDIO_SCENE_PHONE_CHAT ||
198 (audioScene == AUDIO_SCENE_VOICE_RINGING && isVoipStream)) {
199 shared_ptr<AudioDeviceDescriptor> desc = make_shared<AudioDeviceDescriptor>();
200 if (desc->deviceType_ == DEVICE_TYPE_NONE) {
201 AUDIO_INFO_LOG("Ring follow call strategy, replace usage %{public}d to %{public}d", streamUsage,
202 callStreamUsage);
203 desc = FetchCallRenderDevice(callStreamUsage, clientUID, routerType);
204 }
205 descs.push_back(move(desc));
206 } else if ((audioScene == AUDIO_SCENE_RINGING || audioScene == AUDIO_SCENE_VOICE_RINGING) &&
207 streamUsage == STREAM_USAGE_ALARM) {
208 AUDIO_INFO_LOG("alarm follow ring strategy, replace usage alarm to ringtone");
209 descs = FetchRingRenderDevices(STREAM_USAGE_RINGTONE, clientUID, routerType);
210 } else {
211 descs = FetchRingRenderDevices(streamUsage, clientUID, routerType);
212 }
213 }
214
FetchInputDevice(SourceType sourceType,int32_t clientUID)215 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchInputDevice(SourceType sourceType, int32_t clientUID)
216 {
217 shared_ptr<AudioDeviceDescriptor> desc = make_shared<AudioDeviceDescriptor>();
218 RouterType routerType = ROUTER_TYPE_NONE;
219 AudioScene audioScene = AudioPolicyService::GetAudioPolicyService().GetAudioScene();
220 if (sourceType == SOURCE_TYPE_ULTRASONIC &&
221 AudioStreamCollector::GetAudioStreamCollector().GetRunningSourceTypeNoUltrasonic() == SOURCE_TYPE_INVALID) {
222 AUDIO_INFO_LOG("Source ULTRASONIC always choose mic");
223 return AudioDeviceManager::GetAudioDeviceManager().GetCaptureDefaultDevice();
224 }
225 if (capturerConfigMap_[sourceType] == "RecordCaptureRouters") {
226 if (audioScene != AUDIO_SCENE_DEFAULT) {
227 desc = FetchCallCaptureDevice(sourceType, clientUID, routerType);
228 } else {
229 desc = FetchRecordCaptureDevice(sourceType, clientUID, routerType);
230 }
231 } else if (capturerConfigMap_[sourceType] == "CallCaptureRouters") {
232 if (audioScene != AUDIO_SCENE_DEFAULT) {
233 desc = FetchCallCaptureDevice(sourceType, clientUID, routerType);
234 } else {
235 desc = FetchRecordCaptureDevice(sourceType, clientUID, routerType);
236 }
237 } else if (capturerConfigMap_[sourceType] == "VoiceMessages") {
238 desc = FetchVoiceMessageCaptureDevice(sourceType, clientUID, routerType);
239 } else {
240 AUDIO_INFO_LOG("sourceType %{public}d didn't config router strategy, skipped", sourceType);
241 return desc;
242 }
243 vector<shared_ptr<AudioDeviceDescriptor>> descs;
244 descs.push_back(make_shared<AudioDeviceDescriptor>(*desc));
245 if (audioDeviceRefinerCb_ != nullptr) {
246 audioDeviceRefinerCb_->OnAudioInputDeviceRefined(descs, routerType, sourceType, clientUID, PIPE_TYPE_NORMAL_IN);
247 }
248 int32_t audioId_ = descs[0]->deviceId_;
249 DeviceType type = descs[0]->deviceType_;
250 AUDIO_PRERELEASE_LOGI("source:%{public}d uid:%{public}d fetch type:%{public}d id:%{public}d router:%{public}d",
251 sourceType, clientUID, type, audioId_, routerType);
252 return move(descs[0]);
253 }
254
FetchCallCaptureDevice(SourceType sourceType,int32_t clientUID,RouterType & routerType)255 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchCallCaptureDevice(SourceType sourceType,
256 int32_t clientUID, RouterType &routerType)
257 {
258 for (auto &router : callCaptureRouters_) {
259 shared_ptr<AudioDeviceDescriptor> desc = router->GetCallCaptureDevice(sourceType, clientUID);
260 if (desc->deviceType_ != DEVICE_TYPE_NONE) {
261 routerType = router->GetRouterType();
262 return desc;
263 }
264 }
265 return make_shared<AudioDeviceDescriptor>();
266 }
267
FetchRecordCaptureDevice(SourceType sourceType,int32_t clientUID,RouterType & routerType)268 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchRecordCaptureDevice(SourceType sourceType,
269 int32_t clientUID, RouterType &routerType)
270 {
271 for (auto &router : recordCaptureRouters_) {
272 shared_ptr<AudioDeviceDescriptor> desc = router->GetRecordCaptureDevice(sourceType, clientUID);
273 if (desc->deviceType_ != DEVICE_TYPE_NONE) {
274 routerType = router->GetRouterType();
275 return desc;
276 }
277 }
278 return make_shared<AudioDeviceDescriptor>();
279 }
280
FetchVoiceMessageCaptureDevice(SourceType sourceType,int32_t clientUID,RouterType & routerType)281 shared_ptr<AudioDeviceDescriptor> AudioRouterCenter::FetchVoiceMessageCaptureDevice(SourceType sourceType,
282 int32_t clientUID, RouterType &routerType)
283 {
284 for (auto &router : voiceMessageRouters_) {
285 shared_ptr<AudioDeviceDescriptor> desc = router->GetRecordCaptureDevice(sourceType, clientUID);
286 if (desc->deviceType_ != DEVICE_TYPE_NONE) {
287 routerType = router->GetRouterType();
288 return desc;
289 }
290 }
291 return make_shared<AudioDeviceDescriptor>();
292 }
293
SetAudioDeviceRefinerCallback(const sptr<IRemoteObject> & object)294 int32_t AudioRouterCenter::SetAudioDeviceRefinerCallback(const sptr<IRemoteObject> &object)
295 {
296 sptr<IStandardAudioRoutingManagerListener> listener = iface_cast<IStandardAudioRoutingManagerListener>(object);
297 if (listener != nullptr) {
298 audioDeviceRefinerCb_ = listener;
299 return SUCCESS;
300 } else {
301 return ERROR;
302 }
303 }
304
UnsetAudioDeviceRefinerCallback()305 int32_t AudioRouterCenter::UnsetAudioDeviceRefinerCallback()
306 {
307 audioDeviceRefinerCb_ = nullptr;
308 return SUCCESS;
309 }
310
isCallRenderRouter(StreamUsage streamUsage)311 bool AudioRouterCenter::isCallRenderRouter(StreamUsage streamUsage)
312 {
313 return renderConfigMap_[streamUsage] == CALL_RENDER_ROUTERS;
314 }
315 } // namespace AudioStandard
316 } // namespace OHOS
317