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