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