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