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 <math.h>
17 #include <sys/mman.h>
18 #include "hdf_types.h"
19 #include "osal_mem.h"
20 #include "audio_adapter_info_common.h"
21 #include "audio_common.h"
22 #include "audio_interface_lib_capture.h"
23 #include "audio_internal.h"
24 #include "audio_uhdf_log.h"
25 #include "v1_0/iaudio_capture.h"
26
27 #define HDF_LOG_TAG AUDIO_HDI_IMPL
28
29 #define FRAME_SIZE 1024
30 #define CONFIG_FRAME_SIZE ((FRAME_SIZE) * 2)
31
32 #define CONFIG_FRAME_COUNT ((8000 * 2 + ((CONFIG_FRAME_SIZE) - 1)) / (CONFIG_FRAME_SIZE))
33 #define BITS_TO_FROMAT 3
34 #define VOLUME_AVERAGE 2
35 #define INTEGER_TO_DEC 10
36 #define DECIMAL_PART 5
37
38 /* add For Capture Bytes To Frames */
AudioCaptureStart(struct IAudioCapture * handle)39 int32_t AudioCaptureStart(struct IAudioCapture *handle)
40 {
41 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
42 if (hwCapture == NULL) {
43 AUDIO_FUNC_LOGE("The hwCapture is NULL");
44 return AUDIO_ERR_INVALID_PARAM;
45 }
46
47 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
48 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
49 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
50 return AUDIO_ERR_INTERNAL;
51 }
52 if (hwCapture->captureParam.frameCaptureMode.buffer != NULL) {
53 AUDIO_FUNC_LOGE("IAudioCapture already start!");
54 return AUDIO_ERR_AI_BUSY; // capture is busy now
55 }
56 if (hwCapture->devDataHandle == NULL) {
57 AUDIO_FUNC_LOGE("CaptureStart Bind Fail!");
58 return AUDIO_ERR_INTERNAL;
59 }
60
61 int32_t ret = (*pInterfaceLibModeCapture)(
62 hwCapture->devDataHandle, &hwCapture->captureParam, AUDIO_DRV_PCM_IOCTRL_START_CAPTURE);
63 if (ret < 0) {
64 AUDIO_FUNC_LOGE("AudioCaptureStart SetParams FAIL");
65 return AUDIO_ERR_INTERNAL;
66 }
67
68 char *tbuffer = (char *)OsalMemCalloc(FRAME_DATA);
69 if (tbuffer == NULL) {
70 AUDIO_FUNC_LOGE("Calloc Capture tbuffer Fail!");
71 return AUDIO_ERR_MALLOC_FAIL;
72 }
73
74 hwCapture->captureParam.frameCaptureMode.buffer = tbuffer;
75
76 AudioLogRecord(AUDIO_INFO, "[%s]-[%s]-[%d] :> [%s]", __FILE__, __func__, __LINE__, "Audio Capture Start");
77 return AUDIO_SUCCESS;
78 }
79
AudioCaptureStop(struct IAudioCapture * handle)80 int32_t AudioCaptureStop(struct IAudioCapture *handle)
81 {
82 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
83 if (hwCapture == NULL) {
84 AUDIO_FUNC_LOGE("hwCapture is null");
85 return AUDIO_ERR_INVALID_PARAM;
86 }
87 if (hwCapture->devDataHandle == NULL) {
88 AUDIO_FUNC_LOGE("CaptureStart Bind Fail!");
89 return AUDIO_ERR_INTERNAL;
90 }
91 if (hwCapture->captureParam.frameCaptureMode.buffer != NULL) {
92 AudioMemFree((void **)&hwCapture->captureParam.frameCaptureMode.buffer);
93 } else {
94 AUDIO_FUNC_LOGE("Repeat invalid stop operation!");
95 return AUDIO_ERR_NOT_SUPPORT;
96 }
97
98 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
99 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
100 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
101 return AUDIO_ERR_INTERNAL;
102 }
103
104 int32_t ret = (*pInterfaceLibModeCapture)(
105 hwCapture->devDataHandle, &hwCapture->captureParam, AUDIO_DRV_PCM_IOCTRL_STOP_CAPTURE);
106 if (ret < 0) {
107 AUDIO_FUNC_LOGE("AudioCaptureStop SetParams FAIL");
108 return AUDIO_ERR_INTERNAL;
109 }
110
111 AudioLogRecord(AUDIO_INFO, "[%s]-[%s]-[%d] :> [%s]", __FILE__, __func__, __LINE__, "Audio Capture Stop");
112 return AUDIO_SUCCESS;
113 }
114
AudioCapturePause(struct IAudioCapture * handle)115 int32_t AudioCapturePause(struct IAudioCapture *handle)
116 {
117 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
118 if (hwCapture == NULL) {
119 AUDIO_FUNC_LOGE("hwCapture is empty");
120 return AUDIO_ERR_INVALID_PARAM;
121 }
122 if (hwCapture->captureParam.frameCaptureMode.buffer == NULL) {
123 AUDIO_FUNC_LOGE("IAudioCapture already stop!");
124 return AUDIO_ERR_INTERNAL;
125 }
126 if (hwCapture->captureParam.captureMode.ctlParam.pause) {
127 AUDIO_FUNC_LOGE("Audio capture is already pause!");
128 return AUDIO_ERR_NOT_SUPPORT;
129 }
130 if (hwCapture->devDataHandle == NULL) {
131 AUDIO_FUNC_LOGE("CaptureStart Bind Fail!");
132 return AUDIO_ERR_INTERNAL;
133 }
134
135 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
136 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
137 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
138 return AUDIO_ERR_INTERNAL;
139 }
140
141 bool pauseStatus = hwCapture->captureParam.captureMode.ctlParam.pause;
142 hwCapture->captureParam.captureMode.ctlParam.pause = true;
143
144 int32_t ret = (*pInterfaceLibModeCapture)(
145 hwCapture->devDataHandle, &hwCapture->captureParam, AUDIODRV_CTL_IOCTL_PAUSE_WRITE_CAPTURE);
146 if (ret < 0) {
147 AUDIO_FUNC_LOGE("Audio Capture Pause FAIL!");
148 hwCapture->captureParam.captureMode.ctlParam.pause = pauseStatus;
149 return AUDIO_ERR_INTERNAL;
150 }
151
152 AudioLogRecord(AUDIO_INFO, "[%s]-[%s]-[%d] :> [%s]", __FILE__, __func__, __LINE__, "Audio Capture Pause");
153 return AUDIO_SUCCESS;
154 }
155
AudioCaptureResume(struct IAudioCapture * handle)156 int32_t AudioCaptureResume(struct IAudioCapture *handle)
157 {
158 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
159 if (hwCapture == NULL) {
160 AUDIO_FUNC_LOGE("hwCapture is empty");
161 return AUDIO_ERR_INVALID_PARAM;
162 }
163 if (!hwCapture->captureParam.captureMode.ctlParam.pause) {
164 AUDIO_FUNC_LOGE("Audio capture is already Resume !");
165 return AUDIO_ERR_NOT_SUPPORT;
166 }
167 if (hwCapture->devDataHandle == NULL) {
168 AUDIO_FUNC_LOGE("Capture Start Bind Fail!");
169 return AUDIO_ERR_INTERNAL;
170 }
171
172 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
173 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
174 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
175 return AUDIO_ERR_INTERNAL;
176 }
177
178 bool resumeStatus = hwCapture->captureParam.captureMode.ctlParam.pause;
179 hwCapture->captureParam.captureMode.ctlParam.pause = false;
180
181 int32_t ret = (*pInterfaceLibModeCapture)(
182 hwCapture->devDataHandle, &hwCapture->captureParam, AUDIODRV_CTL_IOCTL_PAUSE_WRITE_CAPTURE);
183 if (ret < 0) {
184 AUDIO_FUNC_LOGE("Audio capture Resume FAIL!");
185 hwCapture->captureParam.captureMode.ctlParam.pause = resumeStatus;
186 return AUDIO_ERR_INTERNAL;
187 }
188
189 AudioLogRecord(AUDIO_INFO, "[%s]-[%s]-[%d] :> [%s]", __FILE__, __func__, __LINE__, "Audio Capture Resume");
190 return AUDIO_SUCCESS;
191 }
192
AudioCaptureFlush(struct IAudioCapture * handle)193 int32_t AudioCaptureFlush(struct IAudioCapture *handle)
194 {
195 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
196 if (hwCapture == NULL) {
197 AUDIO_FUNC_LOGE("hwCapture is empty");
198 return AUDIO_ERR_INVALID_PARAM;
199 }
200 return AUDIO_ERR_NOT_SUPPORT;
201 }
202
AudioCaptureGetFrameSize(struct IAudioCapture * handle,uint64_t * size)203 int32_t AudioCaptureGetFrameSize(struct IAudioCapture *handle, uint64_t *size)
204 {
205 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
206 if (hwCapture == NULL || size == NULL) {
207 AUDIO_FUNC_LOGE("Parameter error!");
208 return AUDIO_ERR_INVALID_PARAM;
209 }
210
211 uint32_t channelCount = hwCapture->captureParam.frameCaptureMode.attrs.channelCount;
212 enum AudioFormat format = hwCapture->captureParam.frameCaptureMode.attrs.format;
213 uint32_t formatBitsCapture = 0;
214
215 int32_t ret = FormatToBits(format, &formatBitsCapture);
216 if (ret != AUDIO_SUCCESS) {
217 return ret;
218 }
219
220 *size = FRAME_SIZE * channelCount * (formatBitsCapture >> BITS_TO_FROMAT);
221 return AUDIO_SUCCESS;
222 }
223
AudioCaptureGetFrameCount(struct IAudioCapture * handle,uint64_t * count)224 int32_t AudioCaptureGetFrameCount(struct IAudioCapture *handle, uint64_t *count)
225 {
226 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
227 if (hwCapture == NULL || count == NULL) {
228 AUDIO_FUNC_LOGE("Parameter error!");
229 return AUDIO_ERR_INVALID_PARAM;
230 }
231
232 *count = hwCapture->captureParam.frameCaptureMode.frames;
233 return AUDIO_SUCCESS;
234 }
235
AudioCaptureSetSampleAttributes(struct IAudioCapture * handle,const struct AudioSampleAttributes * attrs)236 int32_t AudioCaptureSetSampleAttributes(struct IAudioCapture *handle, const struct AudioSampleAttributes *attrs)
237 {
238 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
239 if (hwCapture == NULL || attrs == NULL) {
240 AUDIO_FUNC_LOGE("Parameter error!");
241 return AUDIO_ERR_INVALID_PARAM;
242 }
243
244 int32_t ret = AudioCheckParaAttr(attrs);
245 if (ret != AUDIO_SUCCESS) {
246 AUDIO_FUNC_LOGE("AudioCheckParaAttr error!");
247 return ret;
248 }
249
250 struct AudioSampleAttributes tempAttrs = hwCapture->captureParam.frameCaptureMode.attrs;
251 hwCapture->captureParam.frameCaptureMode.attrs = *attrs;
252
253 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
254 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
255 hwCapture->captureParam.frameCaptureMode.attrs = tempAttrs;
256 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
257 return AUDIO_ERR_INTERNAL;
258 }
259 if (hwCapture->devDataHandle == NULL) {
260 hwCapture->captureParam.frameCaptureMode.attrs = tempAttrs;
261 return AUDIO_ERR_INTERNAL;
262 }
263
264 ret = (*pInterfaceLibModeCapture)
265 (hwCapture->devDataHandle, &hwCapture->captureParam, AUDIO_DRV_PCM_IOCTL_HW_PARAMS);
266 if (ret < 0) {
267 AUDIO_FUNC_LOGE("CaptureSetSampleAttributes FAIL");
268 hwCapture->captureParam.frameCaptureMode.attrs = tempAttrs;
269 return AUDIO_ERR_INTERNAL;
270 }
271 return AUDIO_SUCCESS;
272 }
273
AudioCaptureGetSampleAttributes(struct IAudioCapture * handle,struct AudioSampleAttributes * attrs)274 int32_t AudioCaptureGetSampleAttributes(struct IAudioCapture *handle, struct AudioSampleAttributes *attrs)
275 {
276 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
277 if (hwCapture == NULL || attrs == NULL) {
278 AUDIO_FUNC_LOGE("Parameter error!");
279 return AUDIO_ERR_INVALID_PARAM;
280 }
281 attrs->format = hwCapture->captureParam.frameCaptureMode.attrs.format;
282 attrs->sampleRate = hwCapture->captureParam.frameCaptureMode.attrs.sampleRate;
283 attrs->channelCount = hwCapture->captureParam.frameCaptureMode.attrs.channelCount;
284 attrs->interleaved = hwCapture->captureParam.frameCaptureMode.attrs.interleaved;
285 attrs->type = hwCapture->captureParam.frameCaptureMode.attrs.type;
286 attrs->period = hwCapture->captureParam.frameCaptureMode.attrs.period;
287 attrs->frameSize = hwCapture->captureParam.frameCaptureMode.attrs.frameSize;
288 attrs->isBigEndian = hwCapture->captureParam.frameCaptureMode.attrs.isBigEndian;
289 attrs->isSignedData = hwCapture->captureParam.frameCaptureMode.attrs.isSignedData;
290 attrs->startThreshold = hwCapture->captureParam.frameCaptureMode.attrs.startThreshold;
291 attrs->stopThreshold = hwCapture->captureParam.frameCaptureMode.attrs.stopThreshold;
292 attrs->silenceThreshold = hwCapture->captureParam.frameCaptureMode.attrs.silenceThreshold;
293 return AUDIO_SUCCESS;
294 }
295
AudioCaptureGetCurrentChannelId(struct IAudioCapture * handle,uint32_t * channelId)296 int32_t AudioCaptureGetCurrentChannelId(struct IAudioCapture *handle, uint32_t *channelId)
297 {
298 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
299 if (hwCapture == NULL || channelId == NULL) {
300 AUDIO_FUNC_LOGE("Parameter error!");
301 return AUDIO_ERR_INVALID_PARAM;
302 }
303
304 *channelId = hwCapture->captureParam.frameCaptureMode.attrs.channelCount;
305 return AUDIO_SUCCESS;
306 }
307
AudioCaptureCheckSceneCapability(struct IAudioCapture * handle,const struct AudioSceneDescriptor * scene,bool * supported)308 int32_t AudioCaptureCheckSceneCapability(
309 struct IAudioCapture *handle, const struct AudioSceneDescriptor *scene, bool *supported)
310 {
311 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
312 if (hwCapture == NULL || scene == NULL || supported == NULL) {
313 AUDIO_FUNC_LOGE("Parameter error!");
314 return AUDIO_ERR_INVALID_PARAM;
315 }
316 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
317 *supported = false;
318 /* Temporary storage does not save the structure */
319 struct AudioHwCaptureParam captureParam = hwCapture->captureParam;
320 captureParam.frameCaptureMode.attrs.type = (enum AudioCategory)scene->scene.id;
321 captureParam.captureMode.hwInfo.deviceDescript.pins = scene->desc.pins;
322
323 PathSelAnalysisJson *pPathSelAnalysisJson = AudioPassthroughGetPathSelAnalysisJson();
324 if (pPathSelAnalysisJson == NULL || *pPathSelAnalysisJson == NULL) {
325 AUDIO_FUNC_LOGE("pPathSelAnalysisJson Is NULL!");
326 return AUDIO_ERR_NOT_SUPPORT;
327 }
328
329 int32_t ret = (*pPathSelAnalysisJson)((void *)&captureParam, CHECKSCENE_PATH_SELECT_CAPTURE);
330 if (ret < 0) {
331 if (ret == AUDIO_ERR_NOT_SUPPORT) {
332 AUDIO_FUNC_LOGE("AudioCaptureCheckSceneCapability not Support!");
333 return AUDIO_ERR_NOT_SUPPORT;
334 } else {
335 AUDIO_FUNC_LOGE("AudioCaptureCheckSceneCapability fail!");
336 return AUDIO_ERR_INTERNAL;
337 }
338 }
339 *supported = true;
340 return AUDIO_SUCCESS;
341 #else
342 return AUDIO_ERR_NOT_SUPPORT;
343 #endif
344 }
345
AudioCaptureSelectScene(struct IAudioCapture * handle,const struct AudioSceneDescriptor * scene)346 int32_t AudioCaptureSelectScene(struct IAudioCapture *handle, const struct AudioSceneDescriptor *scene)
347 {
348 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
349 if (hwCapture == NULL || scene == NULL) {
350 AUDIO_FUNC_LOGE("Parameter error!");
351 return AUDIO_ERR_INVALID_PARAM;
352 }
353 if (hwCapture->devCtlHandle == NULL) {
354 AUDIO_FUNC_LOGE("CaptureSelectScene Bind Fail!");
355 return AUDIO_ERR_INTERNAL;
356 }
357 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
358 PathSelAnalysisJson *pPathSelAnalysisJson = AudioPassthroughGetPathSelAnalysisJson();
359 if (pPathSelAnalysisJson == NULL || *pPathSelAnalysisJson == NULL) {
360 AUDIO_FUNC_LOGE("pPathSelAnalysisJson Is NULL!");
361 return AUDIO_ERR_NOT_SUPPORT;
362 }
363
364 enum AudioCategory typeTemp = hwCapture->captureParam.frameCaptureMode.attrs.type;
365 enum AudioPortPin pinsTemp = hwCapture->captureParam.captureMode.hwInfo.deviceDescript.pins;
366
367 hwCapture->captureParam.frameCaptureMode.attrs.type = (enum AudioCategory)(scene->scene.id);
368 hwCapture->captureParam.captureMode.hwInfo.deviceDescript.pins = scene->desc.pins;
369 if ((*pPathSelAnalysisJson)((void *)&hwCapture->captureParam, CAPTURE_PATH_SELECT) < 0) {
370 AUDIO_FUNC_LOGE("AudioCaptureSelectScene Fail!");
371 hwCapture->captureParam.frameCaptureMode.attrs.type = typeTemp;
372 hwCapture->captureParam.captureMode.hwInfo.deviceDescript.pins = pinsTemp;
373 return AUDIO_ERR_INTERNAL;
374 }
375
376 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
377 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
378 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Is NULL");
379 hwCapture->captureParam.frameCaptureMode.attrs.type = typeTemp;
380 hwCapture->captureParam.captureMode.hwInfo.deviceDescript.pins = pinsTemp;
381 return AUDIO_ERR_INTERNAL;
382 }
383
384 int32_t ret = (*pInterfaceLibModeCapture)(
385 hwCapture->devCtlHandle, &hwCapture->captureParam, AUDIODRV_CTL_IOCTL_SCENESELECT_CAPTURE);
386 if (ret < 0) {
387 AUDIO_FUNC_LOGE("SetSelectSceneParams FAIL!");
388 hwCapture->captureParam.frameCaptureMode.attrs.type = typeTemp;
389 hwCapture->captureParam.captureMode.hwInfo.deviceDescript.pins = pinsTemp;
390 return AUDIO_ERR_INTERNAL;
391 }
392 return AUDIO_SUCCESS;
393 #else
394 return AUDIO_ERR_NOT_SUPPORT;
395 #endif
396 }
397
AudioCaptureSetMute(struct IAudioCapture * handle,bool mute)398 int32_t AudioCaptureSetMute(struct IAudioCapture *handle, bool mute)
399 {
400 struct AudioHwCapture *impl = (struct AudioHwCapture *)handle;
401 if (impl == NULL) {
402 AUDIO_FUNC_LOGE("Parameter error!");
403 return AUDIO_ERR_INVALID_PARAM;
404 }
405 if (impl->devCtlHandle == NULL) {
406 AUDIO_FUNC_LOGE("CaptureSetMute Bind Fail!");
407 return AUDIO_ERR_INTERNAL;
408 }
409
410 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
411 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
412 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
413 return AUDIO_ERR_INTERNAL;
414 }
415
416 bool muteStatus = impl->captureParam.captureMode.ctlParam.mute;
417 impl->captureParam.captureMode.ctlParam.mute = mute;
418
419 int32_t ret =
420 (*pInterfaceLibModeCapture)(impl->devCtlHandle, &impl->captureParam, AUDIODRV_CTL_IOCTL_MUTE_WRITE_CAPTURE);
421 if (ret < 0) {
422 AUDIO_FUNC_LOGE("SetMute SetParams FAIL");
423 impl->captureParam.captureMode.ctlParam.mute = muteStatus;
424 return AUDIO_ERR_INTERNAL;
425 }
426
427 AudioLogRecord(AUDIO_INFO, "[%s]-[%s]-[%d] :> [Setmute = %d]", __FILE__, __func__, __LINE__, mute);
428 return AUDIO_SUCCESS;
429 }
430
AudioCaptureGetMute(struct IAudioCapture * handle,bool * mute)431 int32_t AudioCaptureGetMute(struct IAudioCapture *handle, bool *mute)
432 {
433 struct AudioHwCapture *impl = (struct AudioHwCapture *)handle;
434 if (impl == NULL || mute == NULL) {
435 AUDIO_FUNC_LOGE("Parameter error!");
436 return AUDIO_ERR_INVALID_PARAM;
437 }
438 if (impl->devCtlHandle == NULL) {
439 AUDIO_FUNC_LOGE("CaptureGetMute Bind Fail!");
440 return AUDIO_ERR_INTERNAL;
441 }
442
443 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
444 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
445 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
446 return AUDIO_ERR_INTERNAL;
447 }
448
449 int32_t ret =
450 (*pInterfaceLibModeCapture)(impl->devCtlHandle, &impl->captureParam, AUDIODRV_CTL_IOCTL_MUTE_READ_CAPTURE);
451 if (ret < 0) {
452 AUDIO_FUNC_LOGE("GetMute SetParams FAIL");
453 return AUDIO_ERR_INTERNAL;
454 }
455
456 *mute = impl->captureParam.captureMode.ctlParam.mute;
457
458 AUDIO_FUNC_LOGI("Get Mute SUCCESS!");
459 return AUDIO_SUCCESS;
460 }
461
AudioCaptureSetVolume(struct IAudioCapture * handle,float volume)462 int32_t AudioCaptureSetVolume(struct IAudioCapture *handle, float volume)
463 {
464 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
465 if (hwCapture == NULL) {
466 AUDIO_FUNC_LOGE("Parameter error!");
467 return AUDIO_ERR_INVALID_PARAM;
468 }
469
470 float volumeTemp = hwCapture->captureParam.captureMode.ctlParam.volume;
471 float volMax = (float)hwCapture->captureParam.captureMode.ctlParam.volThreshold.volMax;
472 float volMin = (float)hwCapture->captureParam.captureMode.ctlParam.volThreshold.volMin;
473 if (hwCapture->devCtlHandle == NULL) {
474 AUDIO_FUNC_LOGE("Bind Fail!");
475 return AUDIO_ERR_INTERNAL;
476 }
477 if (volume < 0 || volume > 1) {
478 AUDIO_FUNC_LOGE("volume param Is error!");
479 return AUDIO_ERR_INVALID_PARAM;
480 }
481
482 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
483 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
484 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
485 return AUDIO_ERR_INTERNAL;
486 }
487
488 volume = (volume == 0) ? 1 : (volume * VOLUME_CHANGE);
489
490 /* change volume to db */
491 float volTemp = ((volMax - volMin) / 2) * log10(volume) + volMin;
492 if (volTemp < volMin || volTemp > volMax) {
493 AUDIO_FUNC_LOGE("volTemp fail");
494 return AUDIO_ERR_INTERNAL;
495 }
496
497 hwCapture->captureParam.captureMode.ctlParam.volume = volTemp;
498
499 int32_t ret = (*pInterfaceLibModeCapture)(
500 hwCapture->devCtlHandle, &hwCapture->captureParam, AUDIODRV_CTL_IOCTL_ELEM_WRITE_CAPTURE);
501 if (ret < 0) {
502 AUDIO_FUNC_LOGE("SetParams FAIL!");
503 hwCapture->captureParam.captureMode.ctlParam.volume = volumeTemp;
504 return AUDIO_ERR_INTERNAL;
505 }
506 return AUDIO_SUCCESS;
507 }
508
AudioCaptureGetVolume(struct IAudioCapture * handle,float * volume)509 int32_t AudioCaptureGetVolume(struct IAudioCapture *handle, float *volume)
510 {
511 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
512 if (hwCapture == NULL || volume == NULL) {
513 AUDIO_FUNC_LOGE("Parameter error!");
514 return AUDIO_ERR_INVALID_PARAM;
515 }
516
517 if (hwCapture->devCtlHandle == NULL) {
518 AUDIO_FUNC_LOGE("CaptureStart Bind Fail!");
519 return AUDIO_ERR_INTERNAL;
520 }
521
522 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
523 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
524 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
525 return AUDIO_ERR_INTERNAL;
526 }
527
528 int32_t ret = (*pInterfaceLibModeCapture)(
529 hwCapture->devCtlHandle, &hwCapture->captureParam, AUDIODRV_CTL_IOCTL_ELEM_READ_CAPTURE);
530 if (ret < 0) {
531 AUDIO_FUNC_LOGE("Get Volume FAIL!");
532 return AUDIO_ERR_INTERNAL;
533 }
534
535 float volumeTemp = hwCapture->captureParam.captureMode.ctlParam.volume;
536 float volMax = (float)hwCapture->captureParam.captureMode.ctlParam.volThreshold.volMax;
537 float volMin = (float)hwCapture->captureParam.captureMode.ctlParam.volThreshold.volMin;
538 if ((volMax - volMin) == 0) {
539 AUDIO_FUNC_LOGE("Divisor cannot be zero!");
540 return AUDIO_ERR_INTERNAL;
541 }
542 volumeTemp = (volumeTemp - volMin) / ((volMax - volMin) / VOLUME_AVERAGE);
543
544 int volumeT = (int)((pow(INTEGER_TO_DEC, volumeTemp) + DECIMAL_PART) / INTEGER_TO_DEC); // delet 0.X num
545
546 *volume = (float)volumeT / INTEGER_TO_DEC; // get volume (0-1)
547 return AUDIO_SUCCESS;
548 }
549
AudioCaptureGetGainThreshold(struct IAudioCapture * handle,float * min,float * max)550 int32_t AudioCaptureGetGainThreshold(struct IAudioCapture *handle, float *min, float *max)
551 {
552 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
553 if (hwCapture == NULL || min == NULL || max == NULL) {
554 AUDIO_FUNC_LOGE("Parameter error!");
555 return AUDIO_ERR_INVALID_PARAM;
556 }
557 if (hwCapture->devCtlHandle == NULL) {
558 AUDIO_FUNC_LOGE("AudioCaptureGetGainThreshold Bind Fail!");
559 return AUDIO_ERR_INTERNAL;
560 }
561
562 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
563 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
564 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Is NULL");
565 return AUDIO_ERR_INTERNAL;
566 }
567
568 int32_t ret = (*pInterfaceLibModeCapture)(
569 hwCapture->devCtlHandle, &hwCapture->captureParam, AUDIODRV_CTL_IOCTL_GAINTHRESHOLD_CAPTURE);
570 if (ret < 0) {
571 AUDIO_FUNC_LOGE("SetParams FAIL!");
572 return AUDIO_ERR_INTERNAL;
573 }
574
575 *max = hwCapture->captureParam.captureMode.ctlParam.audioGain.gainMax;
576 *min = hwCapture->captureParam.captureMode.ctlParam.audioGain.gainMin;
577 return AUDIO_SUCCESS;
578 }
579
AudioCaptureGetGain(struct IAudioCapture * handle,float * gain)580 int32_t AudioCaptureGetGain(struct IAudioCapture *handle, float *gain)
581 {
582 struct AudioHwCapture *impl = (struct AudioHwCapture *)handle;
583 if (impl == NULL || gain == NULL) {
584 AUDIO_FUNC_LOGE("Parameter error!");
585 return AUDIO_ERR_INVALID_PARAM;
586 }
587 if (impl->devCtlHandle == NULL) {
588 AUDIO_FUNC_LOGE("CaptureStart Bind Fail!");
589 return AUDIO_ERR_INTERNAL;
590 }
591
592 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
593 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
594 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
595 return AUDIO_ERR_INTERNAL;
596 }
597
598 int32_t ret =
599 (*pInterfaceLibModeCapture)(impl->devCtlHandle, &impl->captureParam, AUDIODRV_CTL_IOCTL_GAIN_READ_CAPTURE);
600 if (ret < 0) {
601 AUDIO_FUNC_LOGE("Get Volume FAIL!");
602 return AUDIO_ERR_INTERNAL;
603 }
604
605 *gain = impl->captureParam.captureMode.ctlParam.audioGain.gain;
606 return AUDIO_SUCCESS;
607 }
608
AudioCaptureSetGain(struct IAudioCapture * handle,float gain)609 int32_t AudioCaptureSetGain(struct IAudioCapture *handle, float gain)
610 {
611 struct AudioHwCapture *impl = (struct AudioHwCapture *)handle;
612 if (impl == NULL || gain < 0) {
613 AUDIO_FUNC_LOGE("Parameter error!");
614 return AUDIO_ERR_INVALID_PARAM;
615 }
616 if (impl->devCtlHandle == NULL) {
617 AUDIO_FUNC_LOGE("CaptureSetGain Bind Fail!");
618 return AUDIO_ERR_INTERNAL;
619 }
620
621 float gainTemp = impl->captureParam.captureMode.ctlParam.audioGain.gain;
622 impl->captureParam.captureMode.ctlParam.audioGain.gain = gain;
623
624 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
625 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
626 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
627 impl->captureParam.captureMode.ctlParam.audioGain.gain = gainTemp;
628 return AUDIO_ERR_INTERNAL;
629 }
630
631 int32_t ret =
632 (*pInterfaceLibModeCapture)(impl->devCtlHandle, &impl->captureParam, AUDIODRV_CTL_IOCTL_GAIN_WRITE_CAPTURE);
633 if (ret < 0) {
634 AUDIO_FUNC_LOGE("CaptureSetGain FAIL!");
635 impl->captureParam.captureMode.ctlParam.audioGain.gain = gainTemp;
636 return AUDIO_ERR_INTERNAL;
637 }
638 return AUDIO_SUCCESS;
639 }
640
LogErrorGetRensonAndTime(struct AudioHwCapture * hwCapture,int errorReason)641 static int32_t LogErrorGetRensonAndTime(struct AudioHwCapture *hwCapture, int errorReason)
642 {
643 if (hwCapture == NULL) {
644 AUDIO_FUNC_LOGE("Parameter error!");
645 return AUDIO_ERR_INVALID_PARAM;
646 }
647 if (hwCapture->errorLog.iter >= ERROR_LOG_MAX_NUM) {
648 AUDIO_FUNC_LOGE("Capture item more then %{public}d.", ERROR_LOG_MAX_NUM);
649 return AUDIO_ERR_INTERNAL;
650 }
651 if (hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].reason == NULL) {
652 hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].reason = (char *)OsalMemCalloc(ERROR_REASON_DESC_LEN);
653 if (hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].reason == NULL) {
654 AUDIO_FUNC_LOGE("Calloc reasonDesc Fail!");
655 return AUDIO_ERR_MALLOC_FAIL;
656 }
657 }
658
659 if (hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].currentTime == NULL) {
660 hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].currentTime =
661 (char *)OsalMemCalloc(ERROR_REASON_DESC_LEN);
662 if (hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].currentTime == NULL) {
663 AUDIO_FUNC_LOGE("Calloc time Fail!");
664 return AUDIO_ERR_MALLOC_FAIL;
665 }
666 }
667
668 memset_s(hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].reason, ERROR_REASON_DESC_LEN, 0,
669 ERROR_REASON_DESC_LEN);
670 memset_s(hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].currentTime, ERROR_REASON_DESC_LEN, 0,
671 ERROR_REASON_DESC_LEN);
672
673 int32_t ret = GetErrorReason(errorReason, hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].reason);
674 if (ret < 0) {
675 AUDIO_FUNC_LOGE("Capture GetErrorReason failed!");
676 return AUDIO_ERR_INTERNAL;
677 }
678
679 ret = GetCurrentTime(hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].currentTime);
680 if (ret < 0) {
681 AUDIO_FUNC_LOGE("Capture GetCurrentTime failed!");
682 return AUDIO_ERR_INTERNAL;
683 }
684 return AUDIO_SUCCESS;
685 }
686
LogErrorCapture(AudioHandle handle,int errorCode,int reason)687 static void LogErrorCapture(AudioHandle handle, int errorCode, int reason)
688 {
689 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)handle;
690 if (hwCapture == NULL) {
691 AUDIO_FUNC_LOGE("Parameter error!");
692 return;
693 }
694
695 hwCapture->errorLog.totalErrors++;
696 if (hwCapture->errorLog.iter >= ERROR_LOG_MAX_NUM) {
697 hwCapture->errorLog.iter = 0;
698 }
699
700 int32_t ret = LogErrorGetRensonAndTime(hwCapture, reason);
701 if (ret < 0) {
702 return;
703 }
704 if (errorCode == WRITE_FRAME_ERROR_CODE) {
705 hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].errorCode = errorCode;
706 hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].count = hwCapture->errorLog.iter;
707 hwCapture->errorLog.errorDump[hwCapture->errorLog.iter].frames =
708 hwCapture->captureParam.frameCaptureMode.frames;
709 hwCapture->errorLog.iter++;
710 }
711 }
712
AudioCaptureCaptureFrame(struct IAudioCapture * capture,int8_t * frame,uint32_t * frameLen,uint64_t requestBytes)713 int32_t AudioCaptureCaptureFrame(
714 struct IAudioCapture *capture, int8_t *frame, uint32_t *frameLen, uint64_t requestBytes)
715 {
716 struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)capture;
717 if (hwCapture == NULL || frame == NULL || frameLen == NULL ||
718 hwCapture->captureParam.frameCaptureMode.buffer == NULL) {
719 AUDIO_FUNC_LOGE("Param is NULL Fail!");
720 return AUDIO_ERR_INVALID_PARAM;
721 }
722
723 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
724 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
725 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
726 return AUDIO_ERR_INTERNAL;
727 }
728 if (hwCapture->devDataHandle == NULL) {
729 return AUDIO_ERR_INTERNAL;
730 }
731
732 int32_t ret =
733 (*pInterfaceLibModeCapture)(hwCapture->devDataHandle, &hwCapture->captureParam, AUDIO_DRV_PCM_IOCTL_READ);
734 if (ret < 0) {
735 AUDIO_FUNC_LOGE("Capture Frame FAIL!");
736 LogErrorCapture(capture, WRITE_FRAME_ERROR_CODE, ret);
737 return AUDIO_ERR_INTERNAL;
738 }
739 if (requestBytes < hwCapture->captureParam.frameCaptureMode.bufferSize) {
740 AUDIO_FUNC_LOGE("Capture Frame requestBytes too little!");
741 return AUDIO_ERR_INTERNAL;
742 }
743
744 ret = memcpy_s(frame, (size_t)requestBytes, hwCapture->captureParam.frameCaptureMode.buffer,
745 (size_t)hwCapture->captureParam.frameCaptureMode.bufferSize);
746 if (ret != EOK) {
747 AUDIO_FUNC_LOGE("memcpy_s fail");
748 return AUDIO_ERR_INTERNAL;
749 }
750
751 *frameLen = (uint32_t)hwCapture->captureParam.frameCaptureMode.bufferSize;
752
753 hwCapture->captureParam.frameCaptureMode.frames += hwCapture->captureParam.frameCaptureMode.bufferFrameSize;
754 if (hwCapture->captureParam.frameCaptureMode.attrs.sampleRate == 0) {
755 AUDIO_FUNC_LOGE("Divisor cannot be zero!");
756 return AUDIO_ERR_INTERNAL;
757 }
758 if (TimeToAudioTimeStamp(hwCapture->captureParam.frameCaptureMode.bufferFrameSize,
759 &hwCapture->captureParam.frameCaptureMode.time,
760 hwCapture->captureParam.frameCaptureMode.attrs.sampleRate) == HDF_FAILURE) {
761 AUDIO_FUNC_LOGE("Frame is NULL");
762 return AUDIO_ERR_INTERNAL;
763 }
764 return AUDIO_SUCCESS;
765 }
766
AudioCaptureGetCapturePosition(struct IAudioCapture * capture,uint64_t * frames,struct AudioTimeStamp * time)767 int32_t AudioCaptureGetCapturePosition(struct IAudioCapture *capture, uint64_t *frames, struct AudioTimeStamp *time)
768 {
769 struct AudioHwCapture *impl = (struct AudioHwCapture *)capture;
770 if (impl == NULL || frames == NULL || time == NULL) {
771 AUDIO_FUNC_LOGE("Parameter error!");
772 return AUDIO_ERR_INVALID_PARAM;
773 }
774
775 *frames = impl->captureParam.frameCaptureMode.frames;
776 *time = impl->captureParam.frameCaptureMode.time;
777 return AUDIO_SUCCESS;
778 }
779
SetValueCapture(struct ExtraParams mExtraParams,struct AudioHwCapture * capture)780 static int32_t SetValueCapture(struct ExtraParams mExtraParams, struct AudioHwCapture *capture)
781 {
782 if (capture == NULL) {
783 AUDIO_FUNC_LOGE("Parameter error!");
784 return HDF_FAILURE;
785 }
786 if (mExtraParams.route != -1) {
787 capture->captureParam.captureMode.hwInfo.pathroute = mExtraParams.route;
788 }
789 if (mExtraParams.format != -1) {
790 capture->captureParam.frameCaptureMode.attrs.format = mExtraParams.format;
791 }
792 if (mExtraParams.channels != 0) {
793 capture->captureParam.frameCaptureMode.attrs.channelCount = mExtraParams.channels;
794 }
795 if (mExtraParams.flag) {
796 capture->captureParam.frameCaptureMode.frames = mExtraParams.frames;
797 }
798 if (mExtraParams.sampleRate != 0) {
799 capture->captureParam.frameCaptureMode.attrs.sampleRate = mExtraParams.sampleRate;
800 }
801 return HDF_SUCCESS;
802 }
803
AudioCaptureSetExtraParams(struct IAudioCapture * handle,const char * keyValueList)804 int32_t AudioCaptureSetExtraParams(struct IAudioCapture *handle, const char *keyValueList)
805 {
806 int32_t check = 0;
807 int32_t count = 0;
808 struct ExtraParams mExtraParams;
809
810 struct AudioHwCapture *capture = (struct AudioHwCapture *)handle;
811 if (capture == NULL || keyValueList == NULL) {
812 AUDIO_FUNC_LOGE("Parameter error!");
813 return AUDIO_ERR_INVALID_PARAM;
814 }
815
816 if (AudioSetExtraParams(keyValueList, &count, &mExtraParams, &check) < 0) {
817 return AUDIO_ERR_INTERNAL;
818 }
819 if (count != 0 && check == count) {
820 SetValueCapture(mExtraParams, capture);
821 return AUDIO_SUCCESS;
822 } else {
823 AUDIO_FUNC_LOGE("AudioSetExtraParams error!");
824 return AUDIO_ERR_INTERNAL;
825 }
826 }
827
AudioCaptureGetExtraParams(struct IAudioCapture * handle,char * keyValueList,uint32_t listLenth)828 int32_t AudioCaptureGetExtraParams(struct IAudioCapture *handle, char *keyValueList, uint32_t listLenth)
829 {
830 int32_t ret;
831 struct AudioHwCapture *capture = (struct AudioHwCapture *)handle;
832 if (capture == NULL || keyValueList == NULL || listLenth == 0) {
833 AUDIO_FUNC_LOGE("Parameter error!");
834 return AUDIO_ERR_INVALID_PARAM;
835 }
836
837 uint32_t bufferSize = strlen(ROUTE_SAMPLE) + strlen(FORMAT_SAMPLE) + strlen(CHANNELS_SAMPLE) +
838 strlen(FRAME_COUNT_SAMPLE) + strlen(SAMPLING_RATE_SAMPLE) + 1;
839 if (listLenth < bufferSize) {
840 AUDIO_FUNC_LOGE("listLenth < bufferSize error!");
841 return AUDIO_ERR_INTERNAL;
842 }
843
844 ret = AddElementToList(
845 keyValueList, listLenth, AUDIO_ATTR_PARAM_ROUTE, &capture->captureParam.captureMode.hwInfo.pathroute);
846 if (ret < 0) {
847 AUDIO_FUNC_LOGE("AddElementToList hwInfo.pathroute failed!");
848 return AUDIO_ERR_INTERNAL;
849 }
850
851 ret = AddElementToList(
852 keyValueList, listLenth, AUDIO_ATTR_PARAM_FORMAT, &capture->captureParam.frameCaptureMode.attrs.format);
853 if (ret < 0) {
854 AUDIO_FUNC_LOGE("AddElementToList attrs.format failed!");
855 return AUDIO_ERR_INTERNAL;
856 }
857
858 ret = AddElementToList(
859 keyValueList, listLenth, AUDIO_ATTR_PARAM_CHANNELS, &capture->captureParam.frameCaptureMode.attrs.channelCount);
860 if (ret < 0) {
861 AUDIO_FUNC_LOGE("AddElementToList attrs.channelCount failed!");
862 return AUDIO_ERR_INTERNAL;
863 }
864
865 ret = AddElementToList(
866 keyValueList, listLenth, AUDIO_ATTR_PARAM_FRAME_COUNT, &capture->captureParam.frameCaptureMode.frames);
867 if (ret < 0) {
868 AUDIO_FUNC_LOGE("AddElementToList frameCaptureMode.frames failed!");
869 return AUDIO_ERR_INTERNAL;
870 }
871
872 ret = AddElementToList(keyValueList, listLenth, AUDIO_ATTR_PARAM_SAMPLING_RATE,
873 &capture->captureParam.frameCaptureMode.attrs.sampleRate);
874 if (ret < 0) {
875 AUDIO_FUNC_LOGE("AddElementToList attrs.sampleRate failed!");
876 return AUDIO_ERR_INTERNAL;
877 }
878 return AUDIO_SUCCESS;
879 }
880
AudioCaptureReqMmapBufferInit(struct AudioHwCapture * capture,int32_t reqSize,const struct AudioMmapBufferDescripter * tempDesc)881 static int32_t AudioCaptureReqMmapBufferInit(
882 struct AudioHwCapture *capture, int32_t reqSize, const struct AudioMmapBufferDescripter *tempDesc)
883 {
884 if (capture == NULL || capture->devDataHandle == NULL || tempDesc == NULL) {
885 AUDIO_FUNC_LOGE("Parameter error!");
886 return AUDIO_ERR_INVALID_PARAM;
887 }
888 int32_t flags = 0;
889 int64_t fileSize = 0;
890 struct AudioMmapBufferDescripter desc = *tempDesc;
891 uint32_t formatBits = 0;
892 int32_t ret = FormatToBits(capture->captureParam.frameCaptureMode.attrs.format, &formatBits);
893 if (ret < 0) {
894 AUDIO_FUNC_LOGE("FormatToBits failed!");
895 return ret;
896 }
897
898 FILE *fp = fopen(desc.filePath, "rb+");
899 if (fp == NULL) {
900 AUDIO_FUNC_LOGE("Open file failed!");
901 return AUDIO_ERR_INTERNAL;
902 }
903 ret = SetDescParam(&desc, fp, reqSize, &fileSize, &flags);
904 if (ret < 0) {
905 AUDIO_FUNC_LOGE("SetDescParam failed!");
906 fclose(fp);
907 return AUDIO_ERR_INTERNAL;
908 }
909 // formatBits Move right 3
910 desc.totalBufferFrames = reqSize / (capture->captureParam.frameCaptureMode.attrs.channelCount * (formatBits >> 3));
911 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
912 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
913 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Is NULL");
914 munmap(desc.memoryAddress, reqSize);
915 fclose(fp);
916 return AUDIO_ERR_INTERNAL;
917 }
918 capture->captureParam.frameCaptureMode.mmapBufDesc = desc;
919 ret = (*pInterfaceLibModeCapture)(
920 capture->devDataHandle, &capture->captureParam, AUDIO_DRV_PCM_IOCTL_MMAP_BUFFER_CAPTURE);
921 if (msync(desc.memoryAddress, fileSize, MS_ASYNC) < 0) {
922 AUDIO_FUNC_LOGE("sync fail!");
923 }
924 munmap(desc.memoryAddress, reqSize);
925 (void)fclose(fp);
926 if (ret < 0) {
927 AUDIO_FUNC_LOGE("AudioCaptureReqMmapBuffer FAIL!");
928 }
929 return ret;
930 }
931
AudioCaptureReqMmapBuffer(struct IAudioCapture * handle,int32_t reqSize,const struct AudioMmapBufferDescripter * desc)932 int32_t AudioCaptureReqMmapBuffer(
933 struct IAudioCapture *handle, int32_t reqSize, const struct AudioMmapBufferDescripter *desc)
934 {
935 struct AudioHwCapture *capture = (struct AudioHwCapture *)handle;
936 if (capture == NULL || capture->devDataHandle == NULL || desc == NULL) {
937 AUDIO_FUNC_LOGE("Parameter error!");
938 return AUDIO_ERR_INVALID_PARAM;
939 }
940
941 int32_t ret = AudioCaptureReqMmapBufferInit(capture, reqSize, desc);
942 if (ret < 0) {
943 AUDIO_FUNC_LOGE("AudioCaptureReqMmapBufferInit failed!");
944 return ret;
945 }
946
947 AUDIO_FUNC_LOGI("AudioCaptureReqMmapBuffer Success!");
948 return AUDIO_SUCCESS;
949 }
950
AudioCaptureGetMmapPosition(struct IAudioCapture * handle,uint64_t * frames,struct AudioTimeStamp * time)951 int32_t AudioCaptureGetMmapPosition(struct IAudioCapture *handle, uint64_t *frames, struct AudioTimeStamp *time)
952 {
953 struct AudioHwCapture *capture = (struct AudioHwCapture *)handle;
954 if (capture == NULL || frames == NULL || time == NULL) {
955 AUDIO_FUNC_LOGE("Parameter error!");
956 return AUDIO_ERR_INVALID_PARAM;
957 }
958
959 InterfaceLibModeCapturePassthrough *pInterfaceLibModeCapture = AudioPassthroughGetInterfaceLibModeCapture();
960 if (pInterfaceLibModeCapture == NULL || *pInterfaceLibModeCapture == NULL) {
961 AUDIO_FUNC_LOGE("pInterfaceLibModeCapture Fail!");
962 return AUDIO_ERR_INTERNAL;
963 }
964
965 if (capture->devDataHandle == NULL) {
966 return AUDIO_ERR_INTERNAL;
967 }
968
969 int32_t ret = (*pInterfaceLibModeCapture)(
970 capture->devDataHandle, &capture->captureParam, AUDIO_DRV_PCM_IOCTL_MMAP_POSITION_CAPTURE);
971 if (ret < 0) {
972 AUDIO_FUNC_LOGE("GetMmapPosition SetParams FAIL");
973 return AUDIO_ERR_INTERNAL;
974 }
975
976 *frames = capture->captureParam.frameCaptureMode.frames;
977
978 capture->captureParam.frameCaptureMode.time.tvSec = (int64_t)(capture->captureParam.frameCaptureMode.frames /
979 capture->captureParam.frameCaptureMode.attrs.sampleRate);
980
981 uint64_t lastBufFrames =
982 capture->captureParam.frameCaptureMode.frames % capture->captureParam.frameCaptureMode.attrs.sampleRate;
983
984 capture->captureParam.frameCaptureMode.time.tvNSec =
985 (int64_t)((lastBufFrames * SEC_TO_NSEC) / capture->captureParam.frameCaptureMode.attrs.sampleRate);
986
987 *time = capture->captureParam.frameCaptureMode.time;
988 return AUDIO_SUCCESS;
989 }
990
AudioCaptureTurnStandbyMode(struct IAudioCapture * handle)991 int32_t AudioCaptureTurnStandbyMode(struct IAudioCapture *handle)
992 {
993 struct AudioHwCapture *capture = (struct AudioHwCapture *)handle;
994 if (capture == NULL) {
995 AUDIO_FUNC_LOGE("capture is null");
996 return AUDIO_ERR_INVALID_PARAM;
997 }
998
999 capture->captureParam.captureMode.hwInfo.deviceDescript.pins = PIN_NONE;
1000
1001 int32_t ret = AudioCaptureStop((AudioHandle)capture);
1002 if (ret < 0) {
1003 return AUDIO_ERR_INTERNAL;
1004 }
1005 return AUDIO_SUCCESS;
1006 }
1007
AudioCaptureAudioDevDump(struct IAudioCapture * handle,int32_t range,int32_t fd)1008 int32_t AudioCaptureAudioDevDump(struct IAudioCapture *handle, int32_t range, int32_t fd)
1009 {
1010 struct AudioHwCapture *capture = (struct AudioHwCapture *)handle;
1011 if (capture == NULL) {
1012 AUDIO_FUNC_LOGE("Parameter error!");
1013 return AUDIO_ERR_INVALID_PARAM;
1014 }
1015
1016 dprintf(fd, "%s%d\n", "Number of errors: ", capture->errorLog.totalErrors);
1017
1018 if (range < RANGE_MIN - 1 || range > RANGE_MAX) {
1019 dprintf(fd, "%s\n", "Out of range, invalid output");
1020 return AUDIO_SUCCESS;
1021 }
1022
1023 uint32_t mSize = capture->errorLog.iter;
1024 if (range < RANGE_MIN) {
1025 dprintf(fd, "%-5s %-10s %s\n", "count", "errorCode", "Time");
1026 for (uint32_t i = 0; i < mSize; i++) {
1027 dprintf(fd, FORMAT_TWO, capture->errorLog.errorDump[i].count + 1, capture->errorLog.errorDump[i].errorCode,
1028 capture->errorLog.errorDump[i].currentTime);
1029 }
1030 } else {
1031 dprintf(fd, "%-5s %-10s %-20s %-15s %s\n", "count", "errorCode", "frames", "fail reason", "Time");
1032 for (uint32_t i = 0; i < mSize; i++) {
1033 dprintf(fd, FORMAT_ONE, capture->errorLog.errorDump[i].count + 1, capture->errorLog.errorDump[i].errorCode,
1034 capture->errorLog.errorDump[i].frames, capture->errorLog.errorDump[i].reason,
1035 capture->errorLog.errorDump[i].currentTime);
1036 }
1037 }
1038 return AUDIO_SUCCESS;
1039 }
1040
AudioCaptureRelease(struct IAudioCapture * instance)1041 void AudioCaptureRelease(struct IAudioCapture *instance)
1042 {
1043 (void)instance;
1044 }
1045