1 /*
2 * Copyright (c) 2022-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 <math.h>
17 #include <sys/mman.h>
18 #include "hdf_base.h"
19 #include "hdf_types.h"
20 #include "osal_mem.h"
21 #include "audio_adapter_info_common.h"
22 #include "audio_common.h"
23 #include "audio_interface_lib_render.h"
24 #include "audio_internal.h"
25 #include "audio_uhdf_log.h"
26 #include "securec.h"
27
28 #define HDF_LOG_TAG HDF_AUDIO_PRIMARY_IMPL
29
30 #define CONFIG_OUT_LATENCY_MS 100 // unit: ms
31
32 /* 1 buffer: 8000(8kHz sample rate) * 2(bytes, PCM_16_BIT) * 1(channel) */
33 /* 1 frame: 1024(sample) * 2(bytes, PCM_16_BIT) * 1(channel) */
34 #define CONFIG_FRAME_SIZE (1024 * 2 * 1)
35 #define FRAME_SIZE 1024
36 #define CONFIG_FRAME_COUNT ((8000 * 2 * 1 + ((CONFIG_FRAME_SIZE) - 1)) / (CONFIG_FRAME_SIZE))
37
38 #define DEEP_BUFFER_PLATFORM_DELAY (29 * 1000LL)
39 #define LOW_LATENCY_PLATFORM_DELAY (13 * 1000LL)
40 #define BITS_TO_FROMAT 3
41 #define VOLUME_AVERAGE 2
42 #define SEC_TO_MILLSEC 1000
43 #define INTEGER_TO_DEC 10
44 #define DECIMAL_PART 5
45
PcmBytesToFrames(const struct AudioFrameRenderMode * frameRenderMode,uint64_t bytes,uint32_t * frameCount)46 int32_t PcmBytesToFrames(const struct AudioFrameRenderMode *frameRenderMode,
47 uint64_t bytes, uint32_t *frameCount)
48 {
49 if (frameRenderMode == NULL || frameCount == NULL) {
50 AUDIO_FUNC_LOGE("Parameter error!");
51 return AUDIO_ERR_INVALID_PARAM;
52 }
53
54 uint32_t formatBits = 0;
55
56 int32_t ret = FormatToBits(frameRenderMode->attrs.format, &formatBits);
57 if (ret != HDF_SUCCESS) {
58 AUDIO_FUNC_LOGE("FormatToBits error!");
59 return ret;
60 }
61
62 /* channelCount Not greater than 4 , formatBits Not greater than 64 */
63 if (frameRenderMode->attrs.channelCount > 4 || formatBits > 64) {
64 AUDIO_FUNC_LOGE("channelCount or formatBits error!");
65 return AUDIO_ERR_INTERNAL;
66 }
67
68 uint32_t frameSize = frameRenderMode->attrs.channelCount * (formatBits >> 3); // Bit to byte >> 3
69 if (frameSize == 0) {
70 AUDIO_FUNC_LOGE("frameSize error!");
71 return AUDIO_ERR_INTERNAL;
72 }
73 *frameCount = (uint32_t)bytes / frameSize;
74 return AUDIO_SUCCESS;
75 }
76
AudioRenderStart(struct IAudioRender * handle)77 int32_t AudioRenderStart(struct IAudioRender *handle)
78 {
79 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
80 if (hwRender == NULL) {
81 AUDIO_FUNC_LOGE("The pointer is null");
82 return AUDIO_ERR_INVALID_PARAM;
83 }
84
85 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
86 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
87 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
88 return AUDIO_ERR_INTERNAL;
89 }
90 if (hwRender->renderParam.frameRenderMode.buffer != NULL) {
91 AUDIO_FUNC_LOGE("IAudioRender already start!");
92 return AUDIO_ERR_AO_BUSY; // render is busy now
93 }
94 if (hwRender->devDataHandle == NULL) {
95 AUDIO_FUNC_LOGE("devDataHandle is null!");
96 return AUDIO_ERR_INTERNAL;
97 }
98
99 int32_t ret =
100 (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTRL_START);
101 if (ret < 0) {
102 AUDIO_FUNC_LOGE("AudioRenderStart SetParams FAIL");
103 return AUDIO_ERR_INTERNAL;
104 }
105
106 char *buffer = (char *)OsalMemCalloc(FRAME_DATA);
107 if (buffer == NULL) {
108 AUDIO_FUNC_LOGE("Calloc Render buffer Fail!");
109 return AUDIO_ERR_MALLOC_FAIL;
110 }
111
112 hwRender->renderParam.frameRenderMode.buffer = buffer;
113
114 AudioLogRecord(AUDIO_INFO, "[%s]-[%s]-[%d] :> [%s]", __FILE__, __func__, __LINE__, "Audio Render Start");
115 return AUDIO_SUCCESS;
116 }
117
AudioRenderStop(struct IAudioRender * handle)118 int32_t AudioRenderStop(struct IAudioRender *handle)
119 {
120 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
121 if (hwRender == NULL) {
122 AUDIO_FUNC_LOGE("hwRender is invalid");
123 return AUDIO_ERR_INVALID_PARAM;
124 }
125 if (hwRender->renderParam.frameRenderMode.buffer != NULL) {
126 AudioMemFree((void **)&hwRender->renderParam.frameRenderMode.buffer);
127 } else {
128 AUDIO_FUNC_LOGE("Repeat invalid stop operation!");
129 return AUDIO_ERR_NOT_SUPPORT;
130 }
131 if (hwRender->devDataHandle == NULL) {
132 AUDIO_FUNC_LOGE("RenderStart Bind Fail!");
133 return AUDIO_ERR_INTERNAL;
134 }
135
136 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
137 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
138 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
139 return AUDIO_ERR_INTERNAL;
140 }
141
142 int32_t ret =
143 (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTRL_STOP);
144 hwRender->renderParam.renderMode.ctlParam.turnStandbyStatus = AUDIO_TURN_STANDBY_LATER;
145 if (ret < 0) {
146 AUDIO_FUNC_LOGE("AudioRenderStop SetParams FAIL");
147 return AUDIO_ERR_INTERNAL;
148 }
149
150 AudioLogRecord(AUDIO_INFO, "[%s]-[%s]-[%d] :> [%s]", __FILE__, __func__, __LINE__, "Audio Render Stop");
151 return AUDIO_SUCCESS;
152 }
153
AudioRenderPause(struct IAudioRender * handle)154 int32_t AudioRenderPause(struct IAudioRender *handle)
155 {
156 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
157 if (hwRender == NULL) {
158 AUDIO_FUNC_LOGE("hwRender is null");
159 return AUDIO_ERR_INVALID_PARAM;
160 }
161 if (hwRender->renderParam.frameRenderMode.buffer == NULL) {
162 AUDIO_FUNC_LOGE("IAudioRender already stop!");
163 return AUDIO_ERR_INTERNAL;
164 }
165 if (hwRender->renderParam.renderMode.ctlParam.pause) {
166 AUDIO_FUNC_LOGE("Audio is already pause!");
167 return AUDIO_ERR_NOT_SUPPORT;
168 }
169 if (hwRender->devDataHandle == NULL) {
170 AUDIO_FUNC_LOGE("RenderPause Bind Fail!");
171 return AUDIO_ERR_INTERNAL;
172 }
173
174 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
175 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
176 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
177 return AUDIO_ERR_INTERNAL;
178 }
179
180 bool pauseStatus = hwRender->renderParam.renderMode.ctlParam.pause;
181
182 hwRender->renderParam.renderMode.ctlParam.pause = true;
183 int32_t ret =
184 (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIODRV_CTL_IOCTL_PAUSE_WRITE);
185 if (ret < 0) {
186 AUDIO_FUNC_LOGE("RenderPause FAIL!");
187 hwRender->renderParam.renderMode.ctlParam.pause = pauseStatus;
188 return AUDIO_ERR_INTERNAL;
189 }
190
191 AudioLogRecord(AUDIO_INFO, "[%s]-[%s]-[%d] :> [%s]", __FILE__, __func__, __LINE__, "Audio Render Pause");
192 return AUDIO_SUCCESS;
193 }
194
AudioRenderResume(struct IAudioRender * handle)195 int32_t AudioRenderResume(struct IAudioRender *handle)
196 {
197 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
198 if (hwRender == NULL) {
199 AUDIO_FUNC_LOGE("Param is error");
200 return AUDIO_ERR_INVALID_PARAM;
201 }
202 if (!hwRender->renderParam.renderMode.ctlParam.pause) {
203 AUDIO_FUNC_LOGE("Audio is already Resume !");
204 return AUDIO_ERR_NOT_SUPPORT;
205 }
206 if (hwRender->devDataHandle == NULL) {
207 AUDIO_FUNC_LOGE("RenderResume Bind Fail!");
208 return AUDIO_ERR_INTERNAL;
209 }
210
211 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
212 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
213 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
214 return AUDIO_ERR_INTERNAL;
215 }
216
217 bool resumeStatus = hwRender->renderParam.renderMode.ctlParam.pause;
218
219 hwRender->renderParam.renderMode.ctlParam.pause = false;
220 int32_t ret =
221 (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIODRV_CTL_IOCTL_PAUSE_WRITE);
222 if (ret < 0) {
223 AUDIO_FUNC_LOGE("RenderResume FAIL!");
224 hwRender->renderParam.renderMode.ctlParam.pause = resumeStatus;
225 return AUDIO_ERR_INTERNAL;
226 }
227
228 AudioLogRecord(AUDIO_INFO, "[%s]-[%s]-[%d] :> [%s]", __FILE__, __func__, __LINE__, "Audio Render Resume");
229 return AUDIO_SUCCESS;
230 }
231
AudioRenderFlush(struct IAudioRender * handle)232 int32_t AudioRenderFlush(struct IAudioRender *handle)
233 {
234 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
235 if (hwRender == NULL) {
236 AUDIO_FUNC_LOGE("Param is error");
237 return AUDIO_ERR_INVALID_PARAM;
238 }
239
240 bool callBackStatus = hwRender->renderParam.renderMode.hwInfo.callBackEnable;
241 if (callBackStatus) {
242 return CallbackProcessing(hwRender, AUDIO_FLUSH_COMPLETED);
243 }
244 return AUDIO_ERR_NOT_SUPPORT;
245 }
246
AudioRenderGetFrameSize(struct IAudioRender * handle,uint64_t * size)247 int32_t AudioRenderGetFrameSize(struct IAudioRender *handle, uint64_t *size)
248 {
249 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
250 if (hwRender == NULL || size == NULL) {
251 AUDIO_FUNC_LOGE("Param is error");
252 return AUDIO_ERR_INVALID_PARAM;
253 }
254
255 uint32_t channelCount = hwRender->renderParam.frameRenderMode.attrs.channelCount;
256 enum AudioFormat format = hwRender->renderParam.frameRenderMode.attrs.format;
257
258 uint32_t formatBits = 0;
259 int32_t ret = FormatToBits(format, &formatBits);
260 if (ret != AUDIO_SUCCESS) {
261 return ret;
262 }
263 *size = FRAME_SIZE * channelCount * (formatBits >> BITS_TO_FROMAT);
264 return AUDIO_SUCCESS;
265 }
266
AudioRenderGetFrameCount(struct IAudioRender * handle,uint64_t * count)267 int32_t AudioRenderGetFrameCount(struct IAudioRender *handle, uint64_t *count)
268 {
269 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
270 if (hwRender == NULL || count == NULL) {
271 AUDIO_FUNC_LOGE("Param is error");
272 return AUDIO_ERR_INVALID_PARAM;
273 }
274 *count = hwRender->renderParam.frameRenderMode.frames;
275 return AUDIO_SUCCESS;
276 }
277
AudioRenderSetSampleAttributes(struct IAudioRender * handle,const struct AudioSampleAttributes * attrs)278 int32_t AudioRenderSetSampleAttributes(struct IAudioRender *handle, const struct AudioSampleAttributes *attrs)
279 {
280 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
281 if (hwRender == NULL || attrs == NULL || hwRender->devDataHandle == NULL) {
282 AUDIO_FUNC_LOGE("Param is error");
283 return AUDIO_ERR_INVALID_PARAM;
284 }
285
286 int32_t ret = AudioCheckParaAttr(attrs);
287 if (ret != AUDIO_SUCCESS) {
288 return ret;
289 }
290
291 /* attrs temp */
292 struct AudioSampleAttributes tempAttrs = hwRender->renderParam.frameRenderMode.attrs;
293 hwRender->renderParam.frameRenderMode.attrs = *attrs;
294
295 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
296 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL || hwRender->devDataHandle == NULL) {
297 hwRender->renderParam.frameRenderMode.attrs = tempAttrs;
298 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
299 return AUDIO_ERR_INTERNAL;
300 }
301
302 ret = (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTL_HW_PARAMS);
303 if (ret < 0) {
304 AUDIO_FUNC_LOGE("SetSampleAttributes FAIL");
305 hwRender->renderParam.frameRenderMode.attrs = tempAttrs;
306 return AUDIO_ERR_INTERNAL;
307 }
308 return AUDIO_SUCCESS;
309 }
310
AudioRenderGetSampleAttributes(struct IAudioRender * handle,struct AudioSampleAttributes * attrs)311 int32_t AudioRenderGetSampleAttributes(struct IAudioRender *handle, struct AudioSampleAttributes *attrs)
312 {
313 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
314 if (hwRender == NULL || attrs == NULL) {
315 AUDIO_FUNC_LOGE("Param is error");
316 return AUDIO_ERR_INVALID_PARAM;
317 }
318
319 attrs->format = hwRender->renderParam.frameRenderMode.attrs.format;
320 attrs->sampleRate = hwRender->renderParam.frameRenderMode.attrs.sampleRate;
321 attrs->channelCount = hwRender->renderParam.frameRenderMode.attrs.channelCount;
322 attrs->type = hwRender->renderParam.frameRenderMode.attrs.type;
323 attrs->interleaved = hwRender->renderParam.frameRenderMode.attrs.interleaved;
324 attrs->period = hwRender->renderParam.frameRenderMode.attrs.period;
325 attrs->frameSize = hwRender->renderParam.frameRenderMode.attrs.frameSize;
326 attrs->isBigEndian = hwRender->renderParam.frameRenderMode.attrs.isBigEndian;
327 attrs->isSignedData = hwRender->renderParam.frameRenderMode.attrs.isSignedData;
328 attrs->startThreshold = hwRender->renderParam.frameRenderMode.attrs.startThreshold;
329 attrs->stopThreshold = hwRender->renderParam.frameRenderMode.attrs.stopThreshold;
330 attrs->silenceThreshold = hwRender->renderParam.frameRenderMode.attrs.silenceThreshold;
331 return AUDIO_SUCCESS;
332 }
333
AudioRenderGetCurrentChannelId(struct IAudioRender * handle,uint32_t * channelId)334 int32_t AudioRenderGetCurrentChannelId(struct IAudioRender *handle, uint32_t *channelId)
335 {
336 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
337 if (hwRender == NULL || channelId == NULL) {
338 AUDIO_FUNC_LOGE("Param is error");
339 return AUDIO_ERR_INVALID_PARAM;
340 }
341 *channelId = hwRender->renderParam.frameRenderMode.attrs.channelCount;
342 return AUDIO_SUCCESS;
343 }
344
AudioRenderCheckSceneCapability(struct IAudioRender * handle,const struct AudioSceneDescriptor * scene,bool * supported)345 int32_t AudioRenderCheckSceneCapability(
346 struct IAudioRender *handle, const struct AudioSceneDescriptor *scene, bool *supported)
347 {
348 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
349 if (hwRender == NULL || scene == NULL || supported == NULL) {
350 AUDIO_FUNC_LOGE("Param is error");
351 return AUDIO_ERR_INVALID_PARAM;
352 }
353 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
354 *supported = false;
355 /* Temporary storage does not save the structure */
356 struct AudioHwRenderParam renderParam = hwRender->renderParam;
357 renderParam.frameRenderMode.attrs.type = (enum AudioCategory)scene->scene.id;
358 renderParam.renderMode.hwInfo.deviceDescript.pins = scene->desc.pins;
359
360 PathSelAnalysisJson *pPathSelAnalysisJson = AudioPassthroughGetPathSelAnalysisJson();
361 if (pPathSelAnalysisJson == NULL) {
362 AUDIO_FUNC_LOGE("pPathSelAnalysisJson Is NULL!");
363 return AUDIO_ERR_NOT_SUPPORT;
364 }
365
366 int32_t ret = (*pPathSelAnalysisJson)((void *)&renderParam, CHECKSCENE_PATH_SELECT);
367 if (ret < 0) {
368 if (ret == AUDIO_ERR_NOT_SUPPORT) {
369 AUDIO_FUNC_LOGE("AudioRenderCheckSceneCapability not Support!");
370 return AUDIO_ERR_NOT_SUPPORT;
371 } else {
372 AUDIO_FUNC_LOGE("AudioRenderCheckSceneCapability fail!");
373 return AUDIO_ERR_INTERNAL;
374 }
375 }
376 *supported = true;
377 return AUDIO_SUCCESS;
378 #else
379 return AUDIO_ERR_NOT_SUPPORT;
380 #endif
381 }
382
AudioRenderSelectScene(struct IAudioRender * handle,const struct AudioSceneDescriptor * scene)383 int32_t AudioRenderSelectScene(struct IAudioRender *handle, const struct AudioSceneDescriptor *scene)
384 {
385 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
386 if (hwRender == NULL || scene == NULL) {
387 AUDIO_FUNC_LOGE("Param is error");
388 return AUDIO_ERR_INVALID_PARAM;
389 }
390 if (hwRender->devCtlHandle == NULL) {
391 AUDIO_FUNC_LOGE("RenderSelectScene Bind Fail!");
392 return AUDIO_ERR_INTERNAL;
393 }
394 #ifndef AUDIO_HAL_NOTSUPPORT_PATHSELECT
395 PathSelAnalysisJson *pPathSelAnalysisJson = AudioPassthroughGetPathSelAnalysisJson();
396 if (pPathSelAnalysisJson == NULL) {
397 AUDIO_FUNC_LOGE("pPathSelAnalysisJson Is NULL!");
398 return AUDIO_ERR_NOT_SUPPORT;
399 }
400 enum AudioCategory sceneId = hwRender->renderParam.frameRenderMode.attrs.type;
401 enum AudioPortPin descPins = hwRender->renderParam.renderMode.hwInfo.deviceDescript.pins;
402
403 hwRender->renderParam.frameRenderMode.attrs.type = (enum AudioCategory)(scene->scene.id);
404 hwRender->renderParam.renderMode.hwInfo.deviceDescript.pins = scene->desc.pins;
405 if ((*pPathSelAnalysisJson)((void *)&hwRender->renderParam, RENDER_PATH_SELECT) < 0) {
406 AUDIO_FUNC_LOGE("AudioRenderSelectScene Fail!");
407 hwRender->renderParam.frameRenderMode.attrs.type = sceneId;
408 hwRender->renderParam.renderMode.hwInfo.deviceDescript.pins = descPins;
409 return AUDIO_ERR_INTERNAL;
410 }
411
412 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
413 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
414 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
415 hwRender->renderParam.frameRenderMode.attrs.type = sceneId;
416 hwRender->renderParam.renderMode.hwInfo.deviceDescript.pins = descPins;
417 return AUDIO_ERR_INTERNAL;
418 }
419
420 int32_t ret = (*pInterfaceLibModeRender)(
421 hwRender->devCtlHandle, &hwRender->renderParam, AUDIODRV_CTL_IOCTL_SCENESELECT_WRITE);
422 if (ret < 0) {
423 AUDIO_FUNC_LOGE("SetParams FAIL!");
424 hwRender->renderParam.frameRenderMode.attrs.type = sceneId;
425 hwRender->renderParam.renderMode.hwInfo.deviceDescript.pins = descPins;
426 return AUDIO_ERR_INTERNAL;
427 }
428 return AUDIO_SUCCESS;
429 #else
430 return AUDIO_ERR_NOT_SUPPORT;
431 #endif
432 }
433
AudioRenderSetMute(struct IAudioRender * handle,bool mute)434 int32_t AudioRenderSetMute(struct IAudioRender *handle, bool mute)
435 {
436 struct AudioHwRender *impl = (struct AudioHwRender *)handle;
437 if (impl == NULL) {
438 AUDIO_FUNC_LOGE("impl is error");
439 return AUDIO_ERR_INVALID_PARAM;
440 }
441 if (impl->devCtlHandle == NULL) {
442 AUDIO_FUNC_LOGE("RenderSetMute Bind Fail!");
443 return AUDIO_ERR_INTERNAL;
444 }
445
446 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
447 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
448 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
449 return AUDIO_ERR_INTERNAL;
450 }
451
452 bool muteStatus = impl->renderParam.renderMode.ctlParam.mute;
453 impl->renderParam.renderMode.ctlParam.mute = mute;
454
455 int32_t ret = (*pInterfaceLibModeRender)(impl->devCtlHandle, &impl->renderParam, AUDIODRV_CTL_IOCTL_MUTE_WRITE);
456 if (ret < 0) {
457 AUDIO_FUNC_LOGE("SetMute SetParams FAIL");
458 impl->renderParam.renderMode.ctlParam.mute = muteStatus;
459 return AUDIO_ERR_INTERNAL;
460 }
461 AudioLogRecord(AUDIO_INFO, "[%s]-[%s]-[%d] :> [Setmute = %d]", __FILE__, __func__, __LINE__, mute);
462 return AUDIO_SUCCESS;
463 }
464
AudioRenderGetMute(struct IAudioRender * handle,bool * mute)465 int32_t AudioRenderGetMute(struct IAudioRender *handle, bool *mute)
466 {
467 struct AudioHwRender *impl = (struct AudioHwRender *)handle;
468 if (impl == NULL || mute == NULL) {
469 AUDIO_FUNC_LOGE("RenderGetMute Bind Fail!");
470 return AUDIO_ERR_INVALID_PARAM;
471 }
472
473 if (impl->devCtlHandle == NULL) {
474 AUDIO_FUNC_LOGE("RenderGetMute Bind Fail!");
475 return AUDIO_ERR_INTERNAL;
476 }
477
478 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
479 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
480 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
481 return AUDIO_ERR_INTERNAL;
482 }
483
484 int32_t ret =
485 (*pInterfaceLibModeRender)(impl->devCtlHandle, &impl->renderParam, AUDIODRV_CTL_IOCTL_MUTE_READ);
486 if (ret < 0) {
487 AUDIO_FUNC_LOGE("Get Mute FAIL!");
488 return AUDIO_ERR_INTERNAL;
489 }
490 *mute = impl->renderParam.renderMode.ctlParam.mute;
491 AUDIO_FUNC_LOGI("GetMute SUCCESS!");
492 return AUDIO_SUCCESS;
493 }
494
AudioRenderSetVolume(struct IAudioRender * handle,float volume)495 int32_t AudioRenderSetVolume(struct IAudioRender *handle, float volume)
496 {
497 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
498 if (hwRender == NULL) {
499 AUDIO_FUNC_LOGE("hwRender is error");
500 return AUDIO_ERR_INVALID_PARAM;
501 }
502
503 float volumeTemp = hwRender->renderParam.renderMode.ctlParam.volume;
504 float volMax = (float)hwRender->renderParam.renderMode.ctlParam.volThreshold.volMax;
505 float volMin = (float)hwRender->renderParam.renderMode.ctlParam.volThreshold.volMin;
506 if (volume < 0 || volume > 1) {
507 AUDIO_FUNC_LOGE("volume param Is error!");
508 return AUDIO_ERR_INVALID_PARAM;
509 }
510 if (hwRender->devCtlHandle == NULL) {
511 AUDIO_FUNC_LOGE("RenderSetVolume Bind Fail!");
512 return AUDIO_ERR_INTERNAL;
513 }
514
515 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
516 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
517 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
518 return AUDIO_ERR_INTERNAL;
519 }
520
521 volume = (volume == 0) ? 1 : (volume * VOLUME_CHANGE);
522 /* change volume to db */
523 float volTemp = ((volMax - volMin) / 2) * log10(volume) + volMin;
524 if (volTemp < volMin || volTemp > volMax) {
525 AUDIO_FUNC_LOGE("volTemp fail");
526 return AUDIO_ERR_INTERNAL;
527 }
528 hwRender->renderParam.renderMode.ctlParam.volume = volTemp;
529
530 int32_t ret =
531 (*pInterfaceLibModeRender)(hwRender->devCtlHandle, &hwRender->renderParam, AUDIODRV_CTL_IOCTL_ELEM_WRITE);
532 if (ret < 0) {
533 AUDIO_FUNC_LOGE("RenderSetVolume FAIL!");
534 hwRender->renderParam.renderMode.ctlParam.volume = volumeTemp;
535 return AUDIO_ERR_INTERNAL;
536 }
537 return AUDIO_SUCCESS;
538 }
539
AudioRenderGetVolume(struct IAudioRender * handle,float * volume)540 int32_t AudioRenderGetVolume(struct IAudioRender *handle, float *volume)
541 {
542 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
543 if (hwRender == NULL || volume == NULL) {
544 AUDIO_FUNC_LOGE("Param is error");
545 return AUDIO_ERR_INVALID_PARAM;
546 }
547 if (hwRender->devCtlHandle == NULL) {
548 AUDIO_FUNC_LOGE("RenderGetVolume Bind Fail!");
549 return AUDIO_ERR_INTERNAL;
550 }
551
552 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
553 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
554 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
555 return AUDIO_ERR_INTERNAL;
556 }
557
558 int32_t ret =
559 (*pInterfaceLibModeRender)(hwRender->devCtlHandle, &hwRender->renderParam, AUDIODRV_CTL_IOCTL_ELEM_READ);
560 if (ret < 0) {
561 AUDIO_FUNC_LOGE("RenderGetVolume FAIL!");
562 return AUDIO_ERR_INTERNAL;
563 }
564
565 float volumeTemp = hwRender->renderParam.renderMode.ctlParam.volume;
566 float volMax = (float)hwRender->renderParam.renderMode.ctlParam.volThreshold.volMax;
567 float volMin = (float)hwRender->renderParam.renderMode.ctlParam.volThreshold.volMin;
568 if ((volMax - volMin) == 0) {
569 AUDIO_FUNC_LOGE("Divisor cannot be zero!");
570 return AUDIO_ERR_INTERNAL;
571 }
572
573 volumeTemp = (volumeTemp - volMin) / ((volMax - volMin) / VOLUME_AVERAGE);
574
575 int volumeT = (int)((pow(INTEGER_TO_DEC, volumeTemp) + DECIMAL_PART) / INTEGER_TO_DEC); // delet 0.X num
576
577 *volume = (float)volumeT / INTEGER_TO_DEC; // get volume (0-1)
578 return AUDIO_SUCCESS;
579 }
580
AudioRenderGetGainThreshold(struct IAudioRender * handle,float * min,float * max)581 int32_t AudioRenderGetGainThreshold(struct IAudioRender *handle, float *min, float *max)
582 {
583 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
584 if (hwRender == NULL || min == NULL || max == NULL) {
585 return AUDIO_ERR_INVALID_PARAM;
586 }
587 if (hwRender->devCtlHandle == NULL) {
588 AUDIO_FUNC_LOGE("RenderGetGainThreshold Bind Fail!");
589 return AUDIO_ERR_INTERNAL;
590 }
591
592 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
593 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
594 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
595 return AUDIO_ERR_INTERNAL;
596 }
597
598 int32_t ret = (*pInterfaceLibModeRender)(
599 hwRender->devCtlHandle, &hwRender->renderParam, AUDIODRV_CTL_IOCTL_GAINTHRESHOLD_READ);
600 if (ret < 0) {
601 AUDIO_FUNC_LOGE("GetGainThreshold FAIL!");
602 return AUDIO_ERR_INTERNAL;
603 }
604
605 *max = hwRender->renderParam.renderMode.ctlParam.audioGain.gainMax;
606 *min = hwRender->renderParam.renderMode.ctlParam.audioGain.gainMin;
607 return AUDIO_SUCCESS;
608 }
609
AudioRenderGetGain(struct IAudioRender * handle,float * gain)610 int32_t AudioRenderGetGain(struct IAudioRender *handle, float *gain)
611 {
612 struct AudioHwRender *impl = (struct AudioHwRender *)handle;
613 if (impl == NULL || gain == NULL) {
614 AUDIO_FUNC_LOGE("Param is error");
615 return AUDIO_ERR_INVALID_PARAM;
616 }
617 if (impl->devCtlHandle == NULL) {
618 AUDIO_FUNC_LOGE("RenderGetGain Bind Fail!");
619 return AUDIO_ERR_INTERNAL;
620 }
621
622 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
623 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
624 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
625 return AUDIO_ERR_INTERNAL;
626 }
627
628 int32_t ret =
629 (*pInterfaceLibModeRender)(impl->devCtlHandle, &impl->renderParam, AUDIODRV_CTL_IOCTL_GAIN_READ);
630 if (ret < 0) {
631 AUDIO_FUNC_LOGE("RenderGetGain FAIL");
632 return AUDIO_ERR_INTERNAL;
633 }
634
635 *gain = impl->renderParam.renderMode.ctlParam.audioGain.gain;
636 return AUDIO_SUCCESS;
637 }
638
AudioRenderSetGain(struct IAudioRender * handle,float gain)639 int32_t AudioRenderSetGain(struct IAudioRender *handle, float gain)
640 {
641 int32_t ret = 0;
642 struct AudioHwRender *impl = (struct AudioHwRender *)handle;
643 if (impl == NULL || gain < 0) {
644 AUDIO_FUNC_LOGE("Param is error");
645 return AUDIO_ERR_INVALID_PARAM;
646 }
647
648 float gainTemp = impl->renderParam.renderMode.ctlParam.audioGain.gain;
649 impl->renderParam.renderMode.ctlParam.audioGain.gain = gain;
650 if (impl->devCtlHandle == NULL) {
651 AUDIO_FUNC_LOGE("RenderSetGain Bind Fail!");
652 impl->renderParam.renderMode.ctlParam.audioGain.gain = gainTemp;
653 return AUDIO_ERR_INTERNAL;
654 }
655
656 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
657 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
658 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
659 impl->renderParam.renderMode.ctlParam.audioGain.gain = gainTemp;
660 return AUDIO_ERR_INTERNAL;
661 }
662
663 ret = (*pInterfaceLibModeRender)(impl->devCtlHandle, &impl->renderParam, AUDIODRV_CTL_IOCTL_GAIN_WRITE);
664 if (ret < 0) {
665 AUDIO_FUNC_LOGE("RenderSetGain FAIL");
666 impl->renderParam.renderMode.ctlParam.audioGain.gain = gainTemp;
667 return AUDIO_ERR_INTERNAL;
668 }
669 return AUDIO_SUCCESS;
670 }
671
AudioRenderGetLatency(struct IAudioRender * render,uint32_t * ms)672 int32_t AudioRenderGetLatency(struct IAudioRender *render, uint32_t *ms)
673 {
674 struct AudioHwRender *impl = (struct AudioHwRender *)render;
675 if (impl == NULL || ms == NULL) {
676 AUDIO_FUNC_LOGE("impl or ms is null!");
677 return AUDIO_ERR_INVALID_PARAM;
678 }
679
680 uint32_t byteRate = impl->renderParam.frameRenderMode.byteRate;
681 uint32_t periodSize = impl->renderParam.frameRenderMode.periodSize;
682 uint32_t periodCount = impl->renderParam.frameRenderMode.periodCount;
683
684 if (byteRate == 0) {
685 AUDIO_FUNC_LOGE("byteRate error!");
686 return AUDIO_ERR_INTERNAL;
687 }
688
689 *ms = (periodCount * periodSize * SEC_TO_MILLSEC) / byteRate;
690 return AUDIO_SUCCESS;
691 }
692
LogErrorGetRensonAndTime(struct AudioHwRender * hwRender,int errorReason)693 static int32_t LogErrorGetRensonAndTime(struct AudioHwRender *hwRender, int errorReason)
694 {
695 if (hwRender == NULL) {
696 AUDIO_FUNC_LOGE("hwRender is null!");
697 return AUDIO_ERR_INVALID_PARAM;
698 }
699
700 if (hwRender->errorLog.iter >= ERROR_LOG_MAX_NUM) {
701 AUDIO_FUNC_LOGE("hwRender->errorLog.iter >= ERROR_LOG_MAX_NUM error!");
702 return AUDIO_ERR_INVALID_PARAM;
703 }
704
705 if (hwRender->errorLog.errorDump[hwRender->errorLog.iter].reason == NULL) {
706 hwRender->errorLog.errorDump[hwRender->errorLog.iter].reason = (char *)OsalMemCalloc(ERROR_REASON_DESC_LEN);
707 if (hwRender->errorLog.errorDump[hwRender->errorLog.iter].reason == NULL) {
708 AUDIO_FUNC_LOGE("Calloc reasonDesc Fail!");
709 return AUDIO_ERR_MALLOC_FAIL;
710 }
711 }
712
713 if (hwRender->errorLog.errorDump[hwRender->errorLog.iter].currentTime == NULL) {
714 hwRender->errorLog.errorDump[hwRender->errorLog.iter].currentTime =
715 (char *)OsalMemCalloc(ERROR_REASON_DESC_LEN);
716 if (hwRender->errorLog.errorDump[hwRender->errorLog.iter].currentTime == NULL) {
717 AUDIO_FUNC_LOGE("Calloc time Fail!");
718 return AUDIO_ERR_MALLOC_FAIL;
719 }
720 }
721
722 memset_s(
723 hwRender->errorLog.errorDump[hwRender->errorLog.iter].reason, ERROR_REASON_DESC_LEN, 0, ERROR_REASON_DESC_LEN);
724 memset_s(hwRender->errorLog.errorDump[hwRender->errorLog.iter].currentTime, ERROR_REASON_DESC_LEN, 0,
725 ERROR_REASON_DESC_LEN);
726
727 int32_t ret = GetErrorReason(errorReason, hwRender->errorLog.errorDump[hwRender->errorLog.iter].reason);
728 if (ret < 0) {
729 AUDIO_FUNC_LOGE("GetErrorReason failed!");
730 return AUDIO_ERR_INTERNAL;
731 }
732
733 ret = GetCurrentTime(hwRender->errorLog.errorDump[hwRender->errorLog.iter].currentTime);
734 if (ret < 0) {
735 AUDIO_FUNC_LOGE("GetCurrentTime Fail");
736 return AUDIO_ERR_INTERNAL;
737 }
738 return AUDIO_SUCCESS;
739 }
740
LogError(AudioHandle handle,int32_t errorCode,int reason)741 static void LogError(AudioHandle handle, int32_t errorCode, int reason)
742 {
743 struct AudioHwRender *hwRender = (struct AudioHwRender *)handle;
744 if (hwRender == NULL) {
745 AUDIO_FUNC_LOGE("hwRender is null!");
746 return;
747 }
748
749 hwRender->errorLog.totalErrors++;
750 if (hwRender->errorLog.iter >= ERROR_LOG_MAX_NUM) {
751 hwRender->errorLog.iter = 0;
752 }
753
754 int32_t ret = LogErrorGetRensonAndTime(hwRender, reason);
755 if (ret < 0) {
756 AUDIO_FUNC_LOGE("LogErrorGetRensonAndTime error!");
757 return;
758 }
759
760 if (errorCode == WRITE_FRAME_ERROR_CODE) {
761 hwRender->errorLog.errorDump[hwRender->errorLog.iter].errorCode = errorCode;
762 hwRender->errorLog.errorDump[hwRender->errorLog.iter].count = hwRender->errorLog.iter;
763 hwRender->errorLog.errorDump[hwRender->errorLog.iter].frames = hwRender->renderParam.frameRenderMode.frames;
764 hwRender->errorLog.iter++;
765 }
766 }
767
AudioRenderRenderFramSplit(struct AudioHwRender * hwRender)768 static int32_t AudioRenderRenderFramSplit(struct AudioHwRender *hwRender)
769 {
770 if (hwRender == NULL) {
771 AUDIO_FUNC_LOGE("hwRender is null!");
772 return HDF_FAILURE;
773 }
774
775 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
776 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
777 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
778 return HDF_FAILURE;
779 }
780 if (hwRender->devDataHandle == NULL) {
781 AUDIO_FUNC_LOGE("hwRender->devDataHandle is null!");
782 return HDF_FAILURE;
783 }
784
785 int32_t ret =
786 (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTL_WRITE);
787 if (ret < 0) {
788 AUDIO_FUNC_LOGE("Render Frame FAIL!");
789 LogError((AudioHandle)hwRender, WRITE_FRAME_ERROR_CODE, ret);
790 return AUDIO_ERR_INTERNAL;
791 }
792 return HDF_SUCCESS;
793 }
794
AudioRenderRenderFrame(struct IAudioRender * render,const int8_t * frame,uint32_t frameLen,uint64_t * replyBytes)795 int32_t AudioRenderRenderFrame(
796 struct IAudioRender *render, const int8_t *frame, uint32_t frameLen, uint64_t *replyBytes)
797 {
798 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
799 if (hwRender == NULL || frame == NULL || replyBytes == NULL ||
800 hwRender->renderParam.frameRenderMode.buffer == NULL) {
801 AUDIO_FUNC_LOGE("Render Frame Paras is NULL!");
802 return AUDIO_ERR_INVALID_PARAM;
803 }
804 if (frameLen > FRAME_DATA) {
805 AUDIO_FUNC_LOGE("Out of FRAME_DATA size!");
806 return AUDIO_ERR_INTERNAL;
807 }
808
809 int32_t ret = memcpy_s(hwRender->renderParam.frameRenderMode.buffer, FRAME_DATA, frame, frameLen);
810 if (ret != EOK) {
811 AUDIO_FUNC_LOGE("memcpy_s fail");
812 return AUDIO_ERR_INTERNAL;
813 }
814
815 hwRender->renderParam.frameRenderMode.bufferSize = (uint64_t)frameLen;
816 uint32_t frameCount = 0;
817 ret = PcmBytesToFrames(&hwRender->renderParam.frameRenderMode, (uint64_t)frameLen, &frameCount);
818 if (ret != AUDIO_SUCCESS) {
819 AUDIO_FUNC_LOGE("PcmBytesToFrames error!");
820 return ret;
821 }
822
823 hwRender->renderParam.frameRenderMode.bufferFrameSize = (uint64_t)frameCount;
824 if (AudioRenderRenderFramSplit(hwRender) < 0) {
825 AUDIO_FUNC_LOGE("AudioRenderRenderFramSplit error!");
826 return AUDIO_ERR_INTERNAL;
827 }
828
829 *replyBytes = (uint64_t)frameLen;
830
831 hwRender->renderParam.frameRenderMode.frames += hwRender->renderParam.frameRenderMode.bufferFrameSize;
832 if (hwRender->renderParam.frameRenderMode.attrs.sampleRate == 0) {
833 AUDIO_FUNC_LOGE("Divisor cannot be zero!");
834 return AUDIO_ERR_INTERNAL;
835 }
836
837 if (TimeToAudioTimeStamp(hwRender->renderParam.frameRenderMode.bufferFrameSize,
838 &hwRender->renderParam.frameRenderMode.time,
839 hwRender->renderParam.frameRenderMode.attrs.sampleRate) == HDF_FAILURE) {
840 AUDIO_FUNC_LOGE("Frame is NULL");
841 return AUDIO_ERR_INTERNAL;
842 }
843 return AUDIO_SUCCESS;
844 }
845
AudioRenderGetRenderPosition(struct IAudioRender * render,uint64_t * frames,struct AudioTimeStamp * time)846 int32_t AudioRenderGetRenderPosition(struct IAudioRender *render, uint64_t *frames, struct AudioTimeStamp *time)
847 {
848 struct AudioHwRender *impl = (struct AudioHwRender *)render;
849 if (impl == NULL || frames == NULL || time == NULL) {
850 AUDIO_FUNC_LOGE("Paras is NULL!");
851 return AUDIO_ERR_INVALID_PARAM;
852 }
853 *frames = impl->renderParam.frameRenderMode.frames;
854 *time = impl->renderParam.frameRenderMode.time;
855 return AUDIO_SUCCESS;
856 }
857
AudioRenderSetRenderSpeed(struct IAudioRender * render,float speed)858 int32_t AudioRenderSetRenderSpeed(struct IAudioRender *render, float speed)
859 {
860 (void)speed;
861 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
862 if (hwRender == NULL) {
863 AUDIO_FUNC_LOGE("hwRender is NULL!");
864 return AUDIO_ERR_INVALID_PARAM;
865 }
866 return AUDIO_ERR_NOT_SUPPORT;
867 }
868
AudioRenderGetRenderSpeed(struct IAudioRender * render,float * speed)869 int32_t AudioRenderGetRenderSpeed(struct IAudioRender *render, float *speed)
870 {
871 struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
872 if (hwRender == NULL || speed == NULL) {
873 AUDIO_FUNC_LOGE("Param is NULL!");
874 return AUDIO_ERR_INVALID_PARAM;
875 }
876 return AUDIO_ERR_NOT_SUPPORT;
877 }
878
AudioRenderSetChannelMode(struct IAudioRender * render,enum AudioChannelMode mode)879 int32_t AudioRenderSetChannelMode(struct IAudioRender *render, enum AudioChannelMode mode)
880 {
881 struct AudioHwRender *impl = (struct AudioHwRender *)render;
882 if (impl == NULL) {
883 AUDIO_FUNC_LOGE("impl is NULL!");
884 return AUDIO_ERR_INVALID_PARAM;
885 }
886
887 if (impl->devCtlHandle == NULL) {
888 AUDIO_FUNC_LOGE("Bind Fail!");
889 return AUDIO_ERR_INTERNAL;
890 }
891
892 enum AudioChannelMode tempMode = impl->renderParam.frameRenderMode.mode;
893 impl->renderParam.frameRenderMode.mode = mode;
894
895 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
896 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
897 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
898 impl->renderParam.frameRenderMode.mode = tempMode;
899 return AUDIO_ERR_INTERNAL;
900 }
901
902 int32_t ret =
903 (*pInterfaceLibModeRender)(impl->devCtlHandle, &impl->renderParam, AUDIODRV_CTL_IOCTL_CHANNEL_MODE_WRITE);
904 if (ret < 0) {
905 AUDIO_FUNC_LOGE("Set ChannelMode FAIL!");
906 impl->renderParam.frameRenderMode.mode = tempMode;
907 return AUDIO_ERR_INTERNAL;
908 }
909 return AUDIO_SUCCESS;
910 }
911
AudioRenderGetChannelMode(struct IAudioRender * render,enum AudioChannelMode * mode)912 int32_t AudioRenderGetChannelMode(struct IAudioRender *render, enum AudioChannelMode *mode)
913 {
914 struct AudioHwRender *impl = (struct AudioHwRender *)render;
915 if (impl == NULL || mode == NULL || impl->devCtlHandle == NULL) {
916 AUDIO_FUNC_LOGE("Paras is NULL!");
917 return AUDIO_ERR_INVALID_PARAM;
918 }
919
920 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
921 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
922 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
923 return AUDIO_ERR_INTERNAL;
924 }
925
926 int32_t ret =
927 (*pInterfaceLibModeRender)(impl->devCtlHandle, &impl->renderParam, AUDIODRV_CTL_IOCTL_CHANNEL_MODE_READ);
928 if (ret < 0) {
929 AUDIO_FUNC_LOGE("Get ChannelMode FAIL!");
930 return AUDIO_ERR_INTERNAL;
931 }
932 *mode = impl->renderParam.frameRenderMode.mode;
933 return AUDIO_SUCCESS;
934 }
935
SetValue(struct ExtraParams mExtraParams,struct AudioHwRender * render)936 static int32_t SetValue(struct ExtraParams mExtraParams, struct AudioHwRender *render)
937 {
938 if (render == NULL) {
939 AUDIO_FUNC_LOGE("render is NULL!");
940 return HDF_FAILURE;
941 }
942 if (mExtraParams.route != -1) {
943 render->renderParam.renderMode.hwInfo.pathroute = mExtraParams.route;
944 }
945 if (mExtraParams.format != -1) {
946 render->renderParam.frameRenderMode.attrs.format = mExtraParams.format;
947 }
948 if (mExtraParams.channels != 0) {
949 render->renderParam.frameRenderMode.attrs.channelCount = mExtraParams.channels;
950 }
951 if (mExtraParams.flag) {
952 render->renderParam.frameRenderMode.frames = mExtraParams.frames;
953 }
954 if (mExtraParams.sampleRate != 0) {
955 render->renderParam.frameRenderMode.attrs.sampleRate = mExtraParams.sampleRate;
956 }
957 return HDF_SUCCESS;
958 }
959
AudioRenderSetExtraParams(struct IAudioRender * handle,const char * keyValueList)960 int32_t AudioRenderSetExtraParams(struct IAudioRender *handle, const char *keyValueList)
961 {
962 struct AudioHwRender *render = (struct AudioHwRender *)handle;
963 if (render == NULL || keyValueList == NULL) {
964 return AUDIO_ERR_INVALID_PARAM;
965 }
966 int32_t count = 0;
967 int32_t check = 0;
968 struct ExtraParams mExtraParams;
969 if (AudioSetExtraParams(keyValueList, &count, &mExtraParams, &check) < 0) {
970 return AUDIO_ERR_INTERNAL;
971 }
972 if (count != 0 && check == count) {
973 SetValue(mExtraParams, render);
974 return AUDIO_SUCCESS;
975 } else {
976 return AUDIO_ERR_INTERNAL;
977 }
978 }
979
AudioRenderGetExtraParams(struct IAudioRender * handle,char * keyValueList,uint32_t listLenth)980 int32_t AudioRenderGetExtraParams(struct IAudioRender *handle, char *keyValueList, uint32_t listLenth)
981 {
982 struct AudioHwRender *render = (struct AudioHwRender *)handle;
983 if (render == NULL || keyValueList == NULL || listLenth == 0) {
984 return AUDIO_ERR_INVALID_PARAM;
985 }
986
987 int32_t bufferSize = strlen(ROUTE_SAMPLE) + strlen(FORMAT_SAMPLE) + strlen(CHANNELS_SAMPLE) +
988 strlen(FRAME_COUNT_SAMPLE) + strlen(SAMPLING_RATE_SAMPLE) + 1;
989 if (listLenth < (uint32_t)bufferSize) {
990 return AUDIO_ERR_INTERNAL;
991 }
992
993 int32_t ret = AddElementToList(
994 keyValueList, listLenth, AUDIO_ATTR_PARAM_ROUTE, &render->renderParam.renderMode.hwInfo.pathroute);
995 if (ret < 0) {
996 return AUDIO_ERR_INTERNAL;
997 }
998
999 ret = AddElementToList(
1000 keyValueList, listLenth, AUDIO_ATTR_PARAM_FORMAT, &render->renderParam.frameRenderMode.attrs.format);
1001 if (ret < 0) {
1002 return AUDIO_ERR_INTERNAL;
1003 }
1004
1005 ret = AddElementToList(
1006 keyValueList, listLenth, AUDIO_ATTR_PARAM_CHANNELS, &render->renderParam.frameRenderMode.attrs.channelCount);
1007 if (ret < 0) {
1008 return AUDIO_ERR_INTERNAL;
1009 }
1010
1011 ret = AddElementToList(
1012 keyValueList, listLenth, AUDIO_ATTR_PARAM_FRAME_COUNT, &render->renderParam.frameRenderMode.frames);
1013 if (ret < 0) {
1014 return AUDIO_ERR_INTERNAL;
1015 }
1016
1017 ret = AddElementToList(
1018 keyValueList, listLenth, AUDIO_ATTR_PARAM_SAMPLING_RATE, &render->renderParam.frameRenderMode.attrs.sampleRate);
1019 if (ret < 0) {
1020 return AUDIO_ERR_INTERNAL;
1021 }
1022 return AUDIO_SUCCESS;
1023 }
1024
AudioRenderReqMmapBuffer(struct IAudioRender * handle,int32_t reqSize,struct AudioMmapBufferDescriptor * desc)1025 int32_t AudioRenderReqMmapBuffer(
1026 struct IAudioRender *handle, int32_t reqSize, struct AudioMmapBufferDescriptor *desc)
1027 {
1028 (void)handle;
1029 (void)reqSize;
1030 (void)desc;
1031 return AUDIO_SUCCESS;
1032 }
1033
AudioRenderGetMmapPosition(struct IAudioRender * handle,uint64_t * frames,struct AudioTimeStamp * time)1034 int32_t AudioRenderGetMmapPosition(struct IAudioRender *handle, uint64_t *frames, struct AudioTimeStamp *time)
1035 {
1036 struct AudioHwRender *render = (struct AudioHwRender *)handle;
1037 if (render == NULL || frames == NULL || time == NULL) {
1038 return AUDIO_ERR_INVALID_PARAM;
1039 }
1040
1041 InterfaceLibModeRenderPassthrough *pInterfaceLibModeRender = AudioPassthroughGetInterfaceLibModeRender();
1042 if (pInterfaceLibModeRender == NULL || *pInterfaceLibModeRender == NULL) {
1043 AUDIO_FUNC_LOGE("pInterfaceLibModeRender Is NULL");
1044 return AUDIO_ERR_INTERNAL;
1045 }
1046 if (render->devDataHandle == NULL) {
1047 return AUDIO_ERR_INTERNAL;
1048 }
1049
1050 int32_t ret =
1051 (*pInterfaceLibModeRender)(render->devDataHandle, &render->renderParam, AUDIO_DRV_PCM_IOCTL_MMAP_POSITION);
1052 if (ret < 0) {
1053 AUDIO_FUNC_LOGE("Get Position FAIL!");
1054 return AUDIO_ERR_INTERNAL;
1055 }
1056
1057 *frames = render->renderParam.frameRenderMode.frames;
1058
1059 render->renderParam.frameRenderMode.time.tvSec =
1060 (int64_t)(render->renderParam.frameRenderMode.frames / render->renderParam.frameRenderMode.attrs.sampleRate);
1061
1062 uint64_t lastBufFrames =
1063 render->renderParam.frameRenderMode.frames % render->renderParam.frameRenderMode.attrs.sampleRate;
1064
1065 render->renderParam.frameRenderMode.time.tvNSec =
1066 (int64_t)((lastBufFrames * SEC_TO_NSEC) / render->renderParam.frameRenderMode.attrs.sampleRate);
1067
1068 *time = render->renderParam.frameRenderMode.time;
1069 return AUDIO_SUCCESS;
1070 }
1071
AudioRenderTurnStandbyMode(struct IAudioRender * handle)1072 int32_t AudioRenderTurnStandbyMode(struct IAudioRender *handle)
1073 {
1074 struct AudioHwRender *render = (struct AudioHwRender *)handle;
1075 if (render == NULL) {
1076 return AUDIO_ERR_INVALID_PARAM;
1077 }
1078
1079 render->renderParam.renderMode.ctlParam.turnStandbyStatus = AUDIO_TURN_STANDBY_NOW;
1080
1081 int32_t ret = AudioRenderStop((AudioHandle)render);
1082 if (ret < 0) {
1083 return AUDIO_ERR_INTERNAL;
1084 }
1085 return AUDIO_SUCCESS;
1086 }
1087
AudioRenderAudioDevDump(struct IAudioRender * handle,int32_t range,int32_t fd)1088 int32_t AudioRenderAudioDevDump(struct IAudioRender *handle, int32_t range, int32_t fd)
1089 {
1090 struct AudioHwRender *render = (struct AudioHwRender *)handle;
1091 if (render == NULL) {
1092 return AUDIO_ERR_INVALID_PARAM;
1093 }
1094
1095 dprintf(fd, "%s%d\n", "Number of errors: ", render->errorLog.totalErrors);
1096 if (range < RANGE_MIN - 1 || range > RANGE_MAX) {
1097 dprintf(fd, "%s\n", "Out of range, invalid output");
1098 return AUDIO_SUCCESS;
1099 }
1100
1101 uint32_t mSize = render->errorLog.iter;
1102 if (range < RANGE_MIN) {
1103 dprintf(fd, "%-5s %-10s %s\n", "count", "errorCode", "Time");
1104 for (uint32_t i = 0; i < mSize; i++) {
1105 dprintf(fd, FORMAT_TWO, render->errorLog.errorDump[i].count + 1, render->errorLog.errorDump[i].errorCode,
1106 render->errorLog.errorDump[i].currentTime);
1107 }
1108 } else {
1109 dprintf(fd, "%-5s %-10s %-20s %-15s %s\n", "count", "errorCode", "frames", "fail reason", "Time");
1110 for (uint32_t i = 0; i < mSize; i++) {
1111 dprintf(fd, FORMAT_ONE, render->errorLog.errorDump[i].count + 1, render->errorLog.errorDump[i].errorCode,
1112 render->errorLog.errorDump[i].frames, render->errorLog.errorDump[i].reason,
1113 render->errorLog.errorDump[i].currentTime);
1114 }
1115 }
1116 return AUDIO_SUCCESS;
1117 }
CallbackProcessing(AudioHandle handle,enum AudioCallbackType callBackType)1118 int32_t CallbackProcessing(AudioHandle handle, enum AudioCallbackType callBackType)
1119 {
1120 struct AudioHwRender *render = (struct AudioHwRender *)handle;
1121 if (render == NULL) {
1122 AUDIO_FUNC_LOGI("Unregistered callback.\n");
1123 return HDF_FAILURE;
1124 }
1125 if (render->renderParam.frameRenderMode.callback.RenderCallback == NULL) {
1126 return HDF_FAILURE;
1127 }
1128
1129 bool isCallBack = false;
1130 switch (callBackType) {
1131 case AUDIO_NONBLOCK_WRITE_COMPLETED:
1132 case AUDIO_DRAIN_COMPLETED:
1133 case AUDIO_FLUSH_COMPLETED:
1134 case AUDIO_RENDER_FULL:
1135 case AUDIO_ERROR_OCCUR:
1136 isCallBack = true;
1137 break;
1138 default:
1139 break;
1140 }
1141
1142 if (!isCallBack) {
1143 AUDIO_FUNC_LOGI("No callback processing is required.\n");
1144 return HDF_ERR_NOT_SUPPORT;
1145 }
1146
1147 render->renderParam.frameRenderMode.callback.RenderCallback(
1148 &render->renderParam.frameRenderMode.callback, callBackType, NULL, render->renderParam.frameRenderMode.cookie);
1149 return HDF_SUCCESS;
1150 }
1151
AudioRenderRegCallback(struct IAudioRender * render,struct IAudioCallback * audioCallback,int8_t cookie)1152 int32_t AudioRenderRegCallback(struct IAudioRender *render, struct IAudioCallback *audioCallback, int8_t cookie)
1153 {
1154 if (audioCallback == NULL || audioCallback->RenderCallback == NULL) {
1155 return AUDIO_ERR_INVALID_PARAM;
1156 }
1157
1158 struct AudioHwRender *pRender = (struct AudioHwRender *)render;
1159 if (pRender == NULL) {
1160 return AUDIO_ERR_INVALID_PARAM;
1161 }
1162
1163 pRender->renderParam.frameRenderMode.callback.RenderCallback = audioCallback->RenderCallback;
1164 pRender->renderParam.frameRenderMode.cookie = (void *)(uintptr_t)cookie;
1165 pRender->renderParam.renderMode.hwInfo.callBackEnable = true;
1166 return AUDIO_SUCCESS;
1167 }
1168
AudioRenderDrainBuffer(struct IAudioRender * render,enum AudioDrainNotifyType * type)1169 int32_t AudioRenderDrainBuffer(struct IAudioRender *render, enum AudioDrainNotifyType *type)
1170 {
1171 struct AudioHwRender *pRender = (struct AudioHwRender *)render;
1172 if (pRender == NULL || type == NULL) {
1173 return AUDIO_ERR_INVALID_PARAM;
1174 }
1175 return AUDIO_ERR_NOT_SUPPORT;
1176 }
1177
AudioRenderRelease(struct IAudioRender * instance)1178 void AudioRenderRelease(struct IAudioRender *instance)
1179 {
1180 (void)instance;
1181 }
1182