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