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 <dlfcn.h>
19 #include <hdf_base.h>
20 #include <sstream>
21
22 #include "daudio_constants.h"
23 #include "daudio_errcode.h"
24 #include "daudio_events.h"
25 #include "daudio_log.h"
26 #include "daudio_utils.h"
27
28 #undef DH_LOG_TAG
29 #define DH_LOG_TAG "AudioAdapterInterfaceImpl"
30
31 using namespace OHOS::DistributedHardware;
32 namespace OHOS {
33 namespace HDI {
34 namespace DistributedAudio {
35 namespace Audio {
36 namespace V1_0 {
AudioAdapterInterfaceImpl(const AudioAdapterDescriptor & desc)37 AudioAdapterInterfaceImpl::AudioAdapterInterfaceImpl(const AudioAdapterDescriptor &desc)
38 : adpDescriptor_(desc)
39 {
40 renderParam_ = { 0, 0, 0, 0, 0, 0 };
41 captureParam_ = { 0, 0, 0, 0, 0, 0 };
42 DHLOGD("Distributed audio adapter constructed, name(%s).", GetAnonyString(desc.adapterName).c_str());
43 }
44
~AudioAdapterInterfaceImpl()45 AudioAdapterInterfaceImpl::~AudioAdapterInterfaceImpl()
46 {
47 DHLOGD("Distributed audio adapter destructed, name(%s).", GetAnonyString(adpDescriptor_.adapterName).c_str());
48 }
49
50
SetSpeakerCallback(const sptr<IDAudioCallback> & spkCallback)51 void AudioAdapterInterfaceImpl::SetSpeakerCallback(const sptr<IDAudioCallback> &spkCallback)
52 {
53 if (spkCallback == nullptr) {
54 DHLOGE("Callback is nullptr.");
55 return;
56 }
57 extSpkCallback_ = spkCallback;
58 }
59
SetMicCallback(const sptr<IDAudioCallback> & micCallback)60 void AudioAdapterInterfaceImpl::SetMicCallback(const sptr<IDAudioCallback> &micCallback)
61 {
62 if (micCallback == nullptr) {
63 DHLOGE("Callback is nullptr.");
64 return;
65 }
66 extMicCallback_ = micCallback;
67 }
68
InitAllPorts()69 int32_t AudioAdapterInterfaceImpl::InitAllPorts()
70 {
71 DHLOGI("Init (%zu) distributed audio ports.", mapAudioDevice_.size());
72 return HDF_SUCCESS;
73 }
74
CreateRender(const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs,sptr<IAudioRender> & render)75 int32_t AudioAdapterInterfaceImpl::CreateRender(const AudioDeviceDescriptor &desc,
76 const AudioSampleAttributes &attrs, sptr<IAudioRender> &render)
77 {
78 DHLOGI("Create distributed audio render, {pin: %zu, sampleRate: %zu, channel: %zu, formats: %zu, type: %d}.",
79 desc.pins, attrs.sampleRate, attrs.channelCount, attrs.format, static_cast<int32_t>(attrs.type));
80 render = nullptr;
81 {
82 std::lock_guard<std::mutex> devLck(devMapMtx_);
83 if (mapAudioDevice_.find(desc.pins) == mapAudioDevice_.end()) {
84 DHLOGE("Can not find device, create render failed.");
85 return HDF_FAILURE;
86 }
87 }
88 #ifdef DAUDIO_SUPPORT_EXTENSION
89 if (attrs.type == AUDIO_MMAP_NOIRQ) {
90 DHLOGI("Try to mmap mode.");
91 renderFlags_ = Audioext::V1_0::MMAP_MODE;
92 audioRender_ = new AudioRenderExtImpl();
93 audioRender_->SetAttrs(adpDescriptor_.adapterName, desc, attrs, extSpkCallback_);
94 } else {
95 DHLOGI("Try to normal mode.");
96 renderFlags_ = Audioext::V1_0::NORMAL_MODE;
97 audioRender_ = new AudioRenderInterfaceImpl(adpDescriptor_.adapterName, desc, attrs, extSpkCallback_);
98 }
99 #else
100 renderFlags_ = Audioext::V1_0::NORMAL_MODE;
101 audioRender_ = new AudioRenderInterfaceImpl(adpDescriptor_.adapterName, desc, attrs, extSpkCallback_);
102 #endif
103 if (audioRender_ == nullptr) {
104 DHLOGE("Create render failed.");
105 return HDF_FAILURE;
106 }
107
108 int32_t ret = OpenRenderDevice(desc, attrs);
109 if (ret != DH_SUCCESS) {
110 DHLOGE("Open render device failed.");
111 audioRender_ = nullptr;
112 return ret == ERR_DH_AUDIO_HDF_WAIT_TIMEOUT ? HDF_ERR_TIMEOUT : HDF_FAILURE;
113 }
114 render = audioRender_;
115 DHLOGI("Create render success.");
116 return HDF_SUCCESS;
117 }
118
DestroyRender(const AudioDeviceDescriptor & desc)119 int32_t AudioAdapterInterfaceImpl::DestroyRender(const AudioDeviceDescriptor &desc)
120 {
121 DHLOGI("Destroy distributed audio render, {pin: %zu}.", desc.pins);
122 if (audioRender_ == nullptr) {
123 DHLOGD("Render has not been created, do not need destroy.");
124 return HDF_SUCCESS;
125 }
126 if (desc.pins != audioRender_->GetRenderDesc().pins) {
127 DHLOGE("Render pin is wrong, destroy render failed.");
128 return HDF_FAILURE;
129 }
130
131 int32_t ret = CloseRenderDevice(desc);
132 if (ret != DH_SUCCESS) {
133 DHLOGE("Close render device failed.");
134 return HDF_FAILURE;
135 }
136 audioRender_ = nullptr;
137 return HDF_SUCCESS;
138 }
139
CreateCapture(const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs,sptr<IAudioCapture> & capture)140 int32_t AudioAdapterInterfaceImpl::CreateCapture(const AudioDeviceDescriptor &desc,
141 const AudioSampleAttributes &attrs, sptr<IAudioCapture> &capture)
142 {
143 DHLOGI("Create distributed audio capture, {pin: %zu, sampleRate: %zu, channel: %zu, formats: %zu}.",
144 desc.pins, attrs.sampleRate, attrs.channelCount, attrs.format);
145 capture = nullptr;
146 {
147 std::lock_guard<std::mutex> devLck(devMapMtx_);
148 if (mapAudioDevice_.find(desc.pins) == mapAudioDevice_.end()) {
149 DHLOGE("Can not find device, create capture failed.");
150 return HDF_FAILURE;
151 }
152 }
153 #ifdef DAUDIO_SUPPORT_EXTENSION
154 if (attrs.type == AUDIO_MMAP_NOIRQ) {
155 DHLOGI("Try to mmap mode.");
156 capturerFlags_ = Audioext::V1_0::MMAP_MODE;
157 audioCapture_ = new AudioCaptureExtImpl();
158 audioCapture_->SetAttrs(adpDescriptor_.adapterName, desc, attrs, extMicCallback_);
159 } else {
160 DHLOGI("Try to normal mode.");
161 capturerFlags_ = Audioext::V1_0::NORMAL_MODE;
162 audioCapture_ = new AudioCaptureInterfaceImpl(adpDescriptor_.adapterName, desc, attrs, extMicCallback_);
163 }
164 #else
165 capturerFlags_ = Audioext::V1_0::NORMAL_MODE;
166 audioCapture_ = new AudioCaptureInterfaceImpl(adpDescriptor_.adapterName, desc, attrs, extMicCallback_);
167 #endif
168 if (audioCapture_ == nullptr) {
169 DHLOGE("Create capture failed.");
170 return HDF_FAILURE;
171 }
172
173 int32_t ret = OpenCaptureDevice(desc, attrs);
174 if (ret != DH_SUCCESS) {
175 DHLOGE("Open capture device failed.");
176 audioCapture_ = nullptr;
177 return ret == ERR_DH_AUDIO_HDF_WAIT_TIMEOUT ? HDF_ERR_TIMEOUT : HDF_FAILURE;
178 }
179 capture = audioCapture_;
180 DHLOGI("Create capture success.");
181 return HDF_SUCCESS;
182 }
183
DestroyCapture(const AudioDeviceDescriptor & desc)184 int32_t AudioAdapterInterfaceImpl::DestroyCapture(const AudioDeviceDescriptor &desc)
185 {
186 DHLOGI("Destroy distributed audio capture, {pin: %zu}.", desc.pins);
187 if (audioCapture_ == nullptr) {
188 DHLOGD("Capture has not been created, do not need destroy.");
189 return HDF_SUCCESS;
190 }
191 if (desc.pins != audioCapture_->GetCaptureDesc().pins) {
192 DHLOGE("Capture pin is wrong, destroy capture failed.");
193 return HDF_FAILURE;
194 }
195
196 int32_t ret = CloseCaptureDevice(desc);
197 if (ret != DH_SUCCESS) {
198 DHLOGE("Close capture device failed.");
199 return HDF_FAILURE;
200 }
201 audioCapture_ = nullptr;
202 return HDF_SUCCESS;
203 }
204
GetPortCapability(const AudioPort & port,AudioPortCapability & capability)205 int32_t AudioAdapterInterfaceImpl::GetPortCapability(const AudioPort &port, AudioPortCapability &capability)
206 {
207 DHLOGD("Get audio port capability.");
208 (void)port;
209 capability.sampleRateMasks = AUDIO_SAMPLE_RATE_DEFAULT;
210 capability.channelCount = AUDIO_CHANNEL_COUNT_DEFAULT;
211
212 return HDF_SUCCESS;
213 }
214
SetPassthroughMode(const AudioPort & port,AudioPortPassthroughMode mode)215 int32_t AudioAdapterInterfaceImpl::SetPassthroughMode(const AudioPort &port, AudioPortPassthroughMode mode)
216 {
217 (void)port;
218 (void)mode;
219 return HDF_SUCCESS;
220 }
221
GetPassthroughMode(const AudioPort & port,AudioPortPassthroughMode & mode)222 int32_t AudioAdapterInterfaceImpl::GetPassthroughMode(const AudioPort &port, AudioPortPassthroughMode &mode)
223 {
224 (void)port;
225 (void)mode;
226 return HDF_SUCCESS;
227 }
228
GetDeviceStatus(AudioDeviceStatus & status)229 int32_t AudioAdapterInterfaceImpl::GetDeviceStatus(AudioDeviceStatus& status)
230 {
231 (void) status;
232 return HDF_SUCCESS;
233 }
234
UpdateAudioRoute(const AudioRoute & route,int32_t & routeHandle)235 int32_t AudioAdapterInterfaceImpl::UpdateAudioRoute(const AudioRoute &route, int32_t &routeHandle)
236 {
237 (void) route;
238 (void) routeHandle;
239 return HDF_SUCCESS;
240 }
241
ReleaseAudioRoute(int32_t routeHandle)242 int32_t AudioAdapterInterfaceImpl::ReleaseAudioRoute(int32_t routeHandle)
243 {
244 (void) routeHandle;
245 return HDF_SUCCESS;
246 }
247
SetMicMute(bool mute)248 int32_t AudioAdapterInterfaceImpl::SetMicMute(bool mute)
249 {
250 (void) mute;
251 return HDF_SUCCESS;
252 }
253
GetMicMute(bool & mute)254 int32_t AudioAdapterInterfaceImpl::GetMicMute(bool& mute)
255 {
256 (void) mute;
257 return HDF_SUCCESS;
258 }
259
SetVoiceVolume(float volume)260 int32_t AudioAdapterInterfaceImpl::SetVoiceVolume(float volume)
261 {
262 (void) volume;
263 return HDF_SUCCESS;
264 }
265
SetExtraParams(AudioExtParamKey key,const std::string & condition,const std::string & value)266 int32_t AudioAdapterInterfaceImpl::SetExtraParams(AudioExtParamKey key, const std::string &condition,
267 const std::string &value)
268 {
269 DHLOGD("Set audio parameters, key = %d, condition: %s value: %s.", key, condition.c_str(), value.c_str());
270 int32_t ret = ERR_DH_AUDIO_HDF_FAIL;
271 switch (key) {
272 case AudioExtParamKey::AUDIO_EXT_PARAM_KEY_VOLUME:
273 ret = SetAudioVolume(condition, value);
274 if (ret != DH_SUCCESS) {
275 DHLOGE("Set audio parameters failed.");
276 return HDF_FAILURE;
277 }
278 break;
279 case AudioExtParamKey::AUDIO_EXT_PARAM_KEY_NONE:
280 DHLOGE("Parameter is unknown.");
281 break;
282 default:
283 DHLOGE("Parameter is invalid.");
284 return HDF_ERR_INVALID_PARAM;
285 }
286 DHLOGI("Set audio parameters success.");
287 return HDF_SUCCESS;
288 }
289
GetExtraParams(AudioExtParamKey key,const std::string & condition,std::string & value)290 int32_t AudioAdapterInterfaceImpl::GetExtraParams(AudioExtParamKey key, const std::string &condition,
291 std::string &value)
292 {
293 DHLOGD("Get audio parameters, key: %d, condition: %s.", key, condition.c_str());
294 int32_t ret = ERR_DH_AUDIO_HDF_FAIL;
295 switch (key) {
296 case AudioExtParamKey::AUDIO_EXT_PARAM_KEY_VOLUME:
297 ret = GetAudioVolume(condition, value);
298 if (ret != DH_SUCCESS) {
299 DHLOGE("Get audio parameters failed.");
300 return HDF_FAILURE;
301 }
302 break;
303 case AudioExtParamKey::AUDIO_EXT_PARAM_KEY_NONE:
304 DHLOGE("Parameter is unknown.");
305 break;
306 default:
307 DHLOGE("Parameter is invalid.");
308 return HDF_ERR_INVALID_PARAM;
309 }
310 DHLOGI("Get audio parameters success.");
311 return HDF_SUCCESS;
312 }
313
RegExtraParamObserver(const sptr<IAudioCallback> & audioCallback,int8_t cookie)314 int32_t AudioAdapterInterfaceImpl::RegExtraParamObserver(const sptr<IAudioCallback> &audioCallback, int8_t cookie)
315 {
316 DHLOGD("Register audio param observer.");
317 paramCallback_ = audioCallback;
318 (void) cookie;
319 return HDF_SUCCESS;
320 }
321
GetAdapterDesc()322 AudioAdapterDescriptor AudioAdapterInterfaceImpl::GetAdapterDesc()
323 {
324 adpDescriptor_.ports.clear();
325 std::lock_guard<std::mutex> devLck(devMapMtx_);
326 for (auto pin = mapAudioDevice_.begin(); pin != mapAudioDevice_.end(); pin++) {
327 AudioPort port = {PORT_OUT_IN, pin->first, ""};
328 adpDescriptor_.ports.emplace_back(port);
329 }
330 return adpDescriptor_;
331 }
332
GetDeviceCapabilitys(const uint32_t devId)333 std::string AudioAdapterInterfaceImpl::GetDeviceCapabilitys(const uint32_t devId)
334 {
335 std::lock_guard<std::mutex> devLck(devMapMtx_);
336 auto dev = mapAudioDevice_.find(devId);
337 if (dev == mapAudioDevice_.end()) {
338 DHLOGE("Device not found.");
339 return "";
340 }
341 return dev->second;
342 }
343
AdapterLoad()344 int32_t AudioAdapterInterfaceImpl::AdapterLoad()
345 {
346 status_ = AudioAdapterStatus::STATUS_LOAD;
347 return HDF_SUCCESS;
348 }
349
AdapterUnload()350 int32_t AudioAdapterInterfaceImpl::AdapterUnload()
351 {
352 if (audioRender_ != nullptr || audioCapture_ != nullptr) {
353 DHLOGE("Adapter is busy, audio render or capture is not null.");
354 return HDF_ERR_DEVICE_BUSY;
355 }
356 status_ = AudioAdapterStatus::STATUS_UNLOAD;
357 return HDF_SUCCESS;
358 }
359
Notify(const uint32_t devId,const DAudioEvent & event)360 int32_t AudioAdapterInterfaceImpl::Notify(const uint32_t devId, const DAudioEvent &event)
361 {
362 switch (static_cast<AudioExtParamEvent>(event.type)) {
363 case HDF_AUDIO_EVENT_VOLUME_CHANGE:
364 DHLOGI("Notify event: VOLUME_CHANGE, event content: %s.", event.content.c_str());
365 return HandleVolumeChangeEvent(event);
366 case HDF_AUDIO_EVENT_FOCUS_CHANGE:
367 DHLOGI("Notify event: FOCUS_CHANGE, event content: %s.", event.content.c_str());
368 return HandleFocusChangeEvent(event);
369 case HDF_AUDIO_EVENT_RENDER_STATE_CHANGE:
370 DHLOGI("Notify event: RENDER_STATE_CHANGE, event content: %s.", event.content.c_str());
371 return HandleRenderStateChangeEvent(event);
372 case HDF_AUDIO_EVENT_OPEN_SPK_RESULT:
373 case HDF_AUDIO_EVENT_CLOSE_SPK_RESULT:
374 case HDF_AUDIO_EVENT_OPEN_MIC_RESULT:
375 case HDF_AUDIO_EVENT_CLOSE_MIC_RESULT:
376 return HandleSANotifyEvent(event);
377 case HDF_AUDIO_EVENT_SPK_CLOSED:
378 case HDF_AUDIO_EVENT_MIC_CLOSED:
379 return HandleDeviceClosed(event);
380 default:
381 DHLOGE("Audio event: %d is undefined.", event.type);
382 return ERR_DH_AUDIO_HDF_INVALID_OPERATION;
383 }
384 }
385
AddAudioDevice(const uint32_t devId,const std::string & caps)386 int32_t AudioAdapterInterfaceImpl::AddAudioDevice(const uint32_t devId, const std::string &caps)
387 {
388 DHLOGI("Add distributed audio device %d.", devId);
389 std::lock_guard<std::mutex> devLck(devMapMtx_);
390 auto dev = mapAudioDevice_.find(devId);
391 if (dev != mapAudioDevice_.end()) {
392 DHLOGI("Device has been add, do not repeat add.");
393 return DH_SUCCESS;
394 }
395 mapAudioDevice_.insert(std::make_pair(devId, caps));
396
397 DHLOGI("Add audio device success.");
398 return DH_SUCCESS;
399 }
400
RemoveAudioDevice(const uint32_t devId)401 int32_t AudioAdapterInterfaceImpl::RemoveAudioDevice(const uint32_t devId)
402 {
403 DHLOGI("Remove distributed audio device %d.", devId);
404 {
405 std::lock_guard<std::mutex> devLck(devMapMtx_);
406 if (mapAudioDevice_.find(devId) == mapAudioDevice_.end()) {
407 DHLOGE("Device has not been add, remove device failed.");
408 return ERR_DH_AUDIO_HDF_INVALID_OPERATION;
409 }
410 mapAudioDevice_.erase(devId);
411 }
412 AudioDeviceDescriptor dec;
413 if (devId == spkPinInUse_) {
414 dec.pins = static_cast<AudioPortPin>(spkPinInUse_);
415 DestroyRender(dec);
416 }
417 if (devId == micPinInUse_) {
418 dec.pins = static_cast<AudioPortPin>(micPinInUse_);
419 DestroyCapture(dec);
420 }
421
422 DHLOGI("Remove audio device success.");
423 return DH_SUCCESS;
424 }
425
OpenRenderDevice(const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs)426 int32_t AudioAdapterInterfaceImpl::OpenRenderDevice(const AudioDeviceDescriptor &desc,
427 const AudioSampleAttributes &attrs)
428 {
429 DHLOGI("Open render device, pin: %d.", desc.pins);
430 if (isSpkOpened_) {
431 DHLOGI("Render already opened.");
432 return DH_SUCCESS;
433 }
434 std::lock_guard<std::mutex> devLck(renderOptMtx_);
435 spkPinInUse_ = desc.pins;
436 renderParam_.format = attrs.format;
437 renderParam_.channelCount = attrs.channelCount;
438 renderParam_.sampleRate = attrs.sampleRate;
439 renderParam_.streamUsage = attrs.type;
440 renderParam_.frameSize = CalculateFrameSize(attrs.sampleRate, attrs.channelCount, attrs.format,
441 timeInterval_, renderFlags_ == Audioext::V1_0::MMAP_MODE);
442 renderParam_.renderFlags = renderFlags_;
443
444 int32_t ret = extSpkCallback_->SetParameters(adpDescriptor_.adapterName, desc.pins, renderParam_);
445 if (ret != HDF_SUCCESS) {
446 DHLOGE("Set render parameters failed.");
447 return ERR_DH_AUDIO_HDF_SET_PARAM_FAIL;
448 }
449 ret = extSpkCallback_->OpenDevice(adpDescriptor_.adapterName, desc.pins);
450 if (ret != HDF_SUCCESS) {
451 DHLOGE("Open render device failed.");
452 return ERR_DH_AUDIO_HDF_OPEN_DEVICE_FAIL;
453 }
454
455 ret = WaitForSANotify(EVENT_OPEN_SPK);
456 if (ret != DH_SUCCESS) {
457 DHLOGE("Wait SA notify failed.");
458 return ret;
459 }
460 DHLOGI("Open render device success.");
461 return DH_SUCCESS;
462 }
463
CloseRenderDevice(const AudioDeviceDescriptor & desc)464 int32_t AudioAdapterInterfaceImpl::CloseRenderDevice(const AudioDeviceDescriptor &desc)
465 {
466 DHLOGI("Close render device, pin: %d.", desc.pins);
467 std::lock_guard<std::mutex> devLck(renderOptMtx_);
468 if (spkPinInUse_ == 0) {
469 DHLOGI("No need close render device.");
470 return DH_SUCCESS;
471 }
472 renderParam_ = {};
473 int32_t ret = extSpkCallback_->CloseDevice(adpDescriptor_.adapterName, desc.pins);
474 if (ret != HDF_SUCCESS) {
475 DHLOGE("Close audio device failed.");
476 return ERR_DH_AUDIO_HDF_CLOSE_DEVICE_FAIL;
477 }
478
479 ret = WaitForSANotify(EVENT_CLOSE_SPK);
480 if (ret != DH_SUCCESS) {
481 DHLOGE("Wait SA notify failed.");
482 return ret;
483 }
484 spkPinInUse_ = 0;
485 DHLOGI("Close render device success.");
486 return DH_SUCCESS;
487 }
488
OpenCaptureDevice(const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs)489 int32_t AudioAdapterInterfaceImpl::OpenCaptureDevice(const AudioDeviceDescriptor &desc,
490 const AudioSampleAttributes &attrs)
491 {
492 DHLOGI("Open capture device, pin: %d.", desc.pins);
493 if (isMicOpened_) {
494 DHLOGI("Capture already opened.");
495 return DH_SUCCESS;
496 }
497 std::lock_guard<std::mutex> devLck(captureOptMtx_);
498 micPinInUse_ = desc.pins;
499 captureParam_.format = attrs.format;
500 captureParam_.channelCount = attrs.channelCount;
501 captureParam_.sampleRate = attrs.sampleRate;
502 captureParam_.streamUsage = attrs.type;
503 captureParam_.frameSize = CalculateFrameSize(attrs.sampleRate, attrs.channelCount,
504 attrs.format, timeInterval_, capturerFlags_ == Audioext::V1_0::MMAP_MODE);
505 captureParam_.capturerFlags = capturerFlags_;
506
507 int32_t ret = extMicCallback_->SetParameters(adpDescriptor_.adapterName, desc.pins, captureParam_);
508 if (ret != HDF_SUCCESS) {
509 DHLOGE("Set audio parameters failed.");
510 return ERR_DH_AUDIO_HDF_SET_PARAM_FAIL;
511 }
512 ret = extMicCallback_->OpenDevice(adpDescriptor_.adapterName, desc.pins);
513 if (ret != HDF_SUCCESS) {
514 DHLOGE("Open audio device failed.");
515 return ERR_DH_AUDIO_HDF_OPEN_DEVICE_FAIL;
516 }
517
518 ret = WaitForSANotify(EVENT_OPEN_MIC);
519 if (ret != DH_SUCCESS) {
520 DHLOGE("Wait SA notify failed.");
521 return ret;
522 }
523 DHLOGI("Open capture device success.");
524 return DH_SUCCESS;
525 }
526
CloseCaptureDevice(const AudioDeviceDescriptor & desc)527 int32_t AudioAdapterInterfaceImpl::CloseCaptureDevice(const AudioDeviceDescriptor &desc)
528 {
529 DHLOGI("Close capture device, pin: %d.", desc.pins);
530 std::lock_guard<std::mutex> devLck(captureOptMtx_);
531 if (micPinInUse_ == 0) {
532 DHLOGI("No need close capture device.");
533 return DH_SUCCESS;
534 }
535 captureParam_ = {};
536 int32_t ret = extMicCallback_->CloseDevice(adpDescriptor_.adapterName, desc.pins);
537 if (ret != HDF_SUCCESS) {
538 DHLOGE("Close audio device failed.");
539 return ERR_DH_AUDIO_HDF_CLOSE_DEVICE_FAIL;
540 }
541
542 ret = WaitForSANotify(EVENT_CLOSE_MIC);
543 if (ret != DH_SUCCESS) {
544 DHLOGE("Wait SA notify failed.");
545 return ret;
546 }
547 micPinInUse_ = 0;
548 DHLOGI("Close capture device success.");
549 return DH_SUCCESS;
550 }
551
GetVolumeGroup(const uint32_t devId)552 uint32_t AudioAdapterInterfaceImpl::GetVolumeGroup(const uint32_t devId)
553 {
554 uint32_t volGroup = VOLUME_GROUP_ID_DEFAULT;
555 std::lock_guard<std::mutex> devLck(devMapMtx_);
556 auto caps = mapAudioDevice_.find(devId);
557 if (caps == mapAudioDevice_.end()) {
558 DHLOGE("Can not find caps of dev:%u.", devId);
559 return volGroup;
560 }
561
562 int32_t ret = GetAudioParamUInt(caps->second, VOLUME_GROUP_ID, volGroup);
563 if (ret != DH_SUCCESS) {
564 DHLOGE("Get volume group param failed, use default value, ret = %d.", ret);
565 }
566 return volGroup;
567 }
568
GetInterruptGroup(const uint32_t devId)569 uint32_t AudioAdapterInterfaceImpl::GetInterruptGroup(const uint32_t devId)
570 {
571 uint32_t iptGroup = INTERRUPT_GROUP_ID_DEFAULT;
572 std::lock_guard<std::mutex> devLck(devMapMtx_);
573 auto caps = mapAudioDevice_.find(devId);
574 if (caps == mapAudioDevice_.end()) {
575 DHLOGE("Can not find caps of dev:%u.", devId);
576 return iptGroup;
577 }
578
579 int32_t ret = GetAudioParamUInt(caps->second, INTERRUPT_GROUP_ID, iptGroup);
580 if (ret != DH_SUCCESS) {
581 DHLOGE("Get interrupt group param failed, use default value, ret = %d.", ret);
582 }
583 return iptGroup;
584 }
585
SetAudioVolume(const std::string & condition,const std::string & param)586 int32_t AudioAdapterInterfaceImpl::SetAudioVolume(const std::string& condition, const std::string ¶m)
587 {
588 if (extSpkCallback_ == nullptr) {
589 DHLOGE("Callback is nullptr.");
590 return ERR_DH_AUDIO_HDF_NULLPTR;
591 }
592 if (audioRender_ == nullptr) {
593 DHLOGE("Render has not been created.");
594 return ERR_DH_AUDIO_HDF_NULLPTR;
595 }
596 std::string content = condition;
597 int32_t type = getEventTypeFromCondition(content);
598 EXT_PARAM_EVENT eventType;
599
600 if (type == VolumeEventType::EVENT_IS_STREAM_MUTE) {
601 if (param == IS_MUTE_STATUS) {
602 streamMuteStatus_ = 1;
603 } else if (param == NOT_MUTE_STATUS) {
604 streamMuteStatus_ = 0;
605 } else {
606 DHLOGE("Mute param is error.");
607 return ERR_DH_AUDIO_HDF_FAIL;
608 }
609 eventType = HDF_AUDIO_EVNET_MUTE_SET;
610 SetAudioParamStr(content, STREAM_MUTE_STATUS, param);
611 } else {
612 eventType = HDF_AUDIO_EVENT_VOLUME_SET;
613 streamMuteStatus_ = 0;
614 SetAudioParamStr(content, VOLUME_LEVEL, param);
615 }
616 DAudioEvent event = { eventType, content };
617 int32_t ret =
618 extSpkCallback_->NotifyEvent(adpDescriptor_.adapterName, audioRender_->GetRenderDesc().pins, event);
619 if (ret != HDF_SUCCESS) {
620 DHLOGE("NotifyEvent failed.");
621 return ERR_DH_AUDIO_HDF_FAIL;
622 }
623 return DH_SUCCESS;
624 }
625
GetAudioVolume(const std::string & condition,std::string & param)626 int32_t AudioAdapterInterfaceImpl::GetAudioVolume(const std::string& condition, std::string ¶m)
627 {
628 if (audioRender_ == nullptr) {
629 DHLOGE("Render has not been created.");
630 return ERR_DH_AUDIO_HDF_NULLPTR;
631 }
632 int32_t type = getEventTypeFromCondition(condition);
633 uint32_t vol;
634 switch (type) {
635 case VolumeEventType::EVENT_GET_VOLUME:
636 vol = audioRender_->GetVolumeInner();
637 break;
638 case VolumeEventType::EVENT_GET_MAX_VOLUME:
639 vol = audioRender_->GetMaxVolumeInner();
640 break;
641 case VolumeEventType::EVENT_GET_MIN_VOLUME:
642 vol = audioRender_->GetMinVolumeInner();
643 break;
644 case VolumeEventType::EVENT_IS_STREAM_MUTE:
645 vol = streamMuteStatus_;
646 break;
647 default:
648 vol = 0;
649 DHLOGE("Get volume failed.");
650 }
651 param = std::to_string(vol);
652 return DH_SUCCESS;
653 }
654
getEventTypeFromCondition(const std::string & condition)655 int32_t AudioAdapterInterfaceImpl::getEventTypeFromCondition(const std::string &condition)
656 {
657 std::string::size_type position = condition.find_first_of(";");
658 int32_t type = std::stoi(condition.substr(TYPE_CONDITION, position - TYPE_CONDITION));
659 return static_cast<VolumeEventType>(type);
660 }
661
HandleVolumeChangeEvent(const DAudioEvent & event)662 int32_t AudioAdapterInterfaceImpl::HandleVolumeChangeEvent(const DAudioEvent &event)
663 {
664 DHLOGI("Vol change (%s).", event.content.c_str());
665 if (audioRender_ == nullptr) {
666 DHLOGE("Render has not been created.");
667 return ERR_DH_AUDIO_HDF_NULLPTR;
668 }
669 int32_t vol = AUDIO_DEFAULT_MIN_VOLUME_LEVEL;
670 int32_t ret = GetAudioParamInt(event.content, VOLUME_LEVEL, vol);
671 if (ret != DH_SUCCESS) {
672 DHLOGE("Get volume value failed.");
673 return ERR_DH_AUDIO_HDF_FAIL;
674 }
675
676 if (event.content.rfind("FIRST_VOLUME_CHANAGE", 0) == 0) {
677 int32_t maxVol = AUDIO_DEFAULT_MAX_VOLUME_LEVEL;
678 ret = GetAudioParamInt(event.content, MAX_VOLUME_LEVEL, maxVol);
679 if (ret != DH_SUCCESS) {
680 DHLOGE("Get max volume value failed, use defult max volume.");
681 }
682 int32_t minVol = AUDIO_DEFAULT_MIN_VOLUME_LEVEL;
683 ret = GetAudioParamInt(event.content, MIN_VOLUME_LEVEL, minVol);
684 if (ret != DH_SUCCESS) {
685 DHLOGE("Get min volume value failed, use defult min volume.");
686 }
687 audioRender_->SetVolumeInner(vol);
688 audioRender_->SetVolumeRangeInner(maxVol, minVol);
689 return DH_SUCCESS;
690 }
691
692 audioRender_->SetVolumeInner(vol);
693 if (paramCallback_ == nullptr) {
694 DHLOGE("Audio param observer is null.");
695 return ERR_DH_AUDIO_HDF_NULLPTR;
696 }
697 int8_t reserved;
698 int8_t cookie;
699 ret = paramCallback_->ParamCallback(AUDIO_EXT_PARAM_KEY_VOLUME, event.content, std::to_string(vol),
700 reserved, cookie);
701 if (ret != DH_SUCCESS) {
702 DHLOGE("Notify vol failed.");
703 return ERR_DH_AUDIO_HDF_FAIL;
704 }
705 return DH_SUCCESS;
706 }
707
HandleFocusChangeEvent(const DAudioEvent & event)708 int32_t AudioAdapterInterfaceImpl::HandleFocusChangeEvent(const DAudioEvent &event)
709 {
710 DHLOGI("Focus change (%s).", event.content.c_str());
711 if (paramCallback_ == nullptr) {
712 DHLOGE("Audio param observer is null.");
713 return ERR_DH_AUDIO_HDF_NULLPTR;
714 }
715 int8_t reserved;
716 int8_t cookie;
717 int32_t ret = paramCallback_->ParamCallback(AUDIO_EXT_PARAM_KEY_FOCUS, event.content, "", reserved, cookie);
718 if (ret != DH_SUCCESS) {
719 DHLOGE("Notify Focus failed.");
720 return ERR_DH_AUDIO_HDF_FAIL;
721 }
722 return DH_SUCCESS;
723 }
724
HandleRenderStateChangeEvent(const DAudioEvent & event)725 int32_t AudioAdapterInterfaceImpl::HandleRenderStateChangeEvent(const DAudioEvent &event)
726 {
727 DHLOGI("Render state change (%s).", event.content.c_str());
728 if (paramCallback_ == nullptr) {
729 DHLOGE("Audio param observer is null.");
730 return ERR_DH_AUDIO_HDF_NULLPTR;
731 }
732 int8_t reserved;
733 int8_t cookie;
734 int32_t ret = paramCallback_->ParamCallback(AUDIO_EXT_PARAM_KEY_STATUS, event.content, "", reserved, cookie);
735 if (ret != DH_SUCCESS) {
736 DHLOGE("Notify render state failed.");
737 return ERR_DH_AUDIO_HDF_FAIL;
738 }
739 return DH_SUCCESS;
740 }
741
HandleSANotifyEvent(const DAudioEvent & event)742 int32_t AudioAdapterInterfaceImpl::HandleSANotifyEvent(const DAudioEvent &event)
743 {
744 DHLOGD("Notify event type %d, event content: %s.", event.type, event.content.c_str());
745 switch (event.type) {
746 case HDF_AUDIO_EVENT_OPEN_SPK_RESULT:
747 if (event.content == HDF_EVENT_RESULT_SUCCESS) {
748 isSpkOpened_ = true;
749 }
750 spkNotifyFlag_ = true;
751 spkWaitCond_.notify_all();
752 break;
753 case HDF_AUDIO_EVENT_CLOSE_SPK_RESULT:
754 if (event.content == HDF_EVENT_RESULT_SUCCESS) {
755 isSpkOpened_ = false;
756 }
757 spkNotifyFlag_ = true;
758 spkWaitCond_.notify_all();
759 break;
760 case HDF_AUDIO_EVENT_OPEN_MIC_RESULT:
761 if (event.content == HDF_EVENT_RESULT_SUCCESS) {
762 isMicOpened_ = true;
763 }
764 micNotifyFlag_ = true;
765 micWaitCond_.notify_all();
766 break;
767 case HDF_AUDIO_EVENT_CLOSE_MIC_RESULT:
768 if (event.content == HDF_EVENT_RESULT_SUCCESS) {
769 isMicOpened_ = false;
770 }
771 micNotifyFlag_ = true;
772 micWaitCond_.notify_all();
773 break;
774 default:
775 DHLOGE("Notify not support event type %d, event content: %s.", event.type, event.content.c_str());
776 return ERR_DH_AUDIO_HDF_FAIL;
777 }
778 return DH_SUCCESS;
779 }
780
WaitForSANotify(const AudioDeviceEvent & event)781 int32_t AudioAdapterInterfaceImpl::WaitForSANotify(const AudioDeviceEvent &event)
782 {
783 if (event == EVENT_OPEN_SPK || event == EVENT_CLOSE_SPK) {
784 spkNotifyFlag_ = false;
785 std::unique_lock<std::mutex> lck(spkWaitMutex_);
786 auto status = spkWaitCond_.wait_for(lck, std::chrono::seconds(WAIT_SECONDS), [this, event]() {
787 return spkNotifyFlag_ ||
788 (event == EVENT_OPEN_SPK && isSpkOpened_) || (event == EVENT_CLOSE_SPK && !isSpkOpened_);
789 });
790 if (!status) {
791 DHLOGE("Wait spk event: %d timeout(%d)s.", event, WAIT_SECONDS);
792 return ERR_DH_AUDIO_HDF_WAIT_TIMEOUT;
793 }
794 if (event == EVENT_OPEN_SPK && !isSpkOpened_) {
795 DHLOGE("Wait open render device failed.");
796 return ERR_DH_AUDIO_HDF_OPEN_DEVICE_FAIL;
797 } else if (event == EVENT_CLOSE_SPK && isSpkOpened_) {
798 DHLOGE("Wait close render device failed.");
799 return ERR_DH_AUDIO_HDF_CLOSE_DEVICE_FAIL;
800 }
801 return DH_SUCCESS;
802 }
803
804 if (event == EVENT_OPEN_MIC || event == EVENT_CLOSE_MIC) {
805 micNotifyFlag_ = false;
806 std::unique_lock<std::mutex> lck(micWaitMutex_);
807 auto status = micWaitCond_.wait_for(lck, std::chrono::seconds(WAIT_SECONDS), [this, event]() {
808 return micNotifyFlag_ ||
809 (event == EVENT_OPEN_MIC && isMicOpened_) || (event == EVENT_CLOSE_MIC && !isMicOpened_);
810 });
811 if (!status) {
812 DHLOGE("Wait mic event: %d timeout(%d)s.", event, WAIT_SECONDS);
813 return ERR_DH_AUDIO_HDF_WAIT_TIMEOUT;
814 }
815 if (event == EVENT_OPEN_MIC && !isMicOpened_) {
816 DHLOGE("Wait open capture device failed.");
817 return ERR_DH_AUDIO_HDF_OPEN_DEVICE_FAIL;
818 } else if (event == EVENT_CLOSE_MIC && isMicOpened_) {
819 DHLOGE("Wait close capture device failed.");
820 return ERR_DH_AUDIO_HDF_CLOSE_DEVICE_FAIL;
821 }
822 return DH_SUCCESS;
823 }
824 return DH_SUCCESS;
825 }
826
HandleDeviceClosed(const DAudioEvent & event)827 int32_t AudioAdapterInterfaceImpl::HandleDeviceClosed(const DAudioEvent &event)
828 {
829 DHLOGI("Handle device closed, event type: %d.", event.type);
830 if (paramCallback_ != nullptr) {
831 std::stringstream ss;
832 ss << "ERR_EVENT;DEVICE_TYPE=" <<
833 (event.type == HDF_AUDIO_EVENT_SPK_CLOSED ? AUDIO_DEVICE_TYPE_SPEAKER : AUDIO_DEVICE_TYPE_MIC) << ";";
834 int8_t reserved;
835 int8_t cookie;
836 int32_t ret = paramCallback_->ParamCallback(AUDIO_EXT_PARAM_KEY_STATUS, ss.str(),
837 std::to_string(EVENT_DEV_CLOSED), reserved, cookie);
838 if (ret != DH_SUCCESS) {
839 DHLOGE("Notify fwk failed.");
840 }
841 }
842
843 AudioDeviceDescriptor dec;
844 if (isSpkOpened_ && event.type == HDF_AUDIO_EVENT_SPK_CLOSED) {
845 DHLOGE("Render device status error, close render.");
846 dec.pins = static_cast<AudioPortPin>(spkPinInUse_);
847 return DestroyRender(dec);
848 } else if (isMicOpened_ && event.type == HDF_AUDIO_EVENT_MIC_CLOSED) {
849 DHLOGE("Capture device status error, close capture.");
850 dec.pins = static_cast<AudioPortPin>(micPinInUse_);
851 return DestroyCapture(dec);
852 }
853 DHLOGI("Handle device closed success.");
854 return DH_SUCCESS;
855 }
856
IsPortsNoReg()857 bool AudioAdapterInterfaceImpl::IsPortsNoReg()
858 {
859 std::lock_guard<std::mutex> devLck(devMapMtx_);
860 return mapAudioDevice_.empty();
861 }
862 } // V1_0
863 } // Audio
864 } // Distributedaudio
865 } // HDI
866 } // OHOS