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 }