• 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 <hdf_log.h>
16 #include "audio_internal.h"
17 #include "audio_adapter_info_common.h"
18 #include "audio_bluetooth_manager.h"
19 #include "audio_render.h"
20 #include "hitrace_meter.h"
21 namespace OHOS::HDI::Audio_Bluetooth {
22 /* 1 buffer: 8000(8kHz sample rate) * 2(bytes, PCM_16_BIT) * 1(channel) */
23 /* 1 frame: 1024(sample) * 2(bytes, PCM_16_BIT) * 1(channel) */
24 constexpr int FRAME_SIZE = 1024;
25 
PcmBytesToFrames(const struct AudioFrameRenderMode * frameRenderMode,uint64_t bytes,uint32_t * frameCount)26 int32_t PcmBytesToFrames(const struct AudioFrameRenderMode *frameRenderMode, uint64_t bytes, uint32_t *frameCount)
27 {
28     if (frameRenderMode == NULL || frameCount == NULL) {
29         return HDF_FAILURE;
30     }
31     uint32_t formatBits = 0;
32     int32_t ret = FormatToBits(frameRenderMode->attrs.format, &formatBits);
33     if (ret != HDF_SUCCESS) {
34         return ret;
35     }
36     uint32_t frameSize = frameRenderMode->attrs.channelCount * (formatBits >> 3); // Bit to byte >> 3
37     if (frameSize == 0) {
38         return HDF_FAILURE;
39     }
40     *frameCount = (uint32_t)bytes / frameSize;
41     return HDF_SUCCESS;
42 }
43 
AudioRenderStart(AudioHandle handle)44 int32_t AudioRenderStart(AudioHandle handle)
45 {
46     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
47     if (hwRender == NULL) {
48         return AUDIO_HAL_ERR_INVALID_PARAM;
49     }
50     if (hwRender->renderParam.frameRenderMode.buffer != NULL) {
51         HDF_LOGE("AudioRender already start!");
52         return AUDIO_HAL_ERR_AO_BUSY; // render is busy now
53     }
54 
55     HDF_LOGI("%s, StartPlaying", __func__);
56 #ifndef A2DP_HDI_SERVICE
57     if (OHOS::Bluetooth::GetPlayingState() == false) {
58         OHOS::Bluetooth::StartPlaying();
59     }
60 #endif
61 
62     char *buffer = static_cast<char *>(calloc(1, FRAME_DATA));
63     if (buffer == NULL) {
64         HDF_LOGE("Calloc Render buffer Fail!");
65         return AUDIO_HAL_ERR_MALLOC_FAIL;
66     }
67     hwRender->renderParam.frameRenderMode.buffer = buffer;
68     return AUDIO_HAL_SUCCESS;
69 }
70 
AudioRenderStop(AudioHandle handle)71 int32_t AudioRenderStop(AudioHandle handle)
72 {
73     HDF_LOGI("AudioRenderStop");
74     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
75     if (hwRender == NULL) {
76         return AUDIO_HAL_ERR_INVALID_PARAM;
77     }
78     if (hwRender->renderParam.frameRenderMode.buffer != NULL) {
79         AudioMemFree(reinterpret_cast<void **>(&hwRender->renderParam.frameRenderMode.buffer));
80     } else {
81         HDF_LOGE("Repeat invalid stop operation!");
82         return AUDIO_HAL_ERR_NOT_SUPPORT;
83     }
84 
85     HDF_LOGI("%s, StopPlaying", __func__);
86 #ifndef A2DP_HDI_SERVICE
87     if (OHOS::Bluetooth::GetPlayingState() == true) {
88         OHOS::Bluetooth::StopPlaying();
89     }
90 #else
91     OHOS::Bluetooth::StopPlaying();
92 #endif
93 
94     hwRender->renderParam.renderMode.ctlParam.pause = false;
95     return AUDIO_HAL_SUCCESS;
96 }
97 
AudioRenderPause(AudioHandle handle)98 int32_t AudioRenderPause(AudioHandle handle)
99 {
100     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
101     if (hwRender == NULL) {
102         return AUDIO_HAL_ERR_INVALID_PARAM;
103     }
104     if (hwRender->renderParam.frameRenderMode.buffer == NULL) {
105         HDF_LOGE("AudioRender already stop!");
106         return AUDIO_HAL_ERR_INTERNAL;
107     }
108     if (hwRender->renderParam.renderMode.ctlParam.pause) {
109         HDF_LOGE("Audio is already pause!");
110         return AUDIO_HAL_ERR_NOT_SUPPORT;
111     }
112 
113     HDF_LOGI("%s, SuspendPlaying", __func__);
114 #ifndef A2DP_HDI_SERVICE
115     if (OHOS::Bluetooth::GetPlayingState() == true) {
116         OHOS::Bluetooth::SuspendPlaying();
117     }
118 #else
119     OHOS::Bluetooth::SuspendPlaying();
120 #endif
121 
122     hwRender->renderParam.renderMode.ctlParam.pause = true;
123     return AUDIO_HAL_SUCCESS;
124 }
125 
AudioRenderResume(AudioHandle handle)126 int32_t AudioRenderResume(AudioHandle handle)
127 {
128     HDF_LOGI("AudioRenderResume");
129     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
130     if (hwRender == NULL) {
131         return AUDIO_HAL_ERR_INVALID_PARAM;
132     }
133     if (!hwRender->renderParam.renderMode.ctlParam.pause) {
134         HDF_LOGE("Audio is already Resume !");
135         return AUDIO_HAL_ERR_NOT_SUPPORT;
136     }
137 
138     HDF_LOGI("%s, StartPlaying", __func__);
139 #ifndef A2DP_HDI_SERVICE
140     if (OHOS::Bluetooth::GetPlayingState() == false) {
141         OHOS::Bluetooth::StartPlaying();
142     }
143 #endif
144 
145     hwRender->renderParam.renderMode.ctlParam.pause = false;
146     return AUDIO_HAL_SUCCESS;
147 }
148 
AudioRenderFlush(AudioHandle handle)149 int32_t AudioRenderFlush(AudioHandle handle)
150 {
151     HDF_LOGI("AudioRenderFlush");
152     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
153     if (hwRender == NULL) {
154         return AUDIO_HAL_ERR_INVALID_PARAM;
155     }
156     return AUDIO_HAL_ERR_NOT_SUPPORT;
157 }
158 
AudioRenderGetFrameSize(AudioHandle handle,uint64_t * size)159 int32_t AudioRenderGetFrameSize(AudioHandle handle, uint64_t *size)
160 {
161     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
162     const int shift = 3;
163     if (hwRender == NULL || size == NULL) {
164         return AUDIO_HAL_ERR_INVALID_PARAM;
165     }
166     uint32_t channelCount = hwRender->renderParam.frameRenderMode.attrs.channelCount;
167     AudioFormat format = hwRender->renderParam.frameRenderMode.attrs.format;
168     uint32_t formatBits = 0;
169     int32_t ret = FormatToBits(format, &formatBits);
170     if (ret != AUDIO_HAL_SUCCESS) {
171         return ret;
172     }
173     *size = FRAME_SIZE * channelCount * (formatBits >> shift);
174     return AUDIO_HAL_SUCCESS;
175 }
176 
AudioRenderGetFrameCount(AudioHandle handle,uint64_t * count)177 int32_t AudioRenderGetFrameCount(AudioHandle handle, uint64_t *count)
178 {
179     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
180     if (hwRender == NULL || count == NULL) {
181         return AUDIO_HAL_ERR_INVALID_PARAM;
182     }
183     *count = hwRender->renderParam.frameRenderMode.frames;
184     return AUDIO_HAL_SUCCESS;
185 }
186 
AudioRenderSetSampleAttributes(AudioHandle handle,const struct AudioSampleAttributes * attrs)187 int32_t AudioRenderSetSampleAttributes(AudioHandle handle, const struct AudioSampleAttributes *attrs)
188 {
189     (void)attrs;
190     return AUDIO_HAL_SUCCESS;
191 }
192 
AudioRenderGetSampleAttributes(AudioHandle handle,struct AudioSampleAttributes * attrs)193 int32_t AudioRenderGetSampleAttributes(AudioHandle handle, struct AudioSampleAttributes *attrs)
194 {
195     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
196     if (hwRender == NULL || attrs == NULL) {
197         return AUDIO_HAL_ERR_INVALID_PARAM;
198     }
199     attrs->format = hwRender->renderParam.frameRenderMode.attrs.format;
200     attrs->sampleRate = hwRender->renderParam.frameRenderMode.attrs.sampleRate;
201     attrs->channelCount = hwRender->renderParam.frameRenderMode.attrs.channelCount;
202     attrs->type = hwRender->renderParam.frameRenderMode.attrs.type;
203     attrs->interleaved = hwRender->renderParam.frameRenderMode.attrs.interleaved;
204     attrs->period = hwRender->renderParam.frameRenderMode.attrs.period;
205     attrs->frameSize = hwRender->renderParam.frameRenderMode.attrs.frameSize;
206     attrs->isBigEndian = hwRender->renderParam.frameRenderMode.attrs.isBigEndian;
207     attrs->isSignedData = hwRender->renderParam.frameRenderMode.attrs.isSignedData;
208     attrs->startThreshold = hwRender->renderParam.frameRenderMode.attrs.startThreshold;
209     attrs->stopThreshold = hwRender->renderParam.frameRenderMode.attrs.stopThreshold;
210     attrs->silenceThreshold = hwRender->renderParam.frameRenderMode.attrs.silenceThreshold;
211     return AUDIO_HAL_SUCCESS;
212 }
213 
AudioRenderGetCurrentChannelId(AudioHandle handle,uint32_t * channelId)214 int32_t AudioRenderGetCurrentChannelId(AudioHandle handle, uint32_t *channelId)
215 {
216     HDF_LOGI("AudioRenderGetCurrentChannelId");
217     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
218     if (hwRender == NULL || channelId == NULL) {
219         return AUDIO_HAL_ERR_INVALID_PARAM;
220     }
221     *channelId = hwRender->renderParam.frameRenderMode.attrs.channelCount;
222     return AUDIO_HAL_SUCCESS;
223 }
224 
AudioRenderCheckSceneCapability(AudioHandle handle,const struct AudioSceneDescriptor * scene,bool * supported)225 int32_t AudioRenderCheckSceneCapability(AudioHandle handle, const struct AudioSceneDescriptor *scene,
226                                         bool *supported)
227 {
228     (void)scene;
229     (void)supported;
230     HDF_LOGI("AudioRenderCheckSceneCapability");
231     return AUDIO_HAL_SUCCESS;
232 }
233 
AudioRenderSelectScene(AudioHandle handle,const struct AudioSceneDescriptor * scene)234 int32_t AudioRenderSelectScene(AudioHandle handle, const struct AudioSceneDescriptor *scene)
235 {
236     (void)scene;
237     return AUDIO_HAL_SUCCESS;
238 }
239 
AudioRenderSetMute(AudioHandle handle,bool mute)240 int32_t AudioRenderSetMute(AudioHandle handle, bool mute)
241 {
242     (void)mute;
243     return AUDIO_HAL_SUCCESS;
244 }
245 
AudioRenderGetMute(AudioHandle handle,bool * mute)246 int32_t AudioRenderGetMute(AudioHandle handle, bool *mute)
247 {
248     (void)mute;
249     return AUDIO_HAL_SUCCESS;
250 }
251 
AudioRenderSetVolume(AudioHandle handle,float volume)252 int32_t AudioRenderSetVolume(AudioHandle handle, float volume)
253 {
254     (void)volume;
255     return AUDIO_HAL_SUCCESS;
256 }
257 
AudioRenderGetVolume(AudioHandle handle,float * volume)258 int32_t AudioRenderGetVolume(AudioHandle handle, float *volume)
259 {
260     (void)volume;
261     return AUDIO_HAL_SUCCESS;
262 }
263 
AudioRenderGetGainThreshold(AudioHandle handle,float * min,float * max)264 int32_t AudioRenderGetGainThreshold(AudioHandle handle, float *min, float *max)
265 {
266     (void)min;
267     (void)max;
268     HDF_LOGI("AudioRenderGetGainThreshold");
269     return AUDIO_HAL_SUCCESS;
270 }
271 
AudioRenderGetGain(AudioHandle handle,float * gain)272 int32_t AudioRenderGetGain(AudioHandle handle, float *gain)
273 {
274     (void)gain;
275     HDF_LOGI("AudioRenderGetGain");
276     return AUDIO_HAL_SUCCESS;
277 }
278 
AudioRenderSetGain(AudioHandle handle,float gain)279 int32_t AudioRenderSetGain(AudioHandle handle, float gain)
280 {
281     (void)gain;
282     HDF_LOGI("AudioRenderSetGain");
283     return AUDIO_HAL_SUCCESS;
284 }
285 
AudioRenderGetLatency(struct AudioRender * render,uint32_t * ms)286 int32_t AudioRenderGetLatency(struct AudioRender *render, uint32_t *ms)
287 {
288     HITRACE_METER_NAME(HITRACE_TAG_BLUETOOTH, "BtAudioRenderGetLatency");
289     struct AudioHwRender *impl = reinterpret_cast<struct AudioHwRender *>(render);
290     if (impl == NULL || ms == NULL) {
291         return AUDIO_HAL_ERR_INVALID_PARAM;
292     }
293     uint32_t byteRate = impl->renderParam.frameRenderMode.byteRate;
294     uint32_t periodSize = impl->renderParam.frameRenderMode.periodSize;
295     uint32_t periodCount = impl->renderParam.frameRenderMode.periodCount;
296     if (byteRate == 0) {
297         return AUDIO_HAL_ERR_INTERNAL;
298     }
299     uint32_t periodMs = (periodCount * periodSize * 1000) / byteRate;
300     *ms = periodMs;
301 #ifdef A2DP_HDI_SERVICE
302     uint32_t latency = 0;
303     OHOS::Bluetooth::GetLatency(latency);
304     *ms = latency;
305 #endif
306     return AUDIO_HAL_SUCCESS;
307 }
308 
AudioRenderRenderFramSplit(struct AudioHwRender * hwRender)309 int32_t AudioRenderRenderFramSplit(struct AudioHwRender *hwRender)
310 {
311     return HDF_SUCCESS;
312 }
313 
AudioRenderRenderFrame(struct AudioRender * render,const void * frame,uint64_t requestBytes,uint64_t * replyBytes)314 int32_t AudioRenderRenderFrame(struct AudioRender *render, const void *frame,
315                                uint64_t requestBytes, uint64_t *replyBytes)
316 {
317     HITRACE_METER_FMT(HITRACE_TAG_BLUETOOTH, "renderFrame:%d", requestBytes);
318     HDF_LOGD("AudioRenderRenderFrame");
319     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(render);
320     if (hwRender == NULL || frame == NULL || replyBytes == NULL ||
321         hwRender->renderParam.frameRenderMode.buffer == NULL) {
322         HDF_LOGE("Render Frame Paras is NULL!");
323         return AUDIO_HAL_ERR_INVALID_PARAM;
324     }
325     if (FRAME_DATA < requestBytes) {
326         HDF_LOGE("Out of FRAME_DATA size!");
327         return AUDIO_HAL_ERR_INTERNAL;
328     }
329     int32_t ret = memcpy_s(hwRender->renderParam.frameRenderMode.buffer, FRAME_DATA, frame, (uint32_t)requestBytes);
330     if (ret != EOK) {
331         HDF_LOGE("memcpy_s fail");
332         return AUDIO_HAL_ERR_INTERNAL;
333     }
334     hwRender->renderParam.frameRenderMode.bufferSize = requestBytes;
335     uint32_t frameCount = 0;
336     ret = PcmBytesToFrames(&hwRender->renderParam.frameRenderMode, requestBytes, &frameCount);
337     if (ret != AUDIO_HAL_SUCCESS) {
338         return ret;
339     }
340     hwRender->renderParam.frameRenderMode.bufferFrameSize = (uint64_t)frameCount;
341     if (AudioRenderRenderFramSplit(hwRender) < 0) {
342         return AUDIO_HAL_ERR_INTERNAL;
343     }
344     *replyBytes = requestBytes;
345     hwRender->renderParam.frameRenderMode.frames += hwRender->renderParam.frameRenderMode.bufferFrameSize;
346     if (hwRender->renderParam.frameRenderMode.attrs.sampleRate == 0) {
347         HDF_LOGE("Divisor cannot be zero!");
348         return AUDIO_HAL_ERR_INTERNAL;
349     }
350     if (TimeToAudioTimeStamp(hwRender->renderParam.frameRenderMode.bufferFrameSize,
351         &hwRender->renderParam.frameRenderMode.time,
352         hwRender->renderParam.frameRenderMode.attrs.sampleRate) == HDF_FAILURE) {
353         HDF_LOGE("Frame is NULL");
354         return AUDIO_HAL_ERR_INTERNAL;
355     }
356 
357     LOGV("%s, WriteFrame", __func__);
358     const uint8_t *data = reinterpret_cast<const uint8_t *>(frame);
359     AudioSampleAttributes *attrs = &hwRender->renderParam.frameRenderMode.attrs;
360     return OHOS::Bluetooth::WriteFrame(data, static_cast<uint32_t>(requestBytes), attrs);
361 }
362 
AudioRenderGetRenderPosition(struct AudioRender * render,uint64_t * frames,struct AudioTimeStamp * time)363 int32_t AudioRenderGetRenderPosition(struct AudioRender *render, uint64_t *frames, struct AudioTimeStamp *time)
364 {
365     struct AudioHwRender *impl = reinterpret_cast<struct AudioHwRender *>(render);
366     if (impl == NULL || frames == NULL || time == NULL) {
367         return AUDIO_HAL_ERR_INVALID_PARAM;
368     }
369     *frames = impl->renderParam.frameRenderMode.frames;
370     *time = impl->renderParam.frameRenderMode.time;
371     return AUDIO_HAL_SUCCESS;
372 }
373 
AudioRenderSetRenderSpeed(struct AudioRender * render,float speed)374 int32_t AudioRenderSetRenderSpeed(struct AudioRender *render, float speed)
375 {
376     (void)speed;
377     HDF_LOGI("AudioRenderSetRenderSpeed");
378     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(render);
379     if (hwRender == NULL) {
380         return AUDIO_HAL_ERR_INVALID_PARAM;
381     }
382     return AUDIO_HAL_ERR_NOT_SUPPORT;
383 }
384 
AudioRenderGetRenderSpeed(struct AudioRender * render,float * speed)385 int32_t AudioRenderGetRenderSpeed(struct AudioRender *render, float *speed)
386 {
387     HDF_LOGI("AudioRenderGetRenderSpeed");
388     struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(render);
389     if (hwRender == NULL || speed == NULL) {
390         return AUDIO_HAL_ERR_INVALID_PARAM;
391     }
392     return AUDIO_HAL_ERR_NOT_SUPPORT;
393 }
394 
AudioRenderSetChannelMode(struct AudioRender * render,AudioChannelMode mode)395 int32_t AudioRenderSetChannelMode(struct AudioRender *render, AudioChannelMode mode)
396 {
397     (void)render;
398     HDF_LOGI("AudioRenderSetChannelMode");
399     return AUDIO_HAL_SUCCESS;
400 }
401 
AudioRenderGetChannelMode(struct AudioRender * render,AudioChannelMode * mode)402 int32_t AudioRenderGetChannelMode(struct AudioRender *render, AudioChannelMode *mode)
403 {
404     (void)render;
405     HDF_LOGI("AudioRenderGetChannelMode");
406     return AUDIO_HAL_SUCCESS;
407 }
408 
SetValue(struct ExtraParams mExtraParams,struct AudioHwRender * render)409 int32_t SetValue(struct ExtraParams mExtraParams, struct AudioHwRender *render)
410 {
411     if (render == NULL) {
412         return HDF_FAILURE;
413     }
414     if (mExtraParams.route != -1) {
415         render->renderParam.renderMode.hwInfo.pathroute = (PathRoute)mExtraParams.route;
416     }
417     if (mExtraParams.format != -1) {
418         render->renderParam.frameRenderMode.attrs.format = (AudioFormat)mExtraParams.format;
419     }
420     if (mExtraParams.channels != 0) {
421         render->renderParam.frameRenderMode.attrs.channelCount = mExtraParams.channels;
422     }
423     if (mExtraParams.flag) {
424         render->renderParam.frameRenderMode.frames = mExtraParams.frames;
425     }
426     if (mExtraParams.sampleRate != 0) {
427         render->renderParam.frameRenderMode.attrs.sampleRate = mExtraParams.sampleRate;
428     }
429 #ifdef A2DP_HDI_SERVICE
430     if (mExtraParams.audioStreamCtl == 1) {
431         HDF_LOGI("SetValue, try to suspendPlaying=1");
432         OHOS::Bluetooth::SuspendPlayingFromParam();
433     } else if (mExtraParams.audioStreamCtl == 0) {
434         HDF_LOGI("SetValue, try to suspendPlaying=0");
435         OHOS::Bluetooth::UnBlockStart();
436     }
437 #endif
438     return HDF_SUCCESS;
439 }
440 
AudioRenderSetExtraParams(AudioHandle handle,const char * keyValueList)441 int32_t AudioRenderSetExtraParams(AudioHandle handle, const char *keyValueList)
442 {
443     struct AudioHwRender *render = reinterpret_cast<struct AudioHwRender *>(handle);
444     if (render == NULL || keyValueList == NULL) {
445         return AUDIO_HAL_ERR_INVALID_PARAM;
446     }
447     int32_t count = 0;
448     int32_t sumOk = 0;
449     struct ExtraParams mExtraParams;
450     if (AudioSetExtraParams(keyValueList, &count, &mExtraParams, &sumOk) < 0) {
451         return AUDIO_HAL_ERR_INTERNAL;
452     }
453     if (count != 0 && sumOk == count) {
454         SetValue(mExtraParams, render);
455         return AUDIO_HAL_SUCCESS;
456     } else {
457         return AUDIO_HAL_ERR_INTERNAL;
458     }
459 }
460 
AudioRenderGetExtraParams(AudioHandle handle,char * keyValueList,int32_t listLenth)461 int32_t AudioRenderGetExtraParams(AudioHandle handle, char *keyValueList, int32_t listLenth)
462 {
463     struct AudioHwRender *render = reinterpret_cast<struct AudioHwRender *>(handle);
464     if (render == NULL || keyValueList == NULL || listLenth <= 0) {
465         return AUDIO_HAL_ERR_INVALID_PARAM;
466     }
467     int32_t bufferSize = strlen(ROUTE_SAMPLE) + strlen(FORMAT_SAMPLE) + strlen(CHANNELS_SAMPLE)
468                     + strlen(FRAME_COUNT_SAMPLE) + strlen(SAMPLING_RATE_SAMPLE) + 1;
469     if (listLenth < bufferSize) {
470         return AUDIO_HAL_ERR_INTERNAL;
471     }
472     int32_t ret = AddElementToList(keyValueList, listLenth, AUDIO_ATTR_PARAM_ROUTE,
473         &render->renderParam.renderMode.hwInfo.pathroute);
474     if (ret < 0) {
475         return AUDIO_HAL_ERR_INTERNAL;
476     }
477     ret = AddElementToList(keyValueList, listLenth, AUDIO_ATTR_PARAM_FORMAT,
478         &render->renderParam.frameRenderMode.attrs.format);
479     if (ret < 0) {
480         return AUDIO_HAL_ERR_INTERNAL;
481     }
482     ret = AddElementToList(keyValueList, listLenth, AUDIO_ATTR_PARAM_CHANNELS,
483         &render->renderParam.frameRenderMode.attrs.channelCount);
484     if (ret < 0) {
485         return AUDIO_HAL_ERR_INTERNAL;
486     }
487     ret = AddElementToList(keyValueList, listLenth, AUDIO_ATTR_PARAM_FRAME_COUNT,
488         &render->renderParam.frameRenderMode.frames);
489     if (ret < 0) {
490         return AUDIO_HAL_ERR_INTERNAL;
491     }
492     ret = AddElementToList(keyValueList, listLenth, AUDIO_ATTR_PARAM_SAMPLING_RATE,
493         &render->renderParam.frameRenderMode.attrs.sampleRate);
494     if (ret < 0) {
495         return AUDIO_HAL_ERR_INTERNAL;
496     }
497     return AUDIO_HAL_SUCCESS;
498 }
499 
AudioRenderReqMmapBuffer(AudioHandle handle,int32_t reqSize,struct AudioMmapBufferDescriptor * desc)500 int32_t AudioRenderReqMmapBuffer(AudioHandle handle, int32_t reqSize, struct AudioMmapBufferDescriptor *desc)
501 {
502     (void)desc;
503     HDF_LOGI("AudioRenderReqMmapBuffer Success!");
504     return AUDIO_HAL_SUCCESS;
505 }
506 
AudioRenderGetMmapPosition(AudioHandle handle,uint64_t * frames,struct AudioTimeStamp * time)507 int32_t AudioRenderGetMmapPosition(AudioHandle handle, uint64_t *frames, struct AudioTimeStamp *time)
508 {
509     struct AudioHwRender *render = reinterpret_cast<struct AudioHwRender *>(handle);
510     if (render == NULL || frames == NULL || time == NULL) {
511         return AUDIO_HAL_ERR_INVALID_PARAM;
512     }
513     *frames = render->renderParam.frameRenderMode.frames;
514     render->renderParam.frameRenderMode.time.tvSec = (int64_t)render->renderParam.frameRenderMode.frames /
515                                        (int64_t)render->renderParam.frameRenderMode.attrs.sampleRate;
516     int64_t lastBufFrames = render->renderParam.frameRenderMode.frames %
517                         ((int64_t)render->renderParam.frameRenderMode.attrs.sampleRate);
518     render->renderParam.frameRenderMode.time.tvNSec =
519         (lastBufFrames * SEC_TO_NSEC) / ((int64_t)render->renderParam.frameRenderMode.attrs.sampleRate);
520     *time = render->renderParam.frameRenderMode.time;
521     return AUDIO_HAL_SUCCESS;
522 }
523 
AudioRenderTurnStandbyMode(AudioHandle handle)524 int32_t AudioRenderTurnStandbyMode(AudioHandle handle)
525 {
526     struct AudioHwRender *render = reinterpret_cast<struct AudioHwRender *>(handle);
527     if (render == NULL) {
528         return AUDIO_HAL_ERR_INVALID_PARAM;
529     }
530     int32_t ret = AudioRenderStop((AudioHandle)render);
531     if (ret < 0) {
532         return AUDIO_HAL_ERR_INTERNAL;
533     }
534     return AUDIO_HAL_SUCCESS;
535 }
536 
AudioRenderAudioDevDump(AudioHandle handle,int32_t range,int32_t fd)537 int32_t AudioRenderAudioDevDump(AudioHandle handle, int32_t range, int32_t fd)
538 {
539     struct AudioHwRender *render = reinterpret_cast<struct AudioHwRender *>(handle);
540     if (render == NULL) {
541         return AUDIO_HAL_ERR_INVALID_PARAM;
542     }
543     dprintf(fd, "%s%d\n", "Number of errors: ", render->errorLog.totalErrors);
544     if (range < RANGE_MIN - 1 || range > RANGE_MAX) {
545         dprintf(fd, "%s\n", "Out of range, invalid output");
546         return AUDIO_HAL_SUCCESS;
547     }
548     uint32_t mSize = render->errorLog.iter;
549     if (range < RANGE_MIN) {
550         dprintf(fd, "%-5s  %-10s  %s\n", "count", "errorCode", "Time");
551         for (uint32_t i = 0; i < mSize; i++) {
552             dprintf(fd, FORMAT_TWO, render->errorLog.errorDump[i].count + 1,
553                     render->errorLog.errorDump[i].errorCode,
554                     render->errorLog.errorDump[i].currentTime);
555         }
556     } else {
557         dprintf(fd, "%-5s  %-10s  %-20s  %-15s  %s\n", "count", "errorCode", "frames", "fail reason", "Time");
558         for (uint32_t i = 0; i < mSize; i++) {
559             dprintf(fd, FORMAT_ONE, render->errorLog.errorDump[i].count + 1,
560                     render->errorLog.errorDump[i].errorCode,
561                     render->errorLog.errorDump[i].frames,
562                     render->errorLog.errorDump[i].reason,
563                     render->errorLog.errorDump[i].currentTime);
564         }
565     }
566     return AUDIO_HAL_SUCCESS;
567 }
CallbackProcessing(AudioHandle handle,AudioCallbackType callBackType)568 int32_t CallbackProcessing(AudioHandle handle, AudioCallbackType callBackType)
569 {
570     struct AudioHwRender *render = reinterpret_cast<struct AudioHwRender *>(handle);
571     if (render == NULL) {
572         HDF_LOGI("Unregistered callback.\n");
573         return HDF_FAILURE;
574     }
575     if (render->renderParam.frameRenderMode.callback == NULL) {
576         return HDF_FAILURE;
577     }
578     bool isCallBack = true;
579     switch (callBackType) {
580         case AUDIO_NONBLOCK_WRITE_COMPLETED:
581         case AUDIO_DRAIN_COMPLETED:
582         case AUDIO_FLUSH_COMPLETED:
583         case AUDIO_RENDER_FULL:
584         case AUDIO_ERROR_OCCUR:
585             isCallBack = true;
586             break;
587         default:
588             isCallBack = false;
589             break;
590     }
591     if (!isCallBack) {
592         HDF_LOGI("No callback processing is required.\n");
593         return HDF_ERR_NOT_SUPPORT;
594     }
595     render->renderParam.frameRenderMode.callback(callBackType, NULL, render->renderParam.frameRenderMode.cookie);
596     return HDF_SUCCESS;
597 }
598 
AudioRenderRegCallback(struct AudioRender * render,RenderCallback callback,void * cookie)599 int32_t AudioRenderRegCallback(struct AudioRender *render, RenderCallback callback, void *cookie)
600 {
601     struct AudioHwRender *pRender = reinterpret_cast<struct AudioHwRender *>(render);
602     if (pRender == NULL) {
603         return AUDIO_HAL_ERR_INVALID_PARAM;
604     }
605     pRender->renderParam.frameRenderMode.callback = callback;
606     pRender->renderParam.frameRenderMode.cookie = cookie;
607     return AUDIO_HAL_SUCCESS;
608 }
609 
AudioRenderDrainBuffer(struct AudioRender * render,AudioDrainNotifyType * type)610 int32_t AudioRenderDrainBuffer(struct AudioRender *render, AudioDrainNotifyType *type)
611 {
612     struct AudioHwRender *pRender = reinterpret_cast<struct AudioHwRender *>(render);
613     if (pRender == NULL || type == NULL) {
614         return AUDIO_HAL_ERR_INVALID_PARAM;
615     }
616     return AUDIO_HAL_ERR_NOT_SUPPORT;
617 }
618 }