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