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