• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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