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