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