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