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