1 /*
2 * Copyright (c) 2025 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
21 namespace OHOS::HDI::Audio_Bluetooth {
22
HearingAidStart(AudioHandle handle)23 int32_t HearingAidStart(AudioHandle handle)
24 {
25 HDF_LOGI("%{public}s enter", __func__);
26 #ifdef A2DP_HDI_SERVICE
27 auto *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
28 if (hwRender == nullptr) {
29 return AUDIO_HAL_ERR_INVALID_PARAM;
30 }
31 if (hwRender->renderParam.frameRenderMode.buffer != nullptr) {
32 HDF_LOGE("AudioRender already start!");
33 return AUDIO_HAL_ERR_AO_BUSY; // render is busy now
34 }
35 if (OHOS::Bluetooth::StartHearingAid() != HDF_SUCCESS) {
36 return AUDIO_HAL_ERR_INTERNAL;
37 }
38 char *buffer = static_cast<char *>(calloc(1, FRAME_DATA));
39 if (buffer == nullptr) {
40 HDF_LOGE("Calloc Render buffer Fail!");
41 return AUDIO_HAL_ERR_MALLOC_FAIL;
42 }
43 hwRender->renderParam.frameRenderMode.buffer = buffer;
44 return AUDIO_HAL_SUCCESS;
45 #endif
46 return AUDIO_HAL_ERR_NOT_SUPPORT;
47 }
48
HearingAidStop(AudioHandle handle)49 int32_t HearingAidStop(AudioHandle handle)
50 {
51 HDF_LOGI("%{public}s enter", __func__);
52 #ifdef A2DP_HDI_SERVICE
53 auto *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
54 if (hwRender == nullptr) {
55 return AUDIO_HAL_ERR_INVALID_PARAM;
56 }
57 if (hwRender->renderParam.frameRenderMode.buffer != nullptr) {
58 AudioMemFree(reinterpret_cast<void **>(&hwRender->renderParam.frameRenderMode.buffer));
59 } else {
60 HDF_LOGE("Repeat invalid stop operation!");
61 return AUDIO_HAL_ERR_NOT_SUPPORT;
62 }
63 OHOS::Bluetooth::StopHearingAid();
64 hwRender->renderParam.renderMode.ctlParam.pause = false;
65 return AUDIO_HAL_SUCCESS;
66 #endif
67 return AUDIO_HAL_ERR_NOT_SUPPORT;
68 }
69
HearingAidPause(AudioHandle handle)70 int32_t HearingAidPause(AudioHandle handle)
71 {
72 HDF_LOGI("%{public}s enter", __func__);
73 #ifdef A2DP_HDI_SERVICE
74 auto *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
75 if (hwRender == nullptr) {
76 return AUDIO_HAL_ERR_INVALID_PARAM;
77 }
78 if (hwRender->renderParam.frameRenderMode.buffer == nullptr) {
79 HDF_LOGE("AudioRender already stop!");
80 return AUDIO_HAL_ERR_INTERNAL;
81 }
82 if (hwRender->renderParam.renderMode.ctlParam.pause) {
83 HDF_LOGE("Audio is already pause!");
84 return AUDIO_HAL_ERR_NOT_SUPPORT;
85 }
86 OHOS::Bluetooth::StopHearingAid();
87 hwRender->renderParam.renderMode.ctlParam.pause = true;
88 return AUDIO_HAL_SUCCESS;
89 #endif
90 return AUDIO_HAL_ERR_NOT_SUPPORT;
91 }
92
HearingAidResume(AudioHandle handle)93 int32_t HearingAidResume(AudioHandle handle)
94 {
95 HDF_LOGI("%{public}s enter", __func__);
96 #ifdef A2DP_HDI_SERVICE
97 auto *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
98 if (hwRender == nullptr) {
99 return AUDIO_HAL_ERR_INVALID_PARAM;
100 }
101 if (!hwRender->renderParam.renderMode.ctlParam.pause) {
102 HDF_LOGE("Audio is already Resume!");
103 return AUDIO_HAL_ERR_NOT_SUPPORT;
104 }
105 OHOS::Bluetooth::StartHearingAid();
106 hwRender->renderParam.renderMode.ctlParam.pause = false;
107 return AUDIO_HAL_SUCCESS;
108 #endif
109 return AUDIO_HAL_ERR_NOT_SUPPORT;
110 }
111
HearingAidFlush(AudioHandle handle)112 int32_t HearingAidFlush(AudioHandle handle)
113 {
114 HDF_LOGI("%{public}s enter", __func__);
115 auto *hwRender = reinterpret_cast<struct AudioHwRender *>(handle);
116 if (hwRender == nullptr) {
117 return AUDIO_HAL_ERR_INVALID_PARAM;
118 }
119 return AUDIO_HAL_ERR_NOT_SUPPORT;
120 }
121
HearingAidGetFrameSize(AudioHandle handle,uint64_t * size)122 int32_t HearingAidGetFrameSize(AudioHandle handle, uint64_t *size)
123 {
124 (void)handle;
125 (void)size;
126 return AUDIO_HAL_ERR_NOT_SUPPORT;
127 }
128
HearingAidGetFrameCount(AudioHandle handle,uint64_t * count)129 int32_t HearingAidGetFrameCount(AudioHandle handle, uint64_t *count)
130 {
131 (void)handle;
132 (void)count;
133 return AUDIO_HAL_ERR_NOT_SUPPORT;
134 }
135
HearingAidSetSampleAttributes(AudioHandle handle,const struct AudioSampleAttributes * attrs)136 int32_t HearingAidSetSampleAttributes(AudioHandle handle, const struct AudioSampleAttributes *attrs)
137 {
138 (void)handle;
139 (void)attrs;
140 return AUDIO_HAL_ERR_NOT_SUPPORT;
141 }
142
HearingAidGetSampleAttributes(AudioHandle handle,struct AudioSampleAttributes * attrs)143 int32_t HearingAidGetSampleAttributes(AudioHandle handle, struct AudioSampleAttributes *attrs)
144 {
145 (void)handle;
146 (void)attrs;
147 return AUDIO_HAL_ERR_NOT_SUPPORT;
148 }
149
HearingAidGetCurrentChannelId(AudioHandle handle,uint32_t * channelId)150 int32_t HearingAidGetCurrentChannelId(AudioHandle handle, uint32_t *channelId)
151 {
152 (void)handle;
153 (void)channelId;
154 return AUDIO_HAL_ERR_NOT_SUPPORT;
155 }
156
HearingAidCheckSceneCapability(AudioHandle handle,const struct AudioSceneDescriptor * scene,bool * supported)157 int32_t HearingAidCheckSceneCapability(AudioHandle handle, const struct AudioSceneDescriptor *scene, bool *supported)
158 {
159 (void)handle;
160 (void)scene;
161 (void)supported;
162 return AUDIO_HAL_ERR_NOT_SUPPORT;
163 }
164
HearingAidSelectScene(AudioHandle handle,const struct AudioSceneDescriptor * scene)165 int32_t HearingAidSelectScene(AudioHandle handle, const struct AudioSceneDescriptor *scene)
166 {
167 (void)handle;
168 (void)scene;
169 return AUDIO_HAL_ERR_NOT_SUPPORT;
170 }
171
HearingAidSetMute(AudioHandle handle,bool mute)172 int32_t HearingAidSetMute(AudioHandle handle, bool mute)
173 {
174 (void)handle;
175 (void)mute;
176 return AUDIO_HAL_ERR_NOT_SUPPORT;
177 }
178
HearingAidGetMute(AudioHandle handle,bool * mute)179 int32_t HearingAidGetMute(AudioHandle handle, bool *mute)
180 {
181 (void)handle;
182 (void)mute;
183 return AUDIO_HAL_ERR_NOT_SUPPORT;
184 }
185
HearingAidSetVolume(AudioHandle handle,float volume)186 int32_t HearingAidSetVolume(AudioHandle handle, float volume)
187 {
188 (void)handle;
189 (void)volume;
190 return AUDIO_HAL_ERR_NOT_SUPPORT;
191 }
192
HearingAidGetVolume(AudioHandle handle,float * volume)193 int32_t HearingAidGetVolume(AudioHandle handle, float *volume)
194 {
195 (void)handle;
196 (void)volume;
197 return AUDIO_HAL_ERR_NOT_SUPPORT;
198 }
199
HearingAidGetGainThreshold(AudioHandle handle,float * min,float * max)200 int32_t HearingAidGetGainThreshold(AudioHandle handle, float *min, float *max)
201 {
202 (void)handle;
203 (void)min;
204 (void)max;
205 return AUDIO_HAL_ERR_NOT_SUPPORT;
206 }
207
HearingAidGetGain(AudioHandle handle,float * gain)208 int32_t HearingAidGetGain(AudioHandle handle, float *gain)
209 {
210 (void)handle;
211 (void)gain;
212 return AUDIO_HAL_ERR_NOT_SUPPORT;
213 }
214
HearingAidSetGain(AudioHandle handle,float gain)215 int32_t HearingAidSetGain(AudioHandle handle, float gain)
216 {
217 (void)handle;
218 (void)gain;
219 return AUDIO_HAL_ERR_NOT_SUPPORT;
220 }
221
HearingAidGetLatency(struct AudioRender * render,uint32_t * ms)222 int32_t HearingAidGetLatency(struct AudioRender *render, uint32_t *ms)
223 {
224 (void)render;
225 (void)ms;
226 return AUDIO_HAL_ERR_NOT_SUPPORT;
227 }
228
HearingAidRenderFrame(struct AudioRender * render,const void * frame,uint64_t requestBytes,uint64_t * replyBytes)229 int32_t HearingAidRenderFrame(struct AudioRender *render, const void *frame,
230 uint64_t requestBytes, uint64_t *replyBytes)
231 {
232 HDF_LOGI("%{public}s enter", __func__);
233 auto *hwRender = reinterpret_cast<struct AudioHwRender *>(render);
234 if (hwRender == nullptr || frame == nullptr || replyBytes == nullptr ||
235 hwRender->renderParam.frameRenderMode.buffer == nullptr) {
236 HDF_LOGE("Hearing aid Frame Paras is nullptr!");
237 return AUDIO_HAL_ERR_INVALID_PARAM;
238 }
239 if (FRAME_DATA < requestBytes) {
240 HDF_LOGE("Out of FRAME_DATA size!");
241 return AUDIO_HAL_ERR_INTERNAL;
242 }
243 int32_t ret = memcpy_s(hwRender->renderParam.frameRenderMode.buffer, FRAME_DATA, frame, (uint32_t)requestBytes);
244 if (ret != EOK) {
245 HDF_LOGE("memcpy_s fail");
246 return AUDIO_HAL_ERR_INTERNAL;
247 }
248 hwRender->renderParam.frameRenderMode.bufferSize = requestBytes;
249 uint32_t frameCount = 0;
250 ret = PcmBytesToFrames(&hwRender->renderParam.frameRenderMode, requestBytes, &frameCount);
251 if (ret != AUDIO_HAL_SUCCESS) {
252 return ret;
253 }
254 *replyBytes = requestBytes;
255 hwRender->renderParam.frameRenderMode.frames += hwRender->renderParam.frameRenderMode.bufferFrameSize;
256 if (hwRender->renderParam.frameRenderMode.attrs.sampleRate == 0) {
257 HDF_LOGE("Divisor cannot be zero!");
258 return AUDIO_HAL_ERR_INTERNAL;
259 }
260 if (TimeToAudioTimeStamp(hwRender->renderParam.frameRenderMode.bufferFrameSize,
261 &hwRender->renderParam.frameRenderMode.time,
262 hwRender->renderParam.frameRenderMode.attrs.sampleRate) == HDF_FAILURE) {
263 HDF_LOGE("Frame is nullptr");
264 return AUDIO_HAL_ERR_INTERNAL;
265 }
266 LOGV("%s, WriteFrame", __func__);
267 const uint8_t *data = reinterpret_cast<const uint8_t *>(frame);
268 AudioSampleAttributes *attrs = &hwRender->renderParam.frameRenderMode.attrs;
269 return OHOS::Bluetooth::WriteFrameHearingAid(data, static_cast<uint32_t>(requestBytes), attrs);
270 }
271
HearingAidGetRenderPosition(struct AudioRender * render,uint64_t * frames,struct AudioTimeStamp * time)272 int32_t HearingAidGetRenderPosition(struct AudioRender *render, uint64_t *frames, struct AudioTimeStamp *time)
273 {
274 (void)render;
275 (void)frames;
276 (void)time;
277 return AUDIO_HAL_ERR_NOT_SUPPORT;
278 }
279
HearingAidSetRenderSpeed(struct AudioRender * render,float speed)280 int32_t HearingAidSetRenderSpeed(struct AudioRender *render, float speed)
281 {
282 (void)render;
283 (void)speed;
284 return AUDIO_HAL_ERR_NOT_SUPPORT;
285 }
286
HearingAidGetRenderSpeed(struct AudioRender * render,float * speed)287 int32_t HearingAidGetRenderSpeed(struct AudioRender *render, float *speed)
288 {
289 (void)render;
290 (void)speed;
291 return AUDIO_HAL_ERR_NOT_SUPPORT;
292 }
293
HearingAidSetChannelMode(struct AudioRender * render,AudioChannelMode mode)294 int32_t HearingAidSetChannelMode(struct AudioRender *render, AudioChannelMode mode)
295 {
296 (void)render;
297 (void)mode;
298 return AUDIO_HAL_ERR_NOT_SUPPORT;
299 }
300
HearingAidGetChannelMode(struct AudioRender * render,AudioChannelMode * mode)301 int32_t HearingAidGetChannelMode(struct AudioRender *render, AudioChannelMode *mode)
302 {
303 (void)render;
304 (void)mode;
305 return AUDIO_HAL_ERR_NOT_SUPPORT;
306 }
307
HearingAidSetExtraParams(AudioHandle handle,const char * keyValueList)308 int32_t HearingAidSetExtraParams(AudioHandle handle, const char *keyValueList)
309 {
310 (void)handle;
311 (void)keyValueList;
312 return AUDIO_HAL_ERR_NOT_SUPPORT;
313 }
314
HearingAidGetExtraParams(AudioHandle handle,char * keyValueList,int32_t listLength)315 int32_t HearingAidGetExtraParams(AudioHandle handle, char *keyValueList, int32_t listLength)
316 {
317 (void)handle;
318 (void)keyValueList;
319 (void)listLength;
320 return AUDIO_HAL_ERR_NOT_SUPPORT;
321 }
322
HearingAidReqMmapBuffer(AudioHandle handle,int32_t reqSize,struct AudioMmapBufferDescriptor * desc)323 int32_t HearingAidReqMmapBuffer(AudioHandle handle, int32_t reqSize, struct AudioMmapBufferDescriptor *desc)
324 {
325 (void)handle;
326 (void)reqSize;
327 (void)desc;
328 return AUDIO_HAL_ERR_NOT_SUPPORT;
329 }
330
HearingAidGetMmapPosition(AudioHandle handle,uint64_t * frames,struct AudioTimeStamp * time)331 int32_t HearingAidGetMmapPosition(AudioHandle handle, uint64_t *frames, struct AudioTimeStamp *time)
332 {
333 (void)handle;
334 (void)frames;
335 (void)time;
336 return AUDIO_HAL_ERR_NOT_SUPPORT;
337 }
338
HearingAidTurnStandbyMode(AudioHandle handle)339 int32_t HearingAidTurnStandbyMode(AudioHandle handle)
340 {
341 (void)handle;
342 return AUDIO_HAL_ERR_NOT_SUPPORT;
343 }
344
HearingAidAudioDevDump(AudioHandle handle,int32_t range,int32_t fd)345 int32_t HearingAidAudioDevDump(AudioHandle handle, int32_t range, int32_t fd)
346 {
347 (void)handle;
348 (void)range;
349 (void)fd;
350 return AUDIO_HAL_ERR_NOT_SUPPORT;
351 }
352
HearingAidRegCallback(struct AudioRender * render,RenderCallback callback,void * cookie)353 int32_t HearingAidRegCallback(struct AudioRender *render, RenderCallback callback, void *cookie)
354 {
355 (void)render;
356 (void)callback;
357 (void)cookie;
358 return AUDIO_HAL_ERR_NOT_SUPPORT;
359 }
360
HearingAidDrainBuffer(struct AudioRender * render,AudioDrainNotifyType * type)361 int32_t HearingAidDrainBuffer(struct AudioRender *render, AudioDrainNotifyType *type)
362 {
363 (void)render;
364 (void)type;
365 return AUDIO_HAL_ERR_NOT_SUPPORT;
366 }
367 } // namespace OHOS::HDI::Audio_Bluetooth