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