1 /*
2  * Copyright (c) 2022-2024 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 
26 #include "daudio_constants.h"
27 #include "daudio_errcode.h"
28 #include "daudio_events.h"
29 #include "daudio_log.h"
30 #include "daudio_utils.h"
31 
32 #undef DH_LOG_TAG
33 #define DH_LOG_TAG "AudioManagerInterfaceImpl"
34 
35 using namespace OHOS::DistributedHardware;
36 namespace OHOS {
37 namespace HDI {
38 namespace DistributedAudio {
39 namespace Audio {
40 namespace V1_0 {
41 AudioManagerInterfaceImpl *AudioManagerInterfaceImpl::audioManager_ = nullptr;
42 std::mutex AudioManagerInterfaceImpl::audioManagerMtx_;
AudioManagerImplGetInstance(void)43 extern "C" IAudioManager *AudioManagerImplGetInstance(void)
44 {
45     return AudioManagerInterfaceImpl::GetAudioManager();
46 }
47 
AudioManagerInterfaceImpl()48 AudioManagerInterfaceImpl::AudioManagerInterfaceImpl()
49 {
50     DHLOGD("Distributed audio manager constructed.");
51     audioManagerRecipient_ = sptr<AudioManagerRecipient>(new AudioManagerRecipient());
52 }
53 
~AudioManagerInterfaceImpl()54 AudioManagerInterfaceImpl::~AudioManagerInterfaceImpl()
55 {
56     DHLOGD("Distributed audio manager destructed.");
57 }
58 
GetAllAdapters(std::vector<AudioAdapterDescriptor> & descs)59 int32_t AudioManagerInterfaceImpl::GetAllAdapters(std::vector<AudioAdapterDescriptor> &descs)
60 {
61     DHLOGI("Get all distributed audio adapters.");
62     std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
63 
64     std::transform(mapAudioAdapter_.begin(), mapAudioAdapter_.end(), std::back_inserter(descs),
65         [](auto& adp) { return adp.second->GetAdapterDesc(); });
66 
67     DHLOGI("Get adapters success, total is (%{public}zu). ", mapAudioAdapter_.size());
68     return HDF_SUCCESS;
69 }
70 
LoadAdapter(const AudioAdapterDescriptor & desc,sptr<IAudioAdapter> & adapter)71 int32_t AudioManagerInterfaceImpl::LoadAdapter(const AudioAdapterDescriptor &desc, sptr<IAudioAdapter> &adapter)
72 {
73     DHLOGI("Load distributed audio adapter: %{public}s.", GetAnonyString(desc.adapterName).c_str());
74     std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
75     auto adp = mapAudioAdapter_.find(desc.adapterName);
76     if (adp == mapAudioAdapter_.end()) {
77         DHLOGE("Load audio adapter failed, can not find adapter.");
78         adapter = nullptr;
79         return HDF_FAILURE;
80     }
81 
82     if (adp->second == nullptr) {
83         DHLOGE("adapterimpl is nullptr.");
84         return HDF_FAILURE;
85     }
86 
87     int32_t ret = adp->second->AdapterLoad();
88     if (ret != DH_SUCCESS) {
89         DHLOGE("Load audio adapter failed, adapter return: %{public}d.", ret);
90         adapter = nullptr;
91         return HDF_FAILURE;
92     }
93 
94     mapAddFlags_.clear();
95     adapter = adp->second;
96     DHLOGI("Load adapter success.");
97     return HDF_SUCCESS;
98 }
99 
UnloadAdapter(const std::string & adapterName)100 int32_t AudioManagerInterfaceImpl::UnloadAdapter(const std::string &adapterName)
101 {
102     DHLOGI("Unload distributed audio adapter: %{public}s.", GetAnonyString(adapterName).c_str());
103     std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
104     auto adp = mapAudioAdapter_.find(adapterName);
105     if (adp == mapAudioAdapter_.end()) {
106         DHLOGE("Unload audio adapter failed, can not find adapter.");
107         return HDF_SUCCESS;
108     }
109 
110     if (adp->second == nullptr) {
111         DHLOGE("adapterimpl is nullptr.");
112         return HDF_FAILURE;
113     }
114 
115     int32_t ret = adp->second->AdapterUnload();
116     if (ret != DH_SUCCESS) {
117         DHLOGE("Unload audio adapter failed, adapter return: %{public}d.", ret);
118         return ret;
119     }
120     DHLOGI("Unload adapter success.");
121     return HDF_SUCCESS;
122 }
123 
ReleaseAudioManagerObject()124 int32_t AudioManagerInterfaceImpl::ReleaseAudioManagerObject()
125 {
126     DHLOGD("Release distributed audio manager object.");
127     return HDF_SUCCESS;
128 }
129 
AddAudioDevice(const std::string & adpName,const uint32_t dhId,const std::string & caps,const sptr<IDAudioCallback> & callback)130 int32_t AudioManagerInterfaceImpl::AddAudioDevice(const std::string &adpName, const uint32_t dhId,
131     const std::string &caps, const sptr<IDAudioCallback> &callback)
132 {
133     DHLOGI("Add audio device name: %{public}s, device: %{public}d.", GetAnonyString(adpName).c_str(), dhId);
134     std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
135     auto adp = mapAudioAdapter_.find(adpName);
136     if (adp == mapAudioAdapter_.end()) {
137         int32_t ret = CreateAdapter(adpName, dhId, callback);
138         if (ret != DH_SUCCESS) {
139             DHLOGE("Create audio adapter failed.");
140             return ERR_DH_AUDIO_HDF_FAIL;
141         }
142     }
143     adp = mapAudioAdapter_.find(adpName);
144     if (adp == mapAudioAdapter_.end() || adp->second == nullptr) {
145         DHLOGE("Audio device has not been created  or is null ptr.");
146         return ERR_DH_AUDIO_HDF_INVALID_OPERATION;
147     }
148     switch (GetDevTypeByDHId(dhId)) {
149         case AUDIO_DEVICE_TYPE_SPEAKER:
150             adp->second->SetSpeakerCallback(dhId, callback);
151             break;
152         case AUDIO_DEVICE_TYPE_MIC:
153             adp->second->SetMicCallback(dhId, callback);
154             break;
155         default:
156             DHLOGE("DhId is illegal, devType is unknow.");
157             return ERR_DH_AUDIO_HDF_FAIL;
158     }
159     int32_t ret = adp->second->AddAudioDevice(dhId, caps);
160     if (ret != DH_SUCCESS) {
161         DHLOGE("Add audio device failed, adapter return: %{public}d.", ret);
162         return ERR_DH_AUDIO_HDF_FAIL;
163     }
164     std::string flagString = adpName + std::to_string(dhId);
165     if (mapAddFlags_.find(flagString) == mapAddFlags_.end()) {
166         DAudioDevEvent event = { adpName, dhId, HDF_AUDIO_DEVICE_ADD, 0, adp->second->GetVolumeGroup(dhId),
167             adp->second->GetInterruptGroup(dhId) };
168         ret = NotifyFwk(event);
169         if (ret != DH_SUCCESS) {
170             DHLOGE("Notify audio fwk failed, ret = %{public}d.", ret);
171             return ret;
172         }
173         mapAddFlags_.insert(std::make_pair(flagString, true));
174     }
175     sptr<IRemoteObject> remote = GetRemote(adpName);
176     if (remote != nullptr) {
177         remote->AddDeathRecipient(audioManagerRecipient_);
178     }
179     DHLOGI("Add audio device success.");
180     return DH_SUCCESS;
181 }
182 
RemoveAudioDevice(const std::string & adpName,const uint32_t dhId)183 int32_t AudioManagerInterfaceImpl::RemoveAudioDevice(const std::string &adpName, const uint32_t dhId)
184 {
185     DHLOGI("Remove audio device name: %{public}s, device: %{public}d.", GetAnonyString(adpName).c_str(), dhId);
186     auto adapter = GetAdapterFromMap(adpName);
187     CHECK_NULL_RETURN(adapter, ERR_DH_AUDIO_HDF_INVALID_OPERATION);
188 
189     int32_t ret = adapter->RemoveAudioDevice(dhId);
190     if (ret != DH_SUCCESS) {
191         DHLOGE("Remove audio device failed, adapter return: %{public}d.", ret);
192         return ret;
193     }
194     DAudioDevEvent event = { adpName, dhId, HDF_AUDIO_DEVICE_REMOVE, 0, 0, 0 };
195     ret = NotifyFwk(event);
196     if (ret != DH_SUCCESS) {
197         DHLOGE("Notify audio fwk failed, ret = %{public}d.", ret);
198     }
199     mapAddFlags_.erase(adpName + std::to_string(dhId));
200     {
201         std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
202         if (adapter->IsPortsNoReg()) {
203             mapAudioAdapter_.erase(adpName);
204             sptr<IRemoteObject> remote = GetRemote(adpName);
205             if (remote != nullptr) {
206                 remote->RemoveDeathRecipient(audioManagerRecipient_);
207             }
208             mapAudioCallback_.erase(adpName);
209         }
210         DHLOGI("Remove audio device success, mapAudioAdapter size() is : %zu .", mapAudioAdapter_.size());
211     }
212     return DH_SUCCESS;
213 }
214 
GetAdapterFromMap(const std::string & adpName)215 sptr<AudioAdapterInterfaceImpl> AudioManagerInterfaceImpl::GetAdapterFromMap(const std::string &adpName)
216 {
217     std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
218     auto adp = mapAudioAdapter_.find(adpName);
219     if (adp == mapAudioAdapter_.end()) {
220         DHLOGE("Audio device is not found.");
221         return nullptr;
222     }
223     return adp->second;
224 }
225 
Notify(const std::string & adpName,const uint32_t devId,const uint32_t streamId,const DAudioEvent & event)226 int32_t AudioManagerInterfaceImpl::Notify(const std::string &adpName, const uint32_t devId,
227     const uint32_t streamId, const DAudioEvent &event)
228 {
229     DHLOGI("Notify event, adapter name: %{public}s. event type: %{public}d", GetAnonyString(adpName).c_str(),
230         event.type);
231     sptr<AudioAdapterInterfaceImpl> adp = nullptr;
232     {
233         std::lock_guard<std::mutex> adpLck(adapterMapMtx_);
234         auto adpIter = mapAudioAdapter_.find(adpName);
235         if (adpIter == mapAudioAdapter_.end()) {
236             DHLOGE("Notify failed, can not find adapter.");
237             return ERR_DH_AUDIO_HDF_INVALID_OPERATION;
238         }
239         adp = adpIter->second;
240     }
241     if (adp == nullptr) {
242         DHLOGE("The audio adapter is nullptr.");
243         return ERR_DH_AUDIO_HDF_NULLPTR;
244     }
245     int32_t ret = adp->Notify(devId, streamId, event);
246     if (ret != DH_SUCCESS) {
247         DHLOGE("Notify failed, adapter return: %{public}d.", ret);
248         return ERR_DH_AUDIO_HDF_FAIL;
249     }
250     return DH_SUCCESS;
251 }
252 
NotifyFwk(const DAudioDevEvent & event)253 int32_t AudioManagerInterfaceImpl::NotifyFwk(const DAudioDevEvent &event)
254 {
255     DHLOGD("Notify audio fwk event(type:%{public}d, adapter:%{public}s, pin:%{public}d).", event.eventType,
256         GetAnonyString(event.adapterName).c_str(), event.dhId);
257     std::stringstream ss;
258     ss << "EVENT_TYPE=" << event.eventType << ";NID=" << event.adapterName << ";PIN=" << event.dhId << ";VID=" <<
259         event.volGroupId << ";IID=" << event.iptGroupId;
260     std::string eventInfo = ss.str();
261     int ret = HdfDeviceObjectSetServInfo(deviceObject_, eventInfo.c_str());
262     if (ret != HDF_SUCCESS) {
263         DHLOGE("Set service info failed, ret = %{public}d.", ret);
264         return ERR_DH_AUDIO_HDF_FAIL;
265     }
266     ret = HdfDeviceObjectUpdate(deviceObject_);
267     if (ret != HDF_SUCCESS) {
268         DHLOGE("Update service info failed, ret = %{public}d.", ret);
269         return ERR_DH_AUDIO_HDF_FAIL;
270     }
271 
272     DHLOGI("Notify audio fwk success.");
273     return DH_SUCCESS;
274 }
275 
CreateAdapter(const std::string & adpName,const uint32_t devId,const sptr<IDAudioCallback> & callback)276 int32_t AudioManagerInterfaceImpl::CreateAdapter(const std::string &adpName, const uint32_t devId,
277     const sptr<IDAudioCallback> &callback)
278 {
279     DHLOGI("Create adapter, pin id: %{public}s.", GetChangeDevIdMap(static_cast<int32_t>(devId)).c_str());
280     if (callback == nullptr) {
281         DHLOGE("Adapter callback is null.");
282         return ERR_DH_AUDIO_HDF_NULLPTR;
283     }
284     if (devId != DEFAULT_RENDER_ID && devId != DEFAULT_CAPTURE_ID && devId != LOW_LATENCY_RENDER_ID) {
285         DHLOGE("Pin is not default, can not create audio adapter.");
286         return ERR_DH_AUDIO_HDF_FAIL;
287     }
288 
289     AudioAdapterDescriptor desc = { adpName };
290     sptr<AudioAdapterInterfaceImpl> adapter(new AudioAdapterInterfaceImpl(desc));
291     if (adapter == nullptr) {
292         DHLOGE("Create new audio adapter failed.");
293         return ERR_DH_AUDIO_HDF_NULLPTR;
294     }
295     mapAudioAdapter_.insert(std::make_pair(adpName, adapter));
296     mapAudioCallback_.insert(std::make_pair(adpName, callback));
297     return DH_SUCCESS;
298 }
299 
SetDeviceObject(struct HdfDeviceObject * deviceObject)300 void AudioManagerInterfaceImpl::SetDeviceObject(struct HdfDeviceObject *deviceObject)
301 {
302     deviceObject_ = deviceObject;
303 }
304 
OnRemoteDied(const wptr<IRemoteObject> & remote)305 void AudioManagerInterfaceImpl::AudioManagerRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
306 {
307     DHLOGE("Exit the current process.");
308     _Exit(0);
309 }
310 
GetRemote(const std::string & adpName)311 sptr<IRemoteObject> AudioManagerInterfaceImpl::GetRemote(const std::string &adpName)
312 {
313     auto call = mapAudioCallback_.find(adpName);
314     if (call == mapAudioCallback_.end() || call->second == nullptr) {
315         DHLOGE("Audio callback has not been created or is null ptr.");
316         return nullptr;
317     }
318     sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<IDAudioCallback>(call->second);
319     if (remote == nullptr) {
320         DHLOGE("Remote callback is nullptr.");
321         return nullptr;
322     }
323     return remote;
324 }
325 } // V1_0
326 } // Audio
327 } // Distributedaudio
328 } // HDI
329 } // OHOSf
330