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