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