• 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 <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 &param)
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 &param)
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