• 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.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     HdfAudioStartTrace("Hdi:AudioRenderFrameVdi", 0);
107     struct timeval startTime = AudioDfxSysEventGetTimeStamp();
108     int32_t ret = vdiRender->RenderFrame(vdiRender, frame, frameLen, replyBytes);
109     AudioDfxSysEventError("RenderFrame", startTime, TIME_THRESHOLD, ret);
110     HdfAudioFinishTrace();
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 ret;
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     HdfAudioStartTrace("Hdi:SelectScene", 0);
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         HdfAudioFinishTrace();
341         return HDF_FAILURE;
342     }
343 
344     int32_t id = SetTimer("Hdi:SelectScene");
345     ret = vdiRender->SelectScene(vdiRender, &vdiScene);
346     CancelTimer(id);
347     OsalMemFree((void *)vdiScene.desc.desc);
348     if (ret != HDF_SUCCESS) {
349         AUDIO_FUNC_LOGE("audio render select scene fail, ret=%{public}d", ret);
350         HdfAudioFinishTrace();
351         return ret;
352     }
353     HdfAudioFinishTrace();
354     return HDF_SUCCESS;
355 }
356 
AudioRenderSetMuteVdi(struct IAudioRender * render,bool mute)357 int32_t AudioRenderSetMuteVdi(struct IAudioRender *render, bool mute)
358 {
359     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
360 
361     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
362     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
363     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
364     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetMute, HDF_ERR_INVALID_PARAM);
365 
366     int32_t ret = vdiRender->SetMute(vdiRender, mute);
367     if (ret != HDF_SUCCESS) {
368         AUDIO_FUNC_LOGE("audio render SetMute fail, ret=%{public}d", ret);
369         return ret;
370     }
371 
372     return HDF_SUCCESS;
373 }
374 
AudioRenderGetMuteVdi(struct IAudioRender * render,bool * mute)375 int32_t AudioRenderGetMuteVdi(struct IAudioRender *render, bool *mute)
376 {
377     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
378     CHECK_NULL_PTR_RETURN_VALUE(mute, HDF_ERR_INVALID_PARAM);
379 
380     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
381     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
382     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
383     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetMute, HDF_ERR_INVALID_PARAM);
384 
385     int32_t ret = vdiRender->GetMute(vdiRender, mute);
386     if (ret != HDF_SUCCESS) {
387         AUDIO_FUNC_LOGE("audio render GetMute fail, ret=%{public}d", ret);
388         return ret;
389     }
390 
391     return HDF_SUCCESS;
392 }
393 
AudioRenderSetVolumeVdi(struct IAudioRender * render,float volume)394 int32_t AudioRenderSetVolumeVdi(struct IAudioRender *render, float volume)
395 {
396     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
397 
398     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
399     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
400     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
401     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetVolume, HDF_ERR_INVALID_PARAM);
402 
403     int32_t ret = vdiRender->SetVolume(vdiRender, volume);
404     if (ret != HDF_SUCCESS) {
405         AUDIO_FUNC_LOGE("audio render SetVolume fail, ret=%{public}d", ret);
406         return ret;
407     }
408 
409     return HDF_SUCCESS;
410 }
411 
AudioRenderGetVolumeVdi(struct IAudioRender * render,float * volume)412 int32_t AudioRenderGetVolumeVdi(struct IAudioRender *render, float *volume)
413 {
414     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
415     CHECK_NULL_PTR_RETURN_VALUE(volume, HDF_ERR_INVALID_PARAM);
416 
417     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
418     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
419     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
420     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetVolume, HDF_ERR_INVALID_PARAM);
421 
422     int32_t ret = vdiRender->GetVolume(vdiRender, volume);
423     if (ret != HDF_SUCCESS) {
424         AUDIO_FUNC_LOGE("audio render GetVolume fail, ret=%{public}d", ret);
425         return ret;
426     }
427 
428     return HDF_SUCCESS;
429 }
430 
AudioRenderGetGainThresholdVdi(struct IAudioRender * render,float * min,float * max)431 int32_t AudioRenderGetGainThresholdVdi(struct IAudioRender *render, float *min, float *max)
432 {
433     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
434     CHECK_NULL_PTR_RETURN_VALUE(min, HDF_ERR_INVALID_PARAM);
435     CHECK_NULL_PTR_RETURN_VALUE(max, HDF_ERR_INVALID_PARAM);
436 
437     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
438     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
439     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
440     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetGainThreshold, HDF_ERR_INVALID_PARAM);
441 
442     int32_t ret = vdiRender->GetGainThreshold(vdiRender, min, max);
443     if (ret != HDF_SUCCESS) {
444         AUDIO_FUNC_LOGE("audio render GetGainThreshold fail, ret=%{public}d", ret);
445         return ret;
446     }
447 
448     return HDF_SUCCESS;
449 }
450 
AudioRenderGetGainVdi(struct IAudioRender * render,float * gain)451 int32_t AudioRenderGetGainVdi(struct IAudioRender *render, float *gain)
452 {
453     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
454     CHECK_NULL_PTR_RETURN_VALUE(gain, HDF_ERR_INVALID_PARAM);
455 
456     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
457     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
458     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
459     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetGain, HDF_ERR_INVALID_PARAM);
460 
461     int32_t ret = vdiRender->GetGain(vdiRender, gain);
462     if (ret != HDF_SUCCESS) {
463         AUDIO_FUNC_LOGE("audio render GetGain fail, ret=%{public}d", ret);
464         return ret;
465     }
466 
467     return HDF_SUCCESS;
468 }
469 
AudioRenderSetGainVdi(struct IAudioRender * render,float gain)470 int32_t AudioRenderSetGainVdi(struct IAudioRender *render, float gain)
471 {
472     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
473 
474     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
475     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
476     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
477     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetGain, HDF_ERR_INVALID_PARAM);
478 
479     int32_t ret = vdiRender->SetGain(vdiRender, gain);
480     if (ret != HDF_SUCCESS) {
481         AUDIO_FUNC_LOGE("audio render SetGain fail, ret=%{public}d", ret);
482         return ret;
483     }
484 
485     return HDF_SUCCESS;
486 }
487 
AudioRenderGetFrameSizeVdi(struct IAudioRender * render,uint64_t * size)488 int32_t AudioRenderGetFrameSizeVdi(struct IAudioRender *render, uint64_t *size)
489 {
490     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
491     CHECK_NULL_PTR_RETURN_VALUE(size, HDF_ERR_INVALID_PARAM);
492 
493     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
494     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
495     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
496     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetFrameSize, HDF_ERR_INVALID_PARAM);
497 
498     int32_t ret = vdiRender->GetFrameSize(vdiRender, size);
499     if (ret != HDF_SUCCESS) {
500         AUDIO_FUNC_LOGE("audio render GetFrameSize fail, ret=%{public}d", ret);
501         return ret;
502     }
503 
504     return HDF_SUCCESS;
505 }
506 
AudioRenderGetFrameCountVdi(struct IAudioRender * render,uint64_t * count)507 int32_t AudioRenderGetFrameCountVdi(struct IAudioRender *render, uint64_t *count)
508 {
509     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
510     CHECK_NULL_PTR_RETURN_VALUE(count, HDF_ERR_INVALID_PARAM);
511 
512     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
513     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
514     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
515     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetFrameCount, HDF_ERR_INVALID_PARAM);
516 
517     int32_t ret = vdiRender->GetFrameCount(vdiRender, count);
518     if (ret != HDF_SUCCESS) {
519         AUDIO_FUNC_LOGE("audio render GetFrameCount fail, ret=%{public}d", ret);
520         return ret;
521     }
522 
523     return HDF_SUCCESS;
524 }
525 
AudioRenderSetSampleAttributesVdi(struct IAudioRender * render,const struct AudioSampleAttributes * attrs)526 int32_t AudioRenderSetSampleAttributesVdi(struct IAudioRender *render, const struct AudioSampleAttributes *attrs)
527 {
528     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
529     CHECK_NULL_PTR_RETURN_VALUE(attrs, HDF_ERR_INVALID_PARAM);
530 
531     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
532     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
533     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
534     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetSampleAttributes, HDF_ERR_INVALID_PARAM);
535 
536     struct AudioSampleAttributesVdi vdiAttrs;
537     (void)memset_s((void *)&vdiAttrs, sizeof(vdiAttrs), 0, sizeof(vdiAttrs));
538     int32_t ret = AudioCommonSampleAttrToVdiSampleAttrVdi(attrs, &vdiAttrs);
539     if (ret != HDF_SUCCESS) {
540         AUDIO_FUNC_LOGE("audio render SampleAttr to vdisampleAttr fail, ret=%{public}d", ret);
541         return ret;
542     }
543 
544     ret = vdiRender->SetSampleAttributes(vdiRender, &vdiAttrs);
545     if (ret != HDF_SUCCESS) {
546         AUDIO_FUNC_LOGE("audio render SetSampleAttributes fail, ret=%{public}d", ret);
547         return ret;
548     }
549 
550     return HDF_SUCCESS;
551 }
552 
AudioRenderGetSampleAttributesVdi(struct IAudioRender * render,struct AudioSampleAttributes * attrs)553 int32_t AudioRenderGetSampleAttributesVdi(struct IAudioRender *render, struct AudioSampleAttributes *attrs)
554 {
555     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
556     CHECK_NULL_PTR_RETURN_VALUE(attrs, HDF_ERR_INVALID_PARAM);
557 
558     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
559     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
560     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
561     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetSampleAttributes, HDF_ERR_INVALID_PARAM);
562 
563     struct AudioSampleAttributesVdi vdiAttrs;
564     (void)memset_s((void *)&vdiAttrs, sizeof(vdiAttrs), 0, sizeof(vdiAttrs));
565     int32_t ret = vdiRender->GetSampleAttributes(vdiRender, &vdiAttrs);
566     if (ret != HDF_SUCCESS) {
567         AUDIO_FUNC_LOGE("audio render GetSampleAttributes fail, ret=%{public}d", ret);
568         return ret;
569     }
570 
571     ret = AudioCommonVdiSampleAttrToSampleAttrVdi(&vdiAttrs, attrs);
572     if (ret != HDF_SUCCESS) {
573         AUDIO_FUNC_LOGE("audio render vdiSampleAttr to SampleAttr fail, ret=%{public}d", ret);
574         return ret;
575     }
576 
577     return HDF_SUCCESS;
578 }
579 
AudioRenderGetCurrentChannelIdVdi(struct IAudioRender * render,uint32_t * channelId)580 int32_t AudioRenderGetCurrentChannelIdVdi(struct IAudioRender *render, uint32_t *channelId)
581 {
582     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
583     CHECK_NULL_PTR_RETURN_VALUE(channelId, HDF_ERR_INVALID_PARAM);
584 
585     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
586     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
587     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
588     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetCurrentChannelId, HDF_ERR_INVALID_PARAM);
589 
590     int32_t ret = vdiRender->GetCurrentChannelId(vdiRender, channelId);
591     if (ret != HDF_SUCCESS) {
592         AUDIO_FUNC_LOGE("audio render GetCurrentChannelId fail, ret=%{public}d", ret);
593         return ret;
594     }
595 
596     return HDF_SUCCESS;
597 }
598 
AudioRenderSetExtraParamsVdi(struct IAudioRender * render,const char * keyValueList)599 int32_t AudioRenderSetExtraParamsVdi(struct IAudioRender *render, const char *keyValueList)
600 {
601     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
602     CHECK_NULL_PTR_RETURN_VALUE(keyValueList, HDF_ERR_INVALID_PARAM);
603 
604     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
605     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
606     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
607     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->SetExtraParams, HDF_ERR_INVALID_PARAM);
608 
609     int32_t ret = vdiRender->SetExtraParams(vdiRender, keyValueList);
610     if (ret != HDF_SUCCESS) {
611         AUDIO_FUNC_LOGE("audio render SetExtraParams fail, ret=%{public}d", ret);
612         return ret;
613     }
614 
615     return HDF_SUCCESS;
616 }
617 
AudioRenderGetExtraParamsVdi(struct IAudioRender * render,char * keyValueList,uint32_t keyValueListLen)618 int32_t AudioRenderGetExtraParamsVdi(struct IAudioRender *render, char *keyValueList, uint32_t keyValueListLen)
619 {
620     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
621     CHECK_NULL_PTR_RETURN_VALUE(keyValueList, HDF_ERR_INVALID_PARAM);
622 
623     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
624     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
625     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
626     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetExtraParams, HDF_ERR_INVALID_PARAM);
627 
628     int32_t ret = vdiRender->GetExtraParams(vdiRender, keyValueList, keyValueListLen);
629     if (ret != HDF_SUCCESS) {
630         AUDIO_FUNC_LOGE("audio render GetExtraParams fail, ret=%{public}d", ret);
631         return ret;
632     }
633 
634     return HDF_SUCCESS;
635 }
636 
AudioRenderReqMmapBufferVdi(struct IAudioRender * render,int32_t reqSize,struct AudioMmapBufferDescriptor * desc)637 int32_t AudioRenderReqMmapBufferVdi(struct IAudioRender *render, int32_t reqSize,
638     struct AudioMmapBufferDescriptor *desc)
639 {
640     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
641     CHECK_NULL_PTR_RETURN_VALUE(desc, HDF_ERR_INVALID_PARAM);
642 
643     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
644     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
645     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
646     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->ReqMmapBuffer, HDF_ERR_INVALID_PARAM);
647 
648     struct AudioMmapBufferDescriptorVdi vdiDesc = {0};
649     int32_t ret = vdiRender->ReqMmapBuffer(vdiRender, reqSize, &vdiDesc);
650     if (ret != HDF_SUCCESS) {
651         AUDIO_FUNC_LOGE("audio render ReqMmapBuffer fail, ret=%{public}d", ret);
652         return ret;
653     }
654 
655     desc->memoryAddress = NULL;
656     desc->memoryFd = vdiDesc.memoryFd;
657     desc->totalBufferFrames = vdiDesc.totalBufferFrames;
658     desc->transferFrameSize = vdiDesc.transferFrameSize;
659     desc->isShareable = vdiDesc.isShareable;
660     desc->offset = vdiDesc.offset;
661     desc->syncInfoSize = vdiDesc.syncInfoSize;
662     desc->filePath = strdup("");
663     if (desc->filePath == NULL) {
664         AUDIO_FUNC_LOGE("strdup fail");
665         return HDF_FAILURE;
666     }
667 
668     AUDIO_FUNC_LOGD("%{public}s success", __func__);
669     return HDF_SUCCESS;
670 }
671 
AudioRenderGetMmapPositionVdi(struct IAudioRender * render,uint64_t * frames,struct AudioTimeStamp * time)672 int32_t AudioRenderGetMmapPositionVdi(struct IAudioRender *render, uint64_t *frames, struct AudioTimeStamp *time)
673 {
674     struct AudioTimeStampVdi vdiTime;
675     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
676     CHECK_NULL_PTR_RETURN_VALUE(frames, HDF_ERR_INVALID_PARAM);
677     CHECK_NULL_PTR_RETURN_VALUE(time, HDF_ERR_INVALID_PARAM);
678 
679     vdiTime.tvSec = 0;
680     vdiTime.tvNSec = 0;
681 
682     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
683     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
684     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
685     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetMmapPosition, HDF_ERR_INVALID_PARAM);
686 
687     int32_t ret = vdiRender->GetMmapPosition(vdiRender, frames, &vdiTime);
688     if (ret != HDF_SUCCESS) {
689         AUDIO_FUNC_LOGE("audio render GetMmapPosition fail, ret=%{public}d", ret);
690         return ret;
691     }
692 
693     time->tvSec = vdiTime.tvSec;
694     time->tvNSec = vdiTime.tvNSec;
695     return HDF_SUCCESS;
696 }
697 
AudioRenderAddAudioEffectVdi(struct IAudioRender * render,uint64_t effectid)698 int32_t AudioRenderAddAudioEffectVdi(struct IAudioRender *render, uint64_t effectid)
699 {
700     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
701 
702     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
703     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
704     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
705     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->AddAudioEffect, HDF_ERR_INVALID_PARAM);
706 
707     return vdiRender->AddAudioEffect(vdiRender, effectid);
708 }
709 
AudioRenderRemoveAudioEffectVdi(struct IAudioRender * render,uint64_t effectid)710 int32_t AudioRenderRemoveAudioEffectVdi(struct IAudioRender *render, uint64_t effectid)
711 {
712     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
713 
714     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
715     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
716     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
717     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->RemoveAudioEffect, HDF_ERR_INVALID_PARAM);
718 
719     return vdiRender->RemoveAudioEffect(vdiRender, effectid);
720 }
721 
AudioRenderGetFrameBufferSizeVdi(struct IAudioRender * render,uint64_t * bufferSize)722 int32_t AudioRenderGetFrameBufferSizeVdi(struct IAudioRender *render, uint64_t *bufferSize)
723 {
724     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
725     CHECK_NULL_PTR_RETURN_VALUE(bufferSize, HDF_ERR_INVALID_PARAM);
726 
727     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
728     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
729     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
730     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->GetFrameBufferSize, HDF_ERR_INVALID_PARAM);
731 
732     return vdiRender->GetFrameBufferSize(vdiRender, bufferSize);
733 }
734 
AudioRenderStartVdi(struct IAudioRender * render)735 int32_t AudioRenderStartVdi(struct IAudioRender *render)
736 {
737     AUDIO_FUNC_LOGI("hdi start enter");
738     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
739     pthread_rwlock_rdlock(&g_rwVdiRenderLock);
740     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
741     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
742     if (vdiRender == NULL || vdiRender->Start == NULL) {
743         AUDIO_FUNC_LOGE("invalid param");
744         pthread_rwlock_unlock(&g_rwVdiRenderLock);
745         return HDF_ERR_INVALID_PARAM;
746     }
747     HdfAudioStartTrace("Hdi:AudioRenderStartVdi", 0);
748     struct timeval startTime = AudioDfxSysEventGetTimeStamp();
749     int32_t ret = vdiRender->Start(vdiRender);
750     AudioDfxSysEventError("Render Start", startTime, TIME_THRESHOLD, ret);
751     HdfAudioFinishTrace();
752     if (ret != HDF_SUCCESS) {
753         AUDIO_FUNC_LOGE("audio render Start fail, ret=%{public}d", ret);
754         pthread_rwlock_unlock(&g_rwVdiRenderLock);
755         return ret;
756     }
757     pthread_rwlock_unlock(&g_rwVdiRenderLock);
758     return HDF_SUCCESS;
759 }
760 
AudioRenderStopVdi(struct IAudioRender * render)761 int32_t AudioRenderStopVdi(struct IAudioRender *render)
762 {
763     AUDIO_FUNC_LOGI("hdi stop enter");
764     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
765     pthread_rwlock_rdlock(&g_rwVdiRenderLock);
766     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
767     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
768     if (vdiRender == NULL || vdiRender->Stop == NULL) {
769         AUDIO_FUNC_LOGE("invalid param");
770         pthread_rwlock_unlock(&g_rwVdiRenderLock);
771         return HDF_ERR_INVALID_PARAM;
772     }
773     HdfAudioStartTrace("Hdi:AudioRenderStopVdi", 0);
774     struct timeval startTime = AudioDfxSysEventGetTimeStamp();
775     int32_t ret = vdiRender->Stop(vdiRender);
776     AudioDfxSysEventError("Render Stop", startTime, TIME_THRESHOLD, ret);
777     HdfAudioFinishTrace();
778     if (ret != HDF_SUCCESS) {
779         AUDIO_FUNC_LOGE("audio render Stop fail, ret=%{public}d", ret);
780         pthread_rwlock_unlock(&g_rwVdiRenderLock);
781         return ret;
782     }
783     pthread_rwlock_unlock(&g_rwVdiRenderLock);
784     return HDF_SUCCESS;
785 }
786 
AudioRenderPauseVdi(struct IAudioRender * render)787 int32_t AudioRenderPauseVdi(struct IAudioRender *render)
788 {
789     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
790     pthread_rwlock_rdlock(&g_rwVdiRenderLock);
791     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
792     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
793     if (vdiRender == NULL || vdiRender->Pause == NULL) {
794         AUDIO_FUNC_LOGE("invalid param");
795         pthread_rwlock_unlock(&g_rwVdiRenderLock);
796         return HDF_ERR_INVALID_PARAM;
797     }
798 
799     int32_t ret = vdiRender->Pause(vdiRender);
800     if (ret != HDF_SUCCESS) {
801         AUDIO_FUNC_LOGE("audio render Pause fail, ret=%{public}d", ret);
802         pthread_rwlock_unlock(&g_rwVdiRenderLock);
803         return ret;
804     }
805     pthread_rwlock_unlock(&g_rwVdiRenderLock);
806     return HDF_SUCCESS;
807 }
808 
AudioRenderResumeVdi(struct IAudioRender * render)809 int32_t AudioRenderResumeVdi(struct IAudioRender *render)
810 {
811     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
812     pthread_rwlock_rdlock(&g_rwVdiRenderLock);
813     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
814     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
815     if (vdiRender == NULL || vdiRender->Resume == NULL) {
816         AUDIO_FUNC_LOGE("invalid param");
817         pthread_rwlock_unlock(&g_rwVdiRenderLock);
818         return HDF_ERR_INVALID_PARAM;
819     }
820 
821     int32_t ret = vdiRender->Resume(vdiRender);
822     if (ret != HDF_SUCCESS) {
823         AUDIO_FUNC_LOGE("audio render Resume fail, ret=%{public}d", ret);
824         pthread_rwlock_unlock(&g_rwVdiRenderLock);
825         return ret;
826     }
827     pthread_rwlock_unlock(&g_rwVdiRenderLock);
828     return HDF_SUCCESS;
829 }
830 
AudioRenderFlushVdi(struct IAudioRender * render)831 int32_t AudioRenderFlushVdi(struct IAudioRender *render)
832 {
833     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
834 
835     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
836     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
837     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
838     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->Flush, HDF_ERR_INVALID_PARAM);
839 
840     int32_t ret = vdiRender->Flush(vdiRender);
841     if (ret != HDF_SUCCESS) {
842         AUDIO_FUNC_LOGE("audio render Flush fail, ret=%{public}d", ret);
843         return ret;
844     }
845 
846     return HDF_SUCCESS;
847 }
848 
AudioRenderTurnStandbyModeVdi(struct IAudioRender * render)849 int32_t AudioRenderTurnStandbyModeVdi(struct IAudioRender *render)
850 {
851     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
852 
853     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
854     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
855     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
856     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->TurnStandbyMode, HDF_ERR_INVALID_PARAM);
857 
858     int32_t ret = vdiRender->TurnStandbyMode(vdiRender);
859     if (ret != HDF_SUCCESS) {
860         AUDIO_FUNC_LOGE("audio render TurnStandbyMode fail, ret=%{public}d", ret);
861         return ret;
862     }
863 
864     return HDF_SUCCESS;
865 }
866 
AudioRenderAudioDevDumpVdi(struct IAudioRender * render,int32_t range,int32_t fd)867 int32_t AudioRenderAudioDevDumpVdi(struct IAudioRender *render, int32_t range, int32_t fd)
868 {
869     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
870 
871     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
872     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
873     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
874     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->AudioDevDump, HDF_ERR_INVALID_PARAM);
875 
876     int32_t ret = vdiRender->AudioDevDump(vdiRender, range, fd);
877     if (ret != HDF_SUCCESS) {
878         AUDIO_FUNC_LOGE("audio render AudioDevDump fail, ret=%{public}d", ret);
879         return ret;
880     }
881 
882     return HDF_SUCCESS;
883 }
884 
AudioRenderIsSupportsPauseAndResumeVdi(struct IAudioRender * render,bool * supportPause,bool * supportResume)885 int32_t AudioRenderIsSupportsPauseAndResumeVdi(struct IAudioRender *render, bool *supportPause, bool *supportResume)
886 {
887     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
888     CHECK_NULL_PTR_RETURN_VALUE(supportPause, HDF_ERR_INVALID_PARAM);
889     CHECK_NULL_PTR_RETURN_VALUE(supportResume, HDF_ERR_INVALID_PARAM);
890 
891     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
892     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
893     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
894     CHECK_NULL_PTR_RETURN_VALUE(vdiRender->IsSupportsPauseAndResume, HDF_ERR_INVALID_PARAM);
895 
896     return vdiRender->IsSupportsPauseAndResume(vdiRender, supportPause, supportResume);
897 }
898 
AudioRenderSetbufferSize(struct IAudioRender * render,uint32_t size)899 int32_t AudioRenderSetbufferSize(struct IAudioRender *render, uint32_t size)
900 {
901     CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM);
902     struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render;
903     struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender;
904     CHECK_NULL_PTR_RETURN_VALUE(vdiRender, HDF_ERR_INVALID_PARAM);
905     return vdiRender->SetBufferSize(vdiRender, size);
906 }
907 
AudioInitRenderInstanceVdi(struct IAudioRender * render)908 static void AudioInitRenderInstanceVdi(struct IAudioRender *render)
909 {
910     render->GetLatency = AudioGetLatencyVdi;
911     render->RenderFrame = AudioRenderFrameVdi;
912     render->GetRenderPosition = AudioGetRenderPositionVdi;
913     render->SetRenderSpeed = AudioSetRenderSpeedVdi;
914     render->GetRenderSpeed = AudioGetRenderSpeedVdi;
915     render->RegCallback = AudioRenderRegCallbackVdi;
916     render->SetChannelMode = AudioRenderSetChannelModeVdi;
917     render->GetChannelMode = AudioRenderGetChannelModeVdi;
918     render->DrainBuffer = AudioRenderDrainBufferVdi;
919     render->IsSupportsDrain = AudioRenderIsSupportsDrainVdi;
920     render->CheckSceneCapability = AudioRenderCheckSceneCapabilityVdi;
921     render->SelectScene = AudioRenderSelectSceneVdi;
922     render->SetMute = AudioRenderSetMuteVdi;
923     render->GetMute = AudioRenderGetMuteVdi;
924     render->SetVolume = AudioRenderSetVolumeVdi;
925     render->GetVolume = AudioRenderGetVolumeVdi;
926     render->GetGainThreshold = AudioRenderGetGainThresholdVdi;
927     render->GetGain = AudioRenderGetGainVdi;
928     render->SetGain = AudioRenderSetGainVdi;
929     render->GetFrameSize = AudioRenderGetFrameSizeVdi;
930     render->GetFrameCount = AudioRenderGetFrameCountVdi;
931     render->SetSampleAttributes = AudioRenderSetSampleAttributesVdi;
932     render->GetSampleAttributes = AudioRenderGetSampleAttributesVdi;
933     render->GetCurrentChannelId = AudioRenderGetCurrentChannelIdVdi;
934     render->SetExtraParams = AudioRenderSetExtraParamsVdi;
935     render->GetExtraParams = AudioRenderGetExtraParamsVdi;
936     render->ReqMmapBuffer = AudioRenderReqMmapBufferVdi;
937     render->GetMmapPosition = AudioRenderGetMmapPositionVdi;
938     render->AddAudioEffect = AudioRenderAddAudioEffectVdi;
939     render->RemoveAudioEffect = AudioRenderRemoveAudioEffectVdi;
940     render->GetFrameBufferSize = AudioRenderGetFrameBufferSizeVdi;
941     render->Start = AudioRenderStartVdi;
942     render->Stop = AudioRenderStopVdi;
943     render->Pause = AudioRenderPauseVdi;
944     render->Resume = AudioRenderResumeVdi;
945     render->Flush = AudioRenderFlushVdi;
946     render->TurnStandbyMode = AudioRenderTurnStandbyModeVdi;
947     render->AudioDevDump = AudioRenderAudioDevDumpVdi;
948     render->IsSupportsPauseAndResume = AudioRenderIsSupportsPauseAndResumeVdi;
949     render->SetBufferSize = AudioRenderSetbufferSize;
950 }
951 
FindRenderCreated(enum AudioPortPin pin,const struct AudioSampleAttributes * attrs,uint32_t * rendrId,const char * adapterName)952 struct IAudioRender *FindRenderCreated(enum AudioPortPin pin, const struct AudioSampleAttributes *attrs,
953     uint32_t *rendrId, const char *adapterName)
954 {
955     if (attrs->type == AUDIO_MMAP_NOIRQ) {
956         AUDIO_FUNC_LOGI("render type is mmap");
957         return NULL;
958     }
959     uint32_t index = 0;
960     struct AudioRenderPrivVdi *renderPriv = AudioRenderGetPrivVdi();
961     if (renderPriv == NULL) {
962         AUDIO_FUNC_LOGE("Parameter error!");
963         return NULL;
964     }
965 
966     if (renderPriv->renderCnt == 0) {
967         AUDIO_FUNC_LOGI("no render created");
968         return NULL;
969     }
970 
971     for (index = 0; index < AUDIO_VDI_STREAM_NUM_MAX; index++) {
972         if ((renderPriv->renderInfos[index] != NULL) &&
973             (attrs->type == AUDIO_IN_MEDIA || attrs->type == AUDIO_MULTI_CHANNEL) &&
974             (renderPriv->renderInfos[index]->streamType == attrs->type) &&
975             (strcmp(renderPriv->renderInfos[index]->adapterName, adapterName) == 0)) {
976             *rendrId = renderPriv->renderInfos[index]->renderId;
977             renderPriv->renderInfos[index]->usrCount++;
978             return &renderPriv->renderInfos[index]->render;
979         }
980         if ((renderPriv->renderInfos[index] != NULL) &&
981             (renderPriv->renderInfos[index]->desc.pins == pin) &&
982             (renderPriv->renderInfos[index]->streamType == attrs->type) &&
983             (renderPriv->renderInfos[index]->sampleRate == attrs->sampleRate) &&
984             (renderPriv->renderInfos[index]->channelCount == attrs->channelCount)) {
985             *rendrId = renderPriv->renderInfos[index]->renderId;
986             renderPriv->renderInfos[index]->usrCount++;
987             return &renderPriv->renderInfos[index]->render;
988         }
989     }
990 
991     return NULL;
992 }
993 
GetAvailableRenderId(struct AudioRenderPrivVdi * renderPriv)994 static uint32_t GetAvailableRenderId(struct AudioRenderPrivVdi *renderPriv)
995 {
996     uint32_t renderId = AUDIO_VDI_STREAM_NUM_MAX;
997     if (renderPriv == NULL) {
998         AUDIO_FUNC_LOGE("Parameter error!");
999         return renderId;
1000     }
1001 
1002     if (renderPriv->renderCnt < AUDIO_VDI_STREAM_NUM_MAX) {
1003         renderId = renderPriv->renderCnt;
1004         renderPriv->renderCnt++;
1005     } else {
1006         for (uint32_t index = 0; index < AUDIO_VDI_STREAM_NUM_MAX; index++) {
1007             if (renderPriv->renderInfos[index] == NULL) {
1008                 renderId = index;
1009                 break;
1010             }
1011         }
1012     }
1013 
1014     return renderId;
1015 }
1016 
AudioCreateRenderByIdVdi(const struct AudioSampleAttributes * attrs,uint32_t * renderId,struct IAudioRenderVdi * vdiRender,const struct AudioDeviceDescriptor * desc,char * adapterName)1017 struct IAudioRender *AudioCreateRenderByIdVdi(const struct AudioSampleAttributes *attrs, uint32_t *renderId,
1018     struct IAudioRenderVdi *vdiRender, const struct AudioDeviceDescriptor *desc, char *adapterName)
1019 {
1020     struct IAudioRender *render = NULL;
1021     if (attrs == NULL || renderId == NULL || vdiRender == NULL || desc == NULL) {
1022         AUDIO_FUNC_LOGE("audio render is null");
1023         return NULL;
1024     }
1025 
1026     *renderId = AUDIO_VDI_STREAM_NUM_MAX;
1027     struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi();
1028 
1029     *renderId = GetAvailableRenderId(priv);
1030     if (*renderId >= AUDIO_VDI_STREAM_NUM_MAX) {
1031         AUDIO_FUNC_LOGE("audio vdiRender create render index fail, renderId=%{public}d", *renderId);
1032         return NULL;
1033     }
1034 
1035     priv->renderInfos[*renderId] = (struct AudioRenderInfo *)OsalMemCalloc(sizeof(struct AudioRenderInfo));
1036     if (priv->renderInfos[*renderId] == NULL) {
1037         AUDIO_FUNC_LOGE("audio VdiRender malloc renderInfos fail");
1038         return NULL;
1039     }
1040 
1041     priv->renderInfos[*renderId]->vdiRender = vdiRender;
1042     priv->renderInfos[*renderId]->streamType = attrs->type;
1043     priv->renderInfos[*renderId]->sampleRate = attrs->sampleRate;
1044     priv->renderInfos[*renderId]->channelCount = attrs->channelCount;
1045     priv->renderInfos[*renderId]->desc.portId = desc->portId;
1046     priv->renderInfos[*renderId]->desc.pins = desc->pins;
1047     priv->renderInfos[*renderId]->desc.desc = strdup(desc->desc);
1048     if (priv->renderInfos[*renderId]->desc.desc == NULL) {
1049         AUDIO_FUNC_LOGE("strdup fail, desc->desc = %{public}s", desc->desc);
1050         OsalMemFree(priv->renderInfos[*renderId]);
1051         priv->renderInfos[*renderId] = NULL;
1052         return NULL;
1053     }
1054     priv->renderInfos[*renderId]->renderId = *renderId;
1055     priv->renderInfos[*renderId]->usrCount = 1;
1056     priv->renderInfos[*renderId]->callback = NULL;
1057     priv->renderInfos[*renderId]->isRegCb = false;
1058     priv->renderInfos[*renderId]->adapterName = strdup(adapterName);
1059     if (priv->renderInfos[*renderId]->adapterName == NULL) {
1060         OsalMemFree(priv->renderInfos[*renderId]->desc.desc);
1061         OsalMemFree(priv->renderInfos[*renderId]);
1062         priv->renderInfos[*renderId] = NULL;
1063         return NULL;
1064     }
1065     render = &(priv->renderInfos[*renderId]->render);
1066     AudioInitRenderInstanceVdi(render);
1067 
1068     AUDIO_FUNC_LOGD("audio create render success");
1069     return render;
1070 }
1071 
DecreaseRenderUsrCount(uint32_t renderId)1072 uint32_t DecreaseRenderUsrCount(uint32_t renderId)
1073 {
1074     uint32_t usrCnt = 0;
1075     if (renderId >= AUDIO_VDI_STREAM_NUM_MAX) {
1076         AUDIO_FUNC_LOGE("audio check render index fail, descIndex=%{public}d", renderId);
1077         return usrCnt;
1078     }
1079     struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi();
1080     if (priv->renderInfos[renderId] == NULL) {
1081         AUDIO_FUNC_LOGE("audio check render index fail, descIndex=%{public}d", renderId);
1082         return usrCnt;
1083     }
1084 
1085     priv->renderInfos[renderId]->usrCount--;
1086     usrCnt = priv->renderInfos[renderId]->usrCount;
1087     return usrCnt;
1088 }
1089 
AudioDestroyRenderByIdVdi(uint32_t renderId)1090 void AudioDestroyRenderByIdVdi(uint32_t renderId)
1091 {
1092     if (renderId >= AUDIO_VDI_STREAM_NUM_MAX) {
1093         AUDIO_FUNC_LOGE("audio vdiRender destroy render index fail, descIndex=%{public}d", renderId);
1094         return;
1095     }
1096     struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi();
1097     if (priv->renderInfos[renderId] == NULL) {
1098         AUDIO_FUNC_LOGE("audio vdiRender destroy render index fail, descIndex=%{public}d", renderId);
1099         return;
1100     }
1101 
1102     OsalMemFree((void *)priv->renderInfos[renderId]->adapterName);
1103     priv->renderInfos[renderId]->adapterName = NULL;
1104     OsalMemFree((void *)priv->renderInfos[renderId]->desc.desc);
1105     priv->renderInfos[renderId]->vdiRender = NULL;
1106     priv->renderInfos[renderId]->desc.desc = NULL;
1107     priv->renderInfos[renderId]->desc.portId = UINT_MAX;
1108     priv->renderInfos[renderId]->desc.pins = PIN_NONE;
1109     priv->renderInfos[renderId]->callback = NULL;
1110     priv->renderInfos[renderId]->isRegCb = false;
1111     StubCollectorRemoveObject(IAUDIORENDER_INTERFACE_DESC, &(priv->renderInfos[renderId]->render));
1112     OsalMemFree(priv->renderInfos[renderId]);
1113     priv->renderInfos[renderId] = NULL;
1114     AUDIO_FUNC_LOGI("audio destroy render success, renderId = [%{public}u]", renderId);
1115 }
1116