1 /*
2  * Copyright (c) 2021-2023 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 "hdf_audio_server_capture.h"
17 #include "osal_mem.h"
18 #include "audio_uhdf_log.h"
19 #include "hdf_audio_server_common.h"
20 #include "hdf_audio_server_manager.h"
21 
22 #define HDF_LOG_TAG HDF_AUDIO_HAL_STUB
23 #define INTERNEL_INPUT_STEAM_ID 1
24 #define IF_TRUE_PRINT_LOG_RETURN_ERROR(cond, log, err) \
25     if (cond) { \
26         AUDIO_FUNC_LOGE(log); \
27         return err; \
28     }
29 
30 
GetInitCaptureParaAttrs(struct HdfSBuf * data,struct AudioSampleAttributes * attrs)31 static int32_t GetInitCaptureParaAttrs(struct HdfSBuf *data, struct AudioSampleAttributes *attrs)
32 {
33     if (data == NULL || attrs == NULL) {
34         return HDF_FAILURE;
35     }
36     uint32_t tempCapturePara = 0;
37     if (!HdfSbufReadUint32(data, &tempCapturePara)) {
38         AUDIO_FUNC_LOGE("Capture read tempCapturePara fail");
39         return HDF_FAILURE;
40     }
41     attrs->type = (enum AudioCategory)tempCapturePara;
42     if (!HdfSbufReadUint32(data, &attrs->period)) {
43         AUDIO_FUNC_LOGE("Capture read period fail");
44         return HDF_FAILURE;
45     }
46     if (!HdfSbufReadUint32(data, &attrs->frameSize)) {
47         AUDIO_FUNC_LOGE("Capture read frameSize fail");
48         return HDF_FAILURE;
49     }
50     if (!HdfSbufReadUint32(data, &attrs->startThreshold)) {
51         AUDIO_FUNC_LOGE("Capture read startThreshold fail");
52         return HDF_FAILURE;
53     }
54     if (!HdfSbufReadUint32(data, &attrs->stopThreshold)) {
55         AUDIO_FUNC_LOGE("Capture read stopThreshold fail");
56         return HDF_FAILURE;
57     }
58     if (!HdfSbufReadUint32(data, &attrs->silenceThreshold)) {
59         AUDIO_FUNC_LOGE("Capture read silenceThreshold fail");
60         return HDF_FAILURE;
61     }
62     if (!HdfSbufReadUint32(data, &tempCapturePara)) {
63         AUDIO_FUNC_LOGE("Failed to Get Speed sBuf!");
64         return HDF_FAILURE;
65     }
66     attrs->isBigEndian = (bool)tempCapturePara;
67     if (!HdfSbufReadUint32(data, &tempCapturePara)) {
68         AUDIO_FUNC_LOGE("Failed to Get Speed sBuf!");
69         return HDF_FAILURE;
70     }
71     attrs->isSignedData = (bool)tempCapturePara;
72 
73     if (!HdfSbufReadInt32(data, &attrs->streamId)) {
74         AUDIO_FUNC_LOGE("read streamId fail");
75         return HDF_FAILURE;
76     }
77 
78     return HDF_SUCCESS;
79 }
80 
GetInitCapturePara(struct HdfSBuf * data,struct AudioDeviceDescriptor * devDesc,struct AudioSampleAttributes * attrs)81 static int32_t GetInitCapturePara(struct HdfSBuf *data, struct AudioDeviceDescriptor *devDesc,
82     struct AudioSampleAttributes *attrs)
83 {
84     if (data == NULL || devDesc == NULL || attrs == NULL) {
85         return HDF_FAILURE;
86     }
87     uint32_t tempCapturePara = 0;
88     if (!HdfSbufReadUint32(data, &tempCapturePara)) {
89         AUDIO_FUNC_LOGE("Failed to Get Speed sBuf!");
90         return HDF_FAILURE;
91     }
92     attrs->format = (enum AudioFormat)tempCapturePara;
93     if (!HdfSbufReadUint32(data, &attrs->channelCount)) {
94         AUDIO_FUNC_LOGE("read channelCount fail");
95         return HDF_FAILURE;
96     }
97     if (!HdfSbufReadUint32(data, &attrs->sampleRate)) {
98         AUDIO_FUNC_LOGE("read sampleRate fail");
99         return HDF_FAILURE;
100     }
101     if (!HdfSbufReadUint32(data, &tempCapturePara)) {
102         AUDIO_FUNC_LOGE("Failed to Get Speed sBuf!");
103         return HDF_FAILURE;
104     }
105     attrs->interleaved = (bool)tempCapturePara;
106     if (GetInitCaptureParaAttrs(data, attrs) < 0) {
107         return HDF_FAILURE;
108     }
109     if (!HdfSbufReadUint32(data, &devDesc->portId)) {
110         AUDIO_FUNC_LOGE("read portId fail");
111         return HDF_FAILURE;
112     }
113     if (!HdfSbufReadUint32(data, &tempCapturePara)) {
114         AUDIO_FUNC_LOGE("read tempCapturePara fail");
115         return HDF_FAILURE;
116     }
117     devDesc->pins = (enum AudioPortPin)tempCapturePara;
118     devDesc->desc = NULL;
119     return HDF_SUCCESS;
120 }
121 
HdiServiceCreatCapture(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)122 int32_t HdiServiceCreatCapture(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
123 {
124     IF_TRUE_PRINT_LOG_RETURN_ERROR((client == NULL || data == NULL || reply == NULL),
125         "client or data or reply is null!", AUDIO_HAL_ERR_INVALID_PARAM);
126     struct AudioAdapter *adapter = NULL;
127     struct AudioDeviceDescriptor devDesc;
128     struct AudioSampleAttributes attrs;
129     struct AudioCapture *capture = NULL;
130     const char *adapterName = NULL;
131     uint32_t capturePid = 0;
132     IF_TRUE_PRINT_LOG_RETURN_ERROR(((adapterName = HdfSbufReadString(data)) == NULL),
133         "adapterNameCase Is NULL", AUDIO_HAL_ERR_INVALID_PARAM);
134     IF_TRUE_PRINT_LOG_RETURN_ERROR((!HdfSbufReadUint32(data, &capturePid)),
135         "read capturePid fail", AUDIO_HAL_ERR_INTERNAL);
136     AUDIO_FUNC_LOGD("capturePid = %{public}u", capturePid);
137     int32_t ret = GetInitCapturePara(data, &devDesc, &attrs);
138     IF_TRUE_PRINT_LOG_RETURN_ERROR((ret < 0), "GetInitCapturePara fail", AUDIO_HAL_ERR_INTERNAL);
139     ret = AudioAdapterListGetAdapter(adapterName, &adapter);
140     IF_TRUE_PRINT_LOG_RETURN_ERROR((ret < 0), "AudioAdapterListGetAdapter fail", AUDIO_HAL_ERR_INTERNAL);
141     IF_TRUE_PRINT_LOG_RETURN_ERROR((adapter == NULL), "adapter is empty!", AUDIO_HAL_ERR_INVALID_PARAM);
142     const int32_t priority = attrs.type;
143     ret = AudioCreatCaptureCheck(adapterName, priority);
144     IF_TRUE_PRINT_LOG_RETURN_ERROR((ret < 0), "AudioCreatCaptureCheck fail", ret);
145 
146     attrs.streamId = INTERNEL_INPUT_STEAM_ID;
147     IF_TRUE_PRINT_LOG_RETURN_ERROR((adapter->CreateCapture == NULL), "CreateCapture is NULL", AUDIO_HAL_ERR_INTERNAL);
148     ret = adapter->CreateCapture(adapter, &devDesc, &attrs, &capture);
149     IF_TRUE_PRINT_LOG_RETURN_ERROR((capture == NULL || ret < 0), "Failed to CreateCapture", AUDIO_HAL_ERR_INTERNAL);
150     if (AudioAddCaptureInfoInAdapter(adapterName, capture, adapter, priority, capturePid)) {
151         AUDIO_FUNC_LOGE("AudioAddRenderInfoInAdapter");
152         adapter->DestroyCapture(adapter, capture);
153         return AUDIO_HAL_ERR_INTERNAL;
154     }
155     return AUDIO_HAL_SUCCESS;
156 }
157 
HdiServiceCaptureDestory(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)158 int32_t HdiServiceCaptureDestory(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
159 {
160     if (client == NULL || data == NULL || reply == NULL) {
161         AUDIO_FUNC_LOGE("client or data or reply is null!");
162         return AUDIO_HAL_ERR_INVALID_PARAM;
163     }
164     struct AudioAdapter *adapter = NULL;
165     struct AudioCapture *capture = NULL;
166     const char *adapterName = NULL;
167     uint32_t pid = 0;
168     if (HdiServiceRenderCaptureReadData(data, &adapterName, &pid) < 0) {
169         return AUDIO_HAL_ERR_INTERNAL;
170     }
171     int32_t ret = AudioAdapterListGetCapture(adapterName, &capture, pid);
172     if (ret < 0) {
173         AUDIO_FUNC_LOGE("AudioAdapterListGetCapture failed ret = %{public}d", ret);
174         return ret;
175     }
176     ret = AudioAdapterListGetAdapterCapture(adapterName, &adapter, &capture);
177     if (ret < 0) {
178         AUDIO_FUNC_LOGE("AudioAdapterListGetAdapterCapture failed ret = %{public}d", ret);
179         return ret;
180     }
181     if (adapter == NULL || adapter->DestroyCapture == NULL) {
182         AUDIO_FUNC_LOGE("adapter or DestroyCapture is NULL");
183         return AUDIO_HAL_ERR_INTERNAL;
184     }
185     ret = adapter->DestroyCapture(adapter, capture);
186     if (ret < 0) {
187         AUDIO_FUNC_LOGE("DestroyCapture failed!");
188         return ret;
189     }
190     if (AudioDestroyCaptureInfoInAdapter(adapterName) < 0) {
191         return AUDIO_HAL_ERR_INTERNAL;
192     }
193     return AUDIO_HAL_SUCCESS;
194 }
195 
HdiServiceCaptureStart(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)196 int32_t HdiServiceCaptureStart(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
197 {
198     if (client == NULL || data == NULL || reply == NULL) {
199         AUDIO_FUNC_LOGE("client or data or repoly is null!");
200         return AUDIO_HAL_ERR_INVALID_PARAM;
201     }
202     struct AudioCapture *capture = NULL;
203     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
204     if (ret < 0) {
205         AUDIO_FUNC_LOGE("AudioAdapterListCheckAndGetCapture failed ret = %{public}d", ret);
206         return ret;
207     }
208     if (capture == NULL || capture->control.Start == NULL) {
209         AUDIO_FUNC_LOGE("capture or Start is NULL");
210         return AUDIO_HAL_ERR_INTERNAL;
211     }
212     return capture->control.Start((AudioHandle)capture);
213 }
214 
HdiServiceCaptureStop(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)215 int32_t HdiServiceCaptureStop(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
216 {
217     if (client == NULL || data == NULL || reply == NULL) {
218         return AUDIO_HAL_ERR_INVALID_PARAM;
219     }
220     struct AudioCapture *capture = NULL;
221     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
222     if (ret < 0) {
223         return ret;
224     }
225     if (capture == NULL || capture->control.Stop == NULL) {
226         AUDIO_FUNC_LOGE("capture or Stop is NULL");
227         return AUDIO_HAL_ERR_INTERNAL;
228     }
229     return capture->control.Stop((AudioHandle)capture);
230 }
231 
HdiServiceCapturePause(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)232 int32_t HdiServiceCapturePause(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
233 {
234     if (client == NULL || data == NULL || reply == NULL) {
235         return AUDIO_HAL_ERR_INVALID_PARAM;
236     }
237     struct AudioCapture *capture = NULL;
238     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
239     if (ret < 0) {
240         return ret;
241     }
242     if (capture == NULL || capture->control.Pause == NULL) {
243         AUDIO_FUNC_LOGE("capture or Pause is NULL");
244         return AUDIO_HAL_ERR_INTERNAL;
245     }
246     return capture->control.Pause((AudioHandle)capture);
247 }
248 
HdiServiceCaptureResume(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)249 int32_t HdiServiceCaptureResume(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
250 {
251     if (client == NULL || data == NULL || reply == NULL) {
252         return AUDIO_HAL_ERR_INVALID_PARAM;
253     }
254     struct AudioCapture *capture = NULL;
255     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
256     if (ret < 0) {
257         return ret;
258     }
259     if (capture == NULL || capture->control.Resume == NULL) {
260         AUDIO_FUNC_LOGE("capture or Resume is NULL");
261         return AUDIO_HAL_ERR_INTERNAL;
262     }
263     return capture->control.Resume((AudioHandle)capture);
264 }
265 
HdiServiceCaptureFlush(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)266 int32_t HdiServiceCaptureFlush(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
267 {
268     if (client == NULL || data == NULL || reply == NULL) {
269         return AUDIO_HAL_ERR_INVALID_PARAM;
270     }
271     struct AudioCapture *capture = NULL;
272     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
273     if (ret < 0) {
274         return ret;
275     }
276     if (capture == NULL || capture->control.Flush == NULL) {
277         AUDIO_FUNC_LOGE("capture or Flush is NULL");
278         return AUDIO_HAL_ERR_INTERNAL;
279     }
280     return capture->control.Flush((AudioHandle)capture);
281 }
282 
HdiServiceCaptureGetFrameSize(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)283 int32_t HdiServiceCaptureGetFrameSize(const struct HdfDeviceIoClient *client,
284     struct HdfSBuf *data, struct HdfSBuf *reply)
285 {
286     if (client == NULL || data == NULL || reply == NULL) {
287         return AUDIO_HAL_ERR_INVALID_PARAM;
288     }
289     uint64_t size;
290     struct AudioCapture *capture = NULL;
291     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
292     if (ret < 0) {
293         return ret;
294     }
295     if (capture == NULL || capture->attr.GetFrameSize == NULL) {
296         AUDIO_FUNC_LOGE("capture or GetFrameSize is NULL");
297         return AUDIO_HAL_ERR_INTERNAL;
298     }
299     if (capture->attr.GetFrameSize((AudioHandle)capture, &size)) {
300         return AUDIO_HAL_ERR_INTERNAL;
301     }
302     if (!HdfSbufWriteUint64(reply, size)) {
303         return AUDIO_HAL_ERR_INTERNAL;
304     }
305     return AUDIO_HAL_SUCCESS;
306 }
307 
HdiServiceCaptureGetFrameCount(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)308 int32_t HdiServiceCaptureGetFrameCount(const struct HdfDeviceIoClient *client,
309     struct HdfSBuf *data, struct HdfSBuf *reply)
310 {
311     if (client == NULL || data == NULL || reply == NULL) {
312         return AUDIO_HAL_ERR_INVALID_PARAM;
313     }
314     uint64_t count;
315     struct AudioCapture *capture = NULL;
316     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
317     if (ret < 0) {
318         return ret;
319     }
320     if (capture == NULL || capture->attr.GetFrameCount == NULL) {
321         AUDIO_FUNC_LOGE("capture or GetFrameCount is NULL");
322         return AUDIO_HAL_ERR_INTERNAL;
323     }
324     if (capture->attr.GetFrameCount((AudioHandle)capture, &count)) {
325         return AUDIO_HAL_ERR_INTERNAL;
326     }
327     if (!HdfSbufWriteUint64(reply, count)) {
328         AUDIO_FUNC_LOGE("write count failed!");
329         return AUDIO_HAL_ERR_INTERNAL;
330     }
331     return AUDIO_HAL_SUCCESS;
332 }
333 
HdiServiceCaptureSetSampleAttr(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)334 int32_t HdiServiceCaptureSetSampleAttr(const struct HdfDeviceIoClient *client,
335     struct HdfSBuf *data, struct HdfSBuf *reply)
336 {
337     if (client == NULL || data == NULL || reply == NULL) {
338         AUDIO_FUNC_LOGE("The pointer is null!");
339         return AUDIO_HAL_ERR_INVALID_PARAM;
340     }
341     int ret;
342     struct AudioSampleAttributes attrs;
343     struct AudioCapture *capture = NULL;
344     ret = AudioAdapterListCheckAndGetCapture(&capture, data);
345     if (ret < 0) {
346         return ret;
347     }
348     if (ReadAudioSapmleAttrbutes(data, &attrs) < 0) {
349         return AUDIO_HAL_ERR_INTERNAL;
350     }
351     if (capture == NULL || capture->attr.SetSampleAttributes == NULL) {
352         AUDIO_FUNC_LOGE("capture or SetSampleAttributes is NULL");
353         return AUDIO_HAL_ERR_INTERNAL;
354     }
355     return capture->attr.SetSampleAttributes((AudioHandle)capture, &attrs);
356 }
357 
HdiServiceCaptureGetSampleAttr(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)358 int32_t HdiServiceCaptureGetSampleAttr(const struct HdfDeviceIoClient *client,
359     struct HdfSBuf *data, struct HdfSBuf *reply)
360 {
361     if (client == NULL || data == NULL || reply == NULL) {
362         return AUDIO_HAL_ERR_INVALID_PARAM;
363     }
364     struct AudioSampleAttributes attrs;
365     struct AudioCapture *capture = NULL;
366     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
367     if (ret < 0) {
368         return ret;
369     }
370     if (capture == NULL || capture->attr.GetSampleAttributes == NULL) {
371         AUDIO_FUNC_LOGE("capture or GetSampleAttributes is NULL");
372         return AUDIO_HAL_ERR_INTERNAL;
373     }
374     ret = capture->attr.GetSampleAttributes((AudioHandle)capture, &attrs);
375     if (ret < 0) {
376         return ret;
377     }
378     if (WriteAudioSampleAttributes(reply, &attrs) < 0) {
379         return AUDIO_HAL_ERR_INTERNAL;
380     }
381     return AUDIO_HAL_SUCCESS;
382 }
383 
HdiServiceCaptureGetCurChannelId(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)384 int32_t HdiServiceCaptureGetCurChannelId(const struct HdfDeviceIoClient *client,
385     struct HdfSBuf *data, struct HdfSBuf *reply)
386 {
387     if (client == NULL || data == NULL || reply == NULL) {
388         return AUDIO_HAL_ERR_INVALID_PARAM;
389     }
390     uint32_t channelId;
391     struct AudioCapture *capture = NULL;
392     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
393     if (ret < 0) {
394         return ret;
395     }
396     if (capture == NULL || capture->attr.GetCurrentChannelId == NULL) {
397         AUDIO_FUNC_LOGE("capture or GetCurrentChannelId is NULL");
398         return AUDIO_HAL_ERR_INTERNAL;
399     }
400     ret = capture->attr.GetCurrentChannelId((AudioHandle)capture, &channelId);
401     if (ret < 0) {
402         return ret;
403     }
404     if (!HdfSbufWriteUint32(reply, channelId)) {
405         return AUDIO_HAL_ERR_INTERNAL;
406     }
407     return AUDIO_HAL_SUCCESS;
408 }
409 
HdiServiceCaptureCheckSceneCapability(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)410 int32_t HdiServiceCaptureCheckSceneCapability(const struct HdfDeviceIoClient *client,
411     struct HdfSBuf *data, struct HdfSBuf *reply)
412 {
413     if (client == NULL || data == NULL || reply == NULL) {
414         AUDIO_FUNC_LOGE("client or data or reply is null!");
415         return AUDIO_HAL_ERR_INVALID_PARAM;
416     }
417     struct AudioSceneDescriptor scene;
418     bool supported = false;
419     struct AudioCapture *capture = NULL;
420     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
421     if (ret < 0) {
422         return ret;
423     }
424     if (!HdfSbufReadUint32(data, &scene.scene.id)) {
425         return AUDIO_HAL_ERR_INTERNAL;
426     }
427     uint32_t interimPins = 0;
428     if (!HdfSbufReadUint32(data, &interimPins)) {
429         return AUDIO_HAL_ERR_INTERNAL;
430     }
431     scene.desc.pins = (enum AudioPortPin) interimPins;
432     if (capture == NULL || capture->scene.CheckSceneCapability == NULL) {
433         AUDIO_FUNC_LOGE("capture or CheckSceneCapability is NULL");
434         return AUDIO_HAL_ERR_INTERNAL;
435     }
436     ret = capture->scene.CheckSceneCapability((AudioHandle)capture, &scene, &supported);
437     if (ret < 0) {
438         return ret;
439     }
440     uint32_t tempSupported = (uint32_t)supported;
441     if (!HdfSbufWriteUint32(reply, tempSupported)) {
442         return AUDIO_HAL_ERR_INTERNAL;
443     }
444     return AUDIO_HAL_SUCCESS;
445 }
446 
HdiServiceCaptureSelectScene(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)447 int32_t HdiServiceCaptureSelectScene(const struct HdfDeviceIoClient *client,
448     struct HdfSBuf *data, struct HdfSBuf *reply)
449 {
450     if (client == NULL || data == NULL || reply == NULL) {
451         return AUDIO_HAL_ERR_INVALID_PARAM;
452     }
453     struct AudioSceneDescriptor scene;
454     struct AudioCapture *capture = NULL;
455     uint32_t tempPins = 0;
456     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
457     if (ret < 0) {
458         return ret;
459     }
460     if (!HdfSbufReadUint32(data, &scene.scene.id)) {
461         return AUDIO_HAL_ERR_INTERNAL;
462     }
463     if (!HdfSbufReadUint32(data, &tempPins)) {
464         return AUDIO_HAL_ERR_INTERNAL;
465     }
466     scene.desc.pins = (enum AudioPortPin) tempPins;
467     if (capture == NULL || capture->scene.SelectScene == NULL) {
468         AUDIO_FUNC_LOGE("capture or SelectScene is NULL");
469         return AUDIO_HAL_ERR_INTERNAL;
470     }
471     return capture->scene.SelectScene((AudioHandle)capture, &scene);
472 }
473 
HdiServiceCaptureGetMute(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)474 int32_t HdiServiceCaptureGetMute(const struct HdfDeviceIoClient *client,
475     struct HdfSBuf *data, struct HdfSBuf *reply)
476 {
477     if (client == NULL || data == NULL || reply == NULL) {
478         AUDIO_FUNC_LOGE("client or data or reply is null!");
479         return AUDIO_HAL_ERR_INVALID_PARAM;
480     }
481     int32_t ret;
482     bool mute = false;
483     struct AudioCapture *capture = NULL;
484     ret = AudioAdapterListCheckAndGetCapture(&capture, data);
485     if (ret < 0) {
486         return ret;
487     }
488     if (capture == NULL || capture->volume.GetMute == NULL) {
489         AUDIO_FUNC_LOGE("capture or GetMute is NULL");
490         return AUDIO_HAL_ERR_INTERNAL;
491     }
492     ret = capture->volume.GetMute((AudioHandle)capture, &mute);
493     if (ret < 0) {
494         AUDIO_FUNC_LOGE("getmute failed! ret = %{public}d", ret);
495         return ret;
496     }
497     uint32_t tempMute = (uint32_t)mute;
498     if (!HdfSbufWriteUint32(reply, tempMute)) {
499         return AUDIO_HAL_ERR_INTERNAL;
500     }
501     return AUDIO_HAL_SUCCESS;
502 }
503 
HdiServiceCaptureSetMute(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)504 int32_t HdiServiceCaptureSetMute(const struct HdfDeviceIoClient *client,
505     struct HdfSBuf *data, struct HdfSBuf *reply)
506 {
507     if (client == NULL || data == NULL || reply == NULL) {
508         AUDIO_FUNC_LOGE("client or data or reply is null!");
509         return AUDIO_HAL_ERR_INVALID_PARAM;
510     }
511     bool mute = false;
512     struct AudioCapture *capture = NULL;
513     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
514     if (ret < 0) {
515         return ret;
516     }
517     uint32_t tempMute = 0;
518     if (!HdfSbufReadUint32(data, &tempMute)) {
519         return AUDIO_HAL_ERR_INTERNAL;
520     }
521     mute = (bool)tempMute;
522     if (capture == NULL || capture->volume.SetMute == NULL) {
523         AUDIO_FUNC_LOGE("capture or SetMute is NULL");
524         return AUDIO_HAL_ERR_INTERNAL;
525     }
526     return capture->volume.SetMute((AudioHandle)capture, mute);
527 }
528 
HdiServiceCaptureSetVolume(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)529 int32_t HdiServiceCaptureSetVolume(const struct HdfDeviceIoClient *client,
530     struct HdfSBuf *data, struct HdfSBuf *reply)
531 {
532     if (client == NULL || data == NULL || reply == NULL) {
533         AUDIO_FUNC_LOGE("client or data or reply is null!");
534         return AUDIO_HAL_ERR_INVALID_PARAM;
535     }
536     uint32_t volume = 0;
537     struct AudioCapture *capture = NULL;
538     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
539     if (ret < 0) {
540         return ret;
541     }
542     if (!HdfSbufReadUint32(data, &volume)) {
543         return AUDIO_HAL_ERR_INTERNAL;
544     }
545     float setVolume = (float)volume / VOLUME_CHANGE;
546     if (capture == NULL || capture->volume.SetVolume == NULL) {
547         AUDIO_FUNC_LOGE("capture or SetVolume is NULL");
548         return AUDIO_HAL_ERR_INTERNAL;
549     }
550     return capture->volume.SetVolume((AudioHandle)capture, setVolume);
551 }
552 
HdiServiceCaptureGetVolume(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)553 int32_t HdiServiceCaptureGetVolume(const struct HdfDeviceIoClient *client,
554     struct HdfSBuf *data, struct HdfSBuf *reply)
555 {
556     if (client == NULL || data == NULL || reply == NULL) {
557         AUDIO_FUNC_LOGE("client or data or reply is null!");
558         return AUDIO_HAL_ERR_INVALID_PARAM;
559     }
560     float volume;
561     struct AudioCapture *capture = NULL;
562     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
563     if (ret < 0) {
564         return ret;
565     }
566     if (capture == NULL || capture->volume.GetVolume == NULL) {
567         AUDIO_FUNC_LOGE("capture or GetVolume is NULL");
568         return AUDIO_HAL_ERR_INTERNAL;
569     }
570     ret = capture->volume.GetVolume((AudioHandle)capture, &volume);
571     if (ret < 0) {
572         return ret;
573     }
574     uint32_t tempVolume = (uint32_t)(volume * VOLUME_CHANGE);
575     if (!HdfSbufWriteUint32(reply, tempVolume)) {
576         return AUDIO_HAL_ERR_INTERNAL;
577     }
578     return AUDIO_HAL_SUCCESS;
579 }
580 
HdiServiceCaptureGetGainThreshold(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)581 int32_t HdiServiceCaptureGetGainThreshold(const struct HdfDeviceIoClient *client,
582     struct HdfSBuf *data, struct HdfSBuf *reply)
583 {
584     if (client == NULL || data == NULL || reply == NULL) {
585         AUDIO_FUNC_LOGE("client or data or reply is null!");
586         return AUDIO_HAL_ERR_INVALID_PARAM;
587     }
588     float min, max;
589     uint32_t tempMin;
590     uint32_t tempMax;
591     struct AudioCapture *capture = NULL;
592     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
593     if (ret < 0) {
594         return ret;
595     }
596     if (capture == NULL || capture->volume.GetGainThreshold == NULL) {
597         AUDIO_FUNC_LOGE("capture or GetGainThreshold is NULL");
598         return AUDIO_HAL_ERR_INTERNAL;
599     }
600     ret = capture->volume.GetGainThreshold((AudioHandle)capture, &min, &max);
601     if (ret < 0) {
602         AUDIO_FUNC_LOGE("GetGainThreshold failed! ret = %{public}d", ret);
603         return ret;
604     }
605     tempMin = (uint32_t)min;
606     if (!HdfSbufWriteUint32(reply, tempMin)) {
607         return AUDIO_HAL_ERR_INTERNAL;
608     }
609     tempMax = (uint32_t)max;
610     if (!HdfSbufWriteUint32(reply, tempMax)) {
611         return AUDIO_HAL_ERR_INTERNAL;
612     }
613     return AUDIO_HAL_SUCCESS;
614 }
615 
HdiServiceCaptureGetGain(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)616 int32_t HdiServiceCaptureGetGain(const struct HdfDeviceIoClient *client,
617     struct HdfSBuf *data, struct HdfSBuf *reply)
618 {
619     if (client == NULL || data == NULL || reply == NULL) {
620         return AUDIO_HAL_ERR_INVALID_PARAM;
621     }
622     float gain;
623     struct AudioCapture *capture = NULL;
624     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
625     if (ret < 0) {
626         return ret;
627     }
628     if (capture == NULL || capture->volume.GetGain == NULL) {
629         AUDIO_FUNC_LOGE("capture or GetGain is NULL");
630         return AUDIO_HAL_ERR_INTERNAL;
631     }
632     ret = capture->volume.GetGain((AudioHandle)capture, &gain);
633     if (ret < 0) {
634         AUDIO_FUNC_LOGE("GetGain failed! ret = %{public}d", ret);
635         return ret;
636     }
637     uint32_t tempGain = (uint32_t)gain;
638     if (!HdfSbufWriteUint32(reply, tempGain)) {
639         return AUDIO_HAL_ERR_INTERNAL;
640     }
641     return AUDIO_HAL_SUCCESS;
642 }
643 
HdiServiceCaptureSetGain(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)644 int32_t HdiServiceCaptureSetGain(const struct HdfDeviceIoClient *client,
645     struct HdfSBuf *data, struct HdfSBuf *reply)
646 {
647     if (client == NULL || data == NULL || reply == NULL) {
648         return AUDIO_HAL_ERR_INVALID_PARAM;
649     }
650     uint32_t gain = 0;
651     struct AudioCapture *capture = NULL;
652     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
653     if (ret < 0) {
654         return ret;
655     }
656     if (!HdfSbufReadUint32(data, &gain)) {
657         return AUDIO_HAL_ERR_INTERNAL;
658     }
659     if (capture == NULL || capture->volume.SetGain == NULL) {
660         AUDIO_FUNC_LOGE("capture or SetGain is NULL");
661         return AUDIO_HAL_ERR_INTERNAL;
662     }
663     return capture->volume.SetGain((AudioHandle)capture, (float)gain);
664 }
665 
HdiServiceCaptureCaptureFrame(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)666 int32_t HdiServiceCaptureCaptureFrame(const struct HdfDeviceIoClient *client,
667     struct HdfSBuf *data, struct HdfSBuf *reply)
668 {
669     if (client == NULL || data == NULL || reply == NULL) {
670         return AUDIO_HAL_ERR_INVALID_PARAM;
671     }
672     char *frame = NULL;
673     uint64_t requestBytes = 0;
674     uint64_t replyBytes = 0;
675     struct AudioCapture *capture = NULL;
676     const char *adapterName = NULL;
677     uint32_t pid = 0;
678     uint32_t index = 0;
679     if (HdiServiceRenderCaptureReadData(data, &adapterName, &pid) < 0) {
680         AUDIO_FUNC_LOGE("HdiServiceRenderRenderFrame:HdiServiceRenderCaptureReadData fail!");
681         return AUDIO_HAL_ERR_INTERNAL;
682     }
683     int32_t ret = AudioAdapterFrameGetCapture(adapterName, &capture, pid, &index);
684     if (ret < 0) {
685         AUDIO_FUNC_LOGE("AudioAdapterListGetRender fail");
686         return ret;
687     }
688     if (!HdfSbufReadUint64(data, &requestBytes)) {
689         return AUDIO_HAL_ERR_INTERNAL;
690     }
691     frame = (char *)OsalMemCalloc(FRAME_DATA);
692     if (frame == NULL) {
693         return AUDIO_HAL_ERR_MALLOC_FAIL;
694     }
695     AudioSetCaptureBusy(index, true);
696     if (capture == NULL || capture->CaptureFrame == NULL) {
697         AUDIO_FUNC_LOGE("capture or CaptureFrame is NULL");
698         AudioMemFree((void **)&frame);
699         return AUDIO_HAL_ERR_INTERNAL;
700     }
701     ret = capture->CaptureFrame((AudioHandle)capture, (void *)frame, requestBytes, &replyBytes);
702     AudioSetCaptureBusy(index, false);
703     if (ret < 0) {
704         AudioMemFree((void **)&frame);
705         return ret;
706     }
707     if (!HdfSbufWriteBuffer(reply, (const void *)frame, (uint32_t)requestBytes)) {
708         AudioMemFree((void **)&frame);
709         return AUDIO_HAL_ERR_INTERNAL;
710     }
711     if (!HdfSbufWriteUint64(reply, replyBytes)) {
712         AudioMemFree((void **)&frame);
713         return AUDIO_HAL_ERR_INTERNAL;
714     }
715     AudioMemFree((void **)&frame);
716     return AUDIO_HAL_SUCCESS;
717 }
718 
HdiServiceCaptureGetCapturePosition(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)719 int32_t HdiServiceCaptureGetCapturePosition(const struct HdfDeviceIoClient *client,
720     struct HdfSBuf *data, struct HdfSBuf *reply)
721 {
722     if (client == NULL || data == NULL || reply == NULL) {
723         return AUDIO_HAL_ERR_INVALID_PARAM;
724     }
725     struct AudioTimeStamp time;
726     uint64_t frames;
727     struct AudioCapture *capture = NULL;
728     int32_t ret = AudioAdapterListCheckAndGetCapture(&capture, data);
729     if (ret < 0) {
730         return ret;
731     }
732     if (capture == NULL || capture->GetCapturePosition == NULL) {
733         AUDIO_FUNC_LOGE("capture or GetCapturePosition is NULL");
734         return AUDIO_HAL_ERR_INTERNAL;
735     }
736     ret = capture->GetCapturePosition((AudioHandle)capture, &frames, &time);
737     if (ret < 0) {
738         AUDIO_FUNC_LOGE("GetCapturePosition fail");
739         return ret;
740     }
741     if (HdiServicePositionWrite(reply, frames, time) < 0) {
742         return AUDIO_HAL_ERR_INTERNAL;
743     }
744     return AUDIO_HAL_SUCCESS;
745 }
746 
HdiServiceCaptureSetExtraParams(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)747 int32_t HdiServiceCaptureSetExtraParams(const struct HdfDeviceIoClient *client,
748     struct HdfSBuf *data, struct HdfSBuf *reply)
749 {
750     if (client == NULL || data == NULL || reply == NULL) {
751         return AUDIO_HAL_ERR_INVALID_PARAM;
752     }
753     struct AudioCapture *capture = NULL;
754     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
755     if (ret < 0) {
756         return ret;
757     }
758     const char *keyValueList = NULL;
759     if ((keyValueList = HdfSbufReadString(data)) == NULL) {
760         AUDIO_FUNC_LOGE("keyValueList Is NULL");
761         return AUDIO_HAL_ERR_INVALID_PARAM;
762     }
763     if (capture == NULL || capture->attr.SetExtraParams == NULL) {
764         AUDIO_FUNC_LOGE("capture or SetExtraParams is NULL");
765         return AUDIO_HAL_ERR_INTERNAL;
766     }
767     return capture->attr.SetExtraParams((AudioHandle)capture, keyValueList);
768 }
769 
HdiServiceCaptureGetExtraParams(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)770 int32_t HdiServiceCaptureGetExtraParams(const struct HdfDeviceIoClient *client,
771     struct HdfSBuf *data, struct HdfSBuf *reply)
772 {
773     int32_t ret;
774     if (client == NULL || data == NULL || reply == NULL) {
775         return AUDIO_HAL_ERR_INVALID_PARAM;
776     }
777     struct AudioCapture *capture = NULL;
778     ret = AudioAdapterListCheckAndGetCapture(&capture, data);
779     if (ret < 0) {
780         return ret;
781     }
782     int32_t listLenth = 0;
783     if (!HdfSbufReadInt32(data, &listLenth)) {
784         return AUDIO_HAL_ERR_INTERNAL;
785     }
786     if (listLenth <= 0 || listLenth > STR_MAX - 1) {
787         return AUDIO_HAL_ERR_INTERNAL;
788     }
789     char keyValueList[STR_MAX] = { 0 };
790     if (capture == NULL || capture->attr.GetExtraParams == NULL) {
791         AUDIO_FUNC_LOGE("capture or GetExtraParams is NULL");
792         return AUDIO_HAL_ERR_INTERNAL;
793     }
794     ret = capture->attr.GetExtraParams((AudioHandle)capture, keyValueList, listLenth);
795     if (ret < 0) {
796         AUDIO_FUNC_LOGE("GetExtraParams failed! ret = %{public}d", ret);
797         return ret;
798     }
799     char *keyList = keyValueList;
800     if (!HdfSbufWriteString(reply, keyList)) {
801         return AUDIO_HAL_ERR_INTERNAL;
802     }
803     return AUDIO_HAL_SUCCESS;
804 }
805 
HdiServiceCaptureReqMmapBuffer(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)806 int32_t HdiServiceCaptureReqMmapBuffer(const struct HdfDeviceIoClient *client,
807     struct HdfSBuf *data, struct HdfSBuf *reply)
808 {
809     if (client == NULL || data == NULL || reply == NULL) {
810         return AUDIO_HAL_ERR_INVALID_PARAM;
811     }
812     struct AudioCapture *capture = NULL;
813     int32_t ret = AudioAdapterListCheckAndGetCapture(&capture, data);
814     if (ret < 0) {
815         return ret;
816     }
817 
818     struct AudioMmapBufferDescriptor desc;
819     int32_t reqSize = 0;
820     if (!HdfSbufReadInt32(data, &reqSize)) {
821         return AUDIO_HAL_ERR_INTERNAL;
822     }
823     if (HdiServiceReqMmapBuffer(&desc, data) < 0) {
824         return AUDIO_HAL_ERR_INTERNAL;
825     }
826     if (capture == NULL || capture->attr.ReqMmapBuffer == NULL) {
827         AUDIO_FUNC_LOGE("capture or ReqMmapBuffer is NULL");
828         return AUDIO_HAL_ERR_INTERNAL;
829     }
830     ret = capture->attr.ReqMmapBuffer((AudioHandle)capture, reqSize, &desc);
831     if (ret < 0) {
832         AUDIO_FUNC_LOGE("ReqMmapBuffer fail");
833         return ret;
834     }
835 
836     if (!HdfSbufWriteFileDescriptor(reply, desc.memoryFd)) {
837         AUDIO_FUNC_LOGE("memoryFd write fail");
838         return AUDIO_HAL_ERR_INTERNAL;
839     }
840 
841     if (!HdfSbufWriteInt32(reply, desc.totalBufferFrames)) {
842         AUDIO_FUNC_LOGE("totalBufferFrames write fail");
843         return AUDIO_HAL_ERR_INTERNAL;
844     }
845 
846     if (!HdfSbufWriteInt32(reply, desc.transferFrameSize)) {
847         AUDIO_FUNC_LOGE("transferFrameSize write fail");
848         return AUDIO_HAL_ERR_INTERNAL;
849     }
850 
851     if (!HdfSbufWriteInt32(reply, desc.isShareable)) {
852         AUDIO_FUNC_LOGE("isShareable write fail");
853         return AUDIO_HAL_ERR_INTERNAL;
854     }
855 
856     if (!HdfSbufWriteUint32(reply, desc.offset)) {
857         AUDIO_FUNC_LOGE("offset write fail");
858         return AUDIO_HAL_ERR_INTERNAL;
859     }
860     return AUDIO_HAL_SUCCESS;
861 }
862 
HdiServiceCaptureGetMmapPosition(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)863 int32_t HdiServiceCaptureGetMmapPosition(const struct HdfDeviceIoClient *client,
864     struct HdfSBuf *data, struct HdfSBuf *reply)
865 {
866     if (client == NULL || data == NULL || reply == NULL) {
867         return AUDIO_HAL_ERR_INVALID_PARAM;
868     }
869     uint64_t frames;
870     struct AudioTimeStamp time;
871     struct AudioCapture *capture = NULL;
872     int32_t ret = AudioAdapterListCheckAndGetCapture(&capture, data);
873     if (ret < 0) {
874         return ret;
875     }
876 
877     if (capture == NULL || capture->attr.GetMmapPosition == NULL) {
878         AUDIO_FUNC_LOGE("capture or GetMmapPosition is NULL");
879         return AUDIO_HAL_ERR_INTERNAL;
880     }
881     ret = capture->attr.GetMmapPosition((AudioHandle)capture, &frames, &time);
882     if (ret < 0) {
883         AUDIO_FUNC_LOGE("GetMmapPosition failed! ret = %{public}d", ret);
884         return ret;
885     }
886     if (HdiServicePositionWrite(reply, frames, time) < 0) {
887         return AUDIO_HAL_ERR_INTERNAL;
888     }
889     return AUDIO_HAL_SUCCESS;
890 }
891 
HdiServiceCaptureAddEffect(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)892 int32_t HdiServiceCaptureAddEffect(const struct HdfDeviceIoClient *client,
893     struct HdfSBuf *data, struct HdfSBuf *reply)
894 {
895     (void)client;
896     (void)reply;
897     uint64_t effectid = 0;
898     struct AudioCapture *capture = NULL;
899     if (data == NULL) {
900         return AUDIO_HAL_ERR_INVALID_PARAM;
901     }
902 
903     int32_t ret = AudioAdapterListCheckAndGetCapture(&capture, data);
904     if (ret < 0 || capture == NULL) {
905         AUDIO_FUNC_LOGE("capture is null or ret = %{public}d", ret);
906         return ret;
907     }
908 
909     if (!HdfSbufReadUint64(data, &effectid)) {
910         AUDIO_FUNC_LOGE("SbufReadUint64 failed ");
911         return HDF_FAILURE;
912     }
913 
914     if (capture->attr.AddAudioEffect == NULL) {
915         AUDIO_FUNC_LOGE("capture or GetMmapPosition is NULL");
916         return AUDIO_HAL_ERR_INTERNAL;
917     }
918     return capture->attr.AddAudioEffect((AudioHandle)capture, effectid);
919 }
920 
HdiServiceCaptureRemoveEffect(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)921 int32_t HdiServiceCaptureRemoveEffect(const struct HdfDeviceIoClient *client,
922     struct HdfSBuf *data, struct HdfSBuf *reply)
923 {
924     (void)client;
925     (void)reply;
926     uint64_t effectid = 0;
927     if (data == NULL) {
928         return AUDIO_HAL_ERR_INVALID_PARAM;
929     }
930 
931     struct AudioCapture *capture = NULL;
932     int32_t ret = AudioAdapterListCheckAndGetCapture(&capture, data);
933     if (ret < 0 || capture == NULL) {
934         AUDIO_FUNC_LOGE("capture is NULL or ret = %{public}d", ret);
935         return ret;
936     }
937 
938     if (!HdfSbufReadUint64(data, &effectid)) {
939         AUDIO_FUNC_LOGE("HdfSbufReadUint64 failed.");
940         return HDF_FAILURE;
941     }
942 
943     if (capture->attr.RemoveAudioEffect == NULL) {
944         AUDIO_FUNC_LOGE("capture or GetMmapPosition is NULL");
945         return AUDIO_HAL_ERR_INTERNAL;
946     }
947     return capture->attr.RemoveAudioEffect((AudioHandle)capture, effectid);
948 }
949 
HdiServiceCaptureTurnStandbyMode(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)950 int32_t HdiServiceCaptureTurnStandbyMode(const struct HdfDeviceIoClient *client,
951     struct HdfSBuf *data, struct HdfSBuf *reply)
952 {
953     if (client == NULL || data == NULL || reply == NULL) {
954         AUDIO_FUNC_LOGE("The pointer is null");
955         return AUDIO_HAL_ERR_INVALID_PARAM;
956     }
957     struct AudioCapture *capture = NULL;
958     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
959     if (ret < 0) {
960         return ret;
961     }
962     if (capture == NULL || capture->control.Stop == NULL) {
963         AUDIO_FUNC_LOGE("capture or Stop is NULL");
964         return AUDIO_HAL_ERR_INTERNAL;
965     }
966     return capture->control.Stop((AudioHandle)capture);
967 }
968 
HdiServiceCaptureDevDump(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)969 int32_t HdiServiceCaptureDevDump(const struct HdfDeviceIoClient *client,
970     struct HdfSBuf *data, struct HdfSBuf *reply)
971 {
972     if (client == NULL || data == NULL || reply == NULL) {
973         AUDIO_FUNC_LOGE("parameter Is NULL");
974         return AUDIO_HAL_ERR_INVALID_PARAM;
975     }
976     struct AudioCapture *capture = NULL;
977     int ret = AudioAdapterListCheckAndGetCapture(&capture, data);
978     if (ret < 0) {
979         return ret;
980     }
981     int32_t range = 0;
982     if (!HdfSbufReadInt32(data, &range)) {
983         return AUDIO_HAL_ERR_INTERNAL;
984     }
985     ret = HdfSbufReadFileDescriptor(data);
986     if (ret < 0) {
987         return AUDIO_HAL_ERR_INTERNAL;
988     }
989     int32_t fd = ret;
990     if (capture == NULL || capture->control.AudioDevDump == NULL) {
991         AUDIO_FUNC_LOGE("capture or AudioDevDump is NULL");
992         return AUDIO_HAL_ERR_INTERNAL;
993     }
994     return capture->control.AudioDevDump((AudioHandle)capture, range, fd);
995 }
996 
997