• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "audio_render_vdi.h"
17 
18 #include <limits.h>
19 #include <hdf_base.h>
20 #include "audio_uhdf_log.h"
21 #include "osal_mem.h"
22 #include "securec.h"
23 #include "audio_common_vdi.h"
24 #include "audio_trace_vdi.h"
25 
26 #define HDF_LOG_TAG    HDF_AUDIO_PRIMARY_IMPL
27 
28 struct AudioRenderInfo {
29     struct IAudioRender render;
30     struct AudioDeviceDescriptor desc;
31     enum AudioCategory streamType;
32     unsigned int sampleRate;
33     unsigned int channelCount;
34     struct IAudioRenderVdi *vdiRender;
35     uint32_t renderId;
36     unsigned int usrCount;
37     struct IAudioCallback *callback;
38     bool isRegCb;
39 };
40 
41 struct AudioRenderPrivVdi {
42     struct AudioRenderInfo *renderInfos[AUDIO_VDI_STREAM_NUM_MAX];
43     uint32_t renderCnt;
44 };
45 
46 static struct AudioRenderPrivVdi g_audioRenderPrivVdi;
47 
AudioRenderGetPrivVdi(void)48 static struct AudioRenderPrivVdi *AudioRenderGetPrivVdi(void)
49 {
50     return &g_audioRenderPrivVdi;
51 }
52 
AudioGetVdiRenderByIdVdi(uint32_t renderId)53 struct IAudioRenderVdi *AudioGetVdiRenderByIdVdi(uint32_t renderId)
54 {
55     struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi();
56     if (priv->renderInfos[renderId] == NULL) {
57         AUDIO_FUNC_LOGE("not match render");
58         return NULL;
59     }
60 
61     return priv->renderInfos[renderId]->vdiRender;
62 }
63 
AudioGetLatencyVdi(struct IAudioRender * render,uint32_t * ms)64 int32_t AudioGetLatencyVdi(struct IAudioRender *render, uint32_t *ms)
65 {
66     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
67     CHECK_NULL_PTR_RETURN_VALUE(ms, HDF_ERR_INVALID_PARAM);
68 
69     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
70     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
71     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
72     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetLatency, HDF_ERR_INVALID_PARAM);
73 
74     int32_t ret = vdiRender->GetLatency(vdiRender, ms);
75     if (ret != HDF_SUCCESS) {
76         AUDIO_FUNC_LOGE("audio GetLatency fail, ret=%{public}d", ret);
77         return ret;
78     }
79 
80     return HDF_SUCCESS;
81 }
82 
AudioRenderFrameVdi(struct IAudioRender * render,const int8_t * frame,uint32_t frameLen,uint64_t * replyBytes)83 int32_t AudioRenderFrameVdi(struct IAudioRender *render, const int8_t *frame, uint32_t frameLen, uint64_t *replyBytes)
84 {
85     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
86     CHECK_NULL_PTR_RETURN_VALUE(frame, HDF_ERR_INVALID_PARAM);
87     CHECK_NULL_PTR_RETURN_VALUE(replyBytes, HDF_ERR_INVALID_PARAM);
88 
89     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
90     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
91     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
92     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->RenderFrame, HDF_ERR_INVALID_PARAM);
93 
94     HdfAudioStartTrace("Hdi:AudioRenderFrameVdi", 0);
95     int32_t ret = vdiRender->RenderFrame(vdiRender, frame, frameLen, replyBytes);
96     HdfAudioFinishTrace();
97     if (ret != HDF_SUCCESS) {
98         AUDIO_FUNC_LOGE("audio render frame fail, ret=%{public}d", ret);
99         return ret;
100     }
101 
102     return HDF_SUCCESS;
103 }
104 
AudioGetRenderPositionVdi(struct IAudioRender * render,uint64_t * frames,struct AudioTimeStamp * time)105 int32_t AudioGetRenderPositionVdi(struct IAudioRender *render, uint64_t *frames, struct AudioTimeStamp *time)
106 {
107     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
108     CHECK_NULL_PTR_RETURN_VALUE(frames, HDF_ERR_INVALID_PARAM);
109     CHECK_NULL_PTR_RETURN_VALUE(time, HDF_ERR_INVALID_PARAM);
110 
111     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
112     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
113     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
114     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetRenderPosition, HDF_ERR_INVALID_PARAM);
115 
116     int32_t ret = vdiRender->GetRenderPosition(vdiRender, frames, (struct AudioTimeStampVdi *)time);
117     if (ret != HDF_SUCCESS) {
118         AUDIO_FUNC_LOGE("audio render, get position fail, ret=%{public}d", ret);
119         return ret;
120     }
121 
122     return HDF_SUCCESS;
123 }
124 
AudioSetRenderSpeedVdi(struct IAudioRender * render,float speed)125 int32_t AudioSetRenderSpeedVdi(struct IAudioRender *render, float speed)
126 {
127     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
128 
129     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
130     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
131     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
132     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetRenderSpeed, HDF_ERR_INVALID_PARAM);
133 
134     int32_t ret = vdiRender->SetRenderSpeed(vdiRender, speed);
135     if (ret != HDF_SUCCESS) {
136         AUDIO_FUNC_LOGE("audio render SetRenderSpeed fail, ret=%{public}d", ret);
137         return ret;
138     }
139 
140     return HDF_SUCCESS;
141 }
142 
AudioGetRenderSpeedVdi(struct IAudioRender * render,float * speed)143 int32_t AudioGetRenderSpeedVdi(struct IAudioRender *render, float *speed)
144 {
145     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
146     CHECK_NULL_PTR_RETURN_VALUE(speed, HDF_ERR_INVALID_PARAM);
147 
148     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
149     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
150     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
151     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetRenderSpeed, HDF_ERR_INVALID_PARAM);
152 
153     int32_t ret = vdiRender->GetRenderSpeed(vdiRender, speed);
154     if (ret != HDF_SUCCESS) {
155         AUDIO_FUNC_LOGE("audio render GetRenderSpeed fail, ret=%{public}d", ret);
156         return ret;
157     }
158 
159     return HDF_SUCCESS;
160 }
161 
AudioRenderCallbackVdi(enum AudioCallbackTypeVdi type,void * reserved,void * cookie)162 static int32_t AudioRenderCallbackVdi(enum  AudioCallbackTypeVdi type, void *reserved, void *cookie)
163 {
164     CHECK_NULL_PTR_RETURN_VALUE(cookie, HDF_ERR_INVALID_PARAM);
165     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)cookie;
166     struct IAudioCallback *cb = renderInfo->callback;
167     CHECK_NULL_PTR_RETURN_VALUE(cb, HDF_ERR_INVALID_PARAM);
168     int8_t newCookie = 0;
169     int8_t newReserved = 0;
170     int32_t ret = cb->RenderCallback(cb, (enum AudioCallbackType)type, &newReserved, &newCookie);
171     if (ret != HDF_SUCCESS) {
172         AUDIO_FUNC_LOGE("audio render AudioRenderCallbackVdi fail, ret=%{public}d", ret);
173         return HDF_FAILURE;
174     }
175     return HDF_SUCCESS;
176 }
177 
AudioRenderRegCallbackVdi(struct IAudioRender * render,struct IAudioCallback * audioCallback,int8_t cookie)178 int32_t AudioRenderRegCallbackVdi(struct IAudioRender *render, struct IAudioCallback *audioCallback, int8_t cookie)
179 {
180     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
181     CHECK_NULL_PTR_RETURN_VALUE(audioCallback, HDF_ERR_INVALID_PARAM);
182 
183     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
184     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
185     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
186     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->RegCallback, HDF_ERR_INVALID_PARAM);
187 
188     int32_t ret = vdiRender->RegCallback(vdiRender, AudioRenderCallbackVdi, (void *)renderInfo);
189     if (ret != HDF_SUCCESS) {
190         AUDIO_FUNC_LOGE("audio render regCallback fail, ret=%{public}d", ret);
191         return HDF_FAILURE;
192     }
193     renderInfo->callback = audioCallback;
194     renderInfo->isRegCb = true;
195     return HDF_SUCCESS;
196 }
197 
AudioRenderSetChannelModeVdi(struct IAudioRender * render,enum AudioChannelMode mode)198 int32_t AudioRenderSetChannelModeVdi(struct IAudioRender *render, enum AudioChannelMode mode)
199 {
200     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
201 
202     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
203     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
204     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
205     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetChannelMode, HDF_ERR_INVALID_PARAM);
206 
207     int32_t ret = vdiRender->SetChannelMode(vdiRender, (enum AudioChannelModeVdi)mode);
208     if (ret != HDF_SUCCESS) {
209         AUDIO_FUNC_LOGE("audio SetChannelMode fail, ret=%{public}d", ret);
210         return ret;
211     }
212 
213     return HDF_SUCCESS;
214 }
215 
AudioRenderGetChannelModeVdi(struct IAudioRender * render,enum AudioChannelMode * mode)216 int32_t AudioRenderGetChannelModeVdi(struct IAudioRender *render, enum AudioChannelMode *mode)
217 {
218     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
219     CHECK_NULL_PTR_RETURN_VALUE(mode, HDF_ERR_INVALID_PARAM);
220 
221     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
222     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
223     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
224     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetChannelMode, HDF_ERR_INVALID_PARAM);
225 
226     int32_t ret = vdiRender->GetChannelMode(vdiRender, (enum AudioChannelModeVdi *)mode);
227     if (ret != HDF_SUCCESS) {
228         AUDIO_FUNC_LOGE("audio render GetChannelMode fail, ret=%{public}d", ret);
229         return ret;
230     }
231 
232     return HDF_SUCCESS;
233 }
234 
AudioRenderDrainBufferVdi(struct IAudioRender * render,enum AudioDrainNotifyType * type)235 int32_t AudioRenderDrainBufferVdi(struct IAudioRender *render, enum AudioDrainNotifyType *type)
236 {
237     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
238     CHECK_NULL_PTR_RETURN_VALUE(type, HDF_ERR_INVALID_PARAM);
239 
240     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
241     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
242     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
243     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->DrainBuffer, HDF_ERR_INVALID_PARAM);
244 
245     int32_t ret = vdiRender->DrainBuffer(vdiRender, (enum AudioDrainNotifyTypeVdi *)type);
246     if (ret != HDF_SUCCESS) {
247         AUDIO_FUNC_LOGE("audio render DrainBuffer fail, ret=%{public}d", ret);
248         return ret;
249     }
250 
251     return HDF_SUCCESS;
252 }
253 
AudioRenderIsSupportsDrainVdi(struct IAudioRender * render,bool * support)254 int32_t AudioRenderIsSupportsDrainVdi(struct IAudioRender *render, bool *support)
255 {
256     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
257     CHECK_NULL_PTR_RETURN_VALUE(support, HDF_ERR_INVALID_PARAM);
258 
259     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
260     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
261     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
262     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->IsSupportsDrain, HDF_ERR_INVALID_PARAM);
263 
264     int32_t ret = vdiRender->IsSupportsDrain(vdiRender, support);
265     if (ret != HDF_SUCCESS) {
266         AUDIO_FUNC_LOGE("audio render IsSupportsDrain fail, ret=%{public}d", ret);
267         return ret;
268     }
269 
270     return HDF_SUCCESS;
271 }
272 
AudioRenderCheckSceneCapabilityVdi(struct IAudioRender * render,const struct AudioSceneDescriptor * scene,bool * supported)273 int32_t AudioRenderCheckSceneCapabilityVdi(struct IAudioRender *render, const struct AudioSceneDescriptor *scene,
274     bool *supported)
275 {
276     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
277     CHECK_NULL_PTR_RETURN_VALUE(scene, HDF_ERR_INVALID_PARAM);
278     CHECK_NULL_PTR_RETURN_VALUE(supported, HDF_ERR_INVALID_PARAM);
279 
280     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
281     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
282     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
283     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->CheckSceneCapability, HDF_ERR_INVALID_PARAM);
284 
285     struct AudioSceneDescriptorVdi vdiScene;
286     (void)memset_s((void *)&vdiScene, sizeof(vdiScene), 0, sizeof(vdiScene));
287     int32_t ret = AudioCommonSceneToVdiSceneVdi(scene, &vdiScene);
288     if (ret != HDF_SUCCESS) {
289         AUDIO_FUNC_LOGE("audio render scene To vdiScene fail");
290         return HDF_FAILURE;
291     }
292 
293     ret = vdiRender->CheckSceneCapability(vdiRender, &vdiScene, supported);
294     OsalMemFree((void *)vdiScene.desc.desc);
295     if (ret != HDF_SUCCESS) {
296         AUDIO_FUNC_LOGE("audio render CheckSceneCapability fail, ret=%{public}d", ret);
297         return ret;
298     }
299 
300     return HDF_SUCCESS;
301 }
302 
AudioRenderSelectSceneVdi(struct IAudioRender * render,const struct AudioSceneDescriptor * scene)303 int32_t AudioRenderSelectSceneVdi(struct IAudioRender *render, const struct AudioSceneDescriptor *scene)
304 {
305     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
306     CHECK_NULL_PTR_RETURN_VALUE(scene, HDF_ERR_INVALID_PARAM);
307 
308     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
309     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
310     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
311     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SelectScene, HDF_ERR_INVALID_PARAM);
312 
313     struct AudioSceneDescriptorVdi vdiScene;
314     (void)memset_s((void *)&vdiScene, sizeof(vdiScene), 0, sizeof(vdiScene));
315     int32_t ret = AudioCommonSceneToVdiSceneVdi(scene, &vdiScene);
316     if (ret != HDF_SUCCESS) {
317         AUDIO_FUNC_LOGE("audio render scene To vdiScene fail");
318         return HDF_FAILURE;
319     }
320 
321     ret = vdiRender->SelectScene(vdiRender, &vdiScene);
322     OsalMemFree((void *)vdiScene.desc.desc);
323     if (ret != HDF_SUCCESS) {
324         AUDIO_FUNC_LOGE("audio render select scene fail, ret=%{public}d", ret);
325         return ret;
326     }
327 
328     return HDF_SUCCESS;
329 }
330 
AudioRenderSetMuteVdi(struct IAudioRender * render,bool mute)331 int32_t AudioRenderSetMuteVdi(struct IAudioRender *render, bool mute)
332 {
333     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
334 
335     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
336     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
337     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
338     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetMute, HDF_ERR_INVALID_PARAM);
339 
340     int32_t ret = vdiRender->SetMute(vdiRender, mute);
341     if (ret != HDF_SUCCESS) {
342         AUDIO_FUNC_LOGE("audio render SetMute fail, ret=%{public}d", ret);
343         return ret;
344     }
345 
346     return HDF_SUCCESS;
347 }
348 
AudioRenderGetMuteVdi(struct IAudioRender * render,bool * mute)349 int32_t AudioRenderGetMuteVdi(struct IAudioRender *render, bool *mute)
350 {
351     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
352     CHECK_NULL_PTR_RETURN_VALUE(mute, HDF_ERR_INVALID_PARAM);
353 
354     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
355     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
356     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
357     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetMute, HDF_ERR_INVALID_PARAM);
358 
359     int32_t ret = vdiRender->GetMute(vdiRender, mute);
360     if (ret != HDF_SUCCESS) {
361         AUDIO_FUNC_LOGE("audio render GetMute fail, ret=%{public}d", ret);
362         return ret;
363     }
364 
365     return HDF_SUCCESS;
366 }
367 
AudioRenderSetVolumeVdi(struct IAudioRender * render,float volume)368 int32_t AudioRenderSetVolumeVdi(struct IAudioRender *render, float volume)
369 {
370     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
371 
372     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
373     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
374     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
375     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetVolume, HDF_ERR_INVALID_PARAM);
376 
377     int32_t ret = vdiRender->SetVolume(vdiRender, volume);
378     if (ret != HDF_SUCCESS) {
379         AUDIO_FUNC_LOGE("audio render SetVolume fail, ret=%{public}d", ret);
380         return ret;
381     }
382 
383     return HDF_SUCCESS;
384 }
385 
AudioRenderGetVolumeVdi(struct IAudioRender * render,float * volume)386 int32_t AudioRenderGetVolumeVdi(struct IAudioRender *render, float *volume)
387 {
388     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
389     CHECK_NULL_PTR_RETURN_VALUE(volume, HDF_ERR_INVALID_PARAM);
390 
391     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
392     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
393     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
394     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetVolume, HDF_ERR_INVALID_PARAM);
395 
396     int32_t ret = vdiRender->GetVolume(vdiRender, volume);
397     if (ret != HDF_SUCCESS) {
398         AUDIO_FUNC_LOGE("audio render GetVolume fail, ret=%{public}d", ret);
399         return ret;
400     }
401 
402     return HDF_SUCCESS;
403 }
404 
AudioRenderGetGainThresholdVdi(struct IAudioRender * render,float * min,float * max)405 int32_t AudioRenderGetGainThresholdVdi(struct IAudioRender *render, float *min, float *max)
406 {
407     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
408     CHECK_NULL_PTR_RETURN_VALUE(min, HDF_ERR_INVALID_PARAM);
409     CHECK_NULL_PTR_RETURN_VALUE(max, HDF_ERR_INVALID_PARAM);
410 
411     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
412     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
413     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
414     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetGainThreshold, HDF_ERR_INVALID_PARAM);
415 
416     int32_t ret = vdiRender->GetGainThreshold(vdiRender, min, max);
417     if (ret != HDF_SUCCESS) {
418         AUDIO_FUNC_LOGE("audio render GetGainThreshold fail, ret=%{public}d", ret);
419         return ret;
420     }
421 
422     return HDF_SUCCESS;
423 }
424 
AudioRenderGetGainVdi(struct IAudioRender * render,float * gain)425 int32_t AudioRenderGetGainVdi(struct IAudioRender *render, float *gain)
426 {
427     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
428     CHECK_NULL_PTR_RETURN_VALUE(gain, HDF_ERR_INVALID_PARAM);
429 
430     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
431     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
432     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
433     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetGain, HDF_ERR_INVALID_PARAM);
434 
435     int32_t ret = vdiRender->GetGain(vdiRender, gain);
436     if (ret != HDF_SUCCESS) {
437         AUDIO_FUNC_LOGE("audio render GetGain fail, ret=%{public}d", ret);
438         return ret;
439     }
440 
441     return HDF_SUCCESS;
442 }
443 
AudioRenderSetGainVdi(struct IAudioRender * render,float gain)444 int32_t AudioRenderSetGainVdi(struct IAudioRender *render, float gain)
445 {
446     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
447 
448     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
449     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
450     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
451     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetGain, HDF_ERR_INVALID_PARAM);
452 
453     int32_t ret = vdiRender->SetGain(vdiRender, gain);
454     if (ret != HDF_SUCCESS) {
455         AUDIO_FUNC_LOGE("audio render SetGain fail, ret=%{public}d", ret);
456         return ret;
457     }
458 
459     return HDF_SUCCESS;
460 }
461 
AudioRenderGetFrameSizeVdi(struct IAudioRender * render,uint64_t * size)462 int32_t AudioRenderGetFrameSizeVdi(struct IAudioRender *render, uint64_t *size)
463 {
464     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
465     CHECK_NULL_PTR_RETURN_VALUE(size, HDF_ERR_INVALID_PARAM);
466 
467     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
468     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
469     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
470     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetFrameSize, HDF_ERR_INVALID_PARAM);
471 
472     int32_t ret = vdiRender->GetFrameSize(vdiRender, size);
473     if (ret != HDF_SUCCESS) {
474         AUDIO_FUNC_LOGE("audio render GetFrameSize fail, ret=%{public}d", ret);
475         return ret;
476     }
477 
478     return HDF_SUCCESS;
479 }
480 
AudioRenderGetFrameCountVdi(struct IAudioRender * render,uint64_t * count)481 int32_t AudioRenderGetFrameCountVdi(struct IAudioRender *render, uint64_t *count)
482 {
483     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
484     CHECK_NULL_PTR_RETURN_VALUE(count, HDF_ERR_INVALID_PARAM);
485 
486     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
487     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
488     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
489     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetFrameCount, HDF_ERR_INVALID_PARAM);
490 
491     int32_t ret = vdiRender->GetFrameCount(vdiRender, count);
492     if (ret != HDF_SUCCESS) {
493         AUDIO_FUNC_LOGE("audio render GetFrameCount fail, ret=%{public}d", ret);
494         return ret;
495     }
496 
497     return HDF_SUCCESS;
498 }
499 
AudioRenderSetSampleAttributesVdi(struct IAudioRender * render,const struct AudioSampleAttributes * attrs)500 int32_t AudioRenderSetSampleAttributesVdi(struct IAudioRender *render, const struct AudioSampleAttributes *attrs)
501 {
502     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
503     CHECK_NULL_PTR_RETURN_VALUE(attrs, HDF_ERR_INVALID_PARAM);
504 
505     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
506     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
507     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
508     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetSampleAttributes, HDF_ERR_INVALID_PARAM);
509 
510     struct AudioSampleAttributesVdi vdiAttrs;
511     (void)memset_s((void *)&vdiAttrs, sizeof(vdiAttrs), 0, sizeof(vdiAttrs));
512     int32_t ret = AudioCommonSampleAttrToVdiSampleAttrVdi(attrs, &vdiAttrs);
513     if (ret != HDF_SUCCESS) {
514         AUDIO_FUNC_LOGE("audio render SampleAttr to vdisampleAttr fail, ret=%{public}d", ret);
515         return ret;
516     }
517 
518     ret = vdiRender->SetSampleAttributes(vdiRender, &vdiAttrs);
519     if (ret != HDF_SUCCESS) {
520         AUDIO_FUNC_LOGE("audio render SetSampleAttributes fail, ret=%{public}d", ret);
521         return ret;
522     }
523 
524     return HDF_SUCCESS;
525 }
526 
AudioRenderGetSampleAttributesVdi(struct IAudioRender * render,struct AudioSampleAttributes * attrs)527 int32_t AudioRenderGetSampleAttributesVdi(struct IAudioRender *render, struct AudioSampleAttributes *attrs)
528 {
529     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
530     CHECK_NULL_PTR_RETURN_VALUE(attrs, HDF_ERR_INVALID_PARAM);
531 
532     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
533     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
534     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
535     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetSampleAttributes, HDF_ERR_INVALID_PARAM);
536 
537     struct AudioSampleAttributesVdi vdiAttrs;
538     (void)memset_s((void *)&vdiAttrs, sizeof(vdiAttrs), 0, sizeof(vdiAttrs));
539     int32_t ret = vdiRender->GetSampleAttributes(vdiRender, &vdiAttrs);
540     if (ret != HDF_SUCCESS) {
541         AUDIO_FUNC_LOGE("audio render GetSampleAttributes fail, ret=%{public}d", ret);
542         return ret;
543     }
544 
545     ret = AudioCommonVdiSampleAttrToSampleAttrVdi(&vdiAttrs, attrs);
546     if (ret != HDF_SUCCESS) {
547         AUDIO_FUNC_LOGE("audio render vdiSampleAttr to SampleAttr fail, ret=%{public}d", ret);
548         return ret;
549     }
550 
551     return HDF_SUCCESS;
552 }
553 
AudioRenderGetCurrentChannelIdVdi(struct IAudioRender * render,uint32_t * channelId)554 int32_t AudioRenderGetCurrentChannelIdVdi(struct IAudioRender *render, uint32_t *channelId)
555 {
556     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
557     CHECK_NULL_PTR_RETURN_VALUE(channelId, HDF_ERR_INVALID_PARAM);
558 
559     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
560     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
561     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
562     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetCurrentChannelId, HDF_ERR_INVALID_PARAM);
563 
564     int32_t ret = vdiRender->GetCurrentChannelId(vdiRender, channelId);
565     if (ret != HDF_SUCCESS) {
566         AUDIO_FUNC_LOGE("audio render GetCurrentChannelId fail, ret=%{public}d", ret);
567         return ret;
568     }
569 
570     return HDF_SUCCESS;
571 }
572 
AudioRenderSetExtraParamsVdi(struct IAudioRender * render,const char * keyValueList)573 int32_t AudioRenderSetExtraParamsVdi(struct IAudioRender *render, const char *keyValueList)
574 {
575     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
576     CHECK_NULL_PTR_RETURN_VALUE(keyValueList, HDF_ERR_INVALID_PARAM);
577 
578     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
579     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
580     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
581     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetExtraParams, HDF_ERR_INVALID_PARAM);
582 
583     int32_t ret = vdiRender->SetExtraParams(vdiRender, keyValueList);
584     if (ret != HDF_SUCCESS) {
585         AUDIO_FUNC_LOGE("audio render SetExtraParams fail, ret=%{public}d", ret);
586         return ret;
587     }
588 
589     return HDF_SUCCESS;
590 }
591 
AudioRenderGetExtraParamsVdi(struct IAudioRender * render,char * keyValueList,uint32_t keyValueListLen)592 int32_t AudioRenderGetExtraParamsVdi(struct IAudioRender *render, char *keyValueList, uint32_t keyValueListLen)
593 {
594     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
595     CHECK_NULL_PTR_RETURN_VALUE(keyValueList, HDF_ERR_INVALID_PARAM);
596 
597     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
598     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
599     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
600     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetExtraParams, HDF_ERR_INVALID_PARAM);
601 
602     int32_t ret = vdiRender->GetExtraParams(vdiRender, keyValueList, keyValueListLen);
603     if (ret != HDF_SUCCESS) {
604         AUDIO_FUNC_LOGE("audio render GetExtraParams fail, ret=%{public}d", ret);
605         return ret;
606     }
607 
608     return HDF_SUCCESS;
609 }
610 
AudioRenderReqMmapBufferVdi(struct IAudioRender * render,int32_t reqSize,struct AudioMmapBufferDescriptor * desc)611 int32_t AudioRenderReqMmapBufferVdi(struct IAudioRender *render, int32_t reqSize,
612     struct AudioMmapBufferDescriptor *desc)
613 {
614     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
615     CHECK_NULL_PTR_RETURN_VALUE(desc, HDF_ERR_INVALID_PARAM);
616 
617     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
618     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
619     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
620     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->ReqMmapBuffer, HDF_ERR_INVALID_PARAM);
621 
622     struct AudioMmapBufferDescriptorVdi vdiDesc = {0};
623     int32_t ret = vdiRender->ReqMmapBuffer(vdiRender, reqSize, &vdiDesc);
624     if (ret != HDF_SUCCESS) {
625         AUDIO_FUNC_LOGE("audio render ReqMmapBuffer fail, ret=%{public}d", ret);
626         return ret;
627     }
628 
629     desc->memoryAddress = NULL;
630     desc->memoryFd = vdiDesc.memoryFd;
631     desc->totalBufferFrames = vdiDesc.totalBufferFrames;
632     desc->transferFrameSize = vdiDesc.transferFrameSize;
633     desc->isShareable = vdiDesc.isShareable;
634     desc->offset = vdiDesc.offset;
635     desc->filePath = strdup("");
636 
637     AUDIO_FUNC_LOGD("%{public}s success", __func__);
638     return HDF_SUCCESS;
639 }
640 
AudioRenderGetMmapPositionVdi(struct IAudioRender * render,uint64_t * frames,struct AudioTimeStamp * time)641 int32_t AudioRenderGetMmapPositionVdi(struct IAudioRender *render, uint64_t *frames, struct AudioTimeStamp *time)
642 {
643     struct AudioTimeStampVdi vdiTime;
644     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
645     CHECK_NULL_PTR_RETURN_VALUE(frames, HDF_ERR_INVALID_PARAM);
646     CHECK_NULL_PTR_RETURN_VALUE(time, HDF_ERR_INVALID_PARAM);
647 
648     vdiTime.tvSec = 0;
649     vdiTime.tvNSec = 0;
650 
651     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
652     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
653     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
654     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetMmapPosition, HDF_ERR_INVALID_PARAM);
655 
656     int32_t ret = vdiRender->GetMmapPosition(vdiRender, frames, &vdiTime);
657     if (ret != HDF_SUCCESS) {
658         AUDIO_FUNC_LOGE("audio render GetMmapPosition fail, ret=%{public}d", ret);
659         return ret;
660     }
661 
662     time->tvSec = vdiTime.tvSec;
663     time->tvNSec = vdiTime.tvNSec;
664     return HDF_SUCCESS;
665 }
666 
AudioRenderAddAudioEffectVdi(struct IAudioRender * render,uint64_t effectid)667 int32_t AudioRenderAddAudioEffectVdi(struct IAudioRender *render, uint64_t effectid)
668 {
669     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
670 
671     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
672     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
673     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
674     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->AddAudioEffect, HDF_ERR_INVALID_PARAM);
675 
676     return vdiRender->AddAudioEffect(vdiRender, effectid);
677 }
678 
AudioRenderRemoveAudioEffectVdi(struct IAudioRender * render,uint64_t effectid)679 int32_t AudioRenderRemoveAudioEffectVdi(struct IAudioRender *render, uint64_t effectid)
680 {
681     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
682 
683     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
684     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
685     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
686     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->RemoveAudioEffect, HDF_ERR_INVALID_PARAM);
687 
688     return vdiRender->RemoveAudioEffect(vdiRender, effectid);
689 }
690 
AudioRenderGetFrameBufferSizeVdi(struct IAudioRender * render,uint64_t * bufferSize)691 int32_t AudioRenderGetFrameBufferSizeVdi(struct IAudioRender *render, uint64_t *bufferSize)
692 {
693     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
694     CHECK_NULL_PTR_RETURN_VALUE(bufferSize, HDF_ERR_INVALID_PARAM);
695 
696     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
697     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
698     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
699     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetFrameBufferSize, HDF_ERR_INVALID_PARAM);
700 
701     return vdiRender->GetFrameBufferSize(vdiRender, bufferSize);
702 }
703 
AudioRenderStartVdi(struct IAudioRender * render)704 int32_t AudioRenderStartVdi(struct IAudioRender *render)
705 {
706     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
707 
708     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
709     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
710     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
711     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->Start, HDF_ERR_INVALID_PARAM);
712 
713     int32_t ret = vdiRender->Start(vdiRender);
714     if (ret != HDF_SUCCESS) {
715         AUDIO_FUNC_LOGE("audio render Start fail, ret=%{public}d", ret);
716         return ret;
717     }
718 
719     return HDF_SUCCESS;
720 }
721 
AudioRenderStopVdi(struct IAudioRender * render)722 int32_t AudioRenderStopVdi(struct IAudioRender *render)
723 {
724     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
725 
726     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
727     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
728     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
729     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->Stop, HDF_ERR_INVALID_PARAM);
730 
731     int32_t ret = vdiRender->Stop(vdiRender);
732     if (ret != HDF_SUCCESS) {
733         AUDIO_FUNC_LOGE("audio render Stop fail, ret=%{public}d", ret);
734         return ret;
735     }
736 
737     return HDF_SUCCESS;
738 }
739 
AudioRenderPauseVdi(struct IAudioRender * render)740 int32_t AudioRenderPauseVdi(struct IAudioRender *render)
741 {
742     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
743 
744     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
745     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
746     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
747     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->Pause, HDF_ERR_INVALID_PARAM);
748 
749     int32_t ret = vdiRender->Pause(vdiRender);
750     if (ret != HDF_SUCCESS) {
751         AUDIO_FUNC_LOGE("audio render Pause fail, ret=%{public}d", ret);
752         return ret;
753     }
754 
755     return HDF_SUCCESS;
756 }
757 
AudioRenderResumeVdi(struct IAudioRender * render)758 int32_t AudioRenderResumeVdi(struct IAudioRender *render)
759 {
760     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
761 
762     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
763     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
764     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
765     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->Resume, HDF_ERR_INVALID_PARAM);
766 
767     int32_t ret = vdiRender->Resume(vdiRender);
768     if (ret != HDF_SUCCESS) {
769         AUDIO_FUNC_LOGE("audio render Resume fail, ret=%{public}d", ret);
770         return ret;
771     }
772 
773     return HDF_SUCCESS;
774 }
775 
AudioRenderFlushVdi(struct IAudioRender * render)776 int32_t AudioRenderFlushVdi(struct IAudioRender *render)
777 {
778     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
779 
780     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
781     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
782     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
783     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->Flush, HDF_ERR_INVALID_PARAM);
784 
785     int32_t ret = vdiRender->Flush(vdiRender);
786     if (ret != HDF_SUCCESS) {
787         AUDIO_FUNC_LOGE("audio render Flush fail, ret=%{public}d", ret);
788         return ret;
789     }
790 
791     return HDF_SUCCESS;
792 }
793 
AudioRenderTurnStandbyModeVdi(struct IAudioRender * render)794 int32_t AudioRenderTurnStandbyModeVdi(struct IAudioRender *render)
795 {
796     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
797 
798     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
799     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
800     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
801     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->TurnStandbyMode, HDF_ERR_INVALID_PARAM);
802 
803     int32_t ret = vdiRender->TurnStandbyMode(vdiRender);
804     if (ret != HDF_SUCCESS) {
805         AUDIO_FUNC_LOGE("audio render TurnStandbyMode fail, ret=%{public}d", ret);
806         return ret;
807     }
808 
809     return HDF_SUCCESS;
810 }
811 
AudioRenderAudioDevDumpVdi(struct IAudioRender * render,int32_t range,int32_t fd)812 int32_t AudioRenderAudioDevDumpVdi(struct IAudioRender *render, int32_t range, int32_t fd)
813 {
814     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
815 
816     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
817     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
818     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
819     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->AudioDevDump, HDF_ERR_INVALID_PARAM);
820 
821     int32_t ret = vdiRender->AudioDevDump(vdiRender, range, fd);
822     if (ret != HDF_SUCCESS) {
823         AUDIO_FUNC_LOGE("audio render AudioDevDump fail, ret=%{public}d", ret);
824         return ret;
825     }
826 
827     return HDF_SUCCESS;
828 }
829 
AudioRenderIsSupportsPauseAndResumeVdi(struct IAudioRender * render,bool * supportPause,bool * supportResume)830 int32_t AudioRenderIsSupportsPauseAndResumeVdi(struct IAudioRender *render, bool *supportPause, bool *supportResume)
831 {
832     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
833     CHECK_NULL_PTR_RETURN_VALUE(supportPause, HDF_ERR_INVALID_PARAM);
834     CHECK_NULL_PTR_RETURN_VALUE(supportResume, HDF_ERR_INVALID_PARAM);
835 
836     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
837     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
838     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
839     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->IsSupportsPauseAndResume, HDF_ERR_INVALID_PARAM);
840 
841     return vdiRender->IsSupportsPauseAndResume(vdiRender, supportPause, supportResume);
842 }
843 
AudioRenderSetbufferSize(struct IAudioRender * render,uint32_t size)844 int32_t AudioRenderSetbufferSize(struct IAudioRender *render, uint32_t size)
845 {
846     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
847     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
848     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
849     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
850     return vdiRender->SetBufferSize(vdiRender, size);
851 }
852 
AudioInitRenderInstanceVdi(struct IAudioRender * render)853 static void AudioInitRenderInstanceVdi(struct IAudioRender *render)
854 {
855     render->GetLatency = AudioGetLatencyVdi;
856     render->RenderFrame = AudioRenderFrameVdi;
857     render->GetRenderPosition = AudioGetRenderPositionVdi;
858     render->SetRenderSpeed = AudioSetRenderSpeedVdi;
859     render->GetRenderSpeed = AudioGetRenderSpeedVdi;
860     render->RegCallback = AudioRenderRegCallbackVdi;
861     render->SetChannelMode = AudioRenderSetChannelModeVdi;
862     render->GetChannelMode = AudioRenderGetChannelModeVdi;
863     render->DrainBuffer = AudioRenderDrainBufferVdi;
864     render->IsSupportsDrain = AudioRenderIsSupportsDrainVdi;
865     render->CheckSceneCapability = AudioRenderCheckSceneCapabilityVdi;
866     render->SelectScene = AudioRenderSelectSceneVdi;
867     render->SetMute = AudioRenderSetMuteVdi;
868     render->GetMute = AudioRenderGetMuteVdi;
869     render->SetVolume = AudioRenderSetVolumeVdi;
870     render->GetVolume = AudioRenderGetVolumeVdi;
871     render->GetGainThreshold = AudioRenderGetGainThresholdVdi;
872     render->GetGain = AudioRenderGetGainVdi;
873     render->SetGain = AudioRenderSetGainVdi;
874     render->GetFrameSize = AudioRenderGetFrameSizeVdi;
875     render->GetFrameCount = AudioRenderGetFrameCountVdi;
876     render->SetSampleAttributes = AudioRenderSetSampleAttributesVdi;
877     render->GetSampleAttributes = AudioRenderGetSampleAttributesVdi;
878     render->GetCurrentChannelId = AudioRenderGetCurrentChannelIdVdi;
879     render->SetExtraParams = AudioRenderSetExtraParamsVdi;
880     render->GetExtraParams = AudioRenderGetExtraParamsVdi;
881     render->ReqMmapBuffer = AudioRenderReqMmapBufferVdi;
882     render->GetMmapPosition = AudioRenderGetMmapPositionVdi;
883     render->AddAudioEffect = AudioRenderAddAudioEffectVdi;
884     render->RemoveAudioEffect = AudioRenderRemoveAudioEffectVdi;
885     render->GetFrameBufferSize = AudioRenderGetFrameBufferSizeVdi;
886     render->Start = AudioRenderStartVdi;
887     render->Stop = AudioRenderStopVdi;
888     render->Pause = AudioRenderPauseVdi;
889     render->Resume = AudioRenderResumeVdi;
890     render->Flush = AudioRenderFlushVdi;
891     render->TurnStandbyMode = AudioRenderTurnStandbyModeVdi;
892     render->AudioDevDump = AudioRenderAudioDevDumpVdi;
893     render->IsSupportsPauseAndResume = AudioRenderIsSupportsPauseAndResumeVdi;
894     render->SetBufferSize = AudioRenderSetbufferSize;
895 }
896 
FindRenderCreated(enum AudioPortPin pin,const struct AudioSampleAttributes * attrs,uint32_t * rendrId)897 struct IAudioRender *FindRenderCreated(enum AudioPortPin pin, const struct AudioSampleAttributes *attrs,
898     uint32_t *rendrId)
899 {
900     if (attrs.type == AUDIO_MMAP_NOIRQ) {
901         AUDIO_FUNC_LOGI("render type is mmap");
902         return NULL;
903     }
904     uint32_t index = 0;
905     struct AudioRenderPrivVdi *renderPriv = AudioRenderGetPrivVdi();
906     if (renderPriv == NULL) {
907         AUDIO_FUNC_LOGE("Parameter error!");
908         return NULL;
909     }
910 
911     if (renderPriv->renderCnt == 0) {
912         AUDIO_FUNC_LOGI("no render created");
913         return NULL;
914     }
915 
916     for (index = 0; index < AUDIO_VDI_STREAM_NUM_MAX; index++) {
917         if ((renderPriv->renderInfos[index] != NULL) &&
918             (renderPriv->renderInfos[index]->desc.pins == pin) &&
919             (renderPriv->renderInfos[index]->streamType == attrs->type) &&
920             (renderPriv->renderInfos[index]->sampleRate == attrs->sampleRate) &&
921             (renderPriv->renderInfos[index]->channelCount == attrs->channelCount)) {
922             *rendrId = renderPriv->renderInfos[index]->renderId;
923             renderPriv->renderInfos[index]->usrCount++;
924             return &renderPriv->renderInfos[index]->render;
925         }
926     }
927 
928     return NULL;
929 }
930 
GetAvailableRenderId(struct AudioRenderPrivVdi * renderPriv)931 static uint32_t GetAvailableRenderId(struct AudioRenderPrivVdi *renderPriv)
932 {
933     uint32_t renderId = AUDIO_VDI_STREAM_NUM_MAX;
934     if (renderPriv == NULL) {
935         AUDIO_FUNC_LOGE("Parameter error!");
936         return renderId;
937     }
938 
939     if (renderPriv->renderCnt < AUDIO_VDI_STREAM_NUM_MAX) {
940         renderId = renderPriv->renderCnt;
941         renderPriv->renderCnt++;
942     } else {
943         for (uint32_t index = 0; index < AUDIO_VDI_STREAM_NUM_MAX; index++) {
944             if (renderPriv->renderInfos[index] == NULL) {
945                 renderId = index;
946                 break;
947             }
948         }
949     }
950 
951     return renderId;
952 }
953 
AudioCreateRenderByIdVdi(const struct AudioSampleAttributes * attrs,uint32_t * renderId,struct IAudioRenderVdi * vdiRender,const struct AudioDeviceDescriptor * desc)954 struct IAudioRender *AudioCreateRenderByIdVdi(const struct AudioSampleAttributes *attrs, uint32_t *renderId,
955     struct IAudioRenderVdi *vdiRender, const struct AudioDeviceDescriptor *desc)
956 {
957     struct IAudioRender *render = NULL;
958     if (attrs == NULL || renderId == NULL || vdiRender == NULL || desc == NULL) {
959         AUDIO_FUNC_LOGE("audio render is null");
960         return NULL;
961     }
962 
963     *renderId = AUDIO_VDI_STREAM_NUM_MAX;
964     struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi();
965 
966     *renderId = GetAvailableRenderId(priv);
967     if (*renderId >= AUDIO_VDI_STREAM_NUM_MAX) {
968         AUDIO_FUNC_LOGE("audio vdiRender create render index fail, renderId=%{public}d", *renderId);
969         return NULL;
970     }
971 
972     priv->renderInfos[*renderId] = (struct AudioRenderInfo *)OsalMemCalloc(sizeof(struct AudioRenderInfo));
973     if (priv->renderInfos[*renderId] == NULL) {
974         AUDIO_FUNC_LOGE("audio VdiRender malloc renderInfos fail");
975         return NULL;
976     }
977 
978     priv->renderInfos[*renderId]->vdiRender = vdiRender;
979     priv->renderInfos[*renderId]->streamType = attrs->type;
980     priv->renderInfos[*renderId]->sampleRate = attrs->sampleRate;
981     priv->renderInfos[*renderId]->channelCount = attrs->channelCount;
982     priv->renderInfos[*renderId]->desc.portId = desc->portId;
983     priv->renderInfos[*renderId]->desc.pins = desc->pins;
984     priv->renderInfos[*renderId]->desc.desc = strdup(desc->desc);
985     priv->renderInfos[*renderId]->renderId = *renderId;
986     priv->renderInfos[*renderId]->usrCount = 1;
987     priv->renderInfos[*renderId]->callback = NULL;
988     priv->renderInfos[*renderId]->isRegCb = false;
989     render = &(priv->renderInfos[*renderId]->render);
990     AudioInitRenderInstanceVdi(render);
991 
992     AUDIO_FUNC_LOGD("audio create render success");
993     return render;
994 }
995 
DecreaseRenderUsrCount(uint32_t renderId)996 uint32_t DecreaseRenderUsrCount(uint32_t renderId)
997 {
998     uint32_t usrCnt = 0;
999     if (renderId >= AUDIO_VDI_STREAM_NUM_MAX) {
1000         AUDIO_FUNC_LOGE("audio check render index fail, descIndex=%{public}d", renderId);
1001         return usrCnt;
1002     }
1003     struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi();
1004     if (priv->renderInfos[renderId] == NULL) {
1005         AUDIO_FUNC_LOGE("audio check render index fail, descIndex=%{public}d", renderId);
1006         return usrCnt;
1007     }
1008 
1009     priv->renderInfos[renderId]->usrCount--;
1010     usrCnt = priv->renderInfos[renderId]->usrCount;
1011     return usrCnt;
1012 }
1013 
AudioDestroyRenderByIdVdi(uint32_t renderId)1014 void AudioDestroyRenderByIdVdi(uint32_t renderId)
1015 {
1016     if (renderId >= AUDIO_VDI_STREAM_NUM_MAX) {
1017         AUDIO_FUNC_LOGE("audio vdiRender destroy render index fail, descIndex=%{public}d", renderId);
1018         return;
1019     }
1020     struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi();
1021     if (priv->renderInfos[renderId] == NULL) {
1022         AUDIO_FUNC_LOGE("audio vdiRender destroy render index fail, descIndex=%{public}d", renderId);
1023         return;
1024     }
1025 
1026     OsalMemFree((void *)priv->renderInfos[renderId]->desc.desc);
1027     priv->renderInfos[renderId]->vdiRender = NULL;
1028     priv->renderInfos[renderId]->desc.desc = NULL;
1029     priv->renderInfos[renderId]->desc.portId = UINT_MAX;
1030     priv->renderInfos[renderId]->desc.pins = PIN_NONE;
1031     priv->renderInfos[renderId]->callback = NULL;
1032     priv->renderInfos[renderId]->isRegCb = false;
1033     OsalMemFree(priv->renderInfos[renderId]);
1034     priv->renderInfos[renderId] = NULL;
1035 }
1036