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