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