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