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