• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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