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 }