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