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