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