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