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