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