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