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