• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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.h"
17 #include "audio_adapter_info_common.h"
18 #include "audio_hal_log.h"
19 #include "audio_interface_lib_capture.h"
20 #include "audio_interface_lib_render.h"
21 #include "osal_mem.h"
22 
23 #define HDF_LOG_TAG hal_audio_adapter
24 
25 #define CONFIG_CHANNEL_COUNT  2 // two channels
26 #define GAIN_MAX 50.0
27 #define AUDIO_SERVICE_PORTID_FLAG 10
28 #define DEFAULT_RENDER_SAMPLING_RATE 48000
29 #define DEEP_BUFFER_RENDER_PERIOD_SIZE 4096
30 #define DEEP_BUFFER_RENDER_PERIOD_COUNT 8
31 #define TYPE_RENDER "Render"
32 #define TYPE_CAPTURE "Capture"
33 #define INT_32_MAX 0x7fffffff
34 #define SHIFT_RIGHT_31_BITS 31
35 
GetAudioRenderFunc(struct AudioHwRender * hwRender)36 int32_t GetAudioRenderFunc(struct AudioHwRender *hwRender)
37 {
38     if (hwRender == NULL) {
39         return HDF_FAILURE;
40     }
41     hwRender->common.control.Start = AudioRenderStart;
42     hwRender->common.control.Stop = AudioRenderStop;
43     hwRender->common.control.Pause = AudioRenderPause;
44     hwRender->common.control.Resume = AudioRenderResume;
45     hwRender->common.control.Flush = AudioRenderFlush;
46     hwRender->common.control.TurnStandbyMode = AudioRenderTurnStandbyMode;
47     hwRender->common.control.AudioDevDump = AudioRenderAudioDevDump;
48     hwRender->common.attr.GetFrameSize = AudioRenderGetFrameSize;
49     hwRender->common.attr.GetFrameCount = AudioRenderGetFrameCount;
50     hwRender->common.attr.SetSampleAttributes = AudioRenderSetSampleAttributes;
51     hwRender->common.attr.GetSampleAttributes = AudioRenderGetSampleAttributes;
52     hwRender->common.attr.GetCurrentChannelId = AudioRenderGetCurrentChannelId;
53     hwRender->common.attr.SetExtraParams = AudioRenderSetExtraParams;
54     hwRender->common.attr.GetExtraParams = AudioRenderGetExtraParams;
55     hwRender->common.attr.ReqMmapBuffer = AudioRenderReqMmapBuffer;
56     hwRender->common.attr.GetMmapPosition = AudioRenderGetMmapPosition;
57     hwRender->common.scene.CheckSceneCapability = AudioRenderCheckSceneCapability;
58     hwRender->common.scene.SelectScene = AudioRenderSelectScene;
59     hwRender->common.volume.SetMute = AudioRenderSetMute;
60     hwRender->common.volume.GetMute = AudioRenderGetMute;
61     hwRender->common.volume.SetVolume = AudioRenderSetVolume;
62     hwRender->common.volume.GetVolume = AudioRenderGetVolume;
63     hwRender->common.volume.GetGainThreshold = AudioRenderGetGainThreshold;
64     hwRender->common.volume.GetGain = AudioRenderGetGain;
65     hwRender->common.volume.SetGain = AudioRenderSetGain;
66     hwRender->common.GetLatency = AudioRenderGetLatency;
67     hwRender->common.RenderFrame = AudioRenderRenderFrame;
68     hwRender->common.GetRenderPosition = AudioRenderGetRenderPosition;
69     hwRender->common.SetRenderSpeed = AudioRenderSetRenderSpeed;
70     hwRender->common.GetRenderSpeed = AudioRenderGetRenderSpeed;
71     hwRender->common.SetChannelMode = AudioRenderSetChannelMode;
72     hwRender->common.GetChannelMode = AudioRenderGetChannelMode;
73     hwRender->common.RegCallback = AudioRenderRegCallback;
74     hwRender->common.DrainBuffer = AudioRenderDrainBuffer;
75     hwRender->renderParam.frameRenderMode.callbackProcess = CallbackProcessing;
76     return HDF_SUCCESS;
77 }
78 
CheckParaDesc(const struct AudioDeviceDescriptor * desc,const char * type)79 int32_t CheckParaDesc(const struct AudioDeviceDescriptor *desc, const char *type)
80 {
81     if (desc == NULL || type == NULL) {
82         return HDF_FAILURE;
83     }
84     if ((desc->portId) >> SHIFT_RIGHT_31_BITS) {
85         return HDF_ERR_NOT_SUPPORT;
86     }
87     enum AudioPortPin pins = desc->pins;
88     if (!strcmp(type, TYPE_CAPTURE)) {
89         if (pins == PIN_IN_MIC || pins == PIN_IN_HS_MIC || pins == PIN_IN_LINEIN) {
90             return HDF_SUCCESS;
91         } else {
92             return HDF_ERR_NOT_SUPPORT;
93         }
94     } else if (!strcmp(type, TYPE_RENDER)) {
95         if (pins == PIN_OUT_SPEAKER || pins == PIN_OUT_HEADSET || pins == PIN_OUT_LINEOUT || pins == PIN_OUT_HDMI) {
96             return HDF_SUCCESS;
97         } else {
98             return HDF_ERR_NOT_SUPPORT;
99         }
100     }
101     return HDF_ERR_NOT_SUPPORT;
102 }
103 
CheckParaAttr(const struct AudioSampleAttributes * attrs)104 int32_t CheckParaAttr(const struct AudioSampleAttributes *attrs)
105 {
106     if (attrs == NULL) {
107         return HDF_FAILURE;
108     }
109     int32_t ret = ((attrs->sampleRate) >> SHIFT_RIGHT_31_BITS) + ((attrs->channelCount) >> SHIFT_RIGHT_31_BITS) +
110         ((attrs->period) >> SHIFT_RIGHT_31_BITS) + ((attrs->frameSize) >> SHIFT_RIGHT_31_BITS) +
111         ((attrs->startThreshold) >> SHIFT_RIGHT_31_BITS) + ((attrs->stopThreshold) >> SHIFT_RIGHT_31_BITS) +
112         ((attrs->silenceThreshold) >> SHIFT_RIGHT_31_BITS);
113     if (ret > 0) {
114         return HDF_ERR_NOT_SUPPORT;
115     }
116     enum AudioCategory audioCategory = attrs->type;
117     if (AUDIO_IN_MEDIA != audioCategory && AUDIO_IN_COMMUNICATION != audioCategory) {
118         return HDF_ERR_NOT_SUPPORT;
119     }
120     enum AudioFormat audioFormat = attrs->format;
121     return CheckAttrFormat(audioFormat);
122 }
123 
AttrFormatToBit(const struct AudioSampleAttributes * attrs,int32_t * format)124 int32_t AttrFormatToBit(const struct AudioSampleAttributes *attrs, int32_t *format)
125 {
126     if (attrs == NULL || format == NULL) {
127         return HDF_FAILURE;
128     }
129     enum AudioFormat audioFormat = attrs->format;
130     switch (audioFormat) {
131         case AUDIO_FORMAT_PCM_8_BIT:
132             *format = BIT_NUM_8;
133             return HDF_SUCCESS;
134         case AUDIO_FORMAT_PCM_16_BIT:
135             *format = BIT_NUM_16;
136             return HDF_SUCCESS;
137         case AUDIO_FORMAT_PCM_24_BIT:
138             *format = BIT_NUM_24;
139             return HDF_SUCCESS;
140         case AUDIO_FORMAT_PCM_32_BIT:
141             *format = BIT_NUM_32;
142             return HDF_SUCCESS;
143         default:
144             return HDF_ERR_NOT_SUPPORT;
145     }
146 }
147 
InitHwRenderParam(struct AudioHwRender * hwRender,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs)148 int32_t InitHwRenderParam(struct AudioHwRender *hwRender, const struct AudioDeviceDescriptor *desc,
149                           const struct AudioSampleAttributes *attrs)
150 {
151     if (hwRender == NULL || desc == NULL || attrs == NULL) {
152         LOG_FUN_ERR("InitHwRenderParam param Is NULL");
153         return HDF_FAILURE;
154     }
155     int32_t ret = CheckParaDesc(desc, TYPE_RENDER);
156     if (ret != HDF_SUCCESS) {
157         LOG_FUN_ERR("CheckParaDesc Fail");
158         return ret;
159     }
160     ret = CheckParaAttr(attrs);
161     if (ret != HDF_SUCCESS) {
162         LOG_FUN_ERR("CheckParaAttr Fail");
163         return ret;
164     }
165     int32_t formatValue = -1;
166     ret = AttrFormatToBit(attrs, &formatValue);
167     if (ret != HDF_SUCCESS) {
168         LOG_FUN_ERR("AttrFormatToBit Fail");
169         return ret;
170     }
171     if (attrs->channelCount == 0) {
172         return HDF_FAILURE;
173     }
174     hwRender->renderParam.renderMode.hwInfo.deviceDescript = *desc;
175     hwRender->renderParam.renderMode.hwInfo.callBackEnable = false;
176     hwRender->renderParam.frameRenderMode.attrs = *attrs;
177     hwRender->renderParam.renderMode.ctlParam.audioGain.gainMax = GAIN_MAX;  // init gainMax
178     hwRender->renderParam.renderMode.ctlParam.audioGain.gainMin = 0;
179     hwRender->renderParam.frameRenderMode.frames = 0;
180     hwRender->renderParam.frameRenderMode.time.tvNSec = 0;
181     hwRender->renderParam.frameRenderMode.time.tvSec = 0;
182     hwRender->renderParam.frameRenderMode.byteRate = DEFAULT_RENDER_SAMPLING_RATE;
183     hwRender->renderParam.frameRenderMode.periodSize = DEEP_BUFFER_RENDER_PERIOD_SIZE;
184     hwRender->renderParam.frameRenderMode.periodCount = DEEP_BUFFER_RENDER_PERIOD_COUNT;
185     hwRender->renderParam.frameRenderMode.attrs.period = attrs->period;
186     hwRender->renderParam.frameRenderMode.attrs.frameSize = attrs->frameSize;
187     hwRender->renderParam.frameRenderMode.attrs.startThreshold = attrs->startThreshold;
188     hwRender->renderParam.frameRenderMode.attrs.stopThreshold = attrs->stopThreshold;
189     hwRender->renderParam.frameRenderMode.attrs.silenceThreshold = attrs->silenceThreshold;
190     hwRender->renderParam.frameRenderMode.attrs.isBigEndian = attrs->isBigEndian;
191     hwRender->renderParam.frameRenderMode.attrs.isSignedData = attrs->isSignedData;
192     hwRender->renderParam.frameRenderMode.renderhandle = (AudioHandle)hwRender;
193     hwRender->renderParam.renderMode.ctlParam.turnStandbyStatus = AUDIO_TURN_STANDBY_LATER;
194     return HDF_SUCCESS;
195 }
196 
197 enum AudioFormat g_formatIdZero = AUDIO_FORMAT_PCM_16_BIT;
InitForGetPortCapability(struct AudioPort portIndex,struct AudioPortCapability * capabilityIndex)198 int32_t InitForGetPortCapability(struct AudioPort portIndex, struct AudioPortCapability *capabilityIndex)
199 {
200     if (capabilityIndex == NULL) {
201         LOG_FUN_ERR("capabilityIndex Is NULL");
202         return HDF_FAILURE;
203     }
204     /* get capabilityIndex from driver or default */
205     if (portIndex.dir != PORT_OUT) {
206         capabilityIndex->hardwareMode = true;
207         capabilityIndex->channelMasks = AUDIO_CHANNEL_STEREO;
208         capabilityIndex->channelCount = CONFIG_CHANNEL_COUNT;
209         return HDF_SUCCESS;
210     }
211     if (portIndex.portId == 0) {
212         capabilityIndex->hardwareMode = true;
213         capabilityIndex->channelMasks = AUDIO_CHANNEL_STEREO;
214         capabilityIndex->channelCount = CONFIG_CHANNEL_COUNT;
215         capabilityIndex->deviceType = portIndex.dir;
216         capabilityIndex->deviceId = PIN_OUT_SPEAKER;
217         capabilityIndex->formatNum = 1;
218         capabilityIndex->formats = &g_formatIdZero;
219         capabilityIndex->sampleRateMasks = AUDIO_SAMPLE_RATE_MASK_16000;
220         capabilityIndex->subPortsNum = 1;
221         capabilityIndex->subPorts = (struct AudioSubPortCapability *)calloc(capabilityIndex->subPortsNum,
222                                                                             sizeof(struct AudioSubPortCapability));
223         if (capabilityIndex->subPorts == NULL) {
224             LOG_FUN_ERR("capabilityIndex subPorts is NULL!");
225             return HDF_FAILURE;
226         }
227         capabilityIndex->subPorts->portId = portIndex.portId;
228         capabilityIndex->subPorts->desc = portIndex.portName;
229         capabilityIndex->subPorts->mask = PORT_PASSTHROUGH_LPCM;
230         return HDF_SUCCESS;
231     }
232     if (portIndex.portId == 1) {
233         capabilityIndex->hardwareMode = true;
234         capabilityIndex->channelMasks = AUDIO_CHANNEL_STEREO;
235         capabilityIndex->channelCount = CONFIG_CHANNEL_COUNT;
236         capabilityIndex->deviceType = portIndex.dir;
237         capabilityIndex->deviceId = PIN_OUT_HEADSET;
238         capabilityIndex->formatNum = 1;
239         capabilityIndex->formats = &g_formatIdZero;
240         capabilityIndex->sampleRateMasks = AUDIO_SAMPLE_RATE_MASK_16000 | AUDIO_SAMPLE_RATE_MASK_8000;
241         return HDF_SUCCESS;
242     }
243     if (portIndex.portId == HDMI_PORT_ID) {
244         return HdmiPortInit(portIndex, capabilityIndex);
245     }
246     return HDF_FAILURE;
247 }
248 
AudioAdapterReleaseCapSubPorts(const struct AudioPortAndCapability * portCapabilitys,int32_t num)249 void AudioAdapterReleaseCapSubPorts(const struct AudioPortAndCapability *portCapabilitys, int32_t num)
250 {
251     int32_t i = 0;
252     if (portCapabilitys == NULL) {
253         return;
254     }
255     while (i < num) {
256         if (&portCapabilitys[i] == NULL) {
257             break;
258         }
259         AudioMemFree((void **)(&portCapabilitys[i].capability.subPorts));
260         i++;
261     }
262     return;
263 }
264 
AudioAdapterInitAllPorts(struct AudioAdapter * adapter)265 int32_t AudioAdapterInitAllPorts(struct AudioAdapter *adapter)
266 {
267     int32_t ret = AudioCheckAdapterAddr((AudioHandle)adapter);
268     if (ret < 0) {
269         LOG_FUN_ERR("The adapter address passed in is invalid");
270         return ret;
271     }
272     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
273     if (hwAdapter == NULL) {
274         LOG_FUN_ERR("hwAdapter Is NULL");
275         return AUDIO_HAL_ERR_INVALID_PARAM;
276     }
277     if (hwAdapter->portCapabilitys != NULL) {
278         LOG_PARA_INFO("portCapabilitys already Init!");
279         return AUDIO_HAL_SUCCESS;
280     }
281     uint32_t portNum = hwAdapter->adapterDescriptor.portNum;
282     struct AudioPort *ports = hwAdapter->adapterDescriptor.ports;
283     if (ports == NULL) {
284         LOG_FUN_ERR("ports is NULL!");
285         return AUDIO_HAL_ERR_INTERNAL;
286     }
287     if (portNum == 0) {
288         return AUDIO_HAL_ERR_INTERNAL;
289     }
290     struct AudioPortAndCapability *portCapability =
291         (struct AudioPortAndCapability *)calloc(portNum, sizeof(struct AudioPortAndCapability));
292     if (portCapability == NULL) {
293         LOG_FUN_ERR("portCapability is NULL!");
294         return AUDIO_HAL_ERR_INTERNAL;
295     }
296     for (uint32_t i = 0; i < portNum; i++) {
297         portCapability[i].port = ports[i];
298         if (InitForGetPortCapability(ports[i], &portCapability[i].capability)) {
299             LOG_FUN_ERR("ports Init Fail!");
300             AudioAdapterReleaseCapSubPorts(portCapability, portNum);
301             AudioMemFree((void **)&portCapability);
302             return AUDIO_HAL_ERR_INTERNAL;
303         }
304     }
305     hwAdapter->portCapabilitys = portCapability;
306     hwAdapter->portCapabilitys->mode = PORT_PASSTHROUGH_LPCM;
307     return AUDIO_HAL_SUCCESS;
308 }
309 
AudioReleaseRenderHandle(struct AudioHwRender * hwRender)310 void AudioReleaseRenderHandle(struct AudioHwRender *hwRender)
311 {
312     if (hwRender == NULL) {
313         return;
314     }
315     CloseServiceRenderSo *pCloseServiceRender = AudioSoGetCloseServiceRender();
316     if (pCloseServiceRender == NULL || (*pCloseServiceRender) == NULL) {
317         LOG_FUN_ERR("pCloseServiceRender func not exist");
318         return;
319     }
320     if (hwRender->devDataHandle != NULL) {
321         (*pCloseServiceRender)(hwRender->devDataHandle);
322         hwRender->devDataHandle = NULL;
323     }
324     if (hwRender->devCtlHandle != NULL) {
325         (*pCloseServiceRender)(hwRender->devCtlHandle);
326         hwRender->devCtlHandle = NULL;
327     }
328     return;
329 }
330 
AudioSetAcodeModeRender(struct AudioHwRender * hwRender,const InterfaceLibModeRenderSo * pInterfaceLibMode)331 int32_t AudioSetAcodeModeRender(struct AudioHwRender *hwRender,
332     const InterfaceLibModeRenderSo *pInterfaceLibMode)
333 {
334     LOG_FUN_INFO();
335     if (hwRender == NULL || pInterfaceLibMode == NULL || hwRender->devCtlHandle == NULL) {
336         return HDF_FAILURE;
337     }
338     if (hwRender->renderParam.renderMode.hwInfo.deviceDescript.portId < AUDIO_SERVICE_PORTID_FLAG) {
339         return(*pInterfaceLibMode)(hwRender->devCtlHandle, &hwRender->renderParam,
340                                          AUDIODRV_CTL_IOCTL_ACODEC_CHANGE_IN);
341     } else {
342         return(*pInterfaceLibMode)(hwRender->devCtlHandle, &hwRender->renderParam,
343                                          AUDIODRV_CTL_IOCTL_ACODEC_CHANGE_OUT);
344     }
345 }
346 
AudioAdapterCreateRenderPre(struct AudioHwRender * hwRender,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,const struct AudioHwAdapter * hwAdapter)347 int32_t AudioAdapterCreateRenderPre(struct AudioHwRender *hwRender, const struct AudioDeviceDescriptor *desc,
348                                     const struct AudioSampleAttributes *attrs, const struct AudioHwAdapter *hwAdapter)
349 {
350     LOG_FUN_INFO();
351     if (hwAdapter == NULL || hwRender == NULL || desc == NULL || attrs == NULL) {
352         LOG_FUN_ERR("Pointer is null!");
353         return HDF_FAILURE;
354     }
355 
356 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
357     PathSelAnalysisJson *pPathSelAnalysisJson = AudioSoGetPathSelAnalysisJson();
358     if (pPathSelAnalysisJson == NULL || *pPathSelAnalysisJson == NULL) {
359         LOG_FUN_ERR("PathSelAnalysisJson not exist");
360         return HDF_FAILURE;
361     }
362 #endif
363     if (GetAudioRenderFunc(hwRender) < 0) {
364         return HDF_FAILURE;
365     }
366     /* Fill hwRender para */
367     if (InitHwRenderParam(hwRender, desc, attrs) < 0) {
368         return HDF_FAILURE;
369     }
370     /* Select Path */
371 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
372     if ((*pPathSelAnalysisJson)((void *)&hwRender->renderParam, RENDER_PATH_SELECT) < 0) {
373         LOG_FUN_ERR("Path Select Fail!");
374         return HDF_FAILURE;
375     }
376 #endif
377     if (hwAdapter->adapterDescriptor.adapterName == NULL) {
378         LOG_FUN_ERR("pointer is null!");
379         return HDF_FAILURE;
380     }
381     uint32_t adapterNameLen = strlen(hwAdapter->adapterDescriptor.adapterName);
382     if (adapterNameLen == 0) {
383         LOG_FUN_ERR("adapterNameLen is null!");
384         return HDF_FAILURE;
385     }
386     /* Get Adapter name */
387     int32_t ret = strncpy_s(hwRender->renderParam.renderMode.hwInfo.adapterName, NAME_LEN - 1,
388                             hwAdapter->adapterDescriptor.adapterName, adapterNameLen);
389     if (ret != EOK) {
390         LOG_FUN_ERR("copy fail");
391         return HDF_FAILURE;
392     }
393     return HDF_SUCCESS;
394 }
395 
396 
BindServiceRenderOpen(struct AudioHwRender * hwRender,InterfaceLibModeRenderSo * pInterfaceLibModeRender)397 int32_t BindServiceRenderOpen(struct AudioHwRender *hwRender,
398     InterfaceLibModeRenderSo *pInterfaceLibModeRender)
399 {
400     if (hwRender == NULL || hwRender->devDataHandle == NULL ||
401         pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
402         LOG_FUN_ERR("Input para is null!");
403         return HDF_FAILURE;
404     }
405     /* render open */
406     if (hwRender->renderParam.renderMode.hwInfo.deviceDescript.portId < AUDIO_SERVICE_PORTID_FLAG) {
407         hwRender->renderParam.renderMode.hwInfo.card = AUDIO_SERVICE_IN;
408     } else {
409         hwRender->renderParam.renderMode.hwInfo.card = AUDIO_SERVICE_OUT;
410     }
411     int32_t ret = (*pInterfaceLibModeRender)(hwRender->devDataHandle,
412         &hwRender->renderParam, AUDIO_DRV_PCM_IOCTRL_RENDER_OPEN);
413     if (ret < 0) {
414         LOG_FUN_ERR("AudioRender render open FAIL");
415         return HDF_FAILURE;
416     }
417     return HDF_SUCCESS;
418 }
419 
AudioAdapterBindServiceRender(struct AudioHwRender * hwRender)420 int32_t AudioAdapterBindServiceRender(struct AudioHwRender *hwRender)
421 {
422     int32_t ret;
423     if (hwRender == NULL || hwRender->devDataHandle == NULL || hwRender->devCtlHandle == NULL) {
424         return HDF_FAILURE;
425     }
426     InterfaceLibModeRenderSo *pInterfaceLibModeRender = AudioSoGetInterfaceLibModeRender();
427     if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
428         LOG_FUN_ERR("InterfaceLibModeRender not exist");
429         return HDF_FAILURE;
430     }
431     if (BindServiceRenderOpen(hwRender, pInterfaceLibModeRender)) {
432         return HDF_FAILURE;
433     }
434 #ifndef AUDIO_HAL_USER
435     /* Select Codec Mode */
436     ret = AudioSetAcodeModeRender(hwRender, pInterfaceLibModeRender);
437     if (ret < 0) {
438         LOG_FUN_ERR("Select Codec Mode FAIL!");
439         return HDF_FAILURE;
440     }
441 #endif
442     /* Init RenderPathSelect send first */
443     /* portId small than  AUDIO_SERVICE_PORTID_FLAG shoud SceneSelect */
444 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
445     if (hwRender->renderParam.renderMode.hwInfo.deviceDescript.portId < AUDIO_SERVICE_PORTID_FLAG) {
446         ret = (*pInterfaceLibModeRender)(hwRender->devCtlHandle, &hwRender->renderParam,
447             AUDIODRV_CTL_IOCTL_SCENESELECT_WRITE);
448         if (ret < 0) {
449             LOG_FUN_ERR("SetParams FAIL!");
450             return HDF_FAILURE;
451         }
452     }
453 #endif
454     /* set Attr Para */
455     ret = (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTL_HW_PARAMS);
456     if (ret < 0) {
457         LOG_FUN_ERR("AudioRender SetParams FAIL");
458         return HDF_FAILURE;
459     }
460     /* get volThreshold */
461     ret = (*pInterfaceLibModeRender)(hwRender->devCtlHandle, &hwRender->renderParam,
462            AUDIODRV_CTL_IOCTL_VOL_THRESHOLD_READ);
463     if (ret < 0) {
464         LOG_FUN_ERR("SetParams FAIL!");
465         return HDF_FAILURE;
466     }
467 #ifndef AUDIO_HAL_USER
468     ret = (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTL_PREPARE);
469     if (ret < 0) {
470         LOG_FUN_ERR("AudioRender perpare FAIL");
471         return HDF_FAILURE;
472     }
473 #endif
474     return HDF_SUCCESS;
475 }
476 
AudioRenderBindService(struct AudioHwRender * hwRender,BindServiceRenderSo * pBindServiceRender)477 int32_t AudioRenderBindService(struct AudioHwRender *hwRender, BindServiceRenderSo *pBindServiceRender)
478 {
479     if (hwRender == NULL || pBindServiceRender == NULL || *pBindServiceRender == NULL) {
480         return AUDIO_HAL_ERR_INVALID_PARAM;
481     }
482     /* bindRenderService */
483     hwRender->devDataHandle = (*pBindServiceRender)(RENDER_CMD);
484     if (hwRender->devDataHandle == NULL) {
485         LOG_FUN_ERR("Render bind service failed");
486         return AUDIO_HAL_ERR_INTERNAL;
487     }
488     hwRender->devCtlHandle = (*pBindServiceRender)(CTRL_CMD);
489     if (hwRender->devCtlHandle == NULL) {
490         LOG_FUN_ERR("Render bind service failed");
491         return AUDIO_HAL_ERR_INTERNAL;
492     }
493     int32_t ret = AudioAdapterBindServiceRender(hwRender);
494     if (ret != 0) {
495         LOG_FUN_ERR("AudioAdapterBindServiceRender fail");
496         return AUDIO_HAL_ERR_INTERNAL;
497     }
498     return AUDIO_HAL_SUCCESS;
499 }
500 
AudioCreateRenderRelease(struct AudioHwRender ** hwRender)501 void AudioCreateRenderRelease(struct AudioHwRender **hwRender)
502 {
503     if (hwRender != NULL && *hwRender != NULL) {
504         AudioMemFree((void **)&((*hwRender)->renderParam.frameRenderMode.buffer));
505     }
506     AudioMemFree((void **)hwRender);
507     return;
508 }
509 
AudioAdapterCreateRender(struct AudioAdapter * adapter,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,struct AudioRender ** render)510 int32_t AudioAdapterCreateRender(struct AudioAdapter *adapter, const struct AudioDeviceDescriptor *desc,
511                                  const struct AudioSampleAttributes *attrs, struct AudioRender **render)
512 {
513     int32_t ret = AudioCheckAdapterAddr((AudioHandle)adapter);
514     if (ret < 0) {
515         LOG_FUN_ERR("The adapter address passed in is invalid");
516         return ret;
517     }
518     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
519     if (hwAdapter == NULL || desc == NULL || attrs == NULL || render == NULL) {
520         return AUDIO_HAL_ERR_INVALID_PARAM;
521     }
522     if (hwAdapter->adapterMgrRenderFlag > 0) {
523         LOG_FUN_ERR("Create render repeatedly!");
524         return AUDIO_HAL_ERR_INTERNAL;
525     }
526     BindServiceRenderSo *pBindServiceRender = AudioSoGetBindServiceRender();
527     if (pBindServiceRender == NULL || *pBindServiceRender == NULL) {
528         LOG_FUN_ERR("lib render func not exist");
529         return AUDIO_HAL_ERR_INTERNAL;
530     }
531     struct AudioHwRender *hwRender = (struct AudioHwRender *)calloc(1, sizeof(*hwRender));
532     if (hwRender == NULL) {
533         LOG_FUN_ERR("hwRender is NULL!");
534         return AUDIO_HAL_ERR_MALLOC_FAIL;
535     }
536     ret = AudioAdapterCreateRenderPre(hwRender, desc, attrs, hwAdapter);
537     if (ret != 0) {
538         LOG_FUN_ERR("AudioAdapterCreateRenderPre fail");
539         AudioCreateRenderRelease(&hwRender);
540         return AUDIO_HAL_ERR_INTERNAL;
541     }
542     ret = AudioRenderBindService(hwRender, pBindServiceRender);
543     if (ret < 0) {
544         LOG_FUN_ERR("AudioRenderBindService fail");
545         AudioReleaseRenderHandle(hwRender);
546         AudioCreateRenderRelease(&hwRender);
547         return ret;
548     }
549     /* add for Fuzz */
550     ret = AudioAddRenderAddrToList((AudioHandle)(&hwRender->common));
551     if (ret < 0) {
552         LOG_FUN_ERR("The render address get is invalid");
553         AudioReleaseRenderHandle(hwRender);
554         AudioCreateRenderRelease(&hwRender);
555         return ret;
556     }
557     *render = &hwRender->common;
558     hwAdapter->adapterMgrRenderFlag++;
559     return AUDIO_HAL_SUCCESS;
560 }
561 
AudioAdapterDestroyRender(struct AudioAdapter * adapter,struct AudioRender * render)562 int32_t AudioAdapterDestroyRender(struct AudioAdapter *adapter, struct AudioRender *render)
563 {
564     int32_t ret = AudioCheckAdapterAddr((AudioHandle)adapter);
565     if (ret < 0) {
566         LOG_FUN_ERR("The adapter address passed in is invalid");
567         return ret;
568     }
569     ret = AudioCheckRenderAddr((AudioHandle)render);
570     if (ret < 0) {
571         LOG_FUN_ERR("The render address passed in is invalid");
572         return ret;
573     }
574     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
575     if (hwAdapter == NULL || render == NULL) {
576         return AUDIO_HAL_ERR_INVALID_PARAM;
577     }
578     if (hwAdapter->adapterMgrRenderFlag > 0) {
579         hwAdapter->adapterMgrRenderFlag--;
580     }
581     struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
582     if (hwRender == NULL) {
583         return AUDIO_HAL_ERR_INTERNAL;
584     }
585     if (hwRender->renderParam.frameRenderMode.buffer != NULL) {
586         int ret = render->control.Stop((AudioHandle)render);
587         if (ret < 0) {
588             LOG_FUN_ERR("render Stop failed");
589         }
590     }
591     InterfaceLibModeRenderSo *pInterfaceLibModeRender = AudioSoGetInterfaceLibModeRender();
592     if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
593         LOG_FUN_ERR("InterfaceLibModeRender not exist");
594         return HDF_FAILURE;
595     }
596     ret = (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam,
597                                      AUDIO_DRV_PCM_IOCTRL_RENDER_CLOSE);
598     if (ret < 0) {
599         LOG_FUN_ERR("Audio RENDER_CLOSE FAIL");
600     }
601     if (AudioDelRenderAddrFromList((AudioHandle)render)) {
602         LOG_FUN_ERR("adapter or render not in MgrList");
603     }
604     AudioReleaseRenderHandle(hwRender);
605     AudioMemFree((void **)&hwRender->renderParam.frameRenderMode.buffer);
606     for (int i = 0; i < ERROR_LOG_MAX_NUM; i++) {
607         AudioMemFree((void **)&hwRender->errorLog.errorDump[i].reason);
608         AudioMemFree((void **)&hwRender->errorLog.errorDump[i].currentTime);
609     }
610     AudioMemFree((void **)&render);
611     return AUDIO_HAL_SUCCESS;
612 }
613 
GetAudioCaptureFunc(struct AudioHwCapture * hwCapture)614 int32_t GetAudioCaptureFunc(struct AudioHwCapture *hwCapture)
615 {
616     if (hwCapture == NULL) {
617         return HDF_FAILURE;
618     }
619     hwCapture->common.control.Start = AudioCaptureStart;
620     hwCapture->common.control.Stop = AudioCaptureStop;
621     hwCapture->common.control.Pause = AudioCapturePause;
622     hwCapture->common.control.Resume = AudioCaptureResume;
623     hwCapture->common.control.Flush = AudioCaptureFlush;
624     hwCapture->common.control.TurnStandbyMode = AudioCaptureTurnStandbyMode;
625     hwCapture->common.control.AudioDevDump = AudioCaptureAudioDevDump;
626     hwCapture->common.attr.GetFrameSize = AudioCaptureGetFrameSize;
627     hwCapture->common.attr.GetFrameCount = AudioCaptureGetFrameCount;
628     hwCapture->common.attr.SetSampleAttributes = AudioCaptureSetSampleAttributes;
629     hwCapture->common.attr.GetSampleAttributes = AudioCaptureGetSampleAttributes;
630     hwCapture->common.attr.GetCurrentChannelId = AudioCaptureGetCurrentChannelId;
631     hwCapture->common.attr.SetExtraParams = AudioCaptureSetExtraParams;
632     hwCapture->common.attr.GetExtraParams = AudioCaptureGetExtraParams;
633     hwCapture->common.attr.ReqMmapBuffer = AudioCaptureReqMmapBuffer;
634     hwCapture->common.attr.GetMmapPosition = AudioCaptureGetMmapPosition;
635     hwCapture->common.scene.CheckSceneCapability = AudioCaptureCheckSceneCapability;
636     hwCapture->common.scene.SelectScene = AudioCaptureSelectScene;
637     hwCapture->common.volume.SetMute = AudioCaptureSetMute;
638     hwCapture->common.volume.GetMute = AudioCaptureGetMute;
639     hwCapture->common.volume.SetVolume = AudioCaptureSetVolume;
640     hwCapture->common.volume.GetVolume = AudioCaptureGetVolume;
641     hwCapture->common.volume.GetGainThreshold = AudioCaptureGetGainThreshold;
642     hwCapture->common.volume.GetGain = AudioCaptureGetGain;
643     hwCapture->common.volume.SetGain = AudioCaptureSetGain;
644     hwCapture->common.CaptureFrame = AudioCaptureCaptureFrame;
645     hwCapture->common.GetCapturePosition = AudioCaptureGetCapturePosition;
646     return HDF_SUCCESS;
647 }
648 
InitHwCaptureParam(struct AudioHwCapture * hwCapture,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs)649 int32_t InitHwCaptureParam(struct AudioHwCapture *hwCapture, const struct AudioDeviceDescriptor *desc,
650                            const struct AudioSampleAttributes *attrs)
651 {
652     if (hwCapture == NULL || desc == NULL || attrs == NULL) {
653         LOG_FUN_ERR("InitHwCaptureParam param Is NULL");
654         return HDF_FAILURE;
655     }
656     int32_t ret = CheckParaDesc(desc, TYPE_CAPTURE);
657     if (ret != HDF_SUCCESS) {
658         return ret;
659     }
660     ret = CheckParaAttr(attrs);
661     if (ret != HDF_SUCCESS) {
662         return ret;
663     }
664     int32_t formatValue = -1;
665     ret = AttrFormatToBit(attrs, &formatValue);
666     if (ret != HDF_SUCCESS) {
667         return ret;
668     }
669     if (attrs->channelCount == 0) {
670         return HDF_FAILURE;
671     }
672     hwCapture->captureParam.captureMode.hwInfo.deviceDescript = *desc;
673     hwCapture->captureParam.frameCaptureMode.attrs = *attrs;
674     hwCapture->captureParam.captureMode.ctlParam.audioGain.gainMax = GAIN_MAX;  // init gainMax
675     hwCapture->captureParam.captureMode.ctlParam.audioGain.gainMin = 0;
676     hwCapture->captureParam.frameCaptureMode.frames = 0;
677     hwCapture->captureParam.frameCaptureMode.time.tvNSec = 0;
678     hwCapture->captureParam.frameCaptureMode.time.tvSec = 0;
679     hwCapture->captureParam.frameCaptureMode.byteRate = DEFAULT_RENDER_SAMPLING_RATE;
680     hwCapture->captureParam.frameCaptureMode.periodSize = DEEP_BUFFER_RENDER_PERIOD_SIZE;
681     hwCapture->captureParam.frameCaptureMode.periodCount = DEEP_BUFFER_RENDER_PERIOD_COUNT;
682     hwCapture->captureParam.frameCaptureMode.attrs.period = attrs->period;
683     hwCapture->captureParam.frameCaptureMode.attrs.frameSize = attrs->frameSize;
684     hwCapture->captureParam.frameCaptureMode.attrs.startThreshold = attrs->startThreshold;
685     hwCapture->captureParam.frameCaptureMode.attrs.stopThreshold = attrs->stopThreshold;
686     hwCapture->captureParam.frameCaptureMode.attrs.silenceThreshold = attrs->silenceThreshold;
687     hwCapture->captureParam.frameCaptureMode.attrs.isBigEndian = attrs->isBigEndian;
688     hwCapture->captureParam.frameCaptureMode.attrs.isSignedData = attrs->isSignedData;
689     /* Select Codec Mode */
690     if (hwCapture->captureParam.captureMode.hwInfo.deviceDescript.portId < AUDIO_SERVICE_PORTID_FLAG) {
691         hwCapture->captureParam.captureMode.hwInfo.card = AUDIO_SERVICE_IN;
692     } else {
693         hwCapture->captureParam.captureMode.hwInfo.card = AUDIO_SERVICE_OUT;
694     }
695     return HDF_SUCCESS;
696 }
697 
AudioReleaseCaptureHandle(struct AudioHwCapture * hwCapture)698 void AudioReleaseCaptureHandle(struct AudioHwCapture *hwCapture)
699 {
700     if (hwCapture == NULL) {
701         return;
702     }
703     CloseServiceCaptureSo *pCloseServiceCapture = AudioSoGetCloseServiceCapture();
704     if (pCloseServiceCapture == NULL || (*pCloseServiceCapture) == NULL) {
705         LOG_FUN_ERR("pCloseServiceCapture func not exist");
706         return;
707     }
708     if (hwCapture->devDataHandle != NULL) {
709         (*pCloseServiceCapture)(hwCapture->devDataHandle);
710         hwCapture->devDataHandle = NULL;
711     }
712     if (hwCapture->devCtlHandle != NULL) {
713         (*pCloseServiceCapture)(hwCapture->devCtlHandle);
714         hwCapture->devCtlHandle = NULL;
715     }
716     return;
717 }
718 
AudioAdapterCreateCapturePre(struct AudioHwCapture * hwCapture,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,struct AudioHwAdapter * hwAdapter)719 int32_t AudioAdapterCreateCapturePre(struct AudioHwCapture *hwCapture, const struct AudioDeviceDescriptor *desc,
720                                      const struct AudioSampleAttributes *attrs, struct AudioHwAdapter *hwAdapter)
721 {
722     if (hwCapture == NULL || desc == NULL || attrs == NULL || hwAdapter == NULL) {
723         LOG_FUN_ERR("Pointer Is Empty!");
724         return HDF_FAILURE;
725     }
726 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
727     PathSelAnalysisJson *pPathSelAnalysisJson = AudioSoGetPathSelAnalysisJson();
728     if (pPathSelAnalysisJson == NULL || *pPathSelAnalysisJson == NULL) {
729         LOG_FUN_ERR("PathSelAnalysisJson not exist");
730         return HDF_FAILURE;
731     }
732 #endif
733     if (GetAudioCaptureFunc(hwCapture) < 0) {
734         return HDF_FAILURE;
735     }
736     /* Fill hwCapture para */
737     if (InitHwCaptureParam(hwCapture, desc, attrs) < 0) {
738         return HDF_FAILURE;
739     }
740 
741 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
742     /* Select Path */
743     if ((*pPathSelAnalysisJson)((void *)&hwCapture->captureParam, CAPTURE_PATH_SELECT) < 0) {
744         LOG_FUN_ERR("Path Select Fail!");
745         return HDF_FAILURE;
746     }
747 #endif
748     if (hwAdapter->adapterDescriptor.adapterName == NULL) {
749         LOG_FUN_ERR("adapterName is NULL!");
750         return HDF_FAILURE;
751     }
752     uint32_t adapterNameLen = strlen(hwAdapter->adapterDescriptor.adapterName);
753     if (adapterNameLen == 0) {
754         LOG_FUN_ERR("adapterNameLen is null!");
755         return HDF_FAILURE;
756     }
757     /* Get Adapter name */
758     int32_t ret = strncpy_s(hwCapture->captureParam.captureMode.hwInfo.adapterName, NAME_LEN - 1,
759                             hwAdapter->adapterDescriptor.adapterName, adapterNameLen);
760     if (ret != EOK) {
761         LOG_FUN_ERR("copy fail");
762         return HDF_FAILURE;
763     }
764     return HDF_SUCCESS;
765 }
766 
AudioAdapterInterfaceLibModeCapture(struct AudioHwCapture * hwCapture)767 int32_t AudioAdapterInterfaceLibModeCapture(struct AudioHwCapture *hwCapture)
768 {
769     LOG_FUN_INFO();
770     if (hwCapture == NULL || hwCapture->devCtlHandle == NULL || hwCapture->devDataHandle == NULL) {
771         return HDF_FAILURE;
772     }
773     int32_t ret;
774     InterfaceLibModeCaptureSo *pInterfaceLibModeCapture = AudioSoGetInterfaceLibModeCapture();
775     if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
776         LOG_FUN_ERR("lib capture func not exist");
777         return HDF_FAILURE;
778     }
779     ret = (*pInterfaceLibModeCapture)(hwCapture->devDataHandle, &hwCapture->captureParam,
780                                       AUDIO_DRV_PCM_IOCTRL_CAPTURE_OPEN);
781     if (ret < 0) {
782         LOG_FUN_ERR("CAPTURE_OPEN FAIL");
783         return HDF_FAILURE;
784     }
785 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
786     /* Init CapturePathSelect send first */
787     ret = (*pInterfaceLibModeCapture)(hwCapture->devCtlHandle, &hwCapture->captureParam,
788                                               AUDIODRV_CTL_IOCTL_SCENESELECT_CAPTURE);
789     if (ret < 0) {
790         LOG_FUN_ERR("SetParams FAIL!");
791         return HDF_FAILURE;
792     }
793 #endif
794     ret = (*pInterfaceLibModeCapture)(hwCapture->devDataHandle, &hwCapture->captureParam,
795                                       AUDIO_DRV_PCM_IOCTL_HW_PARAMS);
796     if (ret < 0) {
797         LOG_FUN_ERR("AudioCaptureStart SetParams FAIL");
798         return HDF_FAILURE;
799     }
800     /* get volThreshold capture */
801     ret = (*pInterfaceLibModeCapture)(hwCapture->devCtlHandle, &hwCapture->captureParam,
802                                               AUDIODRV_CTL_IOCTL_VOL_THRESHOLD_CAPTURE);
803     if (ret < 0) {
804         LOG_FUN_ERR("SetParams FAIL!");
805         return HDF_FAILURE;
806     }
807 #ifdef AUDIO_HAL_USER
808 #else
809     ret = (*pInterfaceLibModeCapture)(hwCapture->devDataHandle, &hwCapture->captureParam,
810                                       AUDIO_DRV_PCM_IOCTL_PREPARE_CAPTURE);
811     if (ret < 0) {
812         LOG_FUN_ERR("AudioCaptureStart prepare FAIL");
813         return HDF_FAILURE;
814     }
815 #endif
816     return HDF_SUCCESS;
817 }
818 
AudioCaptureBindService(struct AudioHwCapture * hwCapture,BindServiceCaptureSo * pBindServiceCapture)819 int32_t AudioCaptureBindService(struct AudioHwCapture *hwCapture, BindServiceCaptureSo *pBindServiceCapture)
820 {
821     if (hwCapture == NULL || pBindServiceCapture == NULL || *pBindServiceCapture == NULL) {
822         return AUDIO_HAL_ERR_INVALID_PARAM;
823     }
824     hwCapture->devDataHandle = (*pBindServiceCapture)(CAPTURE_CMD);
825     if (hwCapture->devDataHandle == NULL) {
826         LOG_FUN_ERR("Capture bind service failed");
827         return AUDIO_HAL_ERR_INTERNAL;
828     }
829     hwCapture->devCtlHandle = (*pBindServiceCapture)(CTRL_CMD);
830     if (hwCapture->devCtlHandle == NULL) {
831         LOG_FUN_ERR("Capture bind service failed");
832         return AUDIO_HAL_ERR_INTERNAL;
833     }
834     int32_t ret = AudioAdapterInterfaceLibModeCapture(hwCapture);
835     if (ret != 0) {
836         LOG_FUN_ERR("AudioAdapterInterfaceLibModeCapture failed");
837         return AUDIO_HAL_ERR_INTERNAL;
838     }
839     return AUDIO_HAL_SUCCESS;
840 }
841 
AudioAdapterCreateCapture(struct AudioAdapter * adapter,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,struct AudioCapture ** capture)842 int32_t AudioAdapterCreateCapture(struct AudioAdapter *adapter, const struct AudioDeviceDescriptor *desc,
843                                   const struct AudioSampleAttributes *attrs, struct AudioCapture **capture)
844 {
845     int32_t ret = AudioCheckAdapterAddr((AudioHandle)adapter);
846     if (ret < 0) {
847         LOG_FUN_ERR("The adapter address passed in is invalid");
848         return ret;
849     }
850     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
851     if (hwAdapter == NULL || desc == NULL || attrs == NULL || capture == NULL) {
852         return AUDIO_HAL_ERR_INVALID_PARAM;
853     }
854     if (hwAdapter->adapterMgrCaptureFlag > 0) {
855         LOG_FUN_ERR("Create capture repeatedly!");
856         return AUDIO_HAL_ERR_INTERNAL;
857     }
858     BindServiceCaptureSo *pBindServiceCapture = AudioSoGetBindServiceCapture();
859     if (pBindServiceCapture == NULL || *pBindServiceCapture == NULL) {
860         LOG_FUN_ERR("lib capture func not exist");
861         return AUDIO_HAL_ERR_INTERNAL;
862     }
863     struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)calloc(1, sizeof(*hwCapture));
864     if (hwCapture == NULL) {
865         LOG_FUN_ERR("calloc AudioHwCapture failed!");
866         return AUDIO_HAL_ERR_MALLOC_FAIL;
867     }
868     ret = AudioAdapterCreateCapturePre(hwCapture, desc, attrs, hwAdapter);
869     if (ret != 0) {
870         LOG_FUN_ERR("AudioAdapterCreateCapturePre fail");
871         AudioMemFree((void **)&hwCapture);
872         return AUDIO_HAL_ERR_INTERNAL;
873     }
874     ret = AudioCaptureBindService(hwCapture, pBindServiceCapture);
875     if (ret < 0) {
876         LOG_FUN_ERR("AudioCaptureBindService fail");
877         AudioReleaseCaptureHandle(hwCapture);
878         AudioMemFree((void **)&hwCapture);
879         return ret;
880     }
881     ret = AudioAddCaptureAddrToList((AudioHandle)(&hwCapture->common));
882     if (ret < 0) {
883         LOG_FUN_ERR("The capture address get is invalid");
884         AudioReleaseCaptureHandle(hwCapture);
885         AudioMemFree((void **)&hwCapture);
886         return ret;
887     }
888     *capture = &hwCapture->common;
889     hwAdapter->adapterMgrCaptureFlag++;
890     return AUDIO_HAL_SUCCESS;
891 }
892 
AudioAdapterDestroyCapture(struct AudioAdapter * adapter,struct AudioCapture * capture)893 int32_t AudioAdapterDestroyCapture(struct AudioAdapter *adapter, struct AudioCapture *capture)
894 {
895     int32_t ret = AudioCheckAdapterAddr((AudioHandle)adapter);
896     if (ret < 0) {
897         LOG_FUN_ERR("The adapter address passed in is invalid");
898         return ret;
899     }
900     ret = AudioCheckCaptureAddr((AudioHandle)capture);
901     if (ret < 0) {
902         LOG_FUN_ERR("The capture address passed in is invalid");
903         return ret;
904     }
905     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
906     if (hwAdapter == NULL || capture == NULL) {
907         return AUDIO_HAL_ERR_INVALID_PARAM;
908     }
909     if (hwAdapter->adapterMgrCaptureFlag > 0) {
910         hwAdapter->adapterMgrCaptureFlag--;
911     }
912     struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)capture;
913     if (hwCapture == NULL) {
914         return AUDIO_HAL_ERR_INTERNAL;
915     }
916     if (hwCapture->captureParam.frameCaptureMode.buffer != NULL) {
917         ret = capture->control.Stop((AudioHandle)capture);
918         if (ret < 0) {
919             LOG_FUN_ERR("capture Stop failed");
920         }
921     }
922     InterfaceLibModeCaptureSo *pInterfaceLibModeCapture = AudioSoGetInterfaceLibModeCapture();
923     if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
924         LOG_FUN_ERR("lib capture func not exist");
925         return HDF_FAILURE;
926     }
927     ret = (*pInterfaceLibModeCapture)(hwCapture->devDataHandle, &hwCapture->captureParam,
928                                       AUDIO_DRV_PCM_IOCTRL_CAPTURE_CLOSE);
929     if (ret < 0) {
930         LOG_FUN_ERR("CAPTURE_CLOSE FAIL");
931     }
932     if (AudioDelCaptureAddrFromList((AudioHandle)capture)) {
933         LOG_FUN_ERR("adapter or capture not in MgrList");
934     }
935     AudioReleaseCaptureHandle(hwCapture);
936     AudioMemFree((void **)&hwCapture->captureParam.frameCaptureMode.buffer);
937     for (int i = 0; i < ERROR_LOG_MAX_NUM; i++) {
938         AudioMemFree((void **)&hwCapture->errorLog.errorDump[i].reason);
939         AudioMemFree((void **)&hwCapture->errorLog.errorDump[i].currentTime);
940     }
941     AudioMemFree((void **)&capture);
942     return AUDIO_HAL_SUCCESS;
943 }
944 
AudioAdapterGetPortCapability(struct AudioAdapter * adapter,const struct AudioPort * port,struct AudioPortCapability * capability)945 int32_t AudioAdapterGetPortCapability(struct AudioAdapter *adapter, const struct AudioPort *port,
946                                       struct AudioPortCapability *capability)
947 {
948     int32_t ret = AudioCheckAdapterAddr((AudioHandle)adapter);
949     if (ret < 0) {
950         LOG_FUN_ERR("The adapter address passed in is invalid");
951         return ret;
952     }
953     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
954     if (hwAdapter == NULL || port == NULL || port->portName == NULL || capability == NULL) {
955         return AUDIO_HAL_ERR_INVALID_PARAM;
956     }
957     struct AudioPortAndCapability *hwAdapterPortCapabilitys = hwAdapter->portCapabilitys;
958     if (hwAdapterPortCapabilitys == NULL) {
959         LOG_FUN_ERR("hwAdapter portCapabilitys is NULL!");
960         return AUDIO_HAL_ERR_INTERNAL;
961     }
962     int32_t portNum = hwAdapter->adapterDescriptor.portNum;
963     while (hwAdapterPortCapabilitys != NULL && portNum) {
964         if (hwAdapterPortCapabilitys->port.portId == port->portId) {
965             *capability = hwAdapterPortCapabilitys->capability;
966             return AUDIO_HAL_SUCCESS;
967         }
968         hwAdapterPortCapabilitys++;
969         portNum--;
970     }
971     return AUDIO_HAL_ERR_INTERNAL;
972 }
973 
AudioAdapterSetPassthroughMode(struct AudioAdapter * adapter,const struct AudioPort * port,enum AudioPortPassthroughMode mode)974 int32_t AudioAdapterSetPassthroughMode(struct AudioAdapter *adapter,
975                                        const struct AudioPort *port, enum AudioPortPassthroughMode mode)
976 {
977     int32_t ret = AudioCheckAdapterAddr(adapter);
978     if (ret < 0) {
979         LOG_FUN_ERR("The adapter address passed in is invalid");
980         return ret;
981     }
982     if (adapter == NULL || port == NULL || port->portName == NULL) {
983         return AUDIO_HAL_ERR_INVALID_PARAM;
984     }
985     if (port->dir != PORT_OUT || port->portId < 0 || strcmp(port->portName, "AOP") != 0) {
986         return AUDIO_HAL_ERR_INTERNAL;
987     }
988     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
989     if (hwAdapter->portCapabilitys == NULL) {
990         LOG_FUN_ERR("The pointer is null!");
991         return AUDIO_HAL_ERR_INTERNAL;
992     }
993     struct AudioPortAndCapability *portCapabilityTemp = hwAdapter->portCapabilitys;
994     struct AudioPortCapability *portCapability = NULL;
995     int32_t portNum = hwAdapter->adapterDescriptor.portNum;
996     while (portCapabilityTemp != NULL && portNum > 0) {
997         if (portCapabilityTemp->port.portId == port->portId) {
998             portCapability = &portCapabilityTemp->capability;
999             break;
1000         }
1001         portCapabilityTemp++;
1002         portNum--;
1003     }
1004     if (portCapability == NULL || portNum <= 0) {
1005         LOG_FUN_ERR("hwAdapter portCapabilitys is Not Find!");
1006         return AUDIO_HAL_ERR_INTERNAL;
1007     }
1008     struct AudioSubPortCapability *subPortCapability = portCapability->subPorts;
1009     if (subPortCapability == NULL) {
1010         LOG_FUN_ERR("portCapability->subPorts is NULL!");
1011         return AUDIO_HAL_ERR_INTERNAL;
1012     }
1013     int32_t subPortNum = portCapability->subPortsNum;
1014     while (subPortCapability != NULL && subPortNum > 0) {
1015         if (subPortCapability->mask == mode) {
1016             portCapabilityTemp->mode = mode;
1017             break;
1018         }
1019         subPortCapability++;
1020         subPortNum--;
1021     }
1022     if (subPortNum > 0) {
1023         return AUDIO_HAL_SUCCESS;
1024     }
1025     return AUDIO_HAL_ERR_INTERNAL;
1026 }
1027 
AudioAdapterGetPassthroughMode(struct AudioAdapter * adapter,const struct AudioPort * port,enum AudioPortPassthroughMode * mode)1028 int32_t AudioAdapterGetPassthroughMode(struct AudioAdapter *adapter, const struct AudioPort *port,
1029                                        enum AudioPortPassthroughMode *mode)
1030 {
1031     int32_t ret = AudioCheckAdapterAddr(adapter);
1032     if (ret < 0) {
1033         LOG_FUN_ERR("The adapter address passed in is invalid");
1034         return ret;
1035     }
1036     if (adapter == NULL || port == NULL || port->portName == NULL || mode == NULL) {
1037         return AUDIO_HAL_ERR_INVALID_PARAM;
1038     }
1039     if (port->dir != PORT_OUT || port->portId < 0 || strcmp(port->portName, "AOP") != 0) {
1040         return AUDIO_HAL_ERR_INTERNAL;
1041     }
1042     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
1043     if (hwAdapter->portCapabilitys == NULL) {
1044         LOG_FUN_ERR("portCapabilitys pointer is null!");
1045         return AUDIO_HAL_ERR_INTERNAL;
1046     }
1047     struct AudioPortAndCapability *portCapabilitys = hwAdapter->portCapabilitys;
1048     int32_t portNum = hwAdapter->adapterDescriptor.portNum;
1049     while (portCapabilitys != NULL && portNum > 0) {
1050         if (portCapabilitys->port.portId == port->portId) {
1051             *mode = portCapabilitys->mode;
1052             return AUDIO_HAL_SUCCESS;
1053         }
1054         portCapabilitys++;
1055         portNum--;
1056     }
1057     return AUDIO_HAL_ERR_INTERNAL;
1058 }
1059