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