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