1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "audio_adapter_info_common.h"
17 #include "audio_proxy_common.h"
18 #include "audio_uhdf_log.h"
19
20 #define HDF_LOG_TAG HDF_AUDIO_HAL_PROXY
21
AudioProxyRenderCtrl(int cmId,AudioHandle handle)22 static int32_t AudioProxyRenderCtrl(int cmId, AudioHandle handle)
23 {
24 struct HdfSBuf *data = NULL;
25 struct HdfSBuf *reply = NULL;
26 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
27 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
28 AUDIO_FUNC_LOGE("The hwRender parameter is null");
29 return AUDIO_HAL_ERR_INVALID_PARAM;
30 }
31 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
32 return AUDIO_HAL_ERR_INTERNAL;
33 }
34 int32_t ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, cmId, data, reply);
35 AudioProxyBufReplyRecycle(data, reply);
36 return ret;
37 }
38
AudioProxyRenderStart(AudioHandle handle)39 int32_t AudioProxyRenderStart(AudioHandle handle)
40 {
41 AUDIO_FUNC_LOGI();
42 int32_t ret = AudioCheckRenderAddr(handle);
43 if (ret < 0) {
44 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
45 return ret;
46 }
47 return AudioProxyRenderCtrl(AUDIO_HDI_RENDER_START, handle);
48 }
49
AudioProxyRenderStop(AudioHandle handle)50 int32_t AudioProxyRenderStop(AudioHandle handle)
51 {
52 AUDIO_FUNC_LOGI();
53 int32_t ret = AudioCheckRenderAddr(handle);
54 if (ret < 0) {
55 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
56 return ret;
57 }
58 return AudioProxyRenderCtrl(AUDIO_HDI_RENDER_STOP, handle);
59 }
60
AudioProxyRenderPause(AudioHandle handle)61 int32_t AudioProxyRenderPause(AudioHandle handle)
62 {
63 AUDIO_FUNC_LOGI();
64 int32_t ret = AudioCheckRenderAddr(handle);
65 if (ret < 0) {
66 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
67 return ret;
68 }
69 return AudioProxyRenderCtrl(AUDIO_HDI_RENDER_PAUSE, handle);
70 }
71
AudioProxyRenderResume(AudioHandle handle)72 int32_t AudioProxyRenderResume(AudioHandle handle)
73 {
74 AUDIO_FUNC_LOGI();
75 int32_t ret = AudioCheckRenderAddr(handle);
76 if (ret < 0) {
77 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
78 return ret;
79 }
80 return AudioProxyRenderCtrl(AUDIO_HDI_RENDER_RESUME, handle);
81 }
82
AudioProxyRenderFlush(AudioHandle handle)83 int32_t AudioProxyRenderFlush(AudioHandle handle)
84 {
85 int32_t ret = AudioCheckRenderAddr(handle);
86 if (ret < 0) {
87 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid, ret = %{public}d", ret);
88 return ret;
89 }
90 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
91 if (hwRender == NULL) {
92 return AUDIO_HAL_ERR_INVALID_PARAM;
93 }
94 return AUDIO_HAL_ERR_NOT_SUPPORT;
95 }
96
AudioProxyRenderGetFrameParameter(int cmId,const AudioHandle handle,uint64_t * param)97 static int32_t AudioProxyRenderGetFrameParameter(int cmId, const AudioHandle handle, uint64_t *param)
98 {
99 if (param == NULL) {
100 return AUDIO_HAL_ERR_INVALID_PARAM;
101 }
102 int32_t ret;
103 struct HdfSBuf *data = NULL;
104 struct HdfSBuf *reply = NULL;
105 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
106 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
107 AUDIO_FUNC_LOGE("invalid pointer");
108 return AUDIO_HAL_ERR_INVALID_PARAM;
109 }
110 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
111 return AUDIO_HAL_ERR_INTERNAL;
112 }
113 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, cmId, data, reply);
114 if (ret < 0) {
115 AudioProxyBufReplyRecycle(data, reply);
116 return ret;
117 }
118 if (!HdfSbufReadUint64(reply, param)) {
119 AudioProxyBufReplyRecycle(data, reply);
120 return AUDIO_HAL_ERR_INTERNAL;
121 }
122 AudioProxyBufReplyRecycle(data, reply);
123 return AUDIO_HAL_SUCCESS;
124 }
125
AudioProxyRenderGetFrameSize(const AudioHandle handle,uint64_t * size)126 int32_t AudioProxyRenderGetFrameSize(const AudioHandle handle, uint64_t *size)
127 {
128 int32_t ret = AudioCheckRenderAddr(handle);
129 if (ret < 0) {
130 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
131 return ret;
132 }
133 return AudioProxyRenderGetFrameParameter(AUDIO_HDI_RENDER_GET_FRAME_SIZE, handle, size);
134 }
135
AudioProxyRenderGetFrameCount(const AudioHandle handle,uint64_t * count)136 int32_t AudioProxyRenderGetFrameCount(const AudioHandle handle, uint64_t *count)
137 {
138 int32_t ret = AudioCheckRenderAddr(handle);
139 if (ret < 0) {
140 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
141 return ret;
142 }
143 return AudioProxyRenderGetFrameParameter(AUDIO_HDI_RENDER_GET_FRAME_COUNT, handle, count);
144 }
145
AudioProxyRenderSetSampleAttributes(const AudioHandle handle,const struct AudioSampleAttributes * attrs)146 int32_t AudioProxyRenderSetSampleAttributes(const AudioHandle handle, const struct AudioSampleAttributes *attrs)
147 {
148 int32_t ret = AudioCheckRenderAddr(handle);
149 if (ret < 0) {
150 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
151 return ret;
152 }
153 if (handle == NULL || attrs == NULL) {
154 return AUDIO_HAL_ERR_INVALID_PARAM;
155 }
156 struct HdfSBuf *data = NULL;
157 struct HdfSBuf *reply = NULL;
158 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
159 if (hwRender->proxyRemoteHandle == NULL) {
160 AUDIO_FUNC_LOGE("pointer is invalid");
161 return AUDIO_HAL_ERR_INVALID_PARAM;
162 }
163 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
164 return AUDIO_HAL_ERR_INTERNAL;
165 }
166 if (AudioProxyWriteSampleAttributes(data, attrs) < 0) {
167 AudioProxyBufReplyRecycle(data, reply);
168 return AUDIO_HAL_ERR_INTERNAL;
169 }
170 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_SET_SAMPLE_ATTR, data, reply);
171 AudioProxyBufReplyRecycle(data, reply);
172 return ret;
173 }
174
AudioProxyRenderGetSampleAttributes(const AudioHandle handle,struct AudioSampleAttributes * attrs)175 int32_t AudioProxyRenderGetSampleAttributes(const AudioHandle handle,
176 struct AudioSampleAttributes *attrs)
177 {
178 int32_t ret = AudioCheckRenderAddr(handle);
179 if (ret < 0) {
180 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
181 return ret;
182 }
183 if (attrs == NULL) {
184 return AUDIO_HAL_ERR_INVALID_PARAM;
185 }
186 struct HdfSBuf *data = NULL;
187 struct HdfSBuf *reply = NULL;
188 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
189 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
190 AUDIO_FUNC_LOGE("The hwRender parameter is empty");
191 return AUDIO_HAL_ERR_INVALID_PARAM;
192 }
193 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
194 return AUDIO_HAL_ERR_INTERNAL;
195 }
196 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_GET_SAMPLE_ATTR, data, reply);
197 if (ret < 0) {
198 AUDIO_FUNC_LOGE("AudioRenderGetSampleAttributes FAIL");
199 AudioProxyBufReplyRecycle(data, reply);
200 return ret;
201 }
202 if (AudioProxyReadSapmleAttrbutes(reply, attrs) < 0) {
203 AUDIO_FUNC_LOGE("AudioProxyReadSapmleAttrbutes FAIL");
204 AudioProxyBufReplyRecycle(data, reply);
205 return AUDIO_HAL_ERR_INTERNAL;
206 }
207 AudioProxyBufReplyRecycle(data, reply);
208 return AUDIO_HAL_SUCCESS;
209 }
210
AudioProxyRenderGetCurrentChannelId(const AudioHandle handle,uint32_t * channelId)211 int32_t AudioProxyRenderGetCurrentChannelId(const AudioHandle handle, uint32_t *channelId)
212 {
213 int32_t ret = AudioCheckRenderAddr(handle);
214 if (ret < 0) {
215 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
216 return ret;
217 }
218 if (channelId == NULL) {
219 AUDIO_FUNC_LOGE("channedId is null!");
220 return AUDIO_HAL_ERR_INVALID_PARAM;
221 }
222 struct HdfSBuf *data = NULL;
223 struct HdfSBuf *reply = NULL;
224 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
225 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
226 AUDIO_FUNC_LOGE("pointer is null");
227 return AUDIO_HAL_ERR_INVALID_PARAM;
228 }
229 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
230 return AUDIO_HAL_ERR_INTERNAL;
231 }
232 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_GET_CUR_CHANNEL_ID, data, reply);
233 if (ret < 0) {
234 AUDIO_FUNC_LOGE("AudioRenderGetCurrentChannelId FAIL");
235 AudioProxyBufReplyRecycle(data, reply);
236 return ret;
237 }
238 if (!HdfSbufReadUint32(reply, channelId)) {
239 AudioProxyBufReplyRecycle(data, reply);
240 return AUDIO_HAL_ERR_INTERNAL;
241 }
242 AudioProxyBufReplyRecycle(data, reply);
243 return AUDIO_HAL_SUCCESS;
244 }
245
AudioProxyRenderCheckSceneCapability(const AudioHandle handle,const struct AudioSceneDescriptor * scene,bool * supported)246 int32_t AudioProxyRenderCheckSceneCapability(const AudioHandle handle,
247 const struct AudioSceneDescriptor *scene, bool *supported)
248 {
249 int32_t ret = AudioCheckRenderAddr(handle);
250 if (ret < 0) {
251 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
252 return ret;
253 }
254 if (scene == NULL || supported == NULL) {
255 return AUDIO_HAL_ERR_INVALID_PARAM;
256 }
257 uint32_t tempPins;
258 struct HdfSBuf *data = NULL;
259 struct HdfSBuf *reply = NULL;
260 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
261 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
262 AUDIO_FUNC_LOGE("The hwRender pointer is null");
263 return AUDIO_HAL_ERR_INVALID_PARAM;
264 }
265 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
266 AUDIO_FUNC_LOGE("AudioProxyPreprocessRender FAIL");
267 return AUDIO_HAL_ERR_INTERNAL;
268 }
269 if (!HdfSbufWriteUint32(data, scene->scene.id)) {
270 AUDIO_FUNC_LOGE("scene->scene.id Write FAIL");
271 AudioProxyBufReplyRecycle(data, reply);
272 return AUDIO_HAL_ERR_INTERNAL;
273 }
274 tempPins = (uint32_t)scene->desc.pins;
275 if (!HdfSbufWriteUint32(data, tempPins)) {
276 AUDIO_FUNC_LOGE("tempPins Write FAIL");
277 AudioProxyBufReplyRecycle(data, reply);
278 return AUDIO_HAL_ERR_INTERNAL;
279 }
280 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle,
281 AUDIO_HDI_RENDER_CHECK_SCENE_CAPABILITY, data, reply);
282 if (ret < 0) {
283 AUDIO_FUNC_LOGE("AudioRenderCheckSceneCapability FAIL");
284 AudioProxyBufReplyRecycle(data, reply);
285 return ret;
286 }
287 uint32_t tempSupported = 0;
288 if (!HdfSbufReadUint32(reply, &tempSupported)) {
289 AudioProxyBufReplyRecycle(data, reply);
290 return AUDIO_HAL_ERR_INTERNAL;
291 }
292 *supported = (bool)tempSupported;
293 AudioProxyBufReplyRecycle(data, reply);
294 return AUDIO_HAL_SUCCESS;
295 }
296
AudioProxyRenderSelectScene(const AudioHandle handle,const struct AudioSceneDescriptor * scene)297 int32_t AudioProxyRenderSelectScene(const AudioHandle handle, const struct AudioSceneDescriptor *scene)
298 {
299 int32_t ret = AudioCheckRenderAddr(handle);
300 if (ret < 0) {
301 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
302 return ret;
303 }
304 if (scene == NULL) {
305 return AUDIO_HAL_ERR_INVALID_PARAM;
306 }
307 struct HdfSBuf *data = NULL;
308 struct HdfSBuf *reply = NULL;
309 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
310 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
311 AUDIO_FUNC_LOGE("parameter is null");
312 return AUDIO_HAL_ERR_INVALID_PARAM;
313 }
314 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
315 return AUDIO_HAL_ERR_INTERNAL;
316 }
317 if (!HdfSbufWriteUint32(data, scene->scene.id)) {
318 AudioProxyBufReplyRecycle(data, reply);
319 return AUDIO_HAL_ERR_INTERNAL;
320 }
321 uint32_t temporaryPins = scene->desc.pins;
322 if (!HdfSbufWriteUint32(data, temporaryPins)) {
323 AudioProxyBufReplyRecycle(data, reply);
324 return AUDIO_HAL_ERR_INTERNAL;
325 }
326 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_SELECT_SCENE, data, reply);
327 AudioProxyBufReplyRecycle(data, reply);
328 return ret;
329 }
330
AudioProxyRenderSetMute(const AudioHandle handle,bool mute)331 int32_t AudioProxyRenderSetMute(const AudioHandle handle, bool mute)
332 {
333 struct HdfSBuf *data = NULL;
334 struct HdfSBuf *reply = NULL;
335 int32_t ret = AudioCheckRenderAddr(handle);
336 if (ret < 0) {
337 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
338 return ret;
339 }
340 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
341 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
342 AUDIO_FUNC_LOGE("The params is null.");
343 return AUDIO_HAL_ERR_INVALID_PARAM;
344 }
345 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
346 return AUDIO_HAL_ERR_INTERNAL;
347 }
348 uint32_t tempMute = (uint32_t)mute;
349 if (!HdfSbufWriteUint32(data, tempMute)) {
350 AudioProxyBufReplyRecycle(data, reply);
351 return AUDIO_HAL_ERR_INTERNAL;
352 }
353 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_SET_MUTE, data, reply);
354 AudioProxyBufReplyRecycle(data, reply);
355 return ret;
356 }
357
AudioProxyRenderGetMute(const AudioHandle handle,bool * mute)358 int32_t AudioProxyRenderGetMute(const AudioHandle handle, bool *mute)
359 {
360 int32_t ret = AudioCheckRenderAddr(handle);
361 if (ret < 0) {
362 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
363 return ret;
364 }
365 if (mute == NULL) {
366 return AUDIO_HAL_ERR_INVALID_PARAM;
367 }
368 struct HdfSBuf *data = NULL;
369 struct HdfSBuf *reply = NULL;
370 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
371 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
372 AUDIO_FUNC_LOGE("The parameter is null");
373 return AUDIO_HAL_ERR_INVALID_PARAM;
374 }
375 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
376 return AUDIO_HAL_ERR_INTERNAL;
377 }
378 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_GET_MUTE, data, reply);
379 uint32_t tempMute = 0;
380 if (!HdfSbufReadUint32(reply, &tempMute)) {
381 AudioProxyBufReplyRecycle(data, reply);
382 return AUDIO_HAL_ERR_INTERNAL;
383 }
384 *mute = (bool)tempMute;
385 AudioProxyBufReplyRecycle(data, reply);
386 AUDIO_FUNC_LOGI("GetMute SUCCESS!");
387 return ret;
388 }
389
AudioProxyRenderSetVolume(const AudioHandle handle,float volume)390 int32_t AudioProxyRenderSetVolume(const AudioHandle handle, float volume)
391 {
392 AUDIO_FUNC_LOGI();
393 int32_t ret = AudioCheckRenderAddr(handle);
394 if (ret < 0) {
395 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
396 return ret;
397 }
398 return AudioProxyCommonSetRenderCtrlParam(AUDIO_HDI_RENDER_SET_VOLUME, handle, volume);
399 }
400
AudioProxyRenderGetVolume(const AudioHandle handle,float * volume)401 int32_t AudioProxyRenderGetVolume(const AudioHandle handle, float *volume)
402 {
403 AUDIO_FUNC_LOGI();
404 int32_t ret = AudioCheckRenderAddr(handle);
405 if (ret < 0) {
406 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
407 return ret;
408 }
409 return AudioProxyCommonGetRenderCtrlParam(AUDIO_HDI_RENDER_GET_VOLUME, handle, volume);
410 }
411
AudioProxyRenderGetGainThreshold(const AudioHandle handle,float * min,float * max)412 int32_t AudioProxyRenderGetGainThreshold(const AudioHandle handle, float *min, float *max)
413 {
414 int32_t ret = AudioCheckRenderAddr(handle);
415 if (ret < 0) {
416 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
417 return ret;
418 }
419 if (min == NULL || max == NULL) {
420 return AUDIO_HAL_ERR_INVALID_PARAM;
421 }
422 struct HdfSBuf *data = NULL;
423 struct HdfSBuf *reply = NULL;
424 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
425 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
426 AUDIO_FUNC_LOGE("The pointer is invalid");
427 return AUDIO_HAL_ERR_INVALID_PARAM;
428 }
429 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
430 return AUDIO_HAL_ERR_INTERNAL;
431 }
432 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_GET_GAIN_THRESHOLD, data, reply);
433 if (ret < 0) {
434 AUDIO_FUNC_LOGE("AudioRenderGetGainThreshold FAIL");
435 AudioProxyBufReplyRecycle(data, reply);
436 return ret;
437 }
438 uint32_t tempMin = 0;
439 uint32_t tempMax = 0;
440 if (!HdfSbufReadUint32(reply, &tempMin)) {
441 AudioProxyBufReplyRecycle(data, reply);
442 return AUDIO_HAL_ERR_INTERNAL;
443 }
444 if (!HdfSbufReadUint32(reply, &tempMax)) {
445 AudioProxyBufReplyRecycle(data, reply);
446 return AUDIO_HAL_ERR_INTERNAL;
447 }
448 *min = (float)tempMin;
449 *max = (float)tempMax;
450 AudioProxyBufReplyRecycle(data, reply);
451 return AUDIO_HAL_SUCCESS;
452 }
453
AudioProxyRenderGetGain(const AudioHandle handle,float * gain)454 int32_t AudioProxyRenderGetGain(const AudioHandle handle, float *gain)
455 {
456 int32_t ret = AudioCheckRenderAddr(handle);
457 if (ret < 0) {
458 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
459 return ret;
460 }
461 return AudioProxyCommonGetRenderCtrlParam(AUDIO_HDI_RENDER_GET_GAIN, handle, gain);
462 }
463
AudioProxyRenderSetGain(const AudioHandle handle,float gain)464 int32_t AudioProxyRenderSetGain(const AudioHandle handle, float gain)
465 {
466 int32_t ret = AudioCheckRenderAddr(handle);
467 if (ret < 0) {
468 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
469 return ret;
470 }
471 return AudioProxyCommonSetRenderCtrlParam(AUDIO_HDI_RENDER_SET_GAIN, handle, gain);
472 }
473
AudioProxyRenderGetLatency(struct AudioRender * render,uint32_t * ms)474 int32_t AudioProxyRenderGetLatency(struct AudioRender *render, uint32_t *ms)
475 {
476 int32_t ret = AudioCheckRenderAddr((AudioHandle)render);
477 if (ret < 0) {
478 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
479 return ret;
480 }
481 struct HdfSBuf *data = NULL;
482 struct HdfSBuf *reply = NULL;
483 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
484 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL || ms == NULL) {
485 AUDIO_FUNC_LOGE("The pointer is empty");
486 return AUDIO_HAL_ERR_INVALID_PARAM;
487 }
488 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
489 return AUDIO_HAL_ERR_INTERNAL;
490 }
491 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_GET_LATENCY, data, reply);
492 if (ret < 0) {
493 AUDIO_FUNC_LOGE("AudioRenderGetLatency FAIL");
494 AudioProxyBufReplyRecycle(data, reply);
495 return ret;
496 }
497 if (!HdfSbufReadUint32(reply, ms)) {
498 AudioProxyBufReplyRecycle(data, reply);
499 return AUDIO_HAL_ERR_INTERNAL;
500 }
501 AudioProxyBufReplyRecycle(data, reply);
502 return AUDIO_HAL_SUCCESS;
503 }
504
AudioProxyRenderRenderFrame(struct AudioRender * render,const void * frame,uint64_t requestBytes,uint64_t * replyBytes)505 int32_t AudioProxyRenderRenderFrame(struct AudioRender *render, const void *frame,
506 uint64_t requestBytes, uint64_t *replyBytes)
507 {
508 int32_t ret = AudioCheckRenderAddr((AudioHandle)render);
509 if (ret < 0) {
510 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
511 return ret;
512 }
513 if (frame == NULL || replyBytes == NULL) {
514 AUDIO_FUNC_LOGE("Render Frame Paras is NULL!");
515 return AUDIO_HAL_ERR_INVALID_PARAM;
516 }
517 struct HdfSBuf *data = NULL;
518 struct HdfSBuf *reply = NULL;
519 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
520 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
521 AUDIO_FUNC_LOGE("The hwRender parameter is null");
522 return AUDIO_HAL_ERR_INVALID_PARAM;
523 }
524 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
525 AUDIO_FUNC_LOGE("AudioProxyPreprocessRender FAIL");
526 return AUDIO_HAL_ERR_INTERNAL;
527 }
528 if (!HdfSbufWriteBuffer(data, frame, (uint32_t)requestBytes)) {
529 AudioProxyBufReplyRecycle(data, reply);
530 AUDIO_FUNC_LOGE("HdfSbufWriteBuffer FAIL");
531 return AUDIO_HAL_ERR_INTERNAL;
532 }
533 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_RENDER_FRAME, data, reply);
534 if (ret < 0) {
535 if (ret != AUDIO_HAL_ERR_INVALID_OBJECT) {
536 AUDIO_FUNC_LOGE("AudioRenderRenderFrame FAIL");
537 }
538 AudioProxyBufReplyRecycle(data, reply);
539 return ret;
540 }
541 *replyBytes = requestBytes;
542 AudioProxyBufReplyRecycle(data, reply);
543 return AUDIO_HAL_SUCCESS;
544 }
545
AudioProxyRenderGetRenderPosition(struct AudioRender * render,uint64_t * frames,struct AudioTimeStamp * time)546 int32_t AudioProxyRenderGetRenderPosition(struct AudioRender *render, uint64_t *frames, struct AudioTimeStamp *time)
547 {
548 int32_t ret = AudioCheckRenderAddr((AudioHandle)render);
549 if (ret < 0) {
550 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
551 return ret;
552 }
553 if (frames == NULL || time == NULL) {
554 return AUDIO_HAL_ERR_INVALID_PARAM;
555 }
556 struct HdfSBuf *data = NULL;
557 struct HdfSBuf *reply = NULL;
558 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
559 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
560 AUDIO_FUNC_LOGE("hwRender or hwRender->proxyRemoteHandle invalid");
561 return AUDIO_HAL_ERR_INVALID_PARAM;
562 }
563 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
564 AUDIO_FUNC_LOGE("AudioProxyPreprocessRender FAIL");
565 return AUDIO_HAL_ERR_INTERNAL;
566 }
567 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle,
568 AUDIO_HDI_RENDER_GET_RENDER_POSITION, data, reply);
569 if (ret < 0) {
570 AUDIO_FUNC_LOGE("AudioRenderGetRenderPosition FAIL");
571 AudioProxyBufReplyRecycle(data, reply);
572 return ret;
573 }
574 if (AudioProxyGetMmapPositionRead(reply, frames, time) < 0) {
575 AUDIO_FUNC_LOGE("AudioProxyGetMmapPositionRead FAIL");
576 AudioProxyBufReplyRecycle(data, reply);
577 return AUDIO_HAL_ERR_INTERNAL;
578 }
579 AudioProxyBufReplyRecycle(data, reply);
580 return AUDIO_HAL_SUCCESS;
581 }
582
AudioProxyRenderSetRenderSpeed(struct AudioRender * render,float speed)583 int32_t AudioProxyRenderSetRenderSpeed(struct AudioRender *render, float speed)
584 {
585 (void)speed;
586 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
587 if (hwRender == NULL) {
588 return AUDIO_HAL_ERR_INVALID_PARAM;
589 }
590 return AUDIO_HAL_ERR_NOT_SUPPORT;
591 }
592
AudioProxyRenderGetRenderSpeed(struct AudioRender * render,float * speed)593 int32_t AudioProxyRenderGetRenderSpeed(struct AudioRender *render, float *speed)
594 {
595 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
596 if (hwRender == NULL || speed == NULL) {
597 return AUDIO_HAL_ERR_INVALID_PARAM;
598 }
599 return AUDIO_HAL_ERR_NOT_SUPPORT;
600 }
601
AudioProxyRenderSetChannelMode(struct AudioRender * render,enum AudioChannelMode mode)602 int32_t AudioProxyRenderSetChannelMode(struct AudioRender *render, enum AudioChannelMode mode)
603 {
604 int32_t ret = AudioCheckRenderAddr((AudioHandle)render);
605 if (ret < 0) {
606 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
607 return ret;
608 }
609 struct HdfSBuf *data = NULL;
610 struct HdfSBuf *reply = NULL;
611 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
612 if (hwRender == NULL || hwRender->proxyRemoteHandle == NULL) {
613 AUDIO_FUNC_LOGE("parameter is null");
614 return AUDIO_HAL_ERR_INVALID_PARAM;
615 }
616 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
617 AUDIO_FUNC_LOGE("AudioProxyPreprocessRender FAIL");
618 return AUDIO_HAL_ERR_INTERNAL;
619 }
620 uint32_t tempMode = (uint32_t)mode;
621 if (!HdfSbufWriteUint32(data, tempMode)) {
622 AudioProxyBufReplyRecycle(data, reply);
623 return AUDIO_HAL_ERR_INTERNAL;
624 }
625 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_SET_CHANNEL_MODE, data, reply);
626 AudioProxyBufReplyRecycle(data, reply);
627 return ret;
628 }
629
AudioProxyRenderGetChannelMode(struct AudioRender * render,enum AudioChannelMode * mode)630 int32_t AudioProxyRenderGetChannelMode(struct AudioRender *render, enum AudioChannelMode *mode)
631 {
632 int32_t ret = AudioCheckRenderAddr((AudioHandle)render);
633 if (ret < 0) {
634 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
635 return ret;
636 }
637 if (mode == NULL || render == NULL) {
638 return AUDIO_HAL_ERR_INVALID_PARAM;
639 }
640 struct HdfSBuf *data = NULL;
641 struct HdfSBuf *reply = NULL;
642 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
643 if (hwRender->proxyRemoteHandle == NULL) {
644 AUDIO_FUNC_LOGE("hwRender or hwRender->proxyRemoteHandle is NULL");
645 return AUDIO_HAL_ERR_INVALID_PARAM;
646 }
647 ret = AudioProxyPreprocessRender(hwRender, &data, &reply);
648 if (ret < 0) {
649 AUDIO_FUNC_LOGE("AudioProxyPreprocessRender FAIL");
650 return AUDIO_HAL_ERR_INTERNAL;
651 }
652 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_GET_CHANNEL_MODE, data, reply);
653 if (ret < 0) {
654 AUDIO_FUNC_LOGE("AudioRenderGetChannelMode FAIL");
655 AudioProxyBufReplyRecycle(data, reply);
656 return ret;
657 }
658 uint32_t tempMode = 0;
659 if (!HdfSbufReadUint32(reply, &tempMode)) {
660 AudioProxyBufReplyRecycle(data, reply);
661 return AUDIO_HAL_ERR_INTERNAL;
662 }
663 *mode = (enum AudioChannelMode)tempMode;
664 AudioProxyBufReplyRecycle(data, reply);
665 return AUDIO_HAL_SUCCESS;
666 }
667
AudioProxyRenderSetExtraParams(AudioHandle handle,const char * keyValueList)668 int32_t AudioProxyRenderSetExtraParams(AudioHandle handle, const char *keyValueList)
669 {
670 int32_t ret = AudioCheckRenderAddr(handle);
671 if (ret < 0) {
672 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
673 return ret;
674 }
675 if (handle == NULL || keyValueList == NULL) {
676 AUDIO_FUNC_LOGE("The parameter is empty");
677 return AUDIO_HAL_ERR_INVALID_PARAM;
678 }
679 struct HdfSBuf *data = NULL;
680 struct HdfSBuf *reply = NULL;
681 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
682 if (hwRender->proxyRemoteHandle == NULL) {
683 AUDIO_FUNC_LOGE("The parameter is null");
684 return AUDIO_HAL_ERR_INVALID_PARAM;
685 }
686 if (AudioProxyPreprocessRender((AudioHandle)hwRender, &data, &reply) < 0) {
687 return AUDIO_HAL_ERR_INTERNAL;
688 }
689 if (!HdfSbufWriteString(data, keyValueList)) {
690 AudioProxyBufReplyRecycle(data, reply);
691 return AUDIO_HAL_ERR_INTERNAL;
692 }
693 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_SET_EXTRA_PARAMS, data, reply);
694 AudioProxyBufReplyRecycle(data, reply);
695 return ret;
696 }
AudioProxyRenderGetExtraParams(AudioHandle handle,char * keyValueList,int32_t listLenth)697 int32_t AudioProxyRenderGetExtraParams(AudioHandle handle, char *keyValueList, int32_t listLenth)
698 {
699 AUDIO_FUNC_LOGI();
700 int32_t ret = AudioCheckRenderAddr(handle);
701 if (ret < 0) {
702 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
703 return ret;
704 }
705 if (handle == NULL || keyValueList == NULL || listLenth <= 0) {
706 return AUDIO_HAL_ERR_INVALID_PARAM;
707 }
708 struct HdfSBuf *data = NULL;
709 struct HdfSBuf *reply = NULL;
710 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
711 if (hwRender->proxyRemoteHandle == NULL) {
712 AUDIO_FUNC_LOGE("parameter is null");
713 return AUDIO_HAL_ERR_INVALID_PARAM;
714 }
715 if (AudioProxyPreprocessRender((AudioHandle)hwRender, &data, &reply) < 0) {
716 AUDIO_FUNC_LOGE("AudioProxyRenderGetExtraParams FAIL");
717 return AUDIO_HAL_ERR_INTERNAL;
718 }
719 if (!HdfSbufWriteInt32(data, listLenth)) {
720 AudioProxyBufReplyRecycle(data, reply);
721 return AUDIO_HAL_ERR_INTERNAL;
722 }
723 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_GET_EXTRA_PARAMS, data, reply);
724 if (ret < 0) {
725 AUDIO_FUNC_LOGE("AudioProxyRenderGetExtraParams FAIL");
726 AudioProxyBufReplyRecycle(data, reply);
727 return ret;
728 }
729 const char *strKeyValueList = NULL;
730 if ((strKeyValueList = HdfSbufReadString(reply)) == NULL) {
731 AUDIO_FUNC_LOGE("keyValueList Is empty");
732 AudioProxyBufReplyRecycle(data, reply);
733 return AUDIO_HAL_ERR_INTERNAL;
734 }
735 ret = strncpy_s(keyValueList, listLenth, strKeyValueList, strlen(strKeyValueList));
736 if (ret != 0) {
737 AUDIO_FUNC_LOGE("Copy failed!");
738 AudioProxyBufReplyRecycle(data, reply);
739 return AUDIO_HAL_ERR_INTERNAL;
740 }
741 AudioProxyBufReplyRecycle(data, reply);
742 return ret;
743 }
744
AudioProxyRenderReqMmapBuffer(AudioHandle handle,int32_t reqSize,struct AudioMmapBufferDescripter * desc)745 int32_t AudioProxyRenderReqMmapBuffer(AudioHandle handle, int32_t reqSize, struct AudioMmapBufferDescripter *desc)
746 {
747 int32_t ret = AudioCheckRenderAddr(handle);
748 if (ret < 0) {
749 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
750 return ret;
751 }
752 if (handle == NULL || desc == NULL) {
753 return AUDIO_HAL_ERR_INVALID_PARAM;
754 }
755 struct HdfSBuf *data = NULL;
756 struct HdfSBuf *reply = NULL;
757 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
758 if (hwRender->proxyRemoteHandle == NULL) {
759 AUDIO_FUNC_LOGE("hwRender or hwRender->proxyRemoteHandle is NULL");
760 return AUDIO_HAL_ERR_INVALID_PARAM;
761 }
762
763 if (AudioProxyPreprocessRender((AudioHandle)hwRender, &data, &reply) < 0) {
764 AUDIO_FUNC_LOGE("AudioProxyRenderReqMmapBuffer FAIL");
765 return AUDIO_HAL_ERR_INTERNAL;
766 }
767 if (AudioProxyReqMmapBufferWrite(data, reqSize, desc) < 0) {
768 AudioProxyBufReplyRecycle(data, reply);
769 return AUDIO_HAL_ERR_INTERNAL;
770 }
771 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_REQ_MMAP_BUFFER, data, reply);
772 if (ret < 0) {
773 AUDIO_FUNC_LOGE("AudioProxyRenderReqMmapBuffer FAIL");
774 AudioProxyBufReplyRecycle(data, reply);
775 return ret;
776 }
777
778 AudioProxyBufReplyRecycle(data, reply);
779 return ret;
780 }
781
AudioProxyRenderGetMmapPosition(AudioHandle handle,uint64_t * frames,struct AudioTimeStamp * time)782 int32_t AudioProxyRenderGetMmapPosition(AudioHandle handle, uint64_t *frames, struct AudioTimeStamp *time)
783 {
784 int32_t ret = AudioCheckRenderAddr(handle);
785 if (ret < 0) {
786 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
787 return ret;
788 }
789 if (handle == NULL || frames == NULL || time == NULL) {
790 return AUDIO_HAL_ERR_INVALID_PARAM;
791 }
792 struct HdfSBuf *data = NULL;
793 struct HdfSBuf *reply = NULL;
794 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
795 if (hwRender->proxyRemoteHandle == NULL) {
796 AUDIO_FUNC_LOGE("The parameter is empty");
797 return AUDIO_HAL_ERR_INVALID_PARAM;
798 }
799
800 if (AudioProxyPreprocessRender((AudioHandle)hwRender, &data, &reply) < 0) {
801 AUDIO_FUNC_LOGE("AudioProxyRenderGetMmapPosition FAIL");
802 return AUDIO_HAL_ERR_INTERNAL;
803 }
804 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_GET_MMAP_POSITION, data, reply);
805 if (ret < 0) {
806 AudioProxyBufReplyRecycle(data, reply);
807 AUDIO_FUNC_LOGE("AudioProxyRenderGetMmapPosition FAIL");
808 return ret;
809 }
810 if (AudioProxyGetMmapPositionRead(reply, frames, time) < 0) {
811 AudioProxyBufReplyRecycle(data, reply);
812 return AUDIO_HAL_ERR_INTERNAL;
813 }
814 AudioProxyBufReplyRecycle(data, reply);
815 return AUDIO_HAL_SUCCESS;
816 }
817
AudioProxyRenderAddEffect(AudioHandle handle,uint64_t effectid)818 int32_t AudioProxyRenderAddEffect(AudioHandle handle, uint64_t effectid)
819 {
820 struct HdfSBuf *data = NULL;
821 struct HdfSBuf *reply = NULL;
822 struct AudioHwRender *hwRender = NULL;
823 int32_t ret = AudioCheckRenderAddr(handle);
824 if (ret < 0) {
825 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
826 return ret;
827 }
828 if (handle == NULL) {
829 AUDIO_FUNC_LOGE("handle is empty");
830 return AUDIO_HAL_ERR_INVALID_PARAM;
831 }
832 hwRender = (struct AudioHwRender *)handle;
833 if (hwRender->proxyRemoteHandle == NULL) {
834 AUDIO_FUNC_LOGE("The pointer is null");
835 return AUDIO_HAL_ERR_INVALID_PARAM;
836 }
837 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
838 return AUDIO_HAL_ERR_INTERNAL;
839 }
840 if (!HdfSbufWriteUint64(data, effectid)) {
841 AudioProxyBufReplyRecycle(data, reply);
842 return AUDIO_HAL_ERR_INTERNAL;
843 }
844 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_ADD_EFFECT, data, reply);
845 if (ret < 0) {
846 AUDIO_FUNC_LOGE("Dispatch AudioProxyRenderAddEffect FAIL ret = %{public}d", ret);
847 AudioProxyBufReplyRecycle(data, reply);
848 return ret;
849 }
850
851 AudioProxyBufReplyRecycle(data, reply);
852 return AUDIO_HAL_SUCCESS;
853 }
854
AudioProxyRenderRemoveEffect(AudioHandle handle,uint64_t effectid)855 int32_t AudioProxyRenderRemoveEffect(AudioHandle handle, uint64_t effectid)
856 {
857 int32_t ret = AudioCheckRenderAddr(handle);
858 if (ret < 0) {
859 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
860 return ret;
861 }
862 if (handle == NULL) {
863 AUDIO_FUNC_LOGE("The handle is null");
864 return AUDIO_HAL_ERR_INVALID_PARAM;
865 }
866 struct HdfSBuf *reply = NULL;
867 struct HdfSBuf *data = NULL;
868 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
869 if (hwRender->proxyRemoteHandle == NULL) {
870 AUDIO_FUNC_LOGE("The pointer is null");
871 return AUDIO_HAL_ERR_INVALID_PARAM;
872 }
873 if (AudioProxyPreprocessRender(hwRender, &data, &reply) < 0) {
874 AUDIO_FUNC_LOGE("AudioProxyPreprocessRender failed");
875 return AUDIO_HAL_ERR_INTERNAL;
876 }
877 if (!HdfSbufWriteUint64(data, effectid)) {
878 AudioProxyBufReplyRecycle(data, reply);
879 return AUDIO_HAL_ERR_INTERNAL;
880 }
881 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_REMOVE_EFFECT, data, reply);
882 if (ret < 0) {
883 AUDIO_FUNC_LOGE("Dispatch AudioProxyRenderRemoveEffect FAIL ret = %{public}d", ret);
884 AudioProxyBufReplyRecycle(data, reply);
885 return ret;
886 }
887
888 AudioProxyBufReplyRecycle(data, reply);
889 return AUDIO_HAL_SUCCESS;
890 }
891
AudioProxyRenderTurnStandbyMode(AudioHandle handle)892 int32_t AudioProxyRenderTurnStandbyMode(AudioHandle handle)
893 {
894 int32_t ret;
895 struct HdfSBuf *data = NULL;
896 struct HdfSBuf *reply = NULL;
897 ret = AudioCheckRenderAddr(handle);
898 if (ret < 0) {
899 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
900 return ret;
901 }
902 if (handle == NULL) {
903 AUDIO_FUNC_LOGE("handle is null");
904 return AUDIO_HAL_ERR_INVALID_PARAM;
905 }
906 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
907 if (hwRender->proxyRemoteHandle == NULL) {
908 AUDIO_FUNC_LOGE("parameter is empty");
909 return AUDIO_HAL_ERR_INVALID_PARAM;
910 }
911
912 if (AudioProxyPreprocessRender((AudioHandle)hwRender, &data, &reply) < 0) {
913 AUDIO_FUNC_LOGE("AudioProxyRenderTurnStandbyMode FAIL");
914 return AUDIO_HAL_ERR_INTERNAL;
915 }
916 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_TURN_STAND_BY_MODE, data, reply);
917 if (ret < 0) {
918 AUDIO_FUNC_LOGE("AudioProxyRenderTurnStandbyMode FAIL");
919 AudioProxyBufReplyRecycle(data, reply);
920 return ret;
921 }
922 AudioProxyBufReplyRecycle(data, reply);
923 return ret;
924 }
AudioProxyRenderAudioDevDump(AudioHandle handle,int32_t range,int32_t fd)925 int32_t AudioProxyRenderAudioDevDump(AudioHandle handle, int32_t range, int32_t fd)
926 {
927 int32_t ret = AudioCheckRenderAddr(handle);
928 if (ret < 0) {
929 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
930 return ret;
931 }
932 if (handle == NULL) {
933 return AUDIO_HAL_ERR_INVALID_PARAM;
934 }
935 struct HdfSBuf *data = NULL;
936 struct HdfSBuf *reply = NULL;
937 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
938 if (hwRender->proxyRemoteHandle == NULL) {
939 AUDIO_FUNC_LOGE("The hwRender parameter is empty");
940 return AUDIO_HAL_ERR_INVALID_PARAM;
941 }
942 if (AudioProxyPreprocessRender((AudioHandle)hwRender, &data, &reply) < 0) {
943 AUDIO_FUNC_LOGE("AudioProxyRenderAudioDevDump FAIL");
944 return AUDIO_HAL_ERR_INTERNAL;
945 }
946 if (!HdfSbufWriteInt32(data, range)) {
947 AudioProxyBufReplyRecycle(data, reply);
948 AUDIO_FUNC_LOGE("Write FAIL");
949 return AUDIO_HAL_ERR_INTERNAL;
950 }
951 if (!HdfSbufWriteFileDescriptor(data, fd)) {
952 AudioProxyBufReplyRecycle(data, reply);
953 return AUDIO_HAL_ERR_INTERNAL;
954 }
955 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_DEV_DUMP, data, reply);
956 if (ret < 0) {
957 AUDIO_FUNC_LOGE("AudioProxyRenderAudioDevDump FAIL");
958 AudioProxyBufReplyRecycle(data, reply);
959 return ret;
960 }
961 AudioProxyBufReplyRecycle(data, reply);
962 return ret;
963 }
AudioProxyRenderRegCallback(struct AudioRender * render,RenderCallback callback,void * cookie)964 int32_t AudioProxyRenderRegCallback(struct AudioRender *render, RenderCallback callback, void *cookie)
965 {
966 int32_t ret = AudioCheckRenderAddr((AudioHandle)render);
967 if (ret < 0) {
968 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
969 return ret;
970 }
971 if (render == NULL || callback == NULL || cookie == NULL) {
972 return AUDIO_HAL_ERR_INVALID_PARAM;
973 }
974 struct HdfSBuf *data = NULL;
975 struct HdfSBuf *reply = NULL;
976 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
977 if (hwRender->proxyRemoteHandle == NULL) {
978 AUDIO_FUNC_LOGE("The parameter is empty");
979 return AUDIO_HAL_ERR_INVALID_PARAM;
980 }
981 if (AudioProxyPreprocessRender((AudioHandle)hwRender, &data, &reply) < 0) {
982 AUDIO_FUNC_LOGE("AudioProxyRenderRegCallback FAIL");
983 return AUDIO_HAL_ERR_INTERNAL;
984 }
985 uint64_t tempAddr = (uint64_t)(uintptr_t)cookie;
986 if (!HdfSbufWriteUint64(data, tempAddr)) {
987 AudioProxyBufReplyRecycle(data, reply);
988 return AUDIO_HAL_ERR_INTERNAL;
989 }
990 tempAddr = (uint64_t)(uintptr_t)callback;
991 if (!HdfSbufWriteUint64(data, tempAddr)) {
992 AudioProxyBufReplyRecycle(data, reply);
993 return AUDIO_HAL_ERR_INTERNAL;
994 }
995 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_REG_CALLBACK, data, reply);
996 if (ret < 0) {
997 AUDIO_FUNC_LOGE("AudioProxyRenderRegCallback FAIL");
998 AudioProxyBufReplyRecycle(data, reply);
999 return ret;
1000 }
1001 AudioProxyBufReplyRecycle(data, reply);
1002 return ret;
1003 }
AudioProxyRenderDrainBuffer(struct AudioRender * render,enum AudioDrainNotifyType * type)1004 int32_t AudioProxyRenderDrainBuffer(struct AudioRender *render, enum AudioDrainNotifyType *type)
1005 {
1006 int32_t ret = AudioCheckRenderAddr((AudioHandle)render);
1007 if (ret < 0) {
1008 AUDIO_FUNC_LOGE("The proxy render address passed in is invalid");
1009 return ret;
1010 }
1011 if (render == NULL || type == NULL) {
1012 AUDIO_FUNC_LOGE("The hwRender parameter is empty");
1013 return AUDIO_HAL_ERR_INVALID_PARAM;
1014 }
1015 struct HdfSBuf *data = NULL;
1016 struct HdfSBuf *reply = NULL;
1017 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
1018 if (hwRender->proxyRemoteHandle == NULL) {
1019 AUDIO_FUNC_LOGE("The hwRender parameter is empty");
1020 return AUDIO_HAL_ERR_INVALID_PARAM;
1021 }
1022 if (AudioProxyPreprocessRender((AudioHandle)hwRender, &data, &reply) < 0) {
1023 AUDIO_FUNC_LOGE("AudioProxyRenderDrainBuffer FAIL");
1024 return AUDIO_HAL_ERR_INTERNAL;
1025 }
1026 uint32_t tempType = (uint32_t)(uintptr_t)type;
1027 if (!HdfSbufWriteUint32(data, tempType)) {
1028 AudioProxyBufReplyRecycle(data, reply);
1029 return AUDIO_HAL_ERR_INTERNAL;
1030 }
1031 ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_DRAIN_BUFFER, data, reply);
1032 if (ret < 0) {
1033 AUDIO_FUNC_LOGE("AudioProxyRenderDrainBuffer FAIL");
1034 AudioProxyBufReplyRecycle(data, reply);
1035 return ret;
1036 }
1037 AudioProxyBufReplyRecycle(data, reply);
1038 return ret;
1039 }
1040
1041