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