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