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