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