• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "audio_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