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