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