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