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