• 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 "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