• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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