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