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_adapter_interface_impl.h"
17
18 #include <algorithm>
19 #include <dlfcn.h>
20 #include <hdf_base.h>
21 #include <sstream>
22
23 #include "cJSON.h"
24
25 #include "daudio_constants.h"
26 #include "daudio_errcode.h"
27 #include "daudio_events.h"
28 #include "daudio_log.h"
29 #include "daudio_utils.h"
30
31 #undef DH_LOG_TAG
32 #define DH_LOG_TAG "AudioAdapterInterfaceImpl"
33
34 using namespace OHOS::DistributedHardware;
35 namespace OHOS {
36 namespace HDI {
37 namespace DistributedAudio {
38 namespace Audio {
39 namespace V1_0 {
40 static constexpr uint32_t MAX_AUDIO_STREAM_NUM = 10;
41
AudioAdapterInterfaceImpl(const AudioAdapterDescriptor & desc)42 AudioAdapterInterfaceImpl::AudioAdapterInterfaceImpl(const AudioAdapterDescriptor &desc)
43 : adpDescriptor_(desc)
44 {
45 renderDevs_ = std::vector<std::pair<int32_t, sptr<AudioRenderInterfaceImplBase>>>(
46 MAX_AUDIO_STREAM_NUM, std::make_pair(0, sptr<AudioRenderInterfaceImplBase>(nullptr)));
47 captureDevs_ = std::vector<std::pair<int32_t, sptr<AudioCaptureInterfaceImplBase>>>(
48 MAX_AUDIO_STREAM_NUM, std::make_pair(0, sptr<AudioCaptureInterfaceImplBase>(nullptr)));
49 spkStatus_ = std::vector<bool>(MAX_AUDIO_STREAM_NUM, false);
50 renderParam_ = { 0, 0, 0, 0, 0, 0 };
51 captureParam_ = { 0, 0, 0, 0, 0, 0 };
52
53 DHLOGD("Distributed audio adapter constructed, name(%{public}s).", GetAnonyString(desc.adapterName).c_str());
54 }
55
~AudioAdapterInterfaceImpl()56 AudioAdapterInterfaceImpl::~AudioAdapterInterfaceImpl()
57 {
58 DHLOGD("Distributed audio adapter destructed, name(%{public}s).",
59 GetAnonyString(adpDescriptor_.adapterName).c_str());
60 }
61
SetSpeakerCallback(const int32_t dhId,const sptr<IDAudioCallback> & spkCallback)62 void AudioAdapterInterfaceImpl::SetSpeakerCallback(const int32_t dhId, const sptr<IDAudioCallback> &spkCallback)
63 {
64 if (spkCallback == nullptr) {
65 DHLOGE("Callback is nullptr.");
66 return;
67 }
68 std::lock_guard<std::mutex> callbackLck(extCallbackMtx_);
69 if (extCallbackMap_.find(dhId) != extCallbackMap_.end()) {
70 DHLOGI("The callback of daudio is already set.");
71 return;
72 }
73 extCallbackMap_[dhId] = spkCallback;
74 }
75
SetMicCallback(const int32_t dhId,const sptr<IDAudioCallback> & micCallback)76 void AudioAdapterInterfaceImpl::SetMicCallback(const int32_t dhId, const sptr<IDAudioCallback> &micCallback)
77 {
78 if (micCallback == nullptr) {
79 DHLOGE("Callback is nullptr.");
80 return;
81 }
82 std::lock_guard<std::mutex> callbackLck(extCallbackMtx_);
83 if (extCallbackMap_.find(dhId) != extCallbackMap_.end()) {
84 DHLOGI("The callback of daudio is already set.");
85 return;
86 }
87 extCallbackMap_[dhId] = micCallback;
88 }
89
InitAllPorts()90 int32_t AudioAdapterInterfaceImpl::InitAllPorts()
91 {
92 DHLOGI("Init (%{public}zu) distributed audio ports.", mapAudioDevice_.size());
93 return HDF_SUCCESS;
94 }
95
CreateRenderImpl(const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs,int32_t renderId)96 sptr<AudioRenderInterfaceImplBase> AudioAdapterInterfaceImpl::CreateRenderImpl(const AudioDeviceDescriptor &desc,
97 const AudioSampleAttributes &attrs, int32_t renderId)
98 {
99 sptr<AudioRenderInterfaceImplBase> audioRender = nullptr;
100 int renderPinId = 0;
101 auto extSpkCallback = MatchStreamCallback(attrs, desc, renderPinId);
102 if (extSpkCallback == nullptr) {
103 DHLOGE("Matched callback is null.");
104 return audioRender;
105 }
106 #ifdef DAUDIO_SUPPORT_EXTENSION
107 if (attrs.type == AUDIO_MMAP_NOIRQ || attrs.type == AUDIO_MMAP_VOIP) {
108 DHLOGI("Try to mmap mode.");
109 renderFlags_ = Audioext::V2_0::MMAP_MODE;
110 audioRender = sptr<AudioRenderInterfaceImplBase>(new AudioRenderExtImpl());
111 if (audioRender == nullptr) {
112 DHLOGE("audioRender is null.");
113 return audioRender;
114 }
115 audioRender->SetAttrs(adpDescriptor_.adapterName, desc, attrs, extSpkCallback, renderPinId);
116 } else {
117 DHLOGI("Try to normal mode.");
118 renderFlags_ = Audioext::V2_0::NORMAL_MODE;
119 audioRender = sptr<AudioRenderInterfaceImplBase>(new AudioRenderInterfaceImpl(adpDescriptor_.adapterName,
120 desc, attrs, extSpkCallback, renderId));
121 }
122 #else
123 renderFlags_ = Audioext::V2_0::NORMAL_MODE;
124 audioRender = sptr<AudioRenderInterfaceImplBase>(new AudioRenderInterfaceImpl(adpDescriptor_.adapterName,
125 desc, attrs, extSpkCallback, renderId));
126 #endif
127 return audioRender;
128 }
129
CreateRender(const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs,sptr<IAudioRender> & render,uint32_t & renderId)130 int32_t AudioAdapterInterfaceImpl::CreateRender(const AudioDeviceDescriptor &desc,
131 const AudioSampleAttributes &attrs, sptr<IAudioRender> &render, uint32_t &renderId)
132 {
133 DHLOGI("Create distributed audio render, {pin: %{public}d, sampleRate: %{public}d, channel: %{public}d,"
134 "formats: %{public}d, type: %{public}d}.", desc.pins, attrs.sampleRate, attrs.channelCount,
135 attrs.format, static_cast<int32_t>(attrs.type));
136 render = nullptr;
137 sptr<AudioRenderInterfaceImplBase> audioRender = nullptr;
138 if (!CheckDevCapability(desc)) {
139 DHLOGE("Can not find device, create render failed.");
140 return HDF_FAILURE;
141 }
142 int renderPinId = 0;
143 auto extSpkCallback = MatchStreamCallback(attrs, desc, renderPinId);
144 if (extSpkCallback == nullptr) {
145 DHLOGE("Matched callback is null.");
146 return HDF_FAILURE;
147 }
148 if (InsertRenderImpl(desc, attrs, audioRender, renderPinId, renderId) != HDF_SUCCESS) {
149 DHLOGE("Create and insert render implement failed.");
150 return HDF_FAILURE;
151 }
152
153 int32_t ret = OpenRenderDevice(desc, attrs, extSpkCallback, renderPinId, renderId);
154 if (ret != DH_SUCCESS) {
155 DHLOGE("Open render device failed.");
156 DeleteRenderImpl(renderId);
157 renderId = MAX_AUDIO_STREAM_NUM;
158 audioRender = nullptr;
159 return ret == ERR_DH_AUDIO_HDF_WAIT_TIMEOUT ? HDF_ERR_TIMEOUT : HDF_FAILURE;
160 }
161 render = audioRender;
162 DHLOGI("Create render success, render ID is %{public}u.", renderId);
163 return HDF_SUCCESS;
164 }
165
MatchStreamCallback(const AudioSampleAttributes & attrs,const AudioDeviceDescriptor & desc,int32_t & dhId)166 sptr<IDAudioCallback> AudioAdapterInterfaceImpl::MatchStreamCallback(const AudioSampleAttributes &attrs,
167 const AudioDeviceDescriptor &desc, int32_t &dhId)
168 {
169 dhId = static_cast<int32_t>(desc.pins);
170 if (desc.pins == DEFAULT_RENDER_ID && (attrs.type == AUDIO_MMAP_NOIRQ || attrs.type == AUDIO_MMAP_VOIP)) {
171 dhId = LOW_LATENCY_RENDER_ID;
172 }
173
174 std::lock_guard<std::mutex> callbackLck(extCallbackMtx_);
175 auto iter = extCallbackMap_.find(dhId);
176 if (iter == extCallbackMap_.end()) {
177 DHLOGE("Can't find matched callback");
178 return nullptr;
179 }
180 return iter->second;
181 }
182
InsertRenderImpl(const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs,sptr<AudioRenderInterfaceImplBase> & audioRender,const int32_t dhId,uint32_t & renderId)183 int32_t AudioAdapterInterfaceImpl::InsertRenderImpl(const AudioDeviceDescriptor &desc,
184 const AudioSampleAttributes &attrs, sptr<AudioRenderInterfaceImplBase> &audioRender,
185 const int32_t dhId, uint32_t &renderId)
186 {
187 std::lock_guard<std::mutex> devLck(renderDevMtx_);
188 if (renderDevs_.size() != MAX_AUDIO_STREAM_NUM) {
189 DHLOGE("Render device contain check error.");
190 return HDF_FAILURE;
191 }
192 renderId = MAX_AUDIO_STREAM_NUM;
193 for (uint32_t i = 0; i < MAX_AUDIO_STREAM_NUM; i++) {
194 if (renderDevs_[i].second == nullptr) {
195 renderId = i;
196 audioRender = CreateRenderImpl(desc, attrs, renderId);
197 CHECK_NULL_RETURN(audioRender, HDF_FAILURE);
198 renderDevs_[renderId] = std::make_pair(dhId, audioRender);
199 return HDF_SUCCESS;
200 }
201 }
202 DHLOGE("The device is busy, can't create render anymore.");
203 return HDF_FAILURE;
204 }
205
DeleteRenderImpl(uint32_t renderId)206 void AudioAdapterInterfaceImpl::DeleteRenderImpl(uint32_t renderId)
207 {
208 if (renderId >= MAX_AUDIO_STREAM_NUM) {
209 DHLOGE("Invalid render ID.");
210 return;
211 }
212 std::lock_guard<std::mutex> devLck(renderDevMtx_);
213 renderDevs_[renderId] = std::make_pair(0, sptr<AudioRenderInterfaceImplBase>(nullptr));
214 DHLOGE("Delete render success.");
215 return;
216 }
217
DestroyRender(uint32_t renderId)218 int32_t AudioAdapterInterfaceImpl::DestroyRender(uint32_t renderId)
219 {
220 DHLOGI("Destroy distributed audio render, ID: %{public}u.", renderId);
221 if (!IsIdValid(renderId)) {
222 DHLOGE("The input render ID is invalid.");
223 return HDF_FAILURE;
224 }
225 sptr<AudioRenderInterfaceImplBase> audioRender(nullptr);
226 int32_t dhId = 0;
227 {
228 std::lock_guard<std::mutex> devLck(renderDevMtx_);
229 audioRender = renderDevs_[renderId].second;
230 dhId = renderDevs_[renderId].first;
231 }
232 std::lock_guard<std::mutex> callbackLck(extCallbackMtx_);
233 sptr<IDAudioCallback> extSpkCallback(extCallbackMap_[dhId]);
234 if (audioRender == nullptr) {
235 DHLOGD("Render has not been created, do not need destroy.");
236 return HDF_SUCCESS;
237 }
238
239 int32_t ret = CloseRenderDevice(audioRender->GetRenderDesc(), extSpkCallback, dhId, renderId);
240 if (ret != DH_SUCCESS) {
241 DHLOGE("Close render device failed.");
242 return HDF_FAILURE;
243 }
244 {
245 std::lock_guard<std::mutex> devLck(renderDevMtx_);
246 renderDevs_[renderId] = std::make_pair(0, sptr<AudioRenderInterfaceImplBase>(nullptr));
247 }
248 return HDF_SUCCESS;
249 }
250
CheckDevCapability(const AudioDeviceDescriptor & desc)251 bool AudioAdapterInterfaceImpl::CheckDevCapability(const AudioDeviceDescriptor &desc)
252 {
253 std::lock_guard<std::mutex> devLck(devMapMtx_);
254 if (mapAudioDevice_.find(desc.pins) == mapAudioDevice_.end()) {
255 DHLOGE("Can not find device, create render failed.");
256 return false;
257 }
258 return true;
259 }
260
CreateCapture(const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs,sptr<IAudioCapture> & capture,uint32_t & captureId)261 int32_t AudioAdapterInterfaceImpl::CreateCapture(const AudioDeviceDescriptor &desc,
262 const AudioSampleAttributes &attrs, sptr<IAudioCapture> &capture, uint32_t &captureId)
263 {
264 DHLOGI("Create daudio capture, {pin: %{public}d, sampleRate: %{public}" PRIu32", channel: %{public}" PRIu32
265 ", formats: %{public}d}.", desc.pins, attrs.sampleRate, attrs.channelCount, attrs.format);
266 capture = nullptr;
267 sptr<AudioCaptureInterfaceImplBase> audioCapture(nullptr);
268 if (!CheckDevCapability(desc)) {
269 DHLOGE("Can not find device, create capture failed.");
270 return HDF_FAILURE;
271 }
272 int32_t capPinId = 0;
273 auto extMicCallback = MatchStreamCallback(attrs, desc, capPinId);
274 if (extMicCallback == nullptr) {
275 DHLOGE("Matched callback is null.");
276 return HDF_FAILURE;
277 }
278 #ifdef DAUDIO_SUPPORT_EXTENSION
279 if (attrs.type == AUDIO_MMAP_NOIRQ || attrs.type == AUDIO_MMAP_VOIP) {
280 DHLOGI("Try to mmap mode.");
281 capturerFlags_ = Audioext::V2_0::MMAP_MODE;
282 audioCapture = sptr<AudioCaptureInterfaceImplBase>(new AudioCaptureExtImpl());
283 if (audioCapture == nullptr) {
284 DHLOGE("audioCapture is null.");
285 return HDF_FAILURE;
286 }
287 audioCapture->SetAttrs(adpDescriptor_.adapterName, desc, attrs, extMicCallback, desc.pins);
288 } else {
289 DHLOGI("Try to normal mode.");
290 capturerFlags_ = Audioext::V2_0::NORMAL_MODE;
291 audioCapture = sptr<AudioCaptureInterfaceImplBase>(new AudioCaptureInterfaceImpl(adpDescriptor_.adapterName,
292 desc, attrs, extMicCallback));
293 }
294 #else
295 capturerFlags_ = Audioext::V2_0::NORMAL_MODE;
296 audioCapture = sptr<AudioCaptureInterfaceImplBase>(new AudioCaptureInterfaceImpl(adpDescriptor_.adapterName,
297 desc, attrs, extMicCallback));
298 #endif
299 int32_t ret = OpenCaptureDevice(desc, attrs, extMicCallback, capPinId);
300 if (ret != DH_SUCCESS) {
301 DHLOGE("Open capture device failed.");
302 audioCapture = nullptr;
303 return ret == ERR_DH_AUDIO_HDF_WAIT_TIMEOUT ? HDF_ERR_TIMEOUT : HDF_FAILURE;
304 }
305 capture = audioCapture;
306 if (InsertCapImpl(audioCapture, capPinId, captureId) != HDF_SUCCESS) {
307 DHLOGE("Generrate capture ID and insert capture failed.");
308 return HDF_FAILURE;
309 }
310 DHLOGI("Create capture success, capture ID is %{public}u.", captureId);
311 return HDF_SUCCESS;
312 }
313
InsertCapImpl(const sptr<AudioCaptureInterfaceImplBase> & audioCapture,const int32_t dhId,uint32_t & captureId)314 int32_t AudioAdapterInterfaceImpl::InsertCapImpl(const sptr<AudioCaptureInterfaceImplBase> &audioCapture,
315 const int32_t dhId, uint32_t &captureId)
316 {
317 std::lock_guard<std::mutex> devLck(capDevMtx_);
318 if (captureDevs_.size() != MAX_AUDIO_STREAM_NUM) {
319 DHLOGE("Capture device's size check error.");
320 return HDF_FAILURE;
321 }
322 captureId = MAX_AUDIO_STREAM_NUM;
323 for (uint32_t i = 0; i < MAX_AUDIO_STREAM_NUM; i++) {
324 if (captureDevs_[i].second == nullptr) {
325 captureId = i;
326 captureDevs_[captureId] = std::make_pair(dhId, audioCapture);
327 return HDF_SUCCESS;
328 }
329 }
330 DHLOGE("The device is busy, can't create capture anymore.");
331 return HDF_FAILURE;
332 }
333
DestroyCapture(uint32_t captureId)334 int32_t AudioAdapterInterfaceImpl::DestroyCapture(uint32_t captureId)
335 {
336 DHLOGI("Destroy distributed audio capture, ID: %{public}u.", captureId);
337 if (!IsIdValid(captureId)) {
338 DHLOGE("The input capture ID is invalid.");
339 return HDF_FAILURE;
340 }
341 sptr<AudioCaptureInterfaceImplBase> audioCapture(nullptr);
342 int32_t dhId = 0;
343 {
344 std::lock_guard<std::mutex> devLck(capDevMtx_);
345 audioCapture = captureDevs_[captureId].second;
346 dhId = captureDevs_[captureId].first;
347 }
348 std::lock_guard<std::mutex> callbackLck(extCallbackMtx_);
349 sptr<IDAudioCallback> extMicCallback(extCallbackMap_[dhId]);
350 if (audioCapture == nullptr) {
351 DHLOGD("Capture has not been created, do not need destroy.");
352 return HDF_SUCCESS;
353 }
354
355 int32_t ret = CloseCaptureDevice(audioCapture->GetCaptureDesc(), extMicCallback, dhId);
356 if (ret != DH_SUCCESS) {
357 DHLOGE("Close capture device failed.");
358 return HDF_FAILURE;
359 }
360 {
361 std::lock_guard<std::mutex> devLck(capDevMtx_);
362 captureDevs_[captureId].first = 0;
363 captureDevs_[captureId].second = nullptr;
364 }
365 return HDF_SUCCESS;
366 }
367
GetPortCapability(const AudioPort & port,AudioPortCapability & capability)368 int32_t AudioAdapterInterfaceImpl::GetPortCapability(const AudioPort &port, AudioPortCapability &capability)
369 {
370 DHLOGD("Get audio port capability.");
371 (void)port;
372 capability.sampleRateMasks = AUDIO_SAMPLE_RATE_DEFAULT;
373 capability.channelCount = AUDIO_CHANNEL_COUNT_DEFAULT;
374
375 return HDF_SUCCESS;
376 }
377
SetPassthroughMode(const AudioPort & port,AudioPortPassthroughMode mode)378 int32_t AudioAdapterInterfaceImpl::SetPassthroughMode(const AudioPort &port, AudioPortPassthroughMode mode)
379 {
380 (void)port;
381 (void)mode;
382 return HDF_SUCCESS;
383 }
384
GetPassthroughMode(const AudioPort & port,AudioPortPassthroughMode & mode)385 int32_t AudioAdapterInterfaceImpl::GetPassthroughMode(const AudioPort &port, AudioPortPassthroughMode &mode)
386 {
387 (void)port;
388 (void)mode;
389 return HDF_SUCCESS;
390 }
391
GetDeviceStatus(AudioDeviceStatus & status)392 int32_t AudioAdapterInterfaceImpl::GetDeviceStatus(AudioDeviceStatus& status)
393 {
394 (void) status;
395 return HDF_SUCCESS;
396 }
397
UpdateAudioRoute(const AudioRoute & route,int32_t & routeHandle)398 int32_t AudioAdapterInterfaceImpl::UpdateAudioRoute(const AudioRoute &route, int32_t &routeHandle)
399 {
400 (void) route;
401 (void) routeHandle;
402 return HDF_SUCCESS;
403 }
404
ReleaseAudioRoute(int32_t routeHandle)405 int32_t AudioAdapterInterfaceImpl::ReleaseAudioRoute(int32_t routeHandle)
406 {
407 (void) routeHandle;
408 return HDF_SUCCESS;
409 }
410
SetMicMute(bool mute)411 int32_t AudioAdapterInterfaceImpl::SetMicMute(bool mute)
412 {
413 (void) mute;
414 return HDF_SUCCESS;
415 }
416
GetMicMute(bool & mute)417 int32_t AudioAdapterInterfaceImpl::GetMicMute(bool& mute)
418 {
419 (void) mute;
420 return HDF_SUCCESS;
421 }
422
SetVoiceVolume(float volume)423 int32_t AudioAdapterInterfaceImpl::SetVoiceVolume(float volume)
424 {
425 (void) volume;
426 return HDF_SUCCESS;
427 }
428
SetExtraParams(AudioExtParamKey key,const std::string & condition,const std::string & value)429 int32_t AudioAdapterInterfaceImpl::SetExtraParams(AudioExtParamKey key, const std::string &condition,
430 const std::string &value)
431 {
432 DHLOGD("Set audio parameters, key = %{public}d, condition: %{public}s value: %{public}s.", key,
433 condition.c_str(), value.c_str());
434 int32_t ret = ERR_DH_AUDIO_HDF_FAIL;
435 switch (key) {
436 case AudioExtParamKey::AUDIO_EXT_PARAM_KEY_VOLUME:
437 ret = SetAudioVolume(condition, value);
438 if (ret != DH_SUCCESS) {
439 DHLOGE("Set audio parameters failed.");
440 return HDF_FAILURE;
441 }
442 break;
443 default:
444 DHLOGE("Parameter is invalid.");
445 return HDF_ERR_INVALID_PARAM;
446 }
447 DHLOGI("Set audio parameters success.");
448 return HDF_SUCCESS;
449 }
450
GetExtraParams(AudioExtParamKey key,const std::string & condition,std::string & value)451 int32_t AudioAdapterInterfaceImpl::GetExtraParams(AudioExtParamKey key, const std::string &condition,
452 std::string &value)
453 {
454 DHLOGI("Get audio parameters, key: %{public}d, condition: %{public}s.", key, condition.c_str());
455 int32_t ret = ERR_DH_AUDIO_HDF_FAIL;
456 switch (key) {
457 case AudioExtParamKey::AUDIO_EXT_PARAM_KEY_VOLUME:
458 ret = GetAudioVolume(condition, value);
459 if (ret != DH_SUCCESS) {
460 DHLOGE("Get audio parameters failed.");
461 return HDF_FAILURE;
462 }
463 break;
464 default:
465 DHLOGE("Parameter is invalid.");
466 return HDF_ERR_INVALID_PARAM;
467 }
468 DHLOGI("Get audio parameters success.");
469 return HDF_SUCCESS;
470 }
471
RegExtraParamObserver(const sptr<IAudioCallback> & audioCallback,int8_t cookie)472 int32_t AudioAdapterInterfaceImpl::RegExtraParamObserver(const sptr<IAudioCallback> &audioCallback, int8_t cookie)
473 {
474 DHLOGD("Register audio param observer.");
475 paramCallback_ = audioCallback;
476 (void) cookie;
477 return HDF_SUCCESS;
478 }
479
GetAdapterDesc()480 AudioAdapterDescriptor AudioAdapterInterfaceImpl::GetAdapterDesc()
481 {
482 adpDescriptor_.ports.clear();
483 std::lock_guard<std::mutex> devLck(devMapMtx_);
484 for (auto pin = mapAudioDevice_.begin(); pin != mapAudioDevice_.end(); pin++) {
485 AudioPort port = {PORT_OUT_IN, pin->first, ""};
486 adpDescriptor_.ports.emplace_back(port);
487 }
488 return adpDescriptor_;
489 }
490
GetDeviceCapabilitys(const uint32_t devId)491 std::string AudioAdapterInterfaceImpl::GetDeviceCapabilitys(const uint32_t devId)
492 {
493 std::lock_guard<std::mutex> devLck(devMapMtx_);
494 auto dev = mapAudioDevice_.find(devId);
495 if (dev == mapAudioDevice_.end()) {
496 DHLOGE("Device not found.");
497 return "";
498 }
499 return dev->second;
500 }
501
AdapterLoad()502 int32_t AudioAdapterInterfaceImpl::AdapterLoad()
503 {
504 status_ = AudioAdapterStatus::STATUS_LOAD;
505 return HDF_SUCCESS;
506 }
507
AdapterUnload()508 int32_t AudioAdapterInterfaceImpl::AdapterUnload()
509 {
510 if (CheckRendersValid() || CheckCapsValid()) {
511 DHLOGE("Adapter is busy, audio render or capture is not null.");
512 return HDF_ERR_DEVICE_BUSY;
513 }
514 status_ = AudioAdapterStatus::STATUS_UNLOAD;
515 return HDF_SUCCESS;
516 }
517
Notify(const uint32_t devId,const uint32_t streamId,const DAudioEvent & event)518 int32_t AudioAdapterInterfaceImpl::Notify(const uint32_t devId, const uint32_t streamId, const DAudioEvent &event)
519 {
520 switch (static_cast<AudioExtParamEvent>(event.type)) {
521 case HDF_AUDIO_EVENT_VOLUME_CHANGE:
522 DHLOGI("Notify event: VOLUME_CHANGE, event content: %{public}s.", event.content.c_str());
523 return HandleVolumeChangeEvent(event);
524 case HDF_AUDIO_EVENT_FOCUS_CHANGE:
525 DHLOGI("Notify event: FOCUS_CHANGE, event content: %{public}s.", event.content.c_str());
526 return HandleFocusChangeEvent(event);
527 case HDF_AUDIO_EVENT_RENDER_STATE_CHANGE:
528 DHLOGI("Notify event: RENDER_STATE_CHANGE, event content: %{public}s.", event.content.c_str());
529 return HandleRenderStateChangeEvent(event);
530 case HDF_AUDIO_EVENT_OPEN_SPK_RESULT:
531 case HDF_AUDIO_EVENT_CLOSE_SPK_RESULT:
532 case HDF_AUDIO_EVENT_OPEN_MIC_RESULT:
533 case HDF_AUDIO_EVENT_CLOSE_MIC_RESULT:
534 case HDF_AUDIO_EVENT_SPK_DUMP:
535 case HDF_AUDIO_EVENT_MIC_DUMP:
536 return HandleSANotifyEvent(streamId, event);
537 case HDF_AUDIO_EVENT_SPK_CLOSED:
538 case HDF_AUDIO_EVENT_MIC_CLOSED:
539 return HandleDeviceClosed(streamId, event);
540 default:
541 DHLOGE("Audio event: %{public}d is undefined.", event.type);
542 return ERR_DH_AUDIO_HDF_INVALID_OPERATION;
543 }
544 }
545
AddAudioDevice(const uint32_t devId,const std::string & caps)546 int32_t AudioAdapterInterfaceImpl::AddAudioDevice(const uint32_t devId, const std::string &caps)
547 {
548 DHLOGI("Add distributed audio device %{public}s.", GetChangeDevIdMap(static_cast<int32_t>(devId)).c_str());
549 std::lock_guard<std::mutex> devLck(devMapMtx_);
550 auto dev = mapAudioDevice_.find(devId);
551 if (dev != mapAudioDevice_.end()) {
552 mapAudioDevice_[devId] = caps;
553 DHLOGI("Device has been add, refresh caps.");
554 return DH_SUCCESS;
555 }
556 mapAudioDevice_.insert(std::make_pair(devId, caps));
557
558 DHLOGI("Add audio device success.");
559 return DH_SUCCESS;
560 }
561
RemoveAudioDevice(const uint32_t devId)562 int32_t AudioAdapterInterfaceImpl::RemoveAudioDevice(const uint32_t devId)
563 {
564 DHLOGI("Remove distributed audio device %{public}s.", GetChangeDevIdMap(static_cast<int32_t>(devId)).c_str());
565 {
566 std::lock_guard<std::mutex> devLck(devMapMtx_);
567 if (mapAudioDevice_.find(devId) == mapAudioDevice_.end()) {
568 DHLOGE("Device has not been add, remove device failed.");
569 return ERR_DH_AUDIO_HDF_INVALID_OPERATION;
570 }
571 mapAudioDevice_.erase(devId);
572 }
573 if (devId == spkPinInUse_) {
574 for (uint32_t i = 0; i < MAX_AUDIO_STREAM_NUM; i++) {
575 DestroyRender(i);
576 }
577 }
578 if (devId == micPinInUse_) {
579 for (uint32_t capId = 0; capId < MAX_AUDIO_STREAM_NUM; capId++) {
580 DestroyCapture(capId);
581 }
582 }
583
584 DHLOGI("Remove audio device success.");
585 return DH_SUCCESS;
586 }
587
OpenRenderDevice(const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs,const sptr<IDAudioCallback> extSpkCallback,const int32_t dhId,const int32_t renderId)588 int32_t AudioAdapterInterfaceImpl::OpenRenderDevice(const AudioDeviceDescriptor &desc,
589 const AudioSampleAttributes &attrs, const sptr<IDAudioCallback> extSpkCallback,
590 const int32_t dhId, const int32_t renderId)
591 {
592 DHLOGI("Open render device, pin: %{public}d.", dhId);
593 if (extSpkCallback == nullptr) {
594 DHLOGE("Callback is null.");
595 return ERR_DH_AUDIO_HDF_NULLPTR;
596 }
597 std::lock_guard<std::mutex> devLck(renderOptMtx_);
598 renderParam_.format = attrs.format;
599 renderParam_.channelCount = attrs.channelCount;
600 renderParam_.sampleRate = attrs.sampleRate;
601 renderParam_.streamUsage = attrs.type;
602 if (attrs.type == AUDIO_MMAP_NOIRQ) {
603 renderParam_.period = AUDIO_MMAP_NOIRQ_INTERVAL;
604 } else if (attrs.type == AUDIO_MMAP_VOIP) {
605 renderParam_.period = AUDIO_MMAP_VOIP_INTERVAL;
606 } else {
607 renderParam_.period = AUDIO_NORMAL_INTERVAL;
608 }
609 renderParam_.frameSize = CalculateFrameSize(attrs.sampleRate, attrs.channelCount, attrs.format,
610 renderParam_.period, renderFlags_ == Audioext::V2_0::MMAP_MODE);
611 renderParam_.renderFlags = renderFlags_;
612
613 int32_t ret = extSpkCallback->SetParameters(renderId, renderParam_);
614 if (ret != HDF_SUCCESS) {
615 DHLOGE("Set render parameters failed.");
616 return ERR_DH_AUDIO_HDF_SET_PARAM_FAIL;
617 }
618 ret = extSpkCallback->CreateStream(renderId);
619 if (ret != HDF_SUCCESS) {
620 DHLOGE("Open render device failed.");
621 return ERR_DH_AUDIO_HDF_OPEN_DEVICE_FAIL;
622 }
623
624 ret = WaitForSANotify(renderId, EVENT_OPEN_SPK);
625 if (ret != DH_SUCCESS) {
626 DHLOGE("Wait SA notify failed. ret: %{public}d", ret);
627 extSpkCallback->DestroyStream(renderId);
628 return ret;
629 }
630 spkPinInUse_ = static_cast<uint32_t>(dhId);
631 DHLOGI("Open render device success.");
632 return DH_SUCCESS;
633 }
634
CloseRenderDevice(const AudioDeviceDescriptor & desc,sptr<IDAudioCallback> extSpkCallback,const int32_t dhId,const int32_t renderId)635 int32_t AudioAdapterInterfaceImpl::CloseRenderDevice(const AudioDeviceDescriptor &desc,
636 sptr<IDAudioCallback> extSpkCallback, const int32_t dhId, const int32_t renderId)
637 {
638 DHLOGI("Close render device, pin: %{public}d.", dhId);
639 std::lock_guard<std::mutex> devLck(renderOptMtx_);
640 if (spkPinInUse_ == 0) {
641 DHLOGI("No need close render device.");
642 return DH_SUCCESS;
643 }
644 renderParam_ = {};
645 if (extSpkCallback == nullptr) {
646 DHLOGE("Callback is null.");
647 return ERR_DH_AUDIO_HDF_NULLPTR;
648 }
649 int32_t ret = extSpkCallback->DestroyStream(renderId);
650 if (ret != HDF_SUCCESS) {
651 DHLOGE("Close audio device failed.");
652 return ERR_DH_AUDIO_HDF_CLOSE_DEVICE_FAIL;
653 }
654
655 ret = WaitForSANotify(renderId, EVENT_CLOSE_SPK);
656 if (ret != DH_SUCCESS) {
657 DHLOGE("Wait SA notify failed. ret: %{public}d.", ret);
658 return ret;
659 }
660 spkPinInUse_ = 0;
661 DHLOGI("Close render device success.");
662 return DH_SUCCESS;
663 }
664
OpenCaptureDevice(const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs,const sptr<IDAudioCallback> extMicCallback,const int32_t dhId,const int32_t captureId)665 int32_t AudioAdapterInterfaceImpl::OpenCaptureDevice(const AudioDeviceDescriptor &desc,
666 const AudioSampleAttributes &attrs, const sptr<IDAudioCallback> extMicCallback,
667 const int32_t dhId, const int32_t captureId)
668 {
669 DHLOGI("Open capture device, pin: %{public}d.", dhId);
670 if (isMicOpened_) {
671 DHLOGI("Capture already opened.");
672 return DH_SUCCESS;
673 }
674 std::lock_guard<std::mutex> devLck(captureOptMtx_);
675 micPinInUse_ = dhId;
676 captureParam_.format = attrs.format;
677 captureParam_.channelCount = attrs.channelCount;
678 captureParam_.sampleRate = attrs.sampleRate;
679 captureParam_.streamUsage = attrs.type;
680 if (attrs.type == AUDIO_MMAP_NOIRQ) {
681 captureParam_.period = AUDIO_MMAP_NOIRQ_INTERVAL;
682 } else if (attrs.type == AUDIO_MMAP_VOIP) {
683 captureParam_.period = AUDIO_MMAP_VOIP_INTERVAL;
684 } else {
685 captureParam_.period = AUDIO_NORMAL_INTERVAL;
686 }
687 captureParam_.frameSize = CalculateFrameSize(attrs.sampleRate, attrs.channelCount,
688 attrs.format, captureParam_.period, capturerFlags_ == Audioext::V2_0::MMAP_MODE);
689 captureParam_.capturerFlags = capturerFlags_;
690
691 if (extMicCallback == nullptr) {
692 DHLOGE("Callback is null.");
693 return ERR_DH_AUDIO_HDF_NULLPTR;
694 }
695 int32_t ret = extMicCallback->SetParameters(captureId, captureParam_);
696 if (ret != HDF_SUCCESS) {
697 DHLOGE("Set audio parameters failed.");
698 return ERR_DH_AUDIO_HDF_SET_PARAM_FAIL;
699 }
700 ret = extMicCallback->CreateStream(captureId);
701 if (ret != HDF_SUCCESS) {
702 DHLOGE("Open audio device failed.");
703 return ERR_DH_AUDIO_HDF_OPEN_DEVICE_FAIL;
704 }
705
706 ret = WaitForSANotify(captureId, EVENT_OPEN_MIC);
707 if (ret != DH_SUCCESS) {
708 DHLOGE("Wait SA notify failed. ret: %{public}d.", ret);
709 return ret;
710 }
711 DHLOGI("Open capture device success.");
712 return DH_SUCCESS;
713 }
714
CloseCaptureDevice(const AudioDeviceDescriptor & desc,const sptr<IDAudioCallback> extMicCallback,const int32_t dhId,const int32_t captureId)715 int32_t AudioAdapterInterfaceImpl::CloseCaptureDevice(const AudioDeviceDescriptor &desc,
716 const sptr<IDAudioCallback> extMicCallback, const int32_t dhId, const int32_t captureId)
717 {
718 DHLOGI("Close capture device, pin: %{public}d.", dhId);
719 std::lock_guard<std::mutex> devLck(captureOptMtx_);
720 if (micPinInUse_ == 0) {
721 DHLOGI("No need close capture device.");
722 return DH_SUCCESS;
723 }
724 captureParam_ = {};
725 if (extMicCallback == nullptr) {
726 DHLOGE("Callback is null.");
727 return ERR_DH_AUDIO_HDF_NULLPTR;
728 }
729 int32_t ret = extMicCallback->DestroyStream(captureId);
730 if (ret != HDF_SUCCESS) {
731 DHLOGE("Close audio device failed.");
732 return ERR_DH_AUDIO_HDF_CLOSE_DEVICE_FAIL;
733 }
734
735 ret = WaitForSANotify(captureId, EVENT_CLOSE_MIC);
736 if (ret != DH_SUCCESS) {
737 DHLOGE("Wait SA notify failed. ret:%{public}d.", ret);
738 return ret;
739 }
740 micPinInUse_ = 0;
741 DHLOGI("Close capture device success.");
742 return DH_SUCCESS;
743 }
744
GetVolumeGroup(const uint32_t devId)745 uint32_t AudioAdapterInterfaceImpl::GetVolumeGroup(const uint32_t devId)
746 {
747 uint32_t volGroup = VOLUME_GROUP_ID_DEFAULT;
748 std::lock_guard<std::mutex> devLck(devMapMtx_);
749 auto caps = mapAudioDevice_.find(devId);
750 if (caps == mapAudioDevice_.end()) {
751 DHLOGE("Can not find caps of dev:%{public}s.", GetChangeDevIdMap(static_cast<int32_t>(devId)).c_str());
752 return volGroup;
753 }
754
755 int32_t ret = GetAudioParamUInt(caps->second, VOLUME_GROUP_ID, volGroup);
756 if (ret != DH_SUCCESS) {
757 DHLOGE("Get volume group param failed, use default value, ret = %{public}d.", ret);
758 }
759 return volGroup;
760 }
761
GetInterruptGroup(const uint32_t devId)762 uint32_t AudioAdapterInterfaceImpl::GetInterruptGroup(const uint32_t devId)
763 {
764 uint32_t iptGroup = INTERRUPT_GROUP_ID_DEFAULT;
765 std::lock_guard<std::mutex> devLck(devMapMtx_);
766 auto caps = mapAudioDevice_.find(devId);
767 if (caps == mapAudioDevice_.end()) {
768 DHLOGE("Can not find caps of devType: %{public}s.", GetChangeDevIdMap(static_cast<int32_t>(devId)).c_str());
769 return iptGroup;
770 }
771
772 int32_t ret = GetAudioParamUInt(caps->second, INTERRUPT_GROUP_ID, iptGroup);
773 if (ret != DH_SUCCESS) {
774 DHLOGE("Get interrupt group param failed, use default value, ret = %{public}d.", ret);
775 }
776 return iptGroup;
777 }
778
SetAudioVolume(const std::string & condition,const std::string & param)779 int32_t AudioAdapterInterfaceImpl::SetAudioVolume(const std::string& condition, const std::string ¶m)
780 {
781 std::string content = condition;
782 int32_t type = getEventTypeFromCondition(content);
783 EXT_PARAM_EVENT eventType;
784
785 if (type == VolumeEventType::EVENT_IS_STREAM_MUTE) {
786 if (param == IS_MUTE_STATUS) {
787 streamMuteStatus_ = 1;
788 } else if (param == NOT_MUTE_STATUS) {
789 streamMuteStatus_ = 0;
790 } else {
791 DHLOGE("Mute param is error.");
792 return ERR_DH_AUDIO_HDF_FAIL;
793 }
794 eventType = HDF_AUDIO_EVNET_MUTE_SET;
795 SetAudioParamStr(content, STREAM_MUTE_STATUS, param);
796 } else {
797 eventType = HDF_AUDIO_EVENT_VOLUME_SET;
798 streamMuteStatus_ = 0;
799 SetAudioParamStr(content, VOLUME_LEVEL, param);
800 }
801 DAudioEvent event = { eventType, content };
802
803 {
804 std::lock_guard<std::mutex> devLck(renderDevMtx_);
805 for (uint32_t id = 0; id < MAX_AUDIO_STREAM_NUM; id++) {
806 const auto &item = renderDevs_[id];
807 std::lock_guard<std::mutex> callbackLck(extCallbackMtx_);
808 sptr<IDAudioCallback> extSpkCallback(extCallbackMap_[item.first]);
809 SetAudioParamStr(event.content, "dhId", std::to_string(item.first));
810 auto render = item.second;
811 if (render == nullptr || extSpkCallback == nullptr) {
812 continue;
813 }
814 if (extSpkCallback->NotifyEvent(id, event) != HDF_SUCCESS) {
815 DHLOGE("NotifyEvent failed.");
816 return ERR_DH_AUDIO_HDF_FAIL;
817 }
818 }
819 }
820 return DH_SUCCESS;
821 }
822
GetAudioVolume(const std::string & condition,std::string & param)823 int32_t AudioAdapterInterfaceImpl::GetAudioVolume(const std::string& condition, std::string ¶m)
824 {
825 sptr<AudioRenderInterfaceImplBase> audioRender(nullptr);
826 {
827 std::lock_guard<std::mutex> devLck(renderDevMtx_);
828 audioRender = renderDevs_[0].second; // from audioframwork
829 }
830 if (audioRender == nullptr) {
831 DHLOGE("Render has not been created.");
832 return ERR_DH_AUDIO_HDF_NULLPTR;
833 }
834 int32_t type = getEventTypeFromCondition(condition);
835 uint32_t vol;
836 switch (type) {
837 case VolumeEventType::EVENT_GET_VOLUME:
838 vol = audioRender->GetVolumeInner();
839 break;
840 case VolumeEventType::EVENT_GET_MAX_VOLUME:
841 vol = audioRender->GetMaxVolumeInner();
842 break;
843 case VolumeEventType::EVENT_GET_MIN_VOLUME:
844 vol = audioRender->GetMinVolumeInner();
845 break;
846 case VolumeEventType::EVENT_IS_STREAM_MUTE:
847 vol = streamMuteStatus_;
848 break;
849 default:
850 vol = 0;
851 DHLOGE("Get volume failed.");
852 }
853 DHLOGI("Get volume : %{public}" PRIu32" type : %{public}d", vol, type);
854 param = std::to_string(vol);
855 return DH_SUCCESS;
856 }
857
getEventTypeFromCondition(const std::string & condition)858 int32_t AudioAdapterInterfaceImpl::getEventTypeFromCondition(const std::string &condition)
859 {
860 std::string::size_type position = condition.find_first_of(";");
861 int32_t len = static_cast<int32_t>(position) - TYPE_CONDITION;
862 if (len < 0 || len > MAX_EVENT_DIGITS || position == std::string::npos) {
863 DHLOGE("Position is illegal or not find split word");
864 return ERR_DH_AUDIO_HDF_FAIL;
865 }
866 std::string val = condition.substr(TYPE_CONDITION, len);
867 if (!CheckIsNum(val)) {
868 DHLOGE("String is not number. str:%{public}s.", val.c_str());
869 return ERR_DH_AUDIO_HDF_FAIL;
870 }
871 int32_t type = std::atoi(val.c_str());
872 return static_cast<VolumeEventType>(type);
873 }
874
ParseDhIdFromJson(const std::string & args)875 int32_t AudioAdapterInterfaceImpl::ParseDhIdFromJson(const std::string &args)
876 {
877 DHLOGI("Parse distributed hardward Id from args : %{public}s", args.c_str());
878 cJSON *jParam = cJSON_Parse(args.c_str());
879 if (jParam == nullptr) {
880 DHLOGE("Failed to parse JSON: %{public}s", cJSON_GetErrorPtr());
881 return -1;
882 }
883 if (!CJsonParamCheck(jParam, { KEY_DH_ID })) {
884 DHLOGE("Not found the keys of dhId.");
885 cJSON_Delete(jParam);
886 return -1;
887 }
888 cJSON *dhIdItem = cJSON_GetObjectItem(jParam, KEY_DH_ID);
889 if (dhIdItem == NULL || !cJSON_IsString(dhIdItem)) {
890 DHLOGE("Not found the keys of dhId.");
891 cJSON_Delete(jParam);
892 return ERR_DH_AUDIO_HDF_FAIL;
893 }
894 int32_t dhId = ConvertString2Int(std::string(dhIdItem->valuestring));
895 cJSON_Delete(jParam);
896 DHLOGI("Parsed dhId is: %{public}d.", dhId);
897 return dhId;
898 }
899
ConvertString2Int(std::string val)900 int32_t AudioAdapterInterfaceImpl::ConvertString2Int(std::string val)
901 {
902 if (!CheckIsNum(val)) {
903 DHLOGE("String is not number. str:%{public}s.", val.c_str());
904 return -1;
905 }
906 return std::atoi(val.c_str());
907 }
908
GetRenderImpl(const std::string & content)909 sptr<AudioRenderInterfaceImplBase> AudioAdapterInterfaceImpl::GetRenderImpl(const std::string &content)
910 {
911 int32_t dhId = ParseDhIdFromJson(content);
912 if (dhId < 0) {
913 DHLOGE("Failed to parse dhardware id.");
914 return nullptr;
915 }
916 {
917 std::lock_guard<std::mutex> devLck(renderDevMtx_);
918 auto renderDev = find_if(renderDevs_.begin(), renderDevs_.end(),
919 [dhId](std::pair<int32_t, sptr<AudioRenderInterfaceImplBase>> item) { return item.first == dhId; });
920 if (renderDev != renderDevs_.end()) {
921 return renderDev->second;
922 }
923 }
924 DHLOGE("Render has not been created.");
925 return nullptr;
926 }
927
HandleVolumeChangeEvent(const DAudioEvent & event)928 int32_t AudioAdapterInterfaceImpl::HandleVolumeChangeEvent(const DAudioEvent &event)
929 {
930 DHLOGI("Vol change (%{public}s).", event.content.c_str());
931 sptr<AudioRenderInterfaceImplBase> audioRender = GetRenderImpl(event.content);
932 if (audioRender == nullptr) {
933 DHLOGE("Render is null.");
934 return ERR_DH_AUDIO_HDF_NULLPTR;
935 }
936 int32_t vol = AUDIO_DEFAULT_MIN_VOLUME_LEVEL;
937 int32_t ret = GetVolFromEvent(event.content, VOLUME_LEVEL, vol);
938 if (ret != DH_SUCCESS) {
939 DHLOGE("Get volume value failed.");
940 return ERR_DH_AUDIO_HDF_FAIL;
941 }
942
943 if (event.content.find(FIRST_VOLUME_CHANAGE) != event.content.npos) {
944 int32_t maxVol = AUDIO_DEFAULT_MAX_VOLUME_LEVEL;
945 ret = GetVolFromEvent(event.content, MAX_VOLUME_LEVEL, maxVol);
946 if (ret != DH_SUCCESS) {
947 DHLOGE("Get max volume value failed, use defult max volume.");
948 }
949 int32_t minVol = AUDIO_DEFAULT_MIN_VOLUME_LEVEL;
950 ret = GetVolFromEvent(event.content, MIN_VOLUME_LEVEL, minVol);
951 if (ret != DH_SUCCESS) {
952 DHLOGE("Get min volume value failed, use defult min volume.");
953 }
954 audioRender->SetVolumeInner(vol);
955 audioRender->SetVolumeRangeInner(maxVol, minVol);
956 return DH_SUCCESS;
957 }
958
959 audioRender->SetVolumeInner(vol);
960 if (paramCallback_ == nullptr) {
961 DHLOGE("Audio param observer is null.");
962 return ERR_DH_AUDIO_HDF_NULLPTR;
963 }
964 std::string volumeChange = GetVolumeChangeString(event.content);
965 int8_t reserved = 0;
966 int8_t cookie = 0;
967 ret = paramCallback_->ParamCallback(AUDIO_EXT_PARAM_KEY_VOLUME, volumeChange, std::to_string(vol),
968 reserved, cookie);
969 if (ret != DH_SUCCESS) {
970 DHLOGE("Notify vol failed.");
971 return ERR_DH_AUDIO_HDF_FAIL;
972 }
973 return DH_SUCCESS;
974 }
975
GetVolumeChangeString(const std::string & args)976 std::string AudioAdapterInterfaceImpl::GetVolumeChangeString(const std::string &args)
977 {
978 DHLOGI("Vol change (%{public}s).", args.c_str());
979 std::stringstream ss;
980 ss << VOLUME_CHANAGE << ";"
981 << AUDIO_STREAM_TYPE << "=" << ParseStringFromArgs(args, AUDIO_STREAM_TYPE) << ";"
982 << VOLUME_LEVEL << "=" << ParseStringFromArgs(args, VOLUME_LEVEL.c_str()) << ";"
983 << IS_UPDATEUI << "=" << ParseStringFromArgs(args, IS_UPDATEUI) << ";"
984 << VOLUME_GROUP_ID << "=" << ParseStringFromArgs(args, VOLUME_GROUP_ID.c_str()) << ";"
985 << KEY_DH_ID << "=" << ParseStringFromArgs(args, KEY_DH_ID) << ";";
986 std::string res = ss.str();
987 DHLOGI("get ss : %{public}s", res.c_str());
988 return res;
989 }
990
GetVolFromEvent(const std::string & content,const std::string & key,int32_t & vol)991 int32_t AudioAdapterInterfaceImpl::GetVolFromEvent(const std::string &content, const std::string &key, int32_t &vol)
992 {
993 cJSON *jParam = cJSON_Parse(content.c_str());
994 if (jParam == nullptr) {
995 DHLOGE("Failed to parse JSON: %{public}s", cJSON_GetErrorPtr());
996 cJSON_Delete(jParam);
997 return ERR_DH_AUDIO_HDF_FAIL;
998 }
999 cJSON *dhIdItem = cJSON_GetObjectItem(jParam, key.c_str());
1000 if (dhIdItem == NULL || !cJSON_IsString(dhIdItem)) {
1001 DHLOGE("Not found the keys of dhId.");
1002 cJSON_Delete(jParam);
1003 return ERR_DH_AUDIO_HDF_FAIL;
1004 }
1005 std::string val(dhIdItem->valuestring);
1006 if (!CheckIsNum(val)) {
1007 DHLOGE("String is not number. str:%{public}s.", val.c_str());
1008 cJSON_Delete(jParam);
1009 return ERR_DH_AUDIO_HDF_FAIL;
1010 }
1011 vol = std::atoi(val.c_str());
1012 cJSON_Delete(jParam);
1013 return DH_SUCCESS;
1014 }
1015
HandleFocusChangeEvent(const DAudioEvent & event)1016 int32_t AudioAdapterInterfaceImpl::HandleFocusChangeEvent(const DAudioEvent &event)
1017 {
1018 DHLOGI("Focus change (%{public}s).", event.content.c_str());
1019 if (paramCallback_ == nullptr) {
1020 DHLOGE("Audio param observer is null.");
1021 return ERR_DH_AUDIO_HDF_NULLPTR;
1022 }
1023 std::stringstream ss;
1024 ss << INTERRUPT_EVENT << ";"
1025 << VOLUME_EVENT_TYPE << "=" << ParseStringFromArgs(event.content, VOLUME_EVENT_TYPE.c_str()) << ";"
1026 << FORCE_TYPE << "=" << ParseStringFromArgs(event.content, FORCE_TYPE) << ";"
1027 << HINT_TYPE << "=" << ParseStringFromArgs(event.content, HINT_TYPE) << ";"
1028 << KEY_DH_ID << "=" << ParseStringFromArgs(event.content, KEY_DH_ID) << ";"
1029 << AUDIOCATEGORY << "=" << ParseStringFromArgs(event.content, AUDIOCATEGORY) << ";";
1030 DHLOGI("get ss : %{public}s", ss.str().c_str());
1031 int8_t reserved = 0;
1032 int8_t cookie = 0;
1033 int32_t ret = paramCallback_->ParamCallback(AUDIO_EXT_PARAM_KEY_FOCUS, ss.str(), "", reserved, cookie);
1034 if (ret != DH_SUCCESS) {
1035 DHLOGE("Notify Focus failed.");
1036 return ERR_DH_AUDIO_HDF_FAIL;
1037 }
1038 return DH_SUCCESS;
1039 }
1040
HandleRenderStateChangeEvent(const DAudioEvent & event)1041 int32_t AudioAdapterInterfaceImpl::HandleRenderStateChangeEvent(const DAudioEvent &event)
1042 {
1043 DHLOGI("Render state change (%{public}s).", event.content.c_str());
1044 if (paramCallback_ == nullptr) {
1045 DHLOGE("Audio param observer is null.");
1046 return ERR_DH_AUDIO_HDF_NULLPTR;
1047 }
1048 std::stringstream ss;
1049 ss << RENDER_STATE_CHANGE_EVENT << ";"
1050 << KEY_STATE << "=" << ParseStringFromArgs(event.content, KEY_STATE) << ";"
1051 << KEY_DH_ID << "=" << ParseStringFromArgs(event.content, KEY_DH_ID) << ";";
1052 DHLOGI("get ss : %{public}s", ss.str().c_str());
1053 int8_t reserved = 0;
1054 int8_t cookie = 0;
1055 int32_t ret = paramCallback_->ParamCallback(AUDIO_EXT_PARAM_KEY_STATUS, ss.str(), "", reserved, cookie);
1056 if (ret != DH_SUCCESS) {
1057 DHLOGE("Notify render state failed.");
1058 return ERR_DH_AUDIO_HDF_FAIL;
1059 }
1060 return DH_SUCCESS;
1061 }
1062
ConvertMsg2Code(const std::string & msg)1063 int32_t AudioAdapterInterfaceImpl::ConvertMsg2Code(const std::string &msg)
1064 {
1065 if (msg == HDF_EVENT_RESULT_SUCCESS) {
1066 return DH_SUCCESS;
1067 } else if (msg == HDF_EVENT_INIT_ENGINE_FAILED) {
1068 return ERR_DH_AUDIO_HDF_INIT_ENGINE_FAILED;
1069 } else if (msg == HDF_EVENT_NOTIFY_SINK_FAILED) {
1070 return ERR_DH_AUDIO_HDF_NOTIFY_SINK_FAILED;
1071 } else if (msg == HDF_EVENT_TRANS_SETUP_FAILED) {
1072 return ERR_DH_AUDIO_HDF_TRANS_SETUP_FAILED;
1073 } else if (msg == HDF_EVENT_TRANS_START_FAILED) {
1074 return ERR_DH_AUDIO_HDF_TRANS_START_FAILED;
1075 } else {
1076 return ERR_DH_AUDIO_HDF_FAIL;
1077 }
1078 }
1079
HandleSANotifyEvent(const uint32_t streamId,const DAudioEvent & event)1080 int32_t AudioAdapterInterfaceImpl::HandleSANotifyEvent(const uint32_t streamId, const DAudioEvent &event)
1081 {
1082 DHLOGD("Notify event type %{public}d, event content: %{public}s.", event.type, event.content.c_str());
1083 switch (event.type) {
1084 case HDF_AUDIO_EVENT_OPEN_SPK_RESULT:
1085 if (event.content == HDF_EVENT_RESULT_SUCCESS) {
1086 SetSpkStatus(streamId, true);
1087 }
1088 errCode_ = ConvertMsg2Code(event.content);
1089 spkNotifyFlag_ = true;
1090 spkWaitCond_.notify_all();
1091 break;
1092 case HDF_AUDIO_EVENT_CLOSE_SPK_RESULT:
1093 if (event.content == HDF_EVENT_RESULT_SUCCESS) {
1094 SetSpkStatus(streamId, false);
1095 }
1096 errCode_ = ConvertMsg2Code(event.content);
1097 spkNotifyFlag_ = true;
1098 spkWaitCond_.notify_all();
1099 break;
1100 case HDF_AUDIO_EVENT_OPEN_MIC_RESULT:
1101 if (event.content == HDF_EVENT_RESULT_SUCCESS) {
1102 isMicOpened_ = true;
1103 }
1104 errCode_ = ConvertMsg2Code(event.content);
1105 micNotifyFlag_ = true;
1106 micWaitCond_.notify_all();
1107 break;
1108 case HDF_AUDIO_EVENT_CLOSE_MIC_RESULT:
1109 if (event.content == HDF_EVENT_RESULT_SUCCESS) {
1110 isMicOpened_ = false;
1111 }
1112 errCode_ = ConvertMsg2Code(event.content);
1113 micNotifyFlag_ = true;
1114 micWaitCond_.notify_all();
1115 break;
1116 case HDF_AUDIO_EVENT_SPK_DUMP:
1117 SetDumpFlag(true);
1118 break;
1119 case HDF_AUDIO_EVENT_MIC_DUMP:
1120 SetDumpFlag(false);
1121 break;
1122 default:
1123 DHLOGE("Notify not support event type %{public}d, event content: %{public}s.",
1124 event.type, event.content.c_str());
1125 return ERR_DH_AUDIO_HDF_FAIL;
1126 }
1127 return DH_SUCCESS;
1128 }
1129
WaitForSANotify(const uint32_t streamId,const AudioDeviceEvent & event)1130 int32_t AudioAdapterInterfaceImpl::WaitForSANotify(const uint32_t streamId, const AudioDeviceEvent &event)
1131 {
1132 if (event == EVENT_OPEN_SPK || event == EVENT_CLOSE_SPK) {
1133 spkNotifyFlag_ = false;
1134 std::unique_lock<std::mutex> lck(spkWaitMutex_);
1135 auto status = spkWaitCond_.wait_for(lck, std::chrono::milliseconds(WAIT_MILLISECONDS),
1136 [this, streamId, event]() {
1137 auto isSpkOpened = GetSpkStatus(streamId);
1138 return spkNotifyFlag_ ||
1139 (event == EVENT_OPEN_SPK && isSpkOpened) || (event == EVENT_CLOSE_SPK && !isSpkOpened);
1140 });
1141 if (!status) {
1142 DHLOGE("Wait spk event: %{public}d timeout(%{public}d)ms.", event, WAIT_MILLISECONDS);
1143 return ERR_DH_AUDIO_HDF_WAIT_TIMEOUT;
1144 }
1145 if (event == EVENT_OPEN_SPK && !GetSpkStatus(streamId)) {
1146 DHLOGE("Wait open render device failed.");
1147 return errCode_;
1148 } else if (event == EVENT_CLOSE_SPK && GetSpkStatus(streamId)) {
1149 DHLOGE("Wait close render device failed.");
1150 return errCode_;
1151 }
1152 return DH_SUCCESS;
1153 }
1154
1155 if (event == EVENT_OPEN_MIC || event == EVENT_CLOSE_MIC) {
1156 micNotifyFlag_ = false;
1157 std::unique_lock<std::mutex> lck(micWaitMutex_);
1158 auto status = micWaitCond_.wait_for(lck, std::chrono::milliseconds(WAIT_MILLISECONDS), [this, event]() {
1159 return micNotifyFlag_ ||
1160 (event == EVENT_OPEN_MIC && isMicOpened_) || (event == EVENT_CLOSE_MIC && !isMicOpened_);
1161 });
1162 if (!status) {
1163 DHLOGE("Wait mic event: %{public}d timeout(%{public}d)ms.", event, WAIT_MILLISECONDS);
1164 return ERR_DH_AUDIO_HDF_WAIT_TIMEOUT;
1165 }
1166 if (event == EVENT_OPEN_MIC && !isMicOpened_) {
1167 DHLOGE("Wait open capture device failed.");
1168 return errCode_;
1169 } else if (event == EVENT_CLOSE_MIC && isMicOpened_) {
1170 DHLOGE("Wait close capture device failed.");
1171 return errCode_;
1172 }
1173 return DH_SUCCESS;
1174 }
1175 return DH_SUCCESS;
1176 }
1177
HandleDeviceClosed(const uint32_t streamId,const DAudioEvent & event)1178 int32_t AudioAdapterInterfaceImpl::HandleDeviceClosed(const uint32_t streamId, const DAudioEvent &event)
1179 {
1180 DHLOGI("Handle device closed, event type: %{public}d.", event.type);
1181 if (paramCallback_ != nullptr) {
1182 std::stringstream ss;
1183 ss << "ERR_EVENT;DEVICE_TYPE=" <<
1184 (event.type == HDF_AUDIO_EVENT_SPK_CLOSED ? AUDIO_DEVICE_TYPE_SPEAKER : AUDIO_DEVICE_TYPE_MIC) << ";"
1185 << KEY_DH_ID << "=" << ParseStringFromArgs(event.content, KEY_DH_ID) << ";";
1186 DHLOGI("get ss : %{public}s", ss.str().c_str());
1187 int8_t reserved = 0;
1188 int8_t cookie = 0;
1189 int32_t ret = paramCallback_->ParamCallback(AUDIO_EXT_PARAM_KEY_STATUS, ss.str(),
1190 std::to_string(EVENT_DEV_CLOSED), reserved, cookie);
1191 if (ret != DH_SUCCESS) {
1192 DHLOGE("Notify fwk failed.");
1193 }
1194 }
1195
1196 if (GetSpkStatus(streamId) && event.type == HDF_AUDIO_EVENT_SPK_CLOSED) {
1197 DHLOGE("Render device status error, close render.");
1198 bool destroyStatus = true;
1199 for (uint32_t i = 0; i < MAX_AUDIO_STREAM_NUM; i++) {
1200 if (DestroyRender(i) != DH_SUCCESS) {
1201 destroyStatus = false;
1202 }
1203 }
1204 return destroyStatus ? DH_SUCCESS : ERR_DH_AUDIO_HDF_FAIL;
1205 } else if (isMicOpened_ && event.type == HDF_AUDIO_EVENT_MIC_CLOSED) {
1206 DHLOGE("Capture device status error, close capture.");
1207 bool capCloseStatus = true;
1208 for (uint32_t i = 0; i < MAX_AUDIO_STREAM_NUM; i++) {
1209 if (DestroyCapture(i) != DH_SUCCESS) {
1210 capCloseStatus = false;
1211 }
1212 }
1213 return capCloseStatus ? DH_SUCCESS : ERR_DH_AUDIO_HDF_FAIL;
1214 }
1215 DHLOGI("Handle device closed success.");
1216 return DH_SUCCESS;
1217 }
1218
IsPortsNoReg()1219 bool AudioAdapterInterfaceImpl::IsPortsNoReg()
1220 {
1221 std::lock_guard<std::mutex> devLck(devMapMtx_);
1222 return mapAudioDevice_.empty();
1223 }
1224
IsIdValid(const uint32_t id)1225 inline bool AudioAdapterInterfaceImpl::IsIdValid(const uint32_t id)
1226 {
1227 if (id >= MAX_AUDIO_STREAM_NUM) {
1228 DHLOGE("Current id:%{public}u is not supported.", id);
1229 return false;
1230 }
1231 return true;
1232 }
1233
CheckRendersValid()1234 bool AudioAdapterInterfaceImpl::CheckRendersValid()
1235 {
1236 {
1237 std::lock_guard<std::mutex> devLck(renderDevMtx_);
1238 for (uint32_t i = 0; i < MAX_AUDIO_STREAM_NUM; i++) {
1239 if (renderDevs_[i].second != nullptr) {
1240 DHLOGI("Containing active render.");
1241 return true;
1242 }
1243 }
1244 }
1245 return false;
1246 }
1247
CheckCapsValid()1248 bool AudioAdapterInterfaceImpl::CheckCapsValid()
1249 {
1250 {
1251 std::lock_guard<std::mutex> devLck(capDevMtx_);
1252 for (uint32_t i = 0; i < MAX_AUDIO_STREAM_NUM; i++) {
1253 if (captureDevs_[i].second != nullptr) {
1254 DHLOGI("Containing active capture.");
1255 return true;
1256 }
1257 }
1258 }
1259 return false;
1260 }
1261
SetDumpFlag(bool isRender)1262 void AudioAdapterInterfaceImpl::SetDumpFlag(bool isRender)
1263 {
1264 if (isRender) {
1265 std::lock_guard<std::mutex> renderLck(renderDevMtx_);
1266 for (auto item : renderDevs_) {
1267 auto render = item.second;
1268 if (render == nullptr) {
1269 continue;
1270 }
1271 render->SetDumpFlagInner();
1272 }
1273 } else {
1274 std::lock_guard<std::mutex> capLck(capDevMtx_);
1275 for (auto item : captureDevs_) {
1276 auto capture = item.second;
1277 if (capture == nullptr) {
1278 continue;
1279 }
1280 capture->SetDumpFlagInner();
1281 }
1282 }
1283 }
1284
SetSpkStatus(const uint32_t streamId,bool status)1285 void AudioAdapterInterfaceImpl::SetSpkStatus(const uint32_t streamId, bool status)
1286 {
1287 if (streamId >= MAX_AUDIO_STREAM_NUM) {
1288 DHLOGE("Stream ID is out of range.");
1289 return;
1290 }
1291 std::lock_guard<std::mutex> devLck(spkStatusMutex_);
1292 spkStatus_[streamId] = status;
1293 }
1294
GetSpkStatus(const uint32_t streamId)1295 bool AudioAdapterInterfaceImpl::GetSpkStatus(const uint32_t streamId)
1296 {
1297 if (streamId >= MAX_AUDIO_STREAM_NUM) {
1298 DHLOGE("Stream ID is out of range.");
1299 return false;
1300 }
1301 std::lock_guard<std::mutex> devLck(spkStatusMutex_);
1302 return spkStatus_[streamId];
1303 }
1304
1305 } // V1_0
1306 } // Audio
1307 } // Distributedaudio
1308 } // HDI
1309 } // OHOS