1 /*
2 * Copyright (c) 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 #ifndef LOG_TAG
17 #define LOG_TAG "RemoteDeviceManager"
18 #endif
19
20 #include "adapter/remote_device_manager.h"
21 #include "manager/hdi_monitor.h"
22 #include "audio_hdi_log.h"
23 #include "audio_errors.h"
24 #include "audio_utils.h"
25 #include "manager/hdi_adapter_manager.h"
26
27 using namespace OHOS::HDI::DistributedAudio::Audio::V1_0;
28
29 namespace OHOS {
30 namespace AudioStandard {
RemoteAdapterHdiCallback(const std::string & adapterName)31 RemoteAdapterHdiCallback::RemoteAdapterHdiCallback(const std::string &adapterName)
32 : adapterName_(adapterName)
33 {
34 }
35
RenderCallback(AudioCallbackType type,int8_t & reserved,int8_t & cookie)36 int32_t RemoteAdapterHdiCallback::RenderCallback(AudioCallbackType type, int8_t &reserved, int8_t &cookie)
37 {
38 (void)type;
39 (void)reserved;
40 (void)cookie;
41 return SUCCESS;
42 }
43
ParamCallback(AudioExtParamKey key,const std::string & condition,const std::string & value,int8_t & reserved,int8_t cookie)44 int32_t RemoteAdapterHdiCallback::ParamCallback(AudioExtParamKey key, const std::string &condition,
45 const std::string &value, int8_t &reserved, int8_t cookie)
46 {
47 (void)cookie;
48 AUDIO_INFO_LOG("key: %{public}d, condition: %{public}s, value: %{public}s", key, condition.c_str(), value.c_str());
49 AudioParamKey audioKey = AudioParamKey(key);
50 HdiAdapterManager &manager = HdiAdapterManager::GetInstance();
51 std::shared_ptr<IDeviceManager> deviceManager = manager.GetDeviceManager(HDI_DEVICE_MANAGER_TYPE_REMOTE);
52 CHECK_AND_RETURN_RET(deviceManager != nullptr, ERR_INVALID_HANDLE);
53 deviceManager->HandleEvent(adapterName_, audioKey, condition.c_str(), value.c_str(),
54 static_cast<void *>(&reserved));
55 return SUCCESS;
56 }
57
LoadAdapter(const std::string & adapterName)58 int32_t RemoteDeviceManager::LoadAdapter(const std::string &adapterName)
59 {
60 CHECK_AND_RETURN_RET_LOG(adapters_.count(adapterName) == 0 || adapters_[adapterName] == nullptr, SUCCESS,
61 "adapter %{public}s already loaded", adapterName.c_str());
62
63 std::lock_guard<std::mutex> mgrLock(managerMtx_);
64 if (audioManager_ == nullptr || adapters_.size() == 0) {
65 audioManager_ = nullptr;
66 InitAudioManager();
67 }
68 CHECK_AND_RETURN_RET(audioManager_ != nullptr, ERR_INVALID_HANDLE);
69
70 std::vector<AudioAdapterDescriptor> descs;
71 int32_t ret = audioManager_->GetAllAdapters(descs);
72 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS && descs.data() != nullptr, ERR_NOT_STARTED, "get adapters fail");
73 int32_t index = SwitchAdapterDesc(descs, adapterName);
74 CHECK_AND_RETURN_RET(index >= 0, ERR_NOT_STARTED);
75
76 sptr<IAudioAdapter> adapter = nullptr;
77 AudioAdapterDescriptor desc = {
78 .adapterName = descs[index].adapterName,
79 };
80 ret = audioManager_->LoadAdapter(desc, adapter);
81 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS && adapter != nullptr, ERR_NOT_STARTED, "load adapter fail");
82 ret = adapter->InitAllPorts();
83 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_NOT_STARTED, "init all ports fail");
84 std::lock_guard<std::mutex> lock(adapterMtx_);
85 adapters_[adapterName] = std::make_shared<RemoteAdapterWrapper>(adapterName);
86 adapters_[adapterName]->adapterDesc_ = descs[index];
87 adapters_[adapterName]->adapter_ = adapter;
88 AUDIO_INFO_LOG("load adapter %{public}s success", adapterName.c_str());
89 #ifdef FEATURE_DISTRIBUTE_AUDIO
90 adapters_[adapterName]->hdiCallback_ = new RemoteAdapterHdiCallback(adapterName);
91 ret = adapter->RegExtraParamObserver(adapters_[adapterName]->hdiCallback_, 0);
92 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_NOT_STARTED, "regist extra param observer fail, ret: %{public}d", ret);
93 #endif
94 return SUCCESS;
95 }
96
UnloadAdapter(const std::string & adapterName,bool force)97 void RemoteDeviceManager::UnloadAdapter(const std::string &adapterName, bool force)
98 {
99 std::lock_guard<std::mutex> mgrLock(managerMtx_);
100 CHECK_AND_RETURN_LOG(audioManager_ != nullptr, "audio manager is nullptr");
101
102 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
103 CHECK_AND_RETURN_LOG(wrapper != nullptr, "adapter %{public}s is nullptr", adapterName.c_str());
104 std::unique_lock<std::mutex> innerLock(wrapper->adapterMtx_);
105 CHECK_AND_RETURN_LOG(wrapper->adapter_ != nullptr, "adapter %{public}s is nullptr", adapterName.c_str());
106 CHECK_AND_RETURN_LOG(force || (wrapper->hdiRenderIds_.size() == 0 && wrapper->hdiCaptureIds_.size() == 0),
107 "adapter %{public}s has some ports busy, renderNum: %{public}zu, captureNum: %{public}zu", adapterName.c_str(),
108 wrapper->hdiRenderIds_.size(), wrapper->hdiCaptureIds_.size());
109
110 if (wrapper->routeHandle_ != -1) {
111 wrapper->adapter_->ReleaseAudioRoute(wrapper->routeHandle_);
112 }
113 audioManager_->UnloadAdapter(wrapper->adapterDesc_.adapterName);
114 wrapper->adapter_ = nullptr;
115 innerLock.unlock();
116 std::lock_guard<std::mutex> lock(adapterMtx_);
117 adapters_[adapterName].reset();
118 adapters_.erase(adapterName);
119 if (adapters_.size() == 0) {
120 audioManager_ = nullptr;
121 }
122 AUDIO_INFO_LOG("unload adapter %{public}s success", adapterName.c_str());
123 }
124
AllAdapterSetMicMute(bool isMute)125 void RemoteDeviceManager::AllAdapterSetMicMute(bool isMute)
126 {
127 AUDIO_INFO_LOG("not support");
128 }
129
SetAudioParameter(const std::string & adapterName,const AudioParamKey key,const std::string & condition,const std::string & value)130 void RemoteDeviceManager::SetAudioParameter(const std::string &adapterName, const AudioParamKey key,
131 const std::string &condition, const std::string &value)
132 {
133 #ifdef FEATURE_DISTRIBUTE_AUDIO
134 AUDIO_INFO_LOG("key: %{public}d, condition: %{public}s, value: %{public}s", key, condition.c_str(), value.c_str());
135
136 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
137 CHECK_AND_RETURN_LOG(wrapper != nullptr && wrapper->adapter_ != nullptr, "adapter %{public}s is nullptr",
138 adapterName.c_str());
139 AudioExtParamKey hdiKey = AudioExtParamKey(key);
140 int32_t ret = wrapper->adapter_->SetExtraParams(hdiKey, condition, value);
141 CHECK_AND_RETURN_LOG(ret == SUCCESS, "set param fail, error code: %{public}d", ret);
142 #else
143 AUDIO_INFO_LOG("not support");
144 #endif
145 }
146
GetAudioParameter(const std::string & adapterName,const AudioParamKey key,const std::string & condition)147 std::string RemoteDeviceManager::GetAudioParameter(const std::string &adapterName, const AudioParamKey key,
148 const std::string &condition)
149 {
150 #ifdef FEATURE_DISTRIBUTE_AUDIO
151 AUDIO_INFO_LOG("key: %{public}d, condition: %{public}s", key, condition.c_str());
152
153 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
154 CHECK_AND_RETURN_RET_LOG(wrapper != nullptr && wrapper->adapter_ != nullptr, "", "adapter %{public}s is nullptr",
155 adapterName.c_str());
156 AudioExtParamKey hdiKey = AudioExtParamKey(key);
157 std::string value;
158 int32_t ret = wrapper->adapter_->GetExtraParams(hdiKey, condition.c_str(), value);
159 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, "", "get param fail, error code: %{public}d", ret);
160 return value;
161 #else
162 AUDIO_INFO_LOG("not support");
163 return "";
164 #endif
165 }
166
SetVoiceVolume(const std::string & adapterName,float volume)167 int32_t RemoteDeviceManager::SetVoiceVolume(const std::string &adapterName, float volume)
168 {
169 AUDIO_INFO_LOG("not support");
170 return ERR_NOT_SUPPORTED;
171 }
172
SetOutputRoute(const std::string & adapterName,const std::vector<DeviceType> & devices,int32_t streamId)173 int32_t RemoteDeviceManager::SetOutputRoute(const std::string &adapterName, const std::vector<DeviceType> &devices,
174 int32_t streamId)
175 {
176 CHECK_AND_RETURN_RET_LOG(!devices.empty(), ERR_INVALID_PARAM, "invalid audio devices");
177 DeviceType device = devices[0];
178
179 AudioRouteNode source = {
180 .portId = 0,
181 .role = AudioPortRole::AUDIO_PORT_SOURCE_ROLE,
182 .type = AudioPortType::AUDIO_PORT_MIX_TYPE,
183 .ext.mix.moduleId = 0,
184 .ext.mix.streamId = streamId,
185 };
186 AudioRouteNode sink = {};
187 int32_t ret = SetOutputPortPin(device, sink);
188 CHECK_AND_RETURN_RET(ret == SUCCESS, ret);
189 AUDIO_INFO_LOG("output, pin: 0x%{public}X", sink.ext.device.type);
190 sink.portId = static_cast<int32_t>(GetPortId(PORT_OUT));
191 sink.role = AudioPortRole::AUDIO_PORT_SINK_ROLE;
192 sink.type = AudioPortType::AUDIO_PORT_DEVICE_TYPE;
193 sink.ext.device.moduleId = 0;
194 AudioRoute route;
195 route.sources.push_back(source);
196 route.sinks.push_back(sink);
197
198 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
199 CHECK_AND_RETURN_RET_LOG(wrapper != nullptr && wrapper->adapter_ != nullptr, ERR_INVALID_HANDLE,
200 "adapter %{public}s is nullptr", adapterName.c_str());
201 ret = wrapper->adapter_->UpdateAudioRoute(route, wrapper->routeHandle_);
202
203 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "update route fail");
204 return SUCCESS;
205 }
206
SetInputRoute(const std::string & adapterName,DeviceType device,int32_t streamId,int32_t inputType)207 int32_t RemoteDeviceManager::SetInputRoute(const std::string &adapterName, DeviceType device, int32_t streamId,
208 int32_t inputType)
209 {
210 (void)inputType;
211
212 AudioRouteNode source = {};
213 int32_t ret = SetInputPortPin(device, source);
214 CHECK_AND_RETURN_RET(ret == SUCCESS, ret);
215 AUDIO_INFO_LOG("input, pin: 0x%{public}X", source.ext.device.type);
216 source.portId = static_cast<int32_t>(GetPortId(PORT_IN));
217 source.role = AudioPortRole::AUDIO_PORT_SOURCE_ROLE;
218 source.type = AudioPortType::AUDIO_PORT_DEVICE_TYPE;
219 source.ext.device.moduleId = 0;
220 AudioRouteNode sink = {
221 .portId = 0,
222 .role = AudioPortRole::AUDIO_PORT_SINK_ROLE,
223 .type = AudioPortType::AUDIO_PORT_MIX_TYPE,
224 .ext.mix.moduleId = 0,
225 .ext.mix.streamId = streamId,
226 };
227 AudioRoute route;
228 route.sources.push_back(source);
229 route.sinks.push_back(sink);
230
231 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
232 CHECK_AND_RETURN_RET_LOG(wrapper != nullptr && wrapper->adapter_ != nullptr, ERR_INVALID_HANDLE,
233 "adapter %{public}s is nullptr", adapterName.c_str());
234 ret = wrapper->adapter_->UpdateAudioRoute(route, wrapper->routeHandle_);
235
236 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "update route fail");
237 return SUCCESS;
238 }
239
SetMicMute(const std::string & adapterName,bool isMute)240 void RemoteDeviceManager::SetMicMute(const std::string &adapterName, bool isMute)
241 {
242 AUDIO_INFO_LOG("not support");
243 }
244
HandleEvent(const std::string & adapterName,const AudioParamKey key,const char * condition,const char * value,void * reserved)245 int32_t RemoteDeviceManager::HandleEvent(const std::string &adapterName, const AudioParamKey key, const char *condition,
246 const char *value, void *reserved)
247 {
248 AUDIO_INFO_LOG("key: %{public}d, condition: %{public}s, value: %{public}s", key, condition, value);
249 int32_t ret = SUCCESS;
250 switch (key) {
251 case AudioParamKey::PARAM_KEY_STATE:
252 ret = HandleStateChangeEvent(adapterName, key, condition, value);
253 break;
254 case AudioParamKey::VOLUME:
255 case AudioParamKey::INTERRUPT:
256 ret = HandleRenderParamEvent(adapterName, key, condition, value);
257 break;
258 default:
259 AUDIO_ERR_LOG("not support, key: %{public}d", key);
260 return ERR_NOT_SUPPORTED;
261 }
262 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "handle fail, key: %{public}d, error code: %{public}d", key, ret);
263 return SUCCESS;
264 }
265
RegistRenderSinkCallback(const std::string & adapterName,uint32_t hdiRenderId,IDeviceManagerCallback * callback)266 void RemoteDeviceManager::RegistRenderSinkCallback(const std::string &adapterName, uint32_t hdiRenderId,
267 IDeviceManagerCallback *callback)
268 {
269 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName, true);
270 CHECK_AND_RETURN_LOG(wrapper != nullptr, "adapter %{public}s is nullptr", adapterName.c_str());
271 std::lock_guard<std::mutex> lock(wrapper->renderCallbackMtx_);
272 CHECK_AND_RETURN_LOG(wrapper->renderCallbacks_.count(hdiRenderId) == 0,
273 "callback already existed, hdiRenderId: %{public}u", hdiRenderId);
274 wrapper->renderCallbacks_[hdiRenderId] = callback;
275 }
276
RegistCaptureSourceCallback(const std::string & adapterName,uint32_t hdiCaptureId,IDeviceManagerCallback * callback)277 void RemoteDeviceManager::RegistCaptureSourceCallback(const std::string &adapterName, uint32_t hdiCaptureId,
278 IDeviceManagerCallback *callback)
279 {
280 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName, true);
281 CHECK_AND_RETURN_LOG(wrapper != nullptr, "adapter %{public}s is nullptr", adapterName.c_str());
282 std::lock_guard<std::mutex> lock(wrapper->captureCallbackMtx_);
283 CHECK_AND_RETURN_LOG(wrapper->captureCallbacks_.count(hdiCaptureId) == 0,
284 "callback already existed, hdiCaptureId: %{public}u", hdiCaptureId);
285 wrapper->captureCallbacks_[hdiCaptureId] = callback;
286 }
287
UnRegistRenderSinkCallback(const std::string & adapterName,uint32_t hdiRenderId)288 void RemoteDeviceManager::UnRegistRenderSinkCallback(const std::string &adapterName, uint32_t hdiRenderId)
289 {
290 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
291 CHECK_AND_RETURN_LOG(wrapper != nullptr, "adapter %{public}s is nullptr", adapterName.c_str());
292 std::lock_guard<std::mutex> lock(wrapper->renderCallbackMtx_);
293 CHECK_AND_RETURN_LOG(wrapper->renderCallbacks_.count(hdiRenderId) != 0,
294 "callback not exist, hdiRenderId: %{public}u", hdiRenderId);
295 wrapper->renderCallbacks_.erase(hdiRenderId);
296 }
297
UnRegistCaptureSourceCallback(const std::string & adapterName,uint32_t hdiCaptureId)298 void RemoteDeviceManager::UnRegistCaptureSourceCallback(const std::string &adapterName, uint32_t hdiCaptureId)
299 {
300 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
301 CHECK_AND_RETURN_LOG(wrapper != nullptr, "adapter %{public}s is nullptr", adapterName.c_str());
302 std::lock_guard<std::mutex> lock(wrapper->captureCallbackMtx_);
303 CHECK_AND_RETURN_LOG(wrapper->captureCallbacks_.count(hdiCaptureId) != 0,
304 "callback not exist, hdiCaptureId: %{public}u", hdiCaptureId);
305 wrapper->captureCallbacks_.erase(hdiCaptureId);
306 }
307
CreateRender(const std::string & adapterName,void * param,void * deviceDesc,uint32_t & hdiRenderId)308 void *RemoteDeviceManager::CreateRender(const std::string &adapterName, void *param, void *deviceDesc,
309 uint32_t &hdiRenderId)
310 {
311 CHECK_AND_RETURN_RET_LOG(param != nullptr && deviceDesc != nullptr, nullptr, "param or deviceDesc is nullptr");
312 AudioSampleAttributes &remoteParam = *(static_cast<struct AudioSampleAttributes *>(param));
313 AudioDeviceDescriptor &remoteDeviceDesc = *(static_cast<struct AudioDeviceDescriptor *>(deviceDesc));
314
315 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName, true);
316 CHECK_AND_RETURN_RET_LOG(wrapper != nullptr && wrapper->adapter_ != nullptr, nullptr,
317 "adapter %{public}s is nullptr", adapterName.c_str());
318 remoteDeviceDesc.portId = GetPortId(PORT_OUT);
319
320 sptr<IAudioRender> render = nullptr;
321 int32_t ret = wrapper->adapter_->CreateRender(remoteDeviceDesc, remoteParam, render, hdiRenderId);
322 if (ret != SUCCESS || render == nullptr) {
323 AUDIO_ERR_LOG("create render fail");
324 wrapper->isValid_ = false;
325 HdiMonitor::ReportHdiException(HdiType::REMOTE, ErrorCase::CALL_HDI_FAILED, ret, (adapterName +
326 " create render fail, id:" + std::to_string(hdiRenderId)));
327 return nullptr;
328 }
329 IAudioRender *rawRender = render.GetRefPtr();
330 render.ForceSetRefPtr(nullptr);
331 AUDIO_INFO_LOG("create render success, hdiRenderId: %{public}u, desc: %{public}s", hdiRenderId,
332 remoteDeviceDesc.desc.c_str());
333
334 std::lock_guard<std::mutex> lock(wrapper->renderMtx_);
335 wrapper->hdiRenderIds_.insert(hdiRenderId);
336 return rawRender;
337 }
338
DestroyRender(const std::string & adapterName,uint32_t hdiRenderId)339 void RemoteDeviceManager::DestroyRender(const std::string &adapterName, uint32_t hdiRenderId)
340 {
341 AUDIO_INFO_LOG("destroy render, hdiRenderId: %{public}u", hdiRenderId);
342
343 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
344 CHECK_AND_RETURN_LOG(wrapper != nullptr && wrapper->adapter_ != nullptr, "adapter %{public}s is nullptr",
345 adapterName.c_str());
346 if (wrapper->hdiRenderIds_.count(hdiRenderId) == 0) {
347 AUDIO_ERR_LOG("render not exist");
348 if (!wrapper->isValid_) {
349 UnloadAdapter(adapterName);
350 }
351 return;
352 }
353 wrapper->adapter_->DestroyRender(hdiRenderId);
354
355 std::lock_guard<std::mutex> lock(wrapper->renderMtx_);
356 wrapper->hdiRenderIds_.erase(hdiRenderId);
357 UnloadAdapter(adapterName);
358 }
359
CreateCapture(const std::string & adapterName,void * param,void * deviceDesc,uint32_t & hdiCaptureId)360 void *RemoteDeviceManager::CreateCapture(const std::string &adapterName, void *param, void *deviceDesc,
361 uint32_t &hdiCaptureId)
362 {
363 CHECK_AND_RETURN_RET_LOG(param != nullptr && deviceDesc != nullptr, nullptr, "param or deviceDesc is nullptr");
364 AudioSampleAttributes &remoteParam = *(static_cast<struct AudioSampleAttributes *>(param));
365 AudioDeviceDescriptor &remoteDeviceDesc = *(static_cast<struct AudioDeviceDescriptor *>(deviceDesc));
366
367 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName, true);
368 CHECK_AND_RETURN_RET_LOG(wrapper != nullptr && wrapper->adapter_ != nullptr, nullptr,
369 "adapter %{public}s is nullptr", adapterName.c_str());
370 remoteDeviceDesc.portId = GetPortId(PORT_IN);
371
372 sptr<IAudioCapture> capture = nullptr;
373 int32_t ret = wrapper->adapter_->CreateCapture(remoteDeviceDesc, remoteParam, capture, hdiCaptureId);
374 if (ret != SUCCESS || capture == nullptr) {
375 AUDIO_ERR_LOG("create capture fail");
376 wrapper->isValid_ = false;
377 HdiMonitor::ReportHdiException(HdiType::REMOTE, ErrorCase::CALL_HDI_FAILED, ret, (adapterName +
378 " create capture fail, id:" + std::to_string(hdiCaptureId)));
379 return nullptr;
380 }
381 IAudioCapture *rawCapture = capture.GetRefPtr();
382 capture.ForceSetRefPtr(nullptr);
383 AUDIO_INFO_LOG("create capture success, hdiCaptureId: %{public}u, desc: %{public}s", hdiCaptureId,
384 remoteDeviceDesc.desc.c_str());
385
386 std::lock_guard<std::mutex> lock(wrapper->captureMtx_);
387 wrapper->hdiCaptureIds_.insert(hdiCaptureId);
388 return rawCapture;
389 }
390
DestroyCapture(const std::string & adapterName,uint32_t hdiCaptureId)391 void RemoteDeviceManager::DestroyCapture(const std::string &adapterName, uint32_t hdiCaptureId)
392 {
393 AUDIO_INFO_LOG("destroy capture, hdiCaptureId: %{public}u", hdiCaptureId);
394
395 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
396 CHECK_AND_RETURN_LOG(wrapper != nullptr && wrapper->adapter_ != nullptr, "adapter %{public}s is nullptr",
397 adapterName.c_str());
398 if (wrapper->hdiCaptureIds_.count(hdiCaptureId) == 0) {
399 AUDIO_ERR_LOG("capture not exist");
400 if (!wrapper->isValid_) {
401 UnloadAdapter(adapterName);
402 }
403 return;
404 }
405 wrapper->adapter_->DestroyCapture(hdiCaptureId);
406
407 std::lock_guard<std::mutex> lock(wrapper->captureMtx_);
408 wrapper->hdiCaptureIds_.erase(hdiCaptureId);
409 UnloadAdapter(adapterName);
410 }
411
DumpInfo(std::string & dumpString)412 void RemoteDeviceManager::DumpInfo(std::string &dumpString)
413 {
414 for (auto &item : adapters_) {
415 uint32_t renderNum = item.second == nullptr ? 0 : item.second->hdiRenderIds_.size();
416 uint32_t captureNum = item.second == nullptr ? 0 : item.second->hdiCaptureIds_.size();
417 dumpString += " - remote/" + item.first + "\trenderNum: " + std::to_string(renderNum) + "\tcaptureNum: " +
418 std::to_string(captureNum) + "\n";
419 }
420 }
421
InitAudioManager(void)422 void RemoteDeviceManager::InitAudioManager(void)
423 {
424 CHECK_AND_RETURN_LOG(audioManager_ == nullptr, "audio manager already inited");
425 #ifdef FEATURE_DISTRIBUTE_AUDIO
426 AUDIO_INFO_LOG("init audio manager");
427 audioManager_ = IAudioManager::Get("daudio_primary_service", false);
428 if (audioManager_ == nullptr) {
429 HdiMonitor::ReportHdiException(HdiType::REMOTE, ErrorCase::CALL_HDI_FAILED, 0,
430 "get hdi manager fail");
431 }
432 CHECK_AND_RETURN_LOG(audioManager_ != nullptr, "get audio manager fail");
433
434 AUDIO_INFO_LOG("init audio manager succ");
435 #endif
436 }
437
GetAdapter(const std::string & adapterName,bool tryCreate)438 std::shared_ptr<RemoteAdapterWrapper> RemoteDeviceManager::GetAdapter(const std::string &adapterName, bool tryCreate)
439 {
440 {
441 std::lock_guard<std::mutex> lock(adapterMtx_);
442 if (adapters_.count(adapterName) != 0 && adapters_[adapterName] != nullptr) {
443 return adapters_[adapterName];
444 }
445 }
446 if (!tryCreate) {
447 return nullptr;
448 }
449 LoadAdapter(adapterName);
450 std::lock_guard<std::mutex> lock(adapterMtx_);
451 return adapters_.count(adapterName) == 0 ? nullptr : adapters_[adapterName];
452 }
453
SwitchAdapterDesc(const std::vector<AudioAdapterDescriptor> & descs,const std::string & adapterName)454 int32_t RemoteDeviceManager::SwitchAdapterDesc(const std::vector<AudioAdapterDescriptor> &descs,
455 const std::string &adapterName)
456 {
457 for (uint32_t index = 0; index < descs.size(); ++index) {
458 const AudioAdapterDescriptor &desc = descs[index];
459 if (desc.adapterName.c_str() == nullptr) {
460 continue;
461 }
462 AUDIO_DEBUG_LOG("index: %{public}u, adapterName: %{public}s", index, desc.adapterName.c_str());
463 if (!adapterName.compare(desc.adapterName)) {
464 AUDIO_INFO_LOG("match adapter %{public}s", desc.adapterName.c_str());
465 return index;
466 }
467 }
468 AUDIO_ERR_LOG("switch adapter fail, adapterName: %{public}s", adapterName.c_str());
469 return ERR_INVALID_INDEX;
470 }
471
GetPortId(enum AudioPortDirection portFlag)472 uint32_t RemoteDeviceManager::GetPortId(enum AudioPortDirection portFlag)
473 {
474 uint32_t portId = 0;
475 if (portFlag == PORT_OUT) {
476 portId = AudioPortPin::PIN_OUT_SPEAKER;
477 } else if (portFlag == PORT_IN) {
478 portId = AudioPortPin::PIN_IN_MIC;
479 }
480 AUDIO_DEBUG_LOG("portId: %{public}u", portId);
481 return portId;
482 }
483
HandleStateChangeEvent(const std::string & adapterName,const AudioParamKey key,const char * condition,const char * value)484 int32_t RemoteDeviceManager::HandleStateChangeEvent(const std::string &adapterName, const AudioParamKey key,
485 const char *condition, const char *value)
486 {
487 char eventDes[EVENT_DES_SIZE];
488 char contentDes[ADAPTER_STATE_CONTENT_DES_SIZE];
489 CHECK_AND_RETURN_RET_LOG(sscanf_s(condition, "%[^;];%s", eventDes, EVENT_DES_SIZE, contentDes,
490 ADAPTER_STATE_CONTENT_DES_SIZE) == PARAMS_STATE_NUM, ERR_INVALID_PARAM, "parse condition fail");
491 CHECK_AND_RETURN_RET_LOG(strcmp(eventDes, "ERR_EVENT") == 0, ERR_NOT_SUPPORTED, "not support event %{public}s",
492 eventDes);
493
494 std::string devTypeKey = "DEVICE_TYPE=";
495 std::string contentDesStr = std::string(contentDes);
496 size_t devTypeKeyPos = contentDesStr.find(devTypeKey);
497 CHECK_AND_RETURN_RET_LOG(devTypeKeyPos != std::string::npos, ERR_INVALID_PARAM,
498 "not find daudio device type info, contentDes: %{public}s", contentDesStr.c_str());
499 size_t devTypeValPos = devTypeKeyPos + devTypeKey.length();
500 CHECK_AND_RETURN_RET_LOG(devTypeValPos < contentDesStr.length(), ERR_INVALID_PARAM,
501 "not find daudio device type value, contentDes: %{public}s", contentDesStr.c_str());
502
503 int32_t ret = SUCCESS;
504 if (contentDesStr[devTypeValPos] == DAUDIO_DEV_TYPE_SPK) {
505 AUDIO_INFO_LOG("ERR_EVENT is DAUDIO_DEV_TYPE_SPK");
506 ret = HandleRenderParamEvent(adapterName, key, condition, value);
507 } else if (contentDesStr[devTypeValPos] == DAUDIO_DEV_TYPE_MIC) {
508 AUDIO_INFO_LOG("ERR_EVENT is DAUDIO_DEV_TYPE_MIC");
509 ret = HandleCaptureParamEvent(adapterName, key, condition, value);
510 } else {
511 AUDIO_ERR_LOG("not support device type, contentDes: %{public}s", contentDesStr.c_str());
512 return ERR_NOT_SUPPORTED;
513 }
514 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "handle event %{public}s fail", contentDesStr.c_str());
515 return SUCCESS;
516 }
517
HandleRenderParamEvent(const std::string & adapterName,const AudioParamKey key,const char * condition,const char * value)518 int32_t RemoteDeviceManager::HandleRenderParamEvent(const std::string &adapterName, const AudioParamKey key,
519 const char *condition, const char *value)
520 {
521 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
522 CHECK_AND_RETURN_RET_LOG(wrapper != nullptr, ERR_INVALID_HANDLE, "adapter %{public}s is nullptr",
523 adapterName.c_str());
524 IDeviceManagerCallback *renderCallback = nullptr;
525 {
526 std::lock_guard<std::mutex> lock(wrapper->renderCallbackMtx_);
527 if (wrapper->renderCallbacks_.size() != 1) {
528 AUDIO_WARNING_LOG("exist %{public}zu renders port in adapter", wrapper->renderCallbacks_.size());
529 }
530 for (auto &cb : wrapper->renderCallbacks_) {
531 if (cb.second != nullptr) {
532 renderCallback = cb.second;
533 break;
534 }
535 }
536 }
537 CHECK_AND_RETURN_RET_LOG(renderCallback != nullptr, ERR_INVALID_HANDLE, "not find render port in adapter");
538 renderCallback->OnAudioParamChange(adapterName, key, std::string(condition), std::string(value));
539 return SUCCESS;
540 }
541
HandleCaptureParamEvent(const std::string & adapterName,const AudioParamKey key,const char * condition,const char * value)542 int32_t RemoteDeviceManager::HandleCaptureParamEvent(const std::string &adapterName, const AudioParamKey key,
543 const char *condition, const char *value)
544 {
545 std::shared_ptr<RemoteAdapterWrapper> wrapper = GetAdapter(adapterName);
546 CHECK_AND_RETURN_RET_LOG(wrapper != nullptr, ERR_INVALID_HANDLE, "adapter %{public}s is nullptr",
547 adapterName.c_str());
548 IDeviceManagerCallback *captureCallback = nullptr;
549 {
550 std::lock_guard<std::mutex> lock(wrapper->captureCallbackMtx_);
551 if (wrapper->captureCallbacks_.size() != 1) {
552 AUDIO_WARNING_LOG("exist %{public}zu captures port in adapter", wrapper->captureCallbacks_.size());
553 }
554 for (auto &cb : wrapper->captureCallbacks_) {
555 if (cb.second != nullptr) {
556 captureCallback = cb.second;
557 break;
558 }
559 }
560 }
561 CHECK_AND_RETURN_RET_LOG(captureCallback != nullptr, ERR_INVALID_HANDLE, "not find capture port in adapter");
562 captureCallback->OnAudioParamChange(adapterName, key, std::string(condition), std::string(value));
563 return SUCCESS;
564 }
565
SetOutputPortPin(DeviceType outputDevice,AudioRouteNode & sink)566 int32_t RemoteDeviceManager::SetOutputPortPin(DeviceType outputDevice, AudioRouteNode &sink)
567 {
568 int32_t ret = SUCCESS;
569
570 switch (outputDevice) {
571 case DEVICE_TYPE_SPEAKER:
572 sink.ext.device.type = AudioPortPin::PIN_OUT_SPEAKER;
573 sink.ext.device.desc = "pin_out_speaker";
574 break;
575 case DEVICE_TYPE_WIRED_HEADSET:
576 sink.ext.device.type = AudioPortPin::PIN_OUT_HEADSET;
577 sink.ext.device.desc = "pin_out_headset";
578 break;
579 case DEVICE_TYPE_USB_HEADSET:
580 sink.ext.device.type = AudioPortPin::PIN_OUT_USB_EXT;
581 sink.ext.device.desc = "pin_out_usb_ext";
582 break;
583 default:
584 ret = ERR_NOT_SUPPORTED;
585 break;
586 }
587
588 return ret;
589 }
590
SetInputPortPin(DeviceType inputDevice,AudioRouteNode & source)591 int32_t RemoteDeviceManager::SetInputPortPin(DeviceType inputDevice, AudioRouteNode &source)
592 {
593 int32_t ret = SUCCESS;
594
595 switch (inputDevice) {
596 case DEVICE_TYPE_MIC:
597 source.ext.device.type = AudioPortPin::PIN_IN_MIC;
598 source.ext.device.desc = "pin_in_mic";
599 break;
600 case DEVICE_TYPE_WIRED_HEADSET:
601 source.ext.device.type = AudioPortPin::PIN_IN_HS_MIC;
602 source.ext.device.desc = "pin_in_hs_mic";
603 break;
604 case DEVICE_TYPE_USB_HEADSET:
605 source.ext.device.type = AudioPortPin::PIN_IN_USB_EXT;
606 source.ext.device.desc = "pin_in_usb_ext";
607 break;
608 default:
609 ret = ERR_NOT_SUPPORTED;
610 break;
611 }
612
613 return ret;
614 }
615
SetDmDeviceType(uint16_t dmDeviceType,DeviceType deviceType)616 void RemoteDeviceManager::SetDmDeviceType(uint16_t dmDeviceType, DeviceType deviceType)
617 {
618 AUDIO_INFO_LOG("not support");
619 }
620
SetAudioScene(const AudioScene scene)621 void RemoteDeviceManager::SetAudioScene(const AudioScene scene)
622 {
623 AUDIO_INFO_LOG("not support");
624 }
625 } // namespace AudioStandard
626 } // namespace OHOS
627