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