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