• 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_info_common.h"
17 #include "audio_common.h"
18 #include "audio_interface_lib_capture.h"
19 #include "audio_interface_lib_render.h"
20 #include "audio_internal.h"
21 #include "audio_uhdf_log.h"
22 #include "hdf_types.h"
23 #include "osal_mem.h"
24 #include "securec.h"
25 #include "stub_collector.h"
26 
27 #define HDF_LOG_TAG HDF_AUDIO_PRIMARY_IMPL
28 
29 #define CONFIG_CHANNEL_COUNT            2 // two channels
30 #define GAIN_MAX                        50.0
31 #define DEFAULT_RENDER_SAMPLING_RATE    48000
32 #define DEEP_BUFFER_RENDER_PERIOD_SIZE  4096
33 #define DEEP_BUFFER_RENDER_PERIOD_COUNT 8
34 #define TYPE_RENDER                     "Render"
35 #define TYPE_CAPTURE                    "Capture"
36 #define INT_32_MAX                      0x7fffffff
37 #define SHIFT_RIGHT_31_BITS             31
38 
AudioHwRenderInit(struct AudioHwRender * hwRender)39 static int32_t AudioHwRenderInit(struct AudioHwRender *hwRender)
40 {
41     if (hwRender == NULL) {
42         AUDIO_FUNC_LOGE("Parameter error!");
43         return HDF_ERR_INVALID_PARAM;
44     }
45     hwRender->common.Start = AudioRenderStart;
46     hwRender->common.Stop = AudioRenderStop;
47     hwRender->common.Pause = AudioRenderPause;
48     hwRender->common.Resume = AudioRenderResume;
49     hwRender->common.Flush = AudioRenderFlush;
50     hwRender->common.TurnStandbyMode = AudioRenderTurnStandbyMode;
51     hwRender->common.AudioDevDump = AudioRenderAudioDevDump;
52     hwRender->common.GetFrameSize = AudioRenderGetFrameSize;
53     hwRender->common.GetFrameCount = AudioRenderGetFrameCount;
54     hwRender->common.SetSampleAttributes = AudioRenderSetSampleAttributes;
55     hwRender->common.GetSampleAttributes = AudioRenderGetSampleAttributes;
56     hwRender->common.GetCurrentChannelId = AudioRenderGetCurrentChannelId;
57     hwRender->common.SetExtraParams = AudioRenderSetExtraParams;
58     hwRender->common.GetExtraParams = AudioRenderGetExtraParams;
59     hwRender->common.ReqMmapBuffer = AudioRenderReqMmapBuffer;
60     hwRender->common.GetMmapPosition = AudioRenderGetMmapPosition;
61     hwRender->common.CheckSceneCapability = AudioRenderCheckSceneCapability;
62     hwRender->common.SelectScene = AudioRenderSelectScene;
63     hwRender->common.SetMute = AudioRenderSetMute;
64     hwRender->common.GetMute = AudioRenderGetMute;
65     hwRender->common.SetVolume = AudioRenderSetVolume;
66     hwRender->common.GetVolume = AudioRenderGetVolume;
67     hwRender->common.GetGainThreshold = AudioRenderGetGainThreshold;
68     hwRender->common.GetGain = AudioRenderGetGain;
69     hwRender->common.SetGain = AudioRenderSetGain;
70     hwRender->common.GetLatency = AudioRenderGetLatency;
71     hwRender->common.RenderFrame = AudioRenderRenderFrame;
72     hwRender->common.GetRenderPosition = AudioRenderGetRenderPosition;
73     hwRender->common.SetRenderSpeed = AudioRenderSetRenderSpeed;
74     hwRender->common.GetRenderSpeed = AudioRenderGetRenderSpeed;
75     hwRender->common.SetChannelMode = AudioRenderSetChannelMode;
76     hwRender->common.GetChannelMode = AudioRenderGetChannelMode;
77     hwRender->common.RegCallback = AudioRenderRegCallback;
78     hwRender->common.DrainBuffer = AudioRenderDrainBuffer;
79     hwRender->renderParam.frameRenderMode.callbackProcess = CallbackProcessing;
80     return HDF_SUCCESS;
81 }
82 
CheckParaDesc(const struct AudioDeviceDescriptor * desc,const char * type)83 int32_t CheckParaDesc(const struct AudioDeviceDescriptor *desc, const char *type)
84 {
85     if (desc == NULL || type == NULL) {
86         AUDIO_FUNC_LOGE("Parameter error!");
87         return HDF_ERR_INVALID_PARAM;
88     }
89 
90     if ((desc->portId) >> SHIFT_RIGHT_31_BITS) {
91         AUDIO_FUNC_LOGE("portId error!");
92         return HDF_ERR_NOT_SUPPORT;
93     }
94 
95     enum AudioPortPin pins = desc->pins;
96     if (!strcmp(type, TYPE_CAPTURE)) {
97         if (pins == PIN_IN_MIC || pins == PIN_IN_HS_MIC || pins == PIN_IN_LINEIN) {
98             return HDF_SUCCESS;
99         }
100     } else if (!strcmp(type, TYPE_RENDER)) {
101         if (pins == PIN_OUT_SPEAKER || pins == PIN_OUT_HEADSET || pins == PIN_OUT_LINEOUT || pins == PIN_OUT_HDMI
102             || pins == (PIN_OUT_SPEAKER | PIN_OUT_HEADSET)) {
103             return HDF_SUCCESS;
104         }
105     }
106     AUDIO_FUNC_LOGE("Unknow pin!");
107 
108     return HDF_ERR_NOT_SUPPORT;
109 }
110 
CheckParaAttr(const struct AudioSampleAttributes * attrs)111 int32_t CheckParaAttr(const struct AudioSampleAttributes *attrs)
112 {
113     if (attrs == NULL) {
114         AUDIO_FUNC_LOGE("Parameter error!");
115         return HDF_ERR_INVALID_PARAM;
116     }
117 
118     int32_t ret = ((attrs->sampleRate) >> SHIFT_RIGHT_31_BITS) + ((attrs->channelCount) >> SHIFT_RIGHT_31_BITS) +
119         ((attrs->period) >> SHIFT_RIGHT_31_BITS) + ((attrs->frameSize) >> SHIFT_RIGHT_31_BITS) +
120         ((attrs->startThreshold) >> SHIFT_RIGHT_31_BITS) + ((attrs->stopThreshold) >> SHIFT_RIGHT_31_BITS) +
121         ((attrs->silenceThreshold) >> SHIFT_RIGHT_31_BITS);
122     if (ret > 0) {
123         AUDIO_FUNC_LOGE("Sample attributes error!");
124         return HDF_ERR_NOT_SUPPORT;
125     }
126 
127     enum AudioCategory audioCategory = attrs->type;
128     if (audioCategory < AUDIO_IN_MEDIA || audioCategory > AUDIO_MMAP_NOIRQ) {
129         AUDIO_FUNC_LOGE("Audio category error!");
130         return HDF_ERR_NOT_SUPPORT;
131     }
132 
133     enum AudioFormat audioFormat = attrs->format;
134     return CheckAttrFormat(audioFormat);
135 }
136 
AttrFormatToBit(const struct AudioSampleAttributes * attrs,int32_t * format)137 int32_t AttrFormatToBit(const struct AudioSampleAttributes *attrs, int32_t *format)
138 {
139     if (attrs == NULL || format == NULL) {
140         AUDIO_FUNC_LOGE("Parameter error!");
141         return HDF_ERR_INVALID_PARAM;
142     }
143 
144     enum AudioFormat audioFormat = attrs->format;
145     switch (audioFormat) {
146         case AUDIO_FORMAT_TYPE_PCM_8_BIT:
147             *format = BIT_NUM_8;
148             break;
149         case AUDIO_FORMAT_TYPE_PCM_16_BIT:
150             *format = BIT_NUM_16;
151             break;
152         case AUDIO_FORMAT_TYPE_PCM_24_BIT:
153             *format = BIT_NUM_24;
154             break;
155         case AUDIO_FORMAT_TYPE_PCM_32_BIT:
156             *format = BIT_NUM_32;
157             break;
158         default:
159             AUDIO_FUNC_LOGE("Audio format error!");
160             return HDF_ERR_NOT_SUPPORT;
161     }
162 
163     return HDF_SUCCESS;
164 }
165 
AudioFormatServiceName(char * cardServiceName,char * adapterName,uint32_t id)166 static int32_t AudioFormatServiceName(char *cardServiceName, char *adapterName, uint32_t id)
167 {
168     if (cardServiceName == NULL || adapterName == NULL) {
169         AUDIO_FUNC_LOGE("Parameter error!");
170         return HDF_ERR_INVALID_PARAM;
171     }
172 
173     if (snprintf_s(cardServiceName, NAME_LEN, NAME_LEN - 1, "%s%u", adapterName, id) < 0) {
174         AUDIO_FUNC_LOGE("snprintf_s failed!");
175         return HDF_FAILURE;
176     }
177     return HDF_SUCCESS;
178 }
179 
AudioCheckDescPortId(const struct AudioAdapterDescriptor * adapterDescriptor,uint32_t portId,uint32_t * id)180 static int32_t AudioCheckDescPortId(
181     const struct AudioAdapterDescriptor *adapterDescriptor, uint32_t portId, uint32_t *id)
182 {
183     if (adapterDescriptor == NULL || adapterDescriptor->ports == NULL || id == NULL) {
184         AUDIO_FUNC_LOGE("Parameter error!");
185         return HDF_ERR_INVALID_PARAM;
186     }
187 
188     int adapterNum = AudioAdapterGetAdapterNum();
189     if (adapterNum <= 0) {
190         AUDIO_FUNC_LOGE("Get adapterNum fail!");
191         return HDF_FAILURE;
192     }
193     struct AudioAdapterDescriptor *descs = AudioAdapterGetConfigDescs();
194     if (descs == NULL) {
195         AUDIO_FUNC_LOGE("Get adapterDescs is NULL!");
196         return HDF_FAILURE;
197     }
198     bool checkFlag = false;
199     for (int index = 0; index < adapterNum; index++) {
200         if (strcmp(descs[index].adapterName, adapterDescriptor->adapterName) == 0) {
201             if (descs[index].ports[0].portId == portId) {
202                 checkFlag = true;
203                 break;
204             } else {
205                 AUDIO_FUNC_LOGE("The Audio Port ID is invalid, please check!");
206                 return HDF_FAILURE;
207             }
208         }
209     }
210     if (!checkFlag) {
211         AUDIO_FUNC_LOGE("The Audio AdapterName is illegal, please check!");
212         return HDF_FAILURE;
213     }
214     for (int index = 0; index < adapterNum; index++) {
215         if (strncmp(descs[index].adapterName, PRIMARY, strlen(PRIMARY)) == 0) {
216             if (descs[index].ports[0].portId <= AUDIO_PRIMARY_ID_MAX &&
217                 descs[index].ports[0].portId >= AUDIO_PRIMARY_ID_MIN) {
218                 *id = descs[index].ports[0].portId;
219                 break;
220             }
221         }
222     }
223 
224     return HDF_SUCCESS;
225 }
226 
AudioMakeCardServiceName(char * cardServiceName,const struct AudioAdapterDescriptor * adapterDescriptor,uint32_t portId)227 static int32_t AudioMakeCardServiceName(
228     char *cardServiceName, const struct AudioAdapterDescriptor *adapterDescriptor, uint32_t portId)
229 {
230     uint32_t priPortId = 0;
231 
232     if (cardServiceName == NULL || adapterDescriptor == NULL || adapterDescriptor->ports == NULL) {
233         AUDIO_FUNC_LOGE("Parameter error!");
234         return HDF_ERR_INVALID_PARAM;
235     }
236 
237     int32_t ret = AudioCheckDescPortId(adapterDescriptor, portId, &priPortId);
238     if (ret != HDF_SUCCESS) {
239         AUDIO_FUNC_LOGE("The Audio Port ID is illegal, please check!");
240         return HDF_FAILURE;
241     }
242     if (strncmp(adapterDescriptor->adapterName, PRIMARY, strlen(PRIMARY)) == 0) {
243         ret = AudioFormatServiceName(cardServiceName, HDF_AUDIO_CODEC_PRIMARY_DEV, portId);
244     } else if (strncmp(adapterDescriptor->adapterName, HDMI, strlen(HDMI)) == 0) {
245         ret = AudioFormatServiceName(cardServiceName, HDF_AUDIO_CODEC_HDMI_DEV, priPortId);
246     } else if (strncmp(adapterDescriptor->adapterName, USB, strlen(USB)) == 0) {
247         ret = AudioFormatServiceName(cardServiceName, HDF_AUDIO_CODEC_USB_DEV, priPortId);
248     } else if (strncmp(adapterDescriptor->adapterName, A2DP, strlen(A2DP)) == 0) {
249         ret = AudioFormatServiceName(cardServiceName, HDF_AUDIO_CODEC_A2DP_DEV, portId);
250     } else {
251         AUDIO_FUNC_LOGE("The selected sound card is not in the range of sound card list, please check!");
252         return HDF_FAILURE;
253     }
254 
255     return ret;
256 }
257 
InitHwRenderParam(struct AudioHwRender * hwRender,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs)258 int32_t InitHwRenderParam(
259     struct AudioHwRender *hwRender, const struct AudioDeviceDescriptor *desc, const struct AudioSampleAttributes *attrs)
260 {
261     if (hwRender == NULL || desc == NULL || attrs == NULL) {
262         AUDIO_FUNC_LOGE("Parameter error!");
263         return HDF_ERR_INVALID_PARAM;
264     }
265 
266     int32_t ret = CheckParaDesc(desc, TYPE_RENDER);
267     if (ret != HDF_SUCCESS) {
268         AUDIO_FUNC_LOGE("CheckParaDesc Fail");
269         return ret;
270     }
271     ret = CheckParaAttr(attrs);
272     if (ret != HDF_SUCCESS) {
273         AUDIO_FUNC_LOGE("CheckParaAttr Fail");
274         return ret;
275     }
276     int32_t formatValue = -1;
277     ret = AttrFormatToBit(attrs, &formatValue);
278     if (ret != HDF_SUCCESS) {
279         AUDIO_FUNC_LOGE("AttrFormatToBit Fail");
280         return ret;
281     }
282     if (attrs->channelCount == 0) {
283         AUDIO_FUNC_LOGE("channelCount is zero!");
284         return HDF_FAILURE;
285     }
286     hwRender->renderParam.renderMode.hwInfo.deviceDescript = *desc;
287     hwRender->renderParam.renderMode.hwInfo.callBackEnable = false;
288     hwRender->renderParam.frameRenderMode.attrs = *attrs;
289     hwRender->renderParam.renderMode.ctlParam.audioGain.gainMax = GAIN_MAX; // init gainMax
290     hwRender->renderParam.renderMode.ctlParam.audioGain.gainMin = 0;
291     hwRender->renderParam.frameRenderMode.frames = 0;
292     hwRender->renderParam.frameRenderMode.time.tvNSec = 0;
293     hwRender->renderParam.frameRenderMode.time.tvSec = 0;
294     hwRender->renderParam.frameRenderMode.byteRate = DEFAULT_RENDER_SAMPLING_RATE;
295     hwRender->renderParam.frameRenderMode.periodSize = DEEP_BUFFER_RENDER_PERIOD_SIZE;
296     hwRender->renderParam.frameRenderMode.periodCount = DEEP_BUFFER_RENDER_PERIOD_COUNT;
297     hwRender->renderParam.frameRenderMode.renderhandle = (AudioHandle)hwRender;
298     hwRender->renderParam.renderMode.ctlParam.turnStandbyStatus = AUDIO_TURN_STANDBY_LATER;
299     return HDF_SUCCESS;
300 }
301 
InitForGetPortCapability(struct AudioPort portIndex,struct AudioPortCapability * capabilityIndex)302 int32_t InitForGetPortCapability(struct AudioPort portIndex, struct AudioPortCapability *capabilityIndex)
303 {
304     if (capabilityIndex == NULL) {
305         AUDIO_FUNC_LOGE("Parameter error!");
306         return HDF_ERR_INVALID_PARAM;
307     }
308 
309     /* get capabilityIndex from driver or default */
310     if (portIndex.dir != PORT_OUT) {
311         capabilityIndex->hardwareMode = true;
312         capabilityIndex->channelMasks = AUDIO_CHANNEL_STEREO;
313         capabilityIndex->channelCount = CONFIG_CHANNEL_COUNT;
314         return HDF_SUCCESS;
315     }
316 
317     if (InitPortForCapabilitySub(portIndex, capabilityIndex) != HDF_SUCCESS) {
318         AUDIO_FUNC_LOGE("PortInitForCapability fail");
319         return HDF_FAILURE;
320     }
321     return HDF_SUCCESS;
322 }
323 
AudioAdapterReleaseCapSubPorts(const struct AudioPortAndCapability * portCapabilitys,int32_t num)324 void AudioAdapterReleaseCapSubPorts(const struct AudioPortAndCapability *portCapabilitys, int32_t num)
325 {
326     int32_t i = 0;
327 
328     if (portCapabilitys == NULL) {
329         AUDIO_FUNC_LOGE("Parameter error!");
330         return;
331     }
332 
333     while (i < num) {
334         if (&portCapabilitys[i] == NULL) {
335             break;
336         }
337         AudioMemFree((void **)(&portCapabilitys[i].capability.subPorts));
338         i++;
339     }
340 }
341 
AudioAdapterInitAllPorts(struct IAudioAdapter * adapter)342 int32_t AudioAdapterInitAllPorts(struct IAudioAdapter *adapter)
343 {
344     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
345     if (hwAdapter == NULL) {
346         AUDIO_FUNC_LOGE("hwAdapter Is NULL");
347         return AUDIO_ERR_INVALID_PARAM;
348     }
349     if (hwAdapter->portCapabilitys != NULL) {
350         AUDIO_FUNC_LOGI("portCapabilitys already Init!");
351         return AUDIO_SUCCESS;
352     }
353     uint32_t portsLen = hwAdapter->adapterDescriptor.portsLen;
354     struct AudioPort *ports = hwAdapter->adapterDescriptor.ports;
355     if (ports == NULL) {
356         AUDIO_FUNC_LOGE("ports is NULL!");
357         return AUDIO_ERR_INTERNAL;
358     }
359     if (portsLen == 0) {
360         AUDIO_FUNC_LOGE("portsLen is 0!");
361         return AUDIO_ERR_INTERNAL;
362     }
363     struct AudioPortAndCapability *portCapability =
364         (struct AudioPortAndCapability *)OsalMemCalloc(portsLen * sizeof(struct AudioPortAndCapability));
365     if (portCapability == NULL) {
366         AUDIO_FUNC_LOGE("portCapability is NULL!");
367         return AUDIO_ERR_INTERNAL;
368     }
369     for (uint32_t i = 0; i < portsLen; i++) {
370         portCapability[i].port = ports[i];
371         if (InitForGetPortCapability(ports[i], &portCapability[i].capability)) {
372             AUDIO_FUNC_LOGE("ports Init Fail!");
373             AudioAdapterReleaseCapSubPorts(portCapability, portsLen);
374             AudioMemFree((void **)&portCapability);
375             return AUDIO_ERR_INTERNAL;
376         }
377     }
378     hwAdapter->portCapabilitys = portCapability;
379     hwAdapter->portCapabilitys->mode = PORT_PASSTHROUGH_LPCM;
380     return AUDIO_SUCCESS;
381 }
382 
AudioReleaseRenderHandle(struct AudioHwRender * hwRender)383 void AudioReleaseRenderHandle(struct AudioHwRender *hwRender)
384 {
385     if (hwRender == NULL) {
386         AUDIO_FUNC_LOGE("Parameter error!");
387         return;
388     }
389     CloseServiceRenderPassthrough *pCloseRenderService = AudioPassthroughGetCloseServiceRender();
390     if (pCloseRenderService == NULL || (*pCloseRenderService) == NULL) {
391         AUDIO_FUNC_LOGE("pCloseRenderService func not exist");
392         return;
393     }
394     if (hwRender->devDataHandle != NULL) {
395         (*pCloseRenderService)(hwRender->devDataHandle);
396         hwRender->devDataHandle = NULL;
397     }
398     if (hwRender->devCtlHandle != NULL) {
399         (*pCloseRenderService)(hwRender->devCtlHandle);
400         hwRender->devCtlHandle = NULL;
401     }
402 }
403 
AudioAdapterCreateRenderPre(struct AudioHwRender * hwRender,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,const struct AudioHwAdapter * hwAdapter)404 int32_t AudioAdapterCreateRenderPre(struct AudioHwRender *hwRender, const struct AudioDeviceDescriptor *desc,
405     const struct AudioSampleAttributes *attrs, const struct AudioHwAdapter *hwAdapter)
406 {
407     if (hwAdapter == NULL || hwRender == NULL || desc == NULL || attrs == NULL) {
408         AUDIO_FUNC_LOGE("Parameter error!");
409         return HDF_FAILURE;
410     }
411 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
412     PathSelAnalysisJson *pPathSelAnalysisJson = AudioPassthroughGetPathSelAnalysisJson();
413     if (pPathSelAnalysisJson == NULL || *pPathSelAnalysisJson == NULL) {
414         AUDIO_FUNC_LOGE("PathSelAnalysisJson not exist");
415         return HDF_FAILURE;
416     }
417 #endif
418     if (AudioHwRenderInit(hwRender) < 0) {
419         AUDIO_FUNC_LOGE("AudioHwRenderInit error!");
420         return HDF_FAILURE;
421     }
422     /* Fill hwRender para */
423     if (InitHwRenderParam(hwRender, desc, attrs) < 0) {
424         AUDIO_FUNC_LOGE("InitHwRenderParam error!");
425         return HDF_FAILURE;
426     }
427 
428     if (hwAdapter->adapterDescriptor.adapterName == NULL) {
429         AUDIO_FUNC_LOGE("pointer is null!");
430         return HDF_FAILURE;
431     }
432     uint32_t adapterNameLen = strlen(hwAdapter->adapterDescriptor.adapterName);
433     if (adapterNameLen == 0) {
434         AUDIO_FUNC_LOGE("adapterNameLen is null!");
435         return HDF_FAILURE;
436     }
437     /* Get Adapter name */
438     int32_t ret = strncpy_s(hwRender->renderParam.renderMode.hwInfo.adapterName, NAME_LEN - 1,
439         hwAdapter->adapterDescriptor.adapterName, adapterNameLen);
440     if (ret != EOK) {
441         AUDIO_FUNC_LOGE("copy fail");
442         return HDF_FAILURE;
443     }
444     uint32_t portId = hwRender->renderParam.renderMode.hwInfo.deviceDescript.portId;
445     ret = AudioMakeCardServiceName(
446         hwRender->renderParam.renderMode.hwInfo.cardServiceName, &hwAdapter->adapterDescriptor, portId);
447     if (ret != HDF_SUCCESS) {
448         AUDIO_FUNC_LOGE("AudioMakeCardServiceName fail");
449         return HDF_FAILURE;
450     }
451 
452     /* Select Path */
453 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
454     if ((*pPathSelAnalysisJson)((void *)&hwRender->renderParam, RENDER_PATH_SELECT) < 0) {
455         AUDIO_FUNC_LOGE("Path Select Fail!");
456         return HDF_FAILURE;
457     }
458 #endif
459     return HDF_SUCCESS;
460 }
461 
BindServiceRenderOpen(struct AudioHwRender * hwRender,InterfaceLibModeRenderPassthrough * pInterfaceLibModeRender)462 static int32_t BindServiceRenderOpen(struct AudioHwRender *hwRender,
463     InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender)
464 {
465     if (hwRender == NULL || hwRender->devDataHandle == NULL || pInterfaceLibModeRender == NULL ||
466         *pInterfaceLibModeRender == NULL) {
467         AUDIO_FUNC_LOGE("Parameter error!");
468         return HDF_FAILURE;
469     }
470 
471     int32_t ret =
472         (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTRL_RENDER_OPEN);
473     if (ret < 0) {
474         AUDIO_FUNC_LOGE("IAudioRender render open FAIL");
475         return HDF_FAILURE;
476     }
477     return HDF_SUCCESS;
478 }
479 
AudioCtrlRenderClose(struct AudioHwRender * hwRender,InterfaceLibModeRenderPassthrough * pInterfaceLibModeRender)480 int32_t AudioCtrlRenderClose(struct AudioHwRender *hwRender, InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender)
481 {
482     if (hwRender == NULL || hwRender->devDataHandle == NULL || pInterfaceLibModeRender == NULL ||
483         *pInterfaceLibModeRender == NULL) {
484         AUDIO_FUNC_LOGE("Parameter error!");
485         return HDF_FAILURE;
486     }
487 
488     int32_t ret =
489         (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTRL_RENDER_CLOSE);
490     if (ret < 0) {
491         AUDIO_FUNC_LOGE("Audio render close fail, ret is %{public}d", ret);
492         return HDF_FAILURE;
493     }
494     return HDF_SUCCESS;
495 }
496 
AudioAdapterBindServiceRender(struct AudioHwRender * hwRender)497 int32_t AudioAdapterBindServiceRender(struct AudioHwRender *hwRender)
498 {
499     int32_t ret;
500     if (hwRender == NULL || hwRender->devDataHandle == NULL || hwRender->devCtlHandle == NULL) {
501         AUDIO_FUNC_LOGE("Parameter error!");
502         return HDF_FAILURE;
503     }
504 
505     InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
506     if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
507         AUDIO_FUNC_LOGE("InterfaceLibModeRender not exist");
508         return HDF_FAILURE;
509     }
510     if (BindServiceRenderOpen(hwRender, pInterfaceLibModeRender) != HDF_SUCCESS) {
511         return HDF_FAILURE;
512     }
513 
514     /* Init RenderPathSelect send first */
515     /* Internel Indicates the path selection for the sound card */
516 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
517     uint32_t portId = hwRender->renderParam.renderMode.hwInfo.deviceDescript.portId;
518     if (portId < AUDIO_USB_ID_MIN) {
519         ret = (*pInterfaceLibModeRender)(
520             hwRender->devCtlHandle, &hwRender->renderParam, AUDIODRV_CTL_IOCTL_SCENESELECT_WRITE);
521         if (ret < 0) {
522             AUDIO_FUNC_LOGE("SetParams FAIL!");
523             (void)AudioCtrlRenderClose(hwRender, pInterfaceLibModeRender);
524             return HDF_FAILURE;
525         }
526     }
527 #endif
528     /* set Attr Para */
529     ret = (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTL_HW_PARAMS);
530     if (ret < 0) {
531         AUDIO_FUNC_LOGE("IAudioRender SetParams FAIL");
532         (void)AudioCtrlRenderClose(hwRender, pInterfaceLibModeRender);
533         return HDF_FAILURE;
534     }
535 
536     /* get volThreshold */
537     ret = (*pInterfaceLibModeRender)(
538         hwRender->devCtlHandle, &hwRender->renderParam, AUDIODRV_CTL_IOCTL_VOL_THRESHOLD_READ);
539     if (ret < 0) {
540         AUDIO_FUNC_LOGE("SetParams FAIL!");
541         (void)AudioCtrlRenderClose(hwRender, pInterfaceLibModeRender);
542         return HDF_FAILURE;
543     }
544 
545     ret = (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTL_PREPARE);
546     if (ret < 0) {
547         AUDIO_FUNC_LOGE("IAudioRender perpare FAIL");
548         (void)AudioCtrlRenderClose(hwRender, pInterfaceLibModeRender);
549         return HDF_FAILURE;
550     }
551     return HDF_SUCCESS;
552 }
553 
AudioRenderBindService(struct AudioHwRender * hwRender,BindServiceRenderPassthrough * pBindServiceRender)554 static int32_t AudioRenderBindService(struct AudioHwRender *hwRender, BindServiceRenderPassthrough *pBindServiceRender)
555 {
556     if (hwRender == NULL || pBindServiceRender == NULL || *pBindServiceRender == NULL) {
557         AUDIO_FUNC_LOGE("Parameter error!");
558         return AUDIO_ERR_INVALID_PARAM;
559     }
560 
561     /* bindRenderService */
562     hwRender->devDataHandle = (*pBindServiceRender)(RENDER_CMD);
563     if (hwRender->devDataHandle == NULL) {
564         AUDIO_FUNC_LOGE("Render bind service failed");
565         return AUDIO_ERR_INTERNAL;
566     }
567 
568     hwRender->devCtlHandle = (*pBindServiceRender)(CTRL_CMD);
569     if (hwRender->devCtlHandle == NULL) {
570         AUDIO_FUNC_LOGE("Render bind service failed");
571         return AUDIO_ERR_INTERNAL;
572     }
573 
574     int32_t ret = AudioAdapterBindServiceRender(hwRender);
575     if (ret != HDF_SUCCESS) {
576         return AUDIO_ERR_INTERNAL;
577     }
578     return AUDIO_SUCCESS;
579 }
580 
GetAvailableRenderID(struct AudioHwAdapter * hwAdapter)581 static uint32_t GetAvailableRenderID(struct AudioHwAdapter *hwAdapter)
582 {
583     uint32_t renderId = MAX_AUDIO_STREAM_NUM;
584     uint32_t index = 0;
585     if (hwAdapter == NULL) {
586         AUDIO_FUNC_LOGE("Parameter error!");
587         return renderId;
588     }
589 
590     if (hwAdapter->infos.renderCnt < MAX_AUDIO_STREAM_NUM) {
591         renderId = hwAdapter->infos.renderCnt;
592         hwAdapter->infos.renderCnt++;
593     } else {
594         for (index = 0; index < MAX_AUDIO_STREAM_NUM; index++) {
595             if (hwAdapter->infos.renderServicePtr[index] == NULL) {
596                 renderId = index;
597                 break;
598             }
599         }
600     }
601 
602     return renderId;
603 }
604 
AudioAdapterCreateRender(struct IAudioAdapter * adapter,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,struct IAudioRender ** render,uint32_t * renderId)605 int32_t AudioAdapterCreateRender(struct IAudioAdapter *adapter, const struct AudioDeviceDescriptor *desc,
606     const struct AudioSampleAttributes *attrs, struct IAudioRender **render, uint32_t *renderId)
607 {
608     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
609     if (hwAdapter == NULL || desc == NULL || attrs == NULL || render == NULL || renderId == NULL) {
610         AUDIO_FUNC_LOGE("Parameter error!");
611         return AUDIO_ERR_INVALID_PARAM;
612     }
613 
614     BindServiceRenderPassthrough *pBindServiceRender = AudioPassthroughGetBindServiceRender();
615     if (pBindServiceRender == NULL || *pBindServiceRender == NULL) {
616         AUDIO_FUNC_LOGE("lib render func not exist");
617         return AUDIO_ERR_INTERNAL;
618     }
619 
620     struct AudioHwRender *hwRender = (struct AudioHwRender *)OsalMemCalloc(sizeof(*hwRender));
621     if (hwRender == NULL) {
622         AUDIO_FUNC_LOGE("hwRender is NULL!");
623         return AUDIO_ERR_MALLOC_FAIL;
624     }
625 
626     int32_t ret = AudioAdapterCreateRenderPre(hwRender, desc, attrs, hwAdapter);
627     if (ret != HDF_SUCCESS) {
628         AudioMemFree((void **)&hwRender);
629         return AUDIO_ERR_INTERNAL;
630     }
631 
632     ret = AudioRenderBindService(hwRender, pBindServiceRender);
633     if (ret != AUDIO_SUCCESS) {
634         AudioReleaseRenderHandle(hwRender);
635         AudioMemFree((void **)&hwRender);
636         return ret;
637     }
638 
639     *renderId = GetAvailableRenderID(hwAdapter);
640     if (*renderId == MAX_AUDIO_STREAM_NUM) {
641         AUDIO_FUNC_LOGE("there is no available renderId");
642         AudioReleaseRenderHandle(hwRender);
643         AudioMemFree((void **)&hwRender);
644         return HDF_FAILURE;
645     }
646     hwAdapter->infos.renderServicePtr[*renderId] = hwRender;
647 
648     *render = &hwRender->common;
649     return AUDIO_SUCCESS;
650 }
651 
AudioAdapterDestroyRender(struct IAudioAdapter * adapter,uint32_t renderId)652 int32_t AudioAdapterDestroyRender(struct IAudioAdapter *adapter, uint32_t renderId)
653 {
654     int32_t ret = 0;
655     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
656     if (hwAdapter == NULL || renderId >= MAX_AUDIO_STREAM_NUM) {
657         AUDIO_FUNC_LOGE("Invalid input param!");
658         return AUDIO_ERR_INVALID_PARAM;
659     }
660 
661     struct IAudioRender *render = (struct IAudioRender *)hwAdapter->infos.renderServicePtr[renderId];
662     StubCollectorRemoveObject(IAUDIORENDER_INTERFACE_DESC, render);
663 
664     struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
665     if (hwRender == NULL) {
666         AUDIO_FUNC_LOGE("hwRender is NULL!");
667         return AUDIO_ERR_INTERNAL;
668     }
669     if (hwRender->renderParam.frameRenderMode.buffer != NULL) {
670         ret = render->Stop((AudioHandle)render);
671         if (ret < 0) {
672             AUDIO_FUNC_LOGE("render Stop failed");
673         }
674     }
675 
676     InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
677     if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
678         AUDIO_FUNC_LOGE("InterfaceLibModeRender not exist");
679         return HDF_FAILURE;
680     }
681     ret =
682         (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTRL_RENDER_CLOSE);
683     if (ret < 0) {
684         AUDIO_FUNC_LOGE("Audio RENDER_CLOSE FAIL");
685     }
686     AudioReleaseRenderHandle(hwRender);
687     AudioMemFree((void **)&hwRender->renderParam.frameRenderMode.buffer);
688     for (int i = 0; i < ERROR_LOG_MAX_NUM; i++) {
689         AudioMemFree((void **)&hwRender->errorLog.errorDump[i].reason);
690         AudioMemFree((void **)&hwRender->errorLog.errorDump[i].currentTime);
691     }
692     AudioMemFree((void **)&render);
693     hwAdapter->infos.renderServicePtr[renderId] = NULL;
694     return AUDIO_SUCCESS;
695 }
696 
AudioHwCaptureInit(struct AudioHwCapture * hwCapture)697 static int32_t AudioHwCaptureInit(struct AudioHwCapture *hwCapture)
698 {
699     if (hwCapture == NULL) {
700         AUDIO_FUNC_LOGE("Parameter error!");
701         return HDF_FAILURE;
702     }
703     hwCapture->common.Start = AudioCaptureStart;
704     hwCapture->common.Stop = AudioCaptureStop;
705     hwCapture->common.Pause = AudioCapturePause;
706     hwCapture->common.Resume = AudioCaptureResume;
707     hwCapture->common.Flush = AudioCaptureFlush;
708     hwCapture->common.TurnStandbyMode = AudioCaptureTurnStandbyMode;
709     hwCapture->common.AudioDevDump = AudioCaptureAudioDevDump;
710     hwCapture->common.GetFrameSize = AudioCaptureGetFrameSize;
711     hwCapture->common.GetFrameCount = AudioCaptureGetFrameCount;
712     hwCapture->common.SetSampleAttributes = AudioCaptureSetSampleAttributes;
713     hwCapture->common.GetSampleAttributes = AudioCaptureGetSampleAttributes;
714     hwCapture->common.GetCurrentChannelId = AudioCaptureGetCurrentChannelId;
715     hwCapture->common.SetExtraParams = AudioCaptureSetExtraParams;
716     hwCapture->common.GetExtraParams = AudioCaptureGetExtraParams;
717     hwCapture->common.ReqMmapBuffer = AudioCaptureReqMmapBuffer;
718     hwCapture->common.GetMmapPosition = AudioCaptureGetMmapPosition;
719     hwCapture->common.CheckSceneCapability = AudioCaptureCheckSceneCapability;
720     hwCapture->common.SelectScene = AudioCaptureSelectScene;
721     hwCapture->common.SetMute = AudioCaptureSetMute;
722     hwCapture->common.GetMute = AudioCaptureGetMute;
723     hwCapture->common.SetVolume = AudioCaptureSetVolume;
724     hwCapture->common.GetVolume = AudioCaptureGetVolume;
725     hwCapture->common.GetGainThreshold = AudioCaptureGetGainThreshold;
726     hwCapture->common.GetGain = AudioCaptureGetGain;
727     hwCapture->common.SetGain = AudioCaptureSetGain;
728     hwCapture->common.CaptureFrame = AudioCaptureCaptureFrame;
729     hwCapture->common.GetCapturePosition = AudioCaptureGetCapturePosition;
730     return HDF_SUCCESS;
731 }
732 
InitHwCaptureParam(struct AudioHwCapture * hwCapture,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs)733 int32_t InitHwCaptureParam(struct AudioHwCapture *hwCapture, const struct AudioDeviceDescriptor *desc,
734     const struct AudioSampleAttributes *attrs)
735 {
736     if (hwCapture == NULL || desc == NULL || attrs == NULL) {
737         AUDIO_FUNC_LOGE("Parameter error!");
738         return HDF_FAILURE;
739     }
740     int32_t ret = CheckParaDesc(desc, TYPE_CAPTURE);
741     if (ret != HDF_SUCCESS) {
742         return ret;
743     }
744     ret = CheckParaAttr(attrs);
745     if (ret != HDF_SUCCESS) {
746         return ret;
747     }
748     int32_t formatValue = -1;
749     ret = AttrFormatToBit(attrs, &formatValue);
750     if (ret != HDF_SUCCESS) {
751         return ret;
752     }
753     if (attrs->channelCount == 0) {
754         AUDIO_FUNC_LOGE("channelCount is zero!");
755         return HDF_FAILURE;
756     }
757     hwCapture->captureParam.captureMode.hwInfo.deviceDescript = *desc;
758     hwCapture->captureParam.frameCaptureMode.attrs = *attrs;
759     hwCapture->captureParam.captureMode.ctlParam.audioGain.gainMax = GAIN_MAX; // init gainMax
760     hwCapture->captureParam.captureMode.ctlParam.audioGain.gainMin = 0;
761     hwCapture->captureParam.frameCaptureMode.frames = 0;
762     hwCapture->captureParam.frameCaptureMode.time.tvNSec = 0;
763     hwCapture->captureParam.frameCaptureMode.time.tvSec = 0;
764     hwCapture->captureParam.frameCaptureMode.byteRate = DEFAULT_RENDER_SAMPLING_RATE;
765     hwCapture->captureParam.frameCaptureMode.periodSize = DEEP_BUFFER_RENDER_PERIOD_SIZE;
766     hwCapture->captureParam.frameCaptureMode.periodCount = DEEP_BUFFER_RENDER_PERIOD_COUNT;
767     hwCapture->captureParam.frameCaptureMode.attrs.period = attrs->period;
768     hwCapture->captureParam.frameCaptureMode.attrs.frameSize = attrs->frameSize;
769     hwCapture->captureParam.frameCaptureMode.attrs.startThreshold = attrs->startThreshold;
770     hwCapture->captureParam.frameCaptureMode.attrs.stopThreshold = attrs->stopThreshold;
771     hwCapture->captureParam.frameCaptureMode.attrs.silenceThreshold = attrs->silenceThreshold;
772     hwCapture->captureParam.frameCaptureMode.attrs.isBigEndian = attrs->isBigEndian;
773     hwCapture->captureParam.frameCaptureMode.attrs.isSignedData = attrs->isSignedData;
774     return HDF_SUCCESS;
775 }
776 
AudioReleaseCaptureHandle(struct AudioHwCapture * hwCapture)777 void AudioReleaseCaptureHandle(struct AudioHwCapture *hwCapture)
778 {
779     if (hwCapture == NULL) {
780         AUDIO_FUNC_LOGE("Parameter error!");
781         return;
782     }
783 
784     CloseServiceCapturePassthrough *pCloseCaptureService = AudioPassthroughGetCloseServiceCapture();
785     if (pCloseCaptureService == NULL || (*pCloseCaptureService) == NULL) {
786         AUDIO_FUNC_LOGE("pCloseCaptureService func not exist");
787         return;
788     }
789     if (hwCapture->devDataHandle != NULL) {
790         (*pCloseCaptureService)(hwCapture->devDataHandle);
791         hwCapture->devDataHandle = NULL;
792     }
793     if (hwCapture->devCtlHandle != NULL) {
794         (*pCloseCaptureService)(hwCapture->devCtlHandle);
795         hwCapture->devCtlHandle = NULL;
796     }
797 }
798 
AudioAdapterCreateCapturePre(struct AudioHwCapture * hwCapture,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,struct AudioHwAdapter * hwAdapter)799 int32_t AudioAdapterCreateCapturePre(struct AudioHwCapture *hwCapture, const struct AudioDeviceDescriptor *desc,
800     const struct AudioSampleAttributes *attrs, struct AudioHwAdapter *hwAdapter)
801 {
802     if (hwCapture == NULL || desc == NULL || attrs == NULL || hwAdapter == NULL) {
803         AUDIO_FUNC_LOGE("Parameter error!");
804         return HDF_FAILURE;
805     }
806 
807 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
808     PathSelAnalysisJson *pPathSelAnalysisJson = AudioPassthroughGetPathSelAnalysisJson();
809     if (pPathSelAnalysisJson == NULL || *pPathSelAnalysisJson == NULL) {
810         AUDIO_FUNC_LOGE("PathSelAnalysisJson not exist");
811         return HDF_FAILURE;
812     }
813 #endif
814     if (AudioHwCaptureInit(hwCapture) < 0) {
815         return HDF_FAILURE;
816     }
817     if (InitHwCaptureParam(hwCapture, desc, attrs) < 0) {
818         AUDIO_FUNC_LOGE("InitHwCaptureParam error!");
819         return HDF_FAILURE;
820     }
821 
822     if (hwAdapter->adapterDescriptor.adapterName == NULL) {
823         AUDIO_FUNC_LOGE("adapterName is NULL!");
824         return HDF_FAILURE;
825     }
826     uint32_t adapterNameLen = strlen(hwAdapter->adapterDescriptor.adapterName);
827     if (adapterNameLen == 0) {
828         AUDIO_FUNC_LOGE("adapterNameLen is zero!");
829         return HDF_FAILURE;
830     }
831     int32_t ret = strncpy_s(hwCapture->captureParam.captureMode.hwInfo.adapterName, NAME_LEN - 1,
832         hwAdapter->adapterDescriptor.adapterName, adapterNameLen);
833     if (ret != EOK) {
834         AUDIO_FUNC_LOGE("Copy adapterName is failed!");
835         return HDF_FAILURE;
836     }
837     uint32_t portId = hwCapture->captureParam.captureMode.hwInfo.deviceDescript.portId;
838     ret = AudioMakeCardServiceName(
839         hwCapture->captureParam.captureMode.hwInfo.cardServiceName, &hwAdapter->adapterDescriptor, portId);
840     if (ret != HDF_SUCCESS) {
841         AUDIO_FUNC_LOGE("AudioMakeCardServiceName fail");
842         return HDF_FAILURE;
843     }
844 
845 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
846     if ((*pPathSelAnalysisJson)((void *)&hwCapture->captureParam, CAPTURE_PATH_SELECT) < 0) {
847         AUDIO_FUNC_LOGE("Path Select Fail!");
848         return HDF_FAILURE;
849     }
850 #endif
851 
852     return HDF_SUCCESS;
853 }
854 
AudioCtrlCaptureClose(struct AudioHwCapture * hwCapture,InterfaceLibModeCapturePassthrough * pInterfaceLibModeCapture)855 static int32_t AudioCtrlCaptureClose(struct AudioHwCapture *hwCapture,
856     InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture)
857 {
858     if (hwCapture == NULL || hwCapture->devDataHandle == NULL || pInterfaceLibModeCapture == NULL ||
859         *pInterfaceLibModeCapture == NULL) {
860         AUDIO_FUNC_LOGE("Parameter error!");
861         return HDF_FAILURE;
862     }
863 
864     int32_t ret = (*pInterfaceLibModeCapture)(
865         hwCapture->devDataHandle, &hwCapture->captureParam, AUDIO_DRV_PCM_IOCTRL_CAPTURE_CLOSE);
866     if (ret < 0) {
867         AUDIO_FUNC_LOGE("Audio capture close fail, ret is %{public}d", ret);
868         return HDF_FAILURE;
869     }
870     return HDF_SUCCESS;
871 }
872 
AudioAdapterInterfaceLibModeCapture(struct AudioHwCapture * hwCapture)873 int32_t AudioAdapterInterfaceLibModeCapture(struct AudioHwCapture *hwCapture)
874 {
875     if (hwCapture == NULL || hwCapture->devCtlHandle == NULL || hwCapture->devDataHandle == NULL) {
876         AUDIO_FUNC_LOGE("Parameter error!");
877         return HDF_FAILURE;
878     }
879 
880     InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
881     if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
882         AUDIO_FUNC_LOGE("lib capture func not exist");
883         return HDF_FAILURE;
884     }
885     int32_t ret = (*pInterfaceLibModeCapture)(
886         hwCapture->devDataHandle, &hwCapture->captureParam, AUDIO_DRV_PCM_IOCTRL_CAPTURE_OPEN);
887     if (ret < 0) {
888         AUDIO_FUNC_LOGE("CAPTURE_OPEN FAIL");
889         return HDF_FAILURE;
890     }
891 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
892     ret = (*pInterfaceLibModeCapture)(
893         hwCapture->devCtlHandle, &hwCapture->captureParam, AUDIODRV_CTL_IOCTL_SCENESELECT_CAPTURE);
894     if (ret < 0) {
895         AUDIO_FUNC_LOGE("SetParams FAIL!");
896         (void)AudioCtrlCaptureClose(hwCapture, pInterfaceLibModeCapture);
897         return HDF_FAILURE;
898     }
899 #endif
900     ret =
901         (*pInterfaceLibModeCapture)(hwCapture->devDataHandle, &hwCapture->captureParam, AUDIO_DRV_PCM_IOCTL_HW_PARAMS);
902     if (ret < 0) {
903         AUDIO_FUNC_LOGE("AudioCaptureStart SetParams FAIL");
904         (void)AudioCtrlCaptureClose(hwCapture, pInterfaceLibModeCapture);
905         return HDF_FAILURE;
906     }
907     ret = (*pInterfaceLibModeCapture)(
908         hwCapture->devCtlHandle, &hwCapture->captureParam, AUDIODRV_CTL_IOCTL_VOL_THRESHOLD_CAPTURE);
909     if (ret < 0) {
910         AUDIO_FUNC_LOGE("SetParams FAIL!");
911         (void)AudioCtrlCaptureClose(hwCapture, pInterfaceLibModeCapture);
912         return HDF_FAILURE;
913     }
914     ret = (*pInterfaceLibModeCapture)(
915         hwCapture->devDataHandle, &hwCapture->captureParam, AUDIO_DRV_PCM_IOCTL_PREPARE_CAPTURE);
916     if (ret < 0) {
917         AUDIO_FUNC_LOGE("AudioCaptureStart prepare FAIL");
918         (void)AudioCtrlCaptureClose(hwCapture, pInterfaceLibModeCapture);
919         return HDF_FAILURE;
920     }
921     return HDF_SUCCESS;
922 }
923 
AudioCaptureBindService(struct AudioHwCapture * hwCapture,BindServiceCapturePassthrough * pBindServiceCapture)924 int32_t AudioCaptureBindService(struct AudioHwCapture *hwCapture, BindServiceCapturePassthrough *pBindServiceCapture)
925 {
926     if (hwCapture == NULL || pBindServiceCapture == NULL || *pBindServiceCapture == NULL) {
927         AUDIO_FUNC_LOGE("Parameter error!");
928         return AUDIO_ERR_INVALID_PARAM;
929     }
930 
931     hwCapture->devDataHandle = (*pBindServiceCapture)(CAPTURE_CMD);
932     if (hwCapture->devDataHandle == NULL) {
933         AUDIO_FUNC_LOGE("Capture bind service failed");
934         return AUDIO_ERR_INTERNAL;
935     }
936     hwCapture->devCtlHandle = (*pBindServiceCapture)(CTRL_CMD);
937     if (hwCapture->devCtlHandle == NULL) {
938         AUDIO_FUNC_LOGE("Capture bind service failed");
939         return AUDIO_ERR_INTERNAL;
940     }
941     int32_t ret = AudioAdapterInterfaceLibModeCapture(hwCapture);
942     if (ret != 0) {
943         AUDIO_FUNC_LOGE("AudioAdapterInterfaceLibModeCapture failed");
944         return AUDIO_ERR_INTERNAL;
945     }
946     return AUDIO_SUCCESS;
947 }
948 
GetAvailableCaptureID(struct AudioHwAdapter * hwAdapter)949 static uint32_t GetAvailableCaptureID(struct AudioHwAdapter *hwAdapter)
950 {
951     uint32_t captureId = MAX_AUDIO_STREAM_NUM;
952     uint32_t index = 0;
953     if (hwAdapter == NULL) {
954         AUDIO_FUNC_LOGE("Parameter error!");
955         return captureId;
956     }
957 
958     if (hwAdapter->infos.captureCnt < MAX_AUDIO_STREAM_NUM) {
959         captureId = hwAdapter->infos.captureCnt;
960         hwAdapter->infos.captureCnt++;
961     } else {
962         for (index = 0; index < MAX_AUDIO_STREAM_NUM; index++) {
963             if (hwAdapter->infos.captureServicePtr[index] == NULL) {
964                 captureId = index;
965                 break;
966             }
967         }
968     }
969 
970     return captureId;
971 }
972 
AudioAdapterCreateCapture(struct IAudioAdapter * adapter,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,struct IAudioCapture ** capture,uint32_t * captureId)973 int32_t AudioAdapterCreateCapture(struct IAudioAdapter *adapter, const struct AudioDeviceDescriptor *desc,
974     const struct AudioSampleAttributes *attrs, struct IAudioCapture **capture, uint32_t *captureId)
975 {
976     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
977     if (hwAdapter == NULL || desc == NULL || attrs == NULL || capture == NULL || captureId == NULL) {
978         AUDIO_FUNC_LOGE("Parameter error!");
979         return AUDIO_ERR_INVALID_PARAM;
980     }
981 
982     BindServiceCapturePassthrough *pBindServiceCapture = AudioPassthroughGetBindServiceCapture();
983     if (pBindServiceCapture == NULL || *pBindServiceCapture == NULL) {
984         AUDIO_FUNC_LOGE("lib capture func not exist");
985         return AUDIO_ERR_INTERNAL;
986     }
987     struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)OsalMemCalloc(sizeof(*hwCapture));
988     if (hwCapture == NULL) {
989         AUDIO_FUNC_LOGE("calloc AudioHwCapture failed!");
990         return AUDIO_ERR_MALLOC_FAIL;
991     }
992     int32_t ret = AudioAdapterCreateCapturePre(hwCapture, desc, attrs, hwAdapter);
993     if (ret != AUDIO_SUCCESS) {
994         AUDIO_FUNC_LOGE("call AudioAdapterCreateCapturePre failed %{public}d", ret);
995         AudioMemFree((void **)&hwCapture);
996         return AUDIO_ERR_INTERNAL;
997     }
998     ret = AudioCaptureBindService(hwCapture, pBindServiceCapture);
999     if (ret < 0) {
1000         AudioReleaseCaptureHandle(hwCapture);
1001         AudioMemFree((void **)&hwCapture);
1002         return ret;
1003     }
1004 
1005     *captureId = GetAvailableCaptureID(hwAdapter);
1006     if (*captureId == MAX_AUDIO_STREAM_NUM) {
1007         AUDIO_FUNC_LOGE("there is no available captureId");
1008         AudioReleaseCaptureHandle(hwCapture);
1009         AudioMemFree((void **)&hwCapture);
1010         return HDF_FAILURE;
1011     }
1012     hwAdapter->infos.captureServicePtr[*captureId] = hwCapture;
1013 
1014     *capture = &hwCapture->common;
1015     return AUDIO_SUCCESS;
1016 }
1017 
AudioAdapterDestroyCapture(struct IAudioAdapter * adapter,uint32_t captureId)1018 int32_t AudioAdapterDestroyCapture(struct IAudioAdapter *adapter, uint32_t captureId)
1019 {
1020     int32_t ret = 0;
1021     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
1022     if (hwAdapter == NULL || captureId >= MAX_AUDIO_STREAM_NUM) {
1023         AUDIO_FUNC_LOGE("Parameter error!");
1024         return AUDIO_ERR_INVALID_PARAM;
1025     }
1026     struct IAudioCapture *capture = (struct IAudioCapture *)hwAdapter->infos.captureServicePtr[captureId];
1027 
1028     StubCollectorRemoveObject(IAUDIOCAPTURE_INTERFACE_DESC, capture);
1029 
1030     struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)capture;
1031     if (hwCapture == NULL) {
1032         AUDIO_FUNC_LOGE("hwCapture is NULL!");
1033         return AUDIO_ERR_INTERNAL;
1034     }
1035     if (hwCapture->captureParam.frameCaptureMode.buffer != NULL) {
1036         ret = capture->Stop((AudioHandle)capture);
1037         if (ret < 0) {
1038             AUDIO_FUNC_LOGE("capture Stop failed");
1039         }
1040     }
1041     InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
1042     if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
1043         AUDIO_FUNC_LOGE("lib capture func not exist");
1044         return HDF_FAILURE;
1045     }
1046     ret = (*pInterfaceLibModeCapture)(
1047         hwCapture->devDataHandle, &hwCapture->captureParam, AUDIO_DRV_PCM_IOCTRL_CAPTURE_CLOSE);
1048     if (ret < 0) {
1049         AUDIO_FUNC_LOGE("CAPTURE_CLOSE FAIL");
1050     }
1051     AudioReleaseCaptureHandle(hwCapture);
1052     AudioMemFree((void **)&hwCapture->captureParam.frameCaptureMode.buffer);
1053     for (int i = 0; i < ERROR_LOG_MAX_NUM; i++) {
1054         AudioMemFree((void **)&hwCapture->errorLog.errorDump[i].reason);
1055         AudioMemFree((void **)&hwCapture->errorLog.errorDump[i].currentTime);
1056     }
1057     AudioMemFree((void **)&capture);
1058     hwAdapter->infos.captureServicePtr[captureId] = NULL;
1059     return AUDIO_SUCCESS;
1060 }
1061 
AudioSubPortCapabilityDestroy(struct AudioSubPortCapability * dataBlock,bool freeSelf)1062 static void AudioSubPortCapabilityDestroy(struct AudioSubPortCapability *dataBlock, bool freeSelf)
1063 {
1064     if (dataBlock == NULL) {
1065         return;
1066     }
1067 
1068     if (dataBlock->desc != NULL) {
1069         OsalMemFree(dataBlock->desc);
1070         dataBlock->desc = NULL;
1071     }
1072 
1073     if (freeSelf) {
1074         OsalMemFree(dataBlock);
1075     }
1076 }
1077 
AudioPortCapabilityDeepFree(struct AudioPortCapability * dataBlock,bool freeSelf)1078 static void AudioPortCapabilityDeepFree(struct AudioPortCapability *dataBlock, bool freeSelf)
1079 {
1080     if (dataBlock == NULL) {
1081         return;
1082     }
1083 
1084     if (dataBlock->formats != NULL) {
1085         OsalMemFree(dataBlock->formats);
1086         dataBlock->formats = NULL;
1087     }
1088 
1089     if (dataBlock->subPorts != NULL) {
1090         for (uint32_t i = 0; i < dataBlock->subPortsLen; i++) {
1091             AudioSubPortCapabilityDestroy(&dataBlock->subPorts[i], false);
1092         }
1093         OsalMemFree(dataBlock->subPorts);
1094         dataBlock->subPorts = NULL;
1095     }
1096 
1097     if (dataBlock->supportSampleFormats != NULL) {
1098         OsalMemFree(dataBlock->supportSampleFormats);
1099         dataBlock->supportSampleFormats = NULL;
1100     }
1101 
1102     if (freeSelf) {
1103         OsalMemFree(dataBlock);
1104     }
1105 }
1106 
AudioDeepCopySubCapability(struct AudioSubPortCapability ** dstSubPortsOut,struct AudioSubPortCapability * srcSubPorts,uint32_t subPortsLen)1107 static int32_t AudioDeepCopySubCapability(
1108     struct AudioSubPortCapability **dstSubPortsOut, struct AudioSubPortCapability *srcSubPorts, uint32_t subPortsLen)
1109 {
1110     struct AudioSubPortCapability *dstSubPorts = NULL;
1111 
1112     if (dstSubPortsOut == NULL || srcSubPorts == NULL || subPortsLen == 0) {
1113         AUDIO_FUNC_LOGE("Parameter error!");
1114         return AUDIO_ERR_INVALID_PARAM;
1115     }
1116     dstSubPorts = (struct AudioSubPortCapability *)OsalMemCalloc(subPortsLen * sizeof(struct AudioSubPortCapability));
1117     if (dstSubPorts == NULL) {
1118         AUDIO_FUNC_LOGE("OsalMemCalloc fail");
1119         return AUDIO_ERR_MALLOC_FAIL;
1120     }
1121     *dstSubPortsOut = dstSubPorts;
1122     for (uint32_t i = 0; i < subPortsLen; i++) {
1123         dstSubPorts[i] = srcSubPorts[i];
1124         if (srcSubPorts[i].desc != NULL) {
1125             dstSubPorts[i].desc = (char *)OsalMemCalloc(strlen(srcSubPorts[i].desc) + 1);
1126             if (dstSubPorts[i].desc == NULL) {
1127                 AUDIO_FUNC_LOGE("OsalMemCalloc fail");
1128                 return AUDIO_ERR_MALLOC_FAIL;
1129             }
1130             AUDIO_FUNC_LOGI("memcpy_s port");
1131             int32_t ret = memcpy_s(
1132                 dstSubPorts[i].desc, strlen(srcSubPorts[i].desc), srcSubPorts[i].desc, strlen(srcSubPorts[i].desc));
1133             if (ret != EOK) {
1134                 AUDIO_FUNC_LOGE("memcpy_s fail");
1135                 return AUDIO_ERR_INTERNAL;
1136             }
1137         }
1138     }
1139     return AUDIO_SUCCESS;
1140 }
1141 
AudioDeepCopyCapability(struct AudioPortCapability * destCap,struct AudioPortCapability * sourceCap)1142 static int32_t AudioDeepCopyCapability(struct AudioPortCapability *destCap, struct AudioPortCapability *sourceCap)
1143 {
1144     if (destCap == NULL || sourceCap == NULL) {
1145         AUDIO_FUNC_LOGE("Parameter error!");
1146         return AUDIO_ERR_INVALID_PARAM;
1147     }
1148 
1149     *destCap = *sourceCap;
1150     destCap->formats = NULL;
1151     destCap->supportSampleFormats = NULL;
1152     destCap->subPorts = NULL;
1153 
1154     if (sourceCap->formats != NULL) {
1155         destCap->formats = (enum AudioFormat *)OsalMemCalloc(sizeof(enum AudioFormat));
1156         if (destCap->formats == NULL) {
1157             AUDIO_FUNC_LOGE("OsalMemCalloc fail");
1158             return AUDIO_ERR_MALLOC_FAIL;
1159         }
1160         *destCap->formats = *sourceCap->formats;
1161     }
1162     if (sourceCap->supportSampleFormats != NULL) {
1163         destCap->supportSampleFormats = (enum AudioSampleFormat *)OsalMemCalloc(sizeof(enum AudioSampleFormat));
1164         if (destCap->supportSampleFormats == NULL) {
1165             AUDIO_FUNC_LOGE("OsalMemCalloc fail");
1166             AudioPortCapabilityDeepFree(destCap, false);
1167             return AUDIO_ERR_MALLOC_FAIL;
1168         }
1169         *destCap->supportSampleFormats = *sourceCap->supportSampleFormats;
1170     }
1171     int32_t ret = AudioDeepCopySubCapability(&(destCap->subPorts), sourceCap->subPorts, sourceCap->subPortsLen);
1172     if (ret < 0) {
1173         AUDIO_FUNC_LOGE("AudioDeepCopySubCapability copy fail");
1174         AudioPortCapabilityDeepFree(destCap, false);
1175         return AUDIO_ERR_MALLOC_FAIL;
1176     }
1177     return AUDIO_SUCCESS;
1178 }
1179 
AudioAdapterGetPortCapability(struct IAudioAdapter * adapter,const struct AudioPort * port,struct AudioPortCapability * capability)1180 int32_t AudioAdapterGetPortCapability(
1181     struct IAudioAdapter *adapter, const struct AudioPort *port, struct AudioPortCapability *capability)
1182 {
1183     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
1184     if (hwAdapter == NULL || port == NULL || port->portName == NULL || capability == NULL) {
1185         AUDIO_FUNC_LOGE("Parameter error!");
1186         return AUDIO_ERR_INVALID_PARAM;
1187     }
1188     struct AudioPortAndCapability *hwAdapterPortCapabilitys = hwAdapter->portCapabilitys;
1189     if (hwAdapterPortCapabilitys == NULL) {
1190         AUDIO_FUNC_LOGE("hwAdapter portCapabilitys is NULL!");
1191         return AUDIO_ERR_INTERNAL;
1192     }
1193     uint32_t portsLen = hwAdapter->adapterDescriptor.portsLen;
1194     while (hwAdapterPortCapabilitys != NULL && portsLen > 0) {
1195         if (hwAdapterPortCapabilitys->port.portId == port->portId) {
1196             if (AudioDeepCopyCapability(capability, &hwAdapterPortCapabilitys->capability) < 0) {
1197                 return AUDIO_ERR_INTERNAL;
1198             }
1199             return AUDIO_SUCCESS;
1200         }
1201         hwAdapterPortCapabilitys++;
1202         portsLen--;
1203     }
1204     return AUDIO_ERR_INTERNAL;
1205 }
1206 
AudioAdapterSetPassthroughMode(struct IAudioAdapter * adapter,const struct AudioPort * port,enum AudioPortPassthroughMode mode)1207 int32_t AudioAdapterSetPassthroughMode(
1208     struct IAudioAdapter *adapter, const struct AudioPort *port, enum AudioPortPassthroughMode mode)
1209 {
1210     if (adapter == NULL || port == NULL || port->portName == NULL) {
1211         AUDIO_FUNC_LOGE("Parameter error!");
1212         return AUDIO_ERR_INVALID_PARAM;
1213     }
1214     if (port->dir != PORT_OUT || port->portId < 0 || strcmp(port->portName, "AOP") != 0) {
1215         AUDIO_FUNC_LOGE("Port error!");
1216         return AUDIO_ERR_INTERNAL;
1217     }
1218     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
1219     if (hwAdapter->portCapabilitys == NULL) {
1220         AUDIO_FUNC_LOGE("The pointer is null!");
1221         return AUDIO_ERR_INTERNAL;
1222     }
1223     struct AudioPortAndCapability *portCapabilityTemp = hwAdapter->portCapabilitys;
1224     struct AudioPortCapability *portCapability = NULL;
1225     uint32_t portsLen = hwAdapter->adapterDescriptor.portsLen;
1226     while (portCapabilityTemp != NULL && portsLen > 0) {
1227         if (portCapabilityTemp->port.portId == port->portId) {
1228             portCapability = &portCapabilityTemp->capability;
1229             break;
1230         }
1231         portCapabilityTemp++;
1232         portsLen--;
1233     }
1234     if (portCapability == NULL || portsLen == 0) {
1235         AUDIO_FUNC_LOGE("hwAdapter portCapabilitys is Not Find!");
1236         return AUDIO_ERR_INTERNAL;
1237     }
1238     struct AudioSubPortCapability *subPortCapability = portCapability->subPorts;
1239     if (subPortCapability == NULL) {
1240         AUDIO_FUNC_LOGE("portCapability->subPorts is NULL!");
1241         return AUDIO_ERR_INTERNAL;
1242     }
1243     uint32_t subportsLen = portCapability->subPortsLen;
1244     while (subPortCapability != NULL && subportsLen > 0) {
1245         if (subPortCapability->mask == mode) {
1246             portCapabilityTemp->mode = mode;
1247             break;
1248         }
1249         subPortCapability++;
1250         subportsLen--;
1251     }
1252     if (subportsLen == 0) {
1253         AUDIO_FUNC_LOGE("subPortCapability's Temp mode is not find!");
1254         return AUDIO_ERR_INTERNAL;
1255     }
1256     return AUDIO_SUCCESS;
1257 }
1258 
AudioAdapterGetPassthroughMode(struct IAudioAdapter * adapter,const struct AudioPort * port,enum AudioPortPassthroughMode * mode)1259 int32_t AudioAdapterGetPassthroughMode(
1260     struct IAudioAdapter *adapter, const struct AudioPort *port, enum AudioPortPassthroughMode *mode)
1261 {
1262     if (adapter == NULL || port == NULL || port->portName == NULL || mode == NULL) {
1263         AUDIO_FUNC_LOGE("Parameter error!");
1264         return AUDIO_ERR_INVALID_PARAM;
1265     }
1266     if (port->dir != PORT_OUT || port->portId < 0 || strcmp(port->portName, "AOP") != 0) {
1267         AUDIO_FUNC_LOGE("Port error!");
1268         return AUDIO_ERR_INTERNAL;
1269     }
1270     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
1271     if (hwAdapter->portCapabilitys == NULL) {
1272         AUDIO_FUNC_LOGE("portCapabilitys pointer is null!");
1273         return AUDIO_ERR_INTERNAL;
1274     }
1275     struct AudioPortAndCapability *portCapabilitys = hwAdapter->portCapabilitys;
1276     uint32_t portsLen = hwAdapter->adapterDescriptor.portsLen;
1277     while (portCapabilitys != NULL && portsLen > 0) {
1278         if (portCapabilitys->port.portId == port->portId) {
1279             *mode = portCapabilitys->mode;
1280             return AUDIO_SUCCESS;
1281         }
1282         portCapabilitys++;
1283         portsLen--;
1284     }
1285     return AUDIO_ERR_INTERNAL;
1286 }
AudioAdapterGetDeviceStatus(struct IAudioAdapter * adapter,struct AudioDeviceStatus * status)1287 int32_t AudioAdapterGetDeviceStatus(struct IAudioAdapter *adapter, struct AudioDeviceStatus *status)
1288 {
1289     (void)adapter;
1290     (void)status;
1291     return AUDIO_SUCCESS;
1292 }
AudioAdapterRelease(struct IAudioAdapter * instance)1293 void AudioAdapterRelease(struct IAudioAdapter *instance)
1294 {
1295     (void)instance;
1296 }
1297