• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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