1 /*
2 * Copyright (c) 2022-2025 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
16 #include "audio_manager_interface_impl.h"
17
18 #include <cstdlib>
19 #include <hdf_base.h>
20 #include "hdf_device_object.h"
21 #include "iservice_registry.h"
22 #include "iproxy_broker.h"
23 #include "iservmgr_hdi.h"
24 #include <sstream>
25 #include <thread>
26
27 #include "daudio_constants.h"
28 #include "daudio_errcode.h"
29 #include "daudio_events.h"
30 #include "daudio_log.h"
31 #include "daudio_utils.h"
32
33 #undef DH_LOG_TAG
34 #define DH_LOG_TAG "AudioManagerInterfaceImpl"
35
36 using namespace OHOS::DistributedHardware;
37 namespace OHOS {
38 namespace HDI {
39 namespace DistributedAudio {
40 namespace Audio {
41 namespace V1_0 {
42 AudioManagerInterfaceImpl *AudioManagerInterfaceImpl::audioManager_ = nullptr;
43 std::mutex AudioManagerInterfaceImpl::audioManagerMtx_;
44 #define SERVICE_INFO_LEN_MAX 256
45 constexpr int32_t WAIT_RECIPIENT_ERASED_TIME_SEC = 1;
46 constexpr int32_t WAIT_RECIPIENT_ERASED_RETRY_CNT = 3;
AudioManagerImplGetInstance(void)47 extern "C" IAudioManager *AudioManagerImplGetInstance(void)
48 {
49 return AudioManagerInterfaceImpl::GetAudioManager();
50 }
51
AudioManagerInterfaceImpl()52 AudioManagerInterfaceImpl::AudioManagerInterfaceImpl()
53 {
54 DHLOGI("Distributed audio manager constructed.");
55 audioManagerRecipient_ = sptr<AudioManagerRecipient>(new AudioManagerRecipient());
56 }
57
~AudioManagerInterfaceImpl()58 AudioManagerInterfaceImpl::~AudioManagerInterfaceImpl()
59 {
60 DHLOGI("Distributed audio manager destructed.");
61 ForceNotifyFwk();
62 auto retryCount = WAIT_RECIPIENT_ERASED_RETRY_CNT;
63 while (!IsAllClearRegisterRecipientErased() && retryCount--) {
64 std::this_thread::sleep_for(std::chrono::seconds(WAIT_RECIPIENT_ERASED_TIME_SEC));
65 }
66 }
67
GetAllAdapters(std::vector<AudioAdapterDescriptor> & descs)68 int32_t AudioManagerInterfaceImpl::GetAllAdapters(std::vector<AudioAdapterDescriptor> &descs)
69 {
70 DHLOGI("Get all distributed audio adapters.");
71 std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
72
73 std::transform(mapAudioAdapter_.begin(), mapAudioAdapter_.end(), std::back_inserter(descs),
74 [](auto& adp) { return adp.second->GetAdapterDesc(); });
75
76 DHLOGI("Get adapters success, total is (%{public}zu). ", mapAudioAdapter_.size());
77 return HDF_SUCCESS;
78 }
79
LoadAdapter(const AudioAdapterDescriptor & desc,sptr<IAudioAdapter> & adapter)80 int32_t AudioManagerInterfaceImpl::LoadAdapter(const AudioAdapterDescriptor &desc, sptr<IAudioAdapter> &adapter)
81 {
82 DHLOGI("Load distributed audio adapter: %{public}s.", GetAnonyString(desc.adapterName).c_str());
83 std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
84 auto adp = mapAudioAdapter_.find(desc.adapterName);
85 if (adp == mapAudioAdapter_.end()) {
86 DHLOGE("Load audio adapter failed, can not find adapter.");
87 adapter = nullptr;
88 return HDF_FAILURE;
89 }
90
91 if (adp->second == nullptr) {
92 DHLOGE("adapterimpl is nullptr.");
93 return HDF_FAILURE;
94 }
95
96 int32_t ret = adp->second->AdapterLoad();
97 if (ret != DH_SUCCESS) {
98 DHLOGE("Load audio adapter failed, adapter return: %{public}d.", ret);
99 adapter = nullptr;
100 return HDF_FAILURE;
101 }
102
103 mapAddFlags_.clear();
104 adapter = adp->second;
105 DHLOGI("Load adapter success.");
106 return HDF_SUCCESS;
107 }
108
UnloadAdapter(const std::string & adapterName)109 int32_t AudioManagerInterfaceImpl::UnloadAdapter(const std::string &adapterName)
110 {
111 DHLOGI("Unload distributed audio adapter: %{public}s.", GetAnonyString(adapterName).c_str());
112 std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
113 auto adp = mapAudioAdapter_.find(adapterName);
114 if (adp == mapAudioAdapter_.end()) {
115 DHLOGE("Unload audio adapter failed, can not find adapter.");
116 return HDF_SUCCESS;
117 }
118
119 if (adp->second == nullptr) {
120 DHLOGE("adapterimpl is nullptr.");
121 return HDF_FAILURE;
122 }
123
124 int32_t ret = adp->second->AdapterUnload();
125 if (ret != DH_SUCCESS) {
126 DHLOGE("Unload audio adapter failed, adapter return: %{public}d.", ret);
127 return ret;
128 }
129 DHLOGI("Unload adapter success.");
130 return HDF_SUCCESS;
131 }
132
ReleaseAudioManagerObject()133 int32_t AudioManagerInterfaceImpl::ReleaseAudioManagerObject()
134 {
135 DHLOGD("Release distributed audio manager object.");
136 return HDF_SUCCESS;
137 }
138
AddAudioDevice(const std::string & adpName,const uint32_t dhId,const std::string & caps,const sptr<IDAudioCallback> & callback)139 int32_t AudioManagerInterfaceImpl::AddAudioDevice(const std::string &adpName, const uint32_t dhId,
140 const std::string &caps, const sptr<IDAudioCallback> &callback)
141 {
142 DHLOGI("Add audio device name: %{public}s, device: %{public}d.", GetAnonyString(adpName).c_str(), dhId);
143 std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
144 auto adp = mapAudioAdapter_.find(adpName);
145 if (adp == mapAudioAdapter_.end()) {
146 int32_t ret = CreateAdapter(adpName, dhId, callback);
147 if (ret != DH_SUCCESS) {
148 DHLOGE("Create audio adapter failed.");
149 return ERR_DH_AUDIO_HDF_FAIL;
150 }
151 }
152 adp = mapAudioAdapter_.find(adpName);
153 if (adp == mapAudioAdapter_.end() || adp->second == nullptr) {
154 DHLOGE("Audio device has not been created or is null ptr.");
155 return ERR_DH_AUDIO_HDF_INVALID_OPERATION;
156 }
157 switch (GetDevTypeByDHId(dhId)) {
158 case AUDIO_DEVICE_TYPE_SPEAKER:
159 adp->second->SetSpeakerCallback(dhId, callback);
160 break;
161 case AUDIO_DEVICE_TYPE_MIC:
162 adp->second->SetMicCallback(dhId, callback);
163 break;
164 default:
165 DHLOGE("DhId is illegal, devType is unknow.");
166 return ERR_DH_AUDIO_HDF_FAIL;
167 }
168 int32_t ret = adp->second->AddAudioDevice(dhId, caps);
169 if (ret != DH_SUCCESS) {
170 DHLOGE("Add audio device failed, adapter return: %{public}d.", ret);
171 return ERR_DH_AUDIO_HDF_FAIL;
172 }
173 std::string flagString = adpName + std::to_string(dhId);
174 if (mapAddFlags_.find(flagString) == mapAddFlags_.end()) {
175 DAudioDevEvent event = { adpName, dhId, HDF_AUDIO_DEVICE_ADD, 0, adp->second->GetVolumeGroup(dhId),
176 adp->second->GetInterruptGroup(dhId), caps };
177 ret = AddAudioDeviceInner(dhId, event);
178 if (ret != DH_SUCCESS) {
179 return ret;
180 }
181 mapAddFlags_.insert(std::make_pair(flagString, true));
182 notifyFwkMap_.insert(std::make_pair(flagString, event));
183 }
184 sptr<IRemoteObject> remote = GetRemote(adpName);
185 if (remote != nullptr) {
186 AddClearRegisterRecipient(remote, adpName, dhId);
187 }
188 DHLOGI("Add audio device success.");
189 return DH_SUCCESS;
190 }
191
AddAudioDeviceInner(const uint32_t dhId,const DAudioDevEvent & event)192 int32_t AudioManagerInterfaceImpl::AddAudioDeviceInner(const uint32_t dhId, const DAudioDevEvent &event)
193 {
194 int32_t ret = DH_SUCCESS;
195 if (dhId != LOW_LATENCY_RENDER_ID) {
196 int32_t ret = NotifyFwk(event);
197 if (ret != DH_SUCCESS) {
198 DHLOGE("Notify audio fwk failed, ret = %{public}d.", ret);
199 return ret;
200 }
201 }
202 return ret;
203 }
204
RemoveAudioDevice(const std::string & adpName,const uint32_t dhId)205 int32_t AudioManagerInterfaceImpl::RemoveAudioDevice(const std::string &adpName, const uint32_t dhId)
206 {
207 DHLOGI("Remove audio device name: %{public}s, device: %{public}d.", GetAnonyString(adpName).c_str(), dhId);
208 DAudioDevEvent event = { adpName, dhId, HDF_AUDIO_DEVICE_REMOVE, 0, 0, 0 };
209 int32_t ret = NotifyFwk(event);
210 if (ret != DH_SUCCESS) {
211 DHLOGE("Notify audio fwk failed, ret = %{public}d.", ret);
212 }
213 mapAddFlags_.erase(adpName + std::to_string(dhId));
214 notifyFwkMap_.erase(adpName + std::to_string(dhId));
215 auto adapter = GetAdapterFromMap(adpName);
216 CHECK_NULL_RETURN(adapter, ERR_DH_AUDIO_HDF_INVALID_OPERATION);
217
218 ret = adapter->RemoveAudioDevice(dhId);
219 if (ret != DH_SUCCESS) {
220 DHLOGE("Remove audio device failed, adapter return: %{public}d.", ret);
221 return ret;
222 }
223 {
224 std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
225 if (adapter->IsPortsNoReg()) {
226 mapAudioAdapter_.erase(adpName);
227 sptr<IRemoteObject> remote = GetRemote(adpName);
228 if (remote != nullptr) {
229 RemoveClearRegisterRecipient(remote, adpName, dhId);
230 }
231 mapAudioCallback_.erase(adpName);
232 }
233 DHLOGI("Remove audio device success, mapAudioAdapter size() is: %{public}zu .", mapAudioAdapter_.size());
234 }
235 return DH_SUCCESS;
236 }
237
GetAdapterFromMap(const std::string & adpName)238 sptr<AudioAdapterInterfaceImpl> AudioManagerInterfaceImpl::GetAdapterFromMap(const std::string &adpName)
239 {
240 std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
241 auto adp = mapAudioAdapter_.find(adpName);
242 if (adp == mapAudioAdapter_.end()) {
243 DHLOGE("Audio device is not found.");
244 return nullptr;
245 }
246 return adp->second;
247 }
248
Notify(const std::string & adpName,const uint32_t devId,const uint32_t streamId,const DAudioEvent & event)249 int32_t AudioManagerInterfaceImpl::Notify(const std::string &adpName, const uint32_t devId,
250 const uint32_t streamId, const DAudioEvent &event)
251 {
252 DHLOGI("Notify event, adapter name: %{public}s. event type: %{public}d", GetAnonyString(adpName).c_str(),
253 event.type);
254 sptr<AudioAdapterInterfaceImpl> adp = nullptr;
255 {
256 std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
257 auto adpIter = mapAudioAdapter_.find(adpName);
258 if (adpIter == mapAudioAdapter_.end()) {
259 DHLOGE("Notify failed, can not find adapter.");
260 return ERR_DH_AUDIO_HDF_INVALID_OPERATION;
261 }
262 adp = adpIter->second;
263 }
264 if (adp == nullptr) {
265 DHLOGE("The audio adapter is nullptr.");
266 return ERR_DH_AUDIO_HDF_NULLPTR;
267 }
268 int32_t ret = adp->Notify(devId, streamId, event);
269 if (ret != DH_SUCCESS) {
270 DHLOGE("Notify failed, adapter return: %{public}d.", ret);
271 return ERR_DH_AUDIO_HDF_FAIL;
272 }
273 return DH_SUCCESS;
274 }
275
NotifyFwk(const DAudioDevEvent & event)276 int32_t AudioManagerInterfaceImpl::NotifyFwk(const DAudioDevEvent &event)
277 {
278 DHLOGD("Notify audio fwk event(type:%{public}d, adapter:%{public}s, pin:%{public}d).", event.eventType,
279 GetAnonyString(event.adapterName).c_str(), event.dhId);
280 std::stringstream ss;
281 ss << "EVENT_TYPE=" << event.eventType << ";NID=" << event.adapterName << ";PIN=" << event.dhId << ";VID=" <<
282 event.volGroupId << ";IID=" << event.iptGroupId;
283
284 std::stringstream temp(ss.str());
285 temp << ";CAPS=" << event.caps;
286 std::string tempStr = temp.str();
287 if (strlen(tempStr.c_str()) <= SERVICE_INFO_LEN_MAX) {
288 ss << ";CAPS=" << event.caps;
289 }
290
291 std::string eventInfo = ss.str();
292 int ret = HdfDeviceObjectSetServInfo(deviceObject_, eventInfo.c_str());
293 if (ret != HDF_SUCCESS) {
294 DHLOGE("Set service info failed, ret = %{public}d.", ret);
295 return ERR_DH_AUDIO_HDF_FAIL;
296 }
297 ret = HdfDeviceObjectUpdate(deviceObject_);
298 if (ret != HDF_SUCCESS) {
299 DHLOGE("Update service info failed, ret = %{public}d.", ret);
300 return ERR_DH_AUDIO_HDF_FAIL;
301 }
302
303 DHLOGI("Notify audio fwk success.");
304 return DH_SUCCESS;
305 }
306
CreateAdapter(const std::string & adpName,const uint32_t devId,const sptr<IDAudioCallback> & callback)307 int32_t AudioManagerInterfaceImpl::CreateAdapter(const std::string &adpName, const uint32_t devId,
308 const sptr<IDAudioCallback> &callback)
309 {
310 DHLOGI("Create adapter, pin id: %{public}s.", GetChangeDevIdMap(static_cast<int32_t>(devId)).c_str());
311 if (callback == nullptr) {
312 DHLOGE("Adapter callback is null.");
313 return ERR_DH_AUDIO_HDF_NULLPTR;
314 }
315 if (devId != DEFAULT_RENDER_ID && devId != DEFAULT_CAPTURE_ID && devId != LOW_LATENCY_RENDER_ID) {
316 DHLOGE("Pin is not default, can not create audio adapter.");
317 return ERR_DH_AUDIO_HDF_FAIL;
318 }
319
320 AudioAdapterDescriptor desc = { adpName };
321 sptr<AudioAdapterInterfaceImpl> adapter(new AudioAdapterInterfaceImpl(desc));
322 if (adapter == nullptr) {
323 DHLOGE("Create new audio adapter failed.");
324 return ERR_DH_AUDIO_HDF_NULLPTR;
325 }
326 mapAudioAdapter_.insert(std::make_pair(adpName, adapter));
327 mapAudioCallback_.insert(std::make_pair(adpName, callback));
328 return DH_SUCCESS;
329 }
330
SetDeviceObject(struct HdfDeviceObject * deviceObject)331 void AudioManagerInterfaceImpl::SetDeviceObject(struct HdfDeviceObject *deviceObject)
332 {
333 deviceObject_ = deviceObject;
334 }
335
ForceNotifyFwk()336 void AudioManagerInterfaceImpl::ForceNotifyFwk()
337 {
338 std::lock_guard<std::mutex> lock(notifyFwkMtx_);
339 for (auto it : notifyFwkMap_) {
340 DAudioDevEvent event = it.second;
341 event.eventType = HDF_AUDIO_DEVICE_REMOVE;
342 NotifyFwk(event);
343 DHLOGI("Force notify fwk, dhId: %{public}u.", event.dhId);
344 }
345 notifyFwkMap_.clear();
346 DHLOGI("Force notify fwk success.");
347 }
348
RegisterAudioHdfListener(const std::string & serviceName,const sptr<IDAudioHdfCallback> & callbackObj)349 int32_t AudioManagerInterfaceImpl::RegisterAudioHdfListener(const std::string &serviceName,
350 const sptr<IDAudioHdfCallback> &callbackObj)
351 {
352 DHLOGI("Register audio HDF listener, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
353 if (callbackObj == nullptr) {
354 DHLOGE("Audio hdf callback is null.");
355 return HDF_FAILURE;
356 }
357 sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<IDAudioHdfCallback>(callbackObj);
358 if (remote == nullptr) {
359 DHLOGE("Remote callback is nullptr.");
360 return ERR_DH_AUDIO_HDF_NULLPTR;
361 }
362 if (!remote->AddDeathRecipient(audioManagerRecipient_)) {
363 DHLOGE("AddDeathRecipient failed, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
364 return ERR_DH_AUDIO_HDF_FAIL;
365 }
366 std::lock_guard<std::mutex> lock(hdfCallbackMapMtx_);
367 if (mapAudioHdfCallback_.find(serviceName) != mapAudioHdfCallback_.end()) {
368 DHLOGI("The callback has been registered and will be replaced, serviceName: %{public}s.",
369 GetAnonyString(serviceName).c_str());
370 }
371 mapAudioHdfCallback_[serviceName] = callbackObj;
372 DHLOGI("Register audio HDF listener suncess, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
373 return DH_SUCCESS;
374 }
375
UnRegisterAudioHdfListener(const std::string & serviceName)376 int32_t AudioManagerInterfaceImpl::UnRegisterAudioHdfListener(const std::string &serviceName)
377 {
378 DHLOGI("Unregister audio HDF listener, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
379 std::lock_guard<std::mutex> lock(hdfCallbackMapMtx_);
380 auto itCallback = mapAudioHdfCallback_.find(serviceName);
381 if (itCallback == mapAudioHdfCallback_.end() || itCallback->second == nullptr) {
382 DHLOGE("Audio HDF callback has not been created or is null ptr.");
383 return ERR_DH_AUDIO_HDF_NULLPTR;
384 }
385 sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<IDAudioHdfCallback>(itCallback->second);
386 if (remote == nullptr) {
387 DHLOGE("Remote callback is nullptr.");
388 return ERR_DH_AUDIO_HDF_NULLPTR;
389 }
390 if (!remote->RemoveDeathRecipient(audioManagerRecipient_)) {
391 DHLOGE("RemoveDeathRecipient failed, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
392 return ERR_DH_AUDIO_HDF_FAIL;
393 }
394 mapAudioHdfCallback_.erase(itCallback);
395 DHLOGI("Unregister audio HDF listener suncess, serviceName: %{public}s.", GetAnonyString(serviceName).c_str());
396 return DH_SUCCESS;
397 }
398
OnRemoteDied(const wptr<IRemoteObject> & remote)399 void AudioManagerInterfaceImpl::ClearRegisterRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
400 {
401 DHLOGI("Remote died, remote daudio device begin.");
402 auto audioMgr = AudioManagerInterfaceImpl::GetAudioManager();
403 if (audioMgr != nullptr) {
404 audioMgr->RemoveAudioDevice(deviceId_, dhId_);
405 }
406 needErase_ = true;
407 DHLOGI("Remote died, remote daudio device end.");
408 }
409
OnRemoteDied(const wptr<IRemoteObject> & remote)410 void AudioManagerInterfaceImpl::AudioManagerRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
411 {
412 DHLOGE("notifyFWK before Exit the current process");
413 auto audioMgr = AudioManagerInterfaceImpl::GetAudioManager();
414 if (audioMgr != nullptr) {
415 audioMgr->ForceNotifyFwk();
416 }
417 _Exit(0);
418 }
419
GetRemote(const std::string & adpName)420 sptr<IRemoteObject> AudioManagerInterfaceImpl::GetRemote(const std::string &adpName)
421 {
422 auto call = mapAudioCallback_.find(adpName);
423 if (call == mapAudioCallback_.end() || call->second == nullptr) {
424 DHLOGE("Audio callback has not been created or is null ptr.");
425 return nullptr;
426 }
427 sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<IDAudioCallback>(call->second);
428 if (remote == nullptr) {
429 DHLOGE("Remote callback is nullptr.");
430 return nullptr;
431 }
432 return remote;
433 }
434
AddClearRegisterRecipient(sptr<IRemoteObject> & remote,const std::string & deviceId,uint32_t dhId)435 int32_t AudioManagerInterfaceImpl::AddClearRegisterRecipient(sptr<IRemoteObject> &remote,
436 const std::string &deviceId, uint32_t dhId)
437 {
438 DHLOGI("add clear register recipient begin.");
439 auto clearRegisterRecipient = sptr<ClearRegisterRecipient>(new ClearRegisterRecipient(deviceId, dhId));
440 if (clearRegisterRecipient == nullptr) {
441 DHLOGE("Create clear register recipient object failed.");
442 return ERR_DH_AUDIO_HDF_NULLPTR;
443 }
444 if (remote->AddDeathRecipient(clearRegisterRecipient) == false) {
445 DHLOGE("call AddDeathRecipient failed.");
446 return ERR_DH_AUDIO_HDF_FAIL;
447 }
448 std::lock_guard<std::mutex> lock(clearRegisterRecipientsMtx_);
449 clearRegisterRecipients_.erase(std::remove_if(clearRegisterRecipients_.begin(), clearRegisterRecipients_.end(),
450 [](sptr<ClearRegisterRecipient> &clearRegisterRecipient) {
451 return clearRegisterRecipient->IsNeedErase();
452 }), clearRegisterRecipients_.end());
453 clearRegisterRecipients_.push_back(clearRegisterRecipient);
454 DHLOGI("add clear register recipient end.");
455 return DH_SUCCESS;
456 }
457
RemoveClearRegisterRecipient(sptr<IRemoteObject> & remote,const std::string & deviceId,uint32_t dhId)458 int32_t AudioManagerInterfaceImpl::RemoveClearRegisterRecipient(sptr<IRemoteObject> &remote,
459 const std::string &deviceId, uint32_t dhId)
460 {
461 DHLOGI("remove clear register recipient begin.");
462 std::lock_guard<std::mutex> lock(clearRegisterRecipientsMtx_);
463 for (auto itRecipient = clearRegisterRecipients_.begin();
464 itRecipient != clearRegisterRecipients_.end(); ++itRecipient) {
465 auto &clearRegisterRecipient = *itRecipient;
466 if (clearRegisterRecipient->IsMatch(deviceId, dhId)) {
467 if (remote->RemoveDeathRecipient(clearRegisterRecipient) == false) {
468 DHLOGE("call RemoveDeathRecipient failed.");
469 }
470 clearRegisterRecipients_.erase(itRecipient);
471 DHLOGI("remove one clear register recipient.");
472 break;
473 }
474 }
475 DHLOGI("remove clear register recipient end.");
476 return DH_SUCCESS;
477 }
478
IsAllClearRegisterRecipientErased()479 bool AudioManagerInterfaceImpl::IsAllClearRegisterRecipientErased()
480 {
481 DHLOGI("is all clear register recipient erased begin.");
482 std::lock_guard<std::mutex> lock(clearRegisterRecipientsMtx_);
483 for (auto itRecipient = clearRegisterRecipients_.begin();
484 itRecipient != clearRegisterRecipients_.end(); ++itRecipient) {
485 auto &clearRegisterRecipient = *itRecipient;
486 if (clearRegisterRecipient == nullptr) {
487 DHLOGE("Clear register recipient is nullptr.");
488 continue;
489 }
490 if (!clearRegisterRecipient->IsNeedErase()) {
491 DHLOGI("clear register recipient not erased.");
492 return false;
493 }
494 }
495 DHLOGI("is all clear register recipient erased end.");
496 return true;
497 }
498 } // V1_0
499 } // Audio
500 } // Distributedaudio
501 } // HDI
502 } // OHOSf
503