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