1 /*
2  * Copyright (c) 2024 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 "fast_audio_render.h"
17 #include "audio_adapter_info_common.h"
18 #include "audio_bluetooth_manager.h"
19 #include "audio_internal.h"
20 #include "hdf_log.h"
21 #include <string>
22 
23 namespace OHOS::HDI::Audio_Bluetooth {
24 #ifdef A2DP_HDI_SERVICE
25 const uint32_t MIN_TIME_INTERVAL = 30;
26 const uint32_t MAX_TIME_INTERVAL = 80;
27 const int32_t MAX_ASHMEM_LEN = 100000;
28 const int32_t MIN_ASHMEM_LEN = 10;
29 const int32_t RENDER_TIME_INTERVAL = 5;
30 const int32_t PER_MS_SECOND = 1000;
31 
CalculateSampleNum(uint32_t sampleRate,uint32_t timeMs)32 static int32_t CalculateSampleNum(uint32_t sampleRate, uint32_t timeMs)
33 {
34     return (sampleRate * timeMs) / PER_MS_SECOND;
35 }
36 #endif
37 
FastRenderStart(AudioHandle handle)38 int32_t FastRenderStart(AudioHandle handle)
39 {
40     HDF_LOGI("%{public}s enter", __func__);
41 #ifdef A2DP_HDI_SERVICE
42     AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender>(handle);
43     if (hwRender == nullptr) {
44         return AUDIO_HAL_ERR_INVALID_PARAM;
45     }
46     AudioSampleAttributes *attr = &hwRender->RenderParam.frameRenderMode.attrs;
47     uint32_t format = static_cast<uint32_t>(attrs->format);
48     return OHOS::Bluetooth::FastStartPlaying(attrs->sampleRate, attrs->channelCount, format);
49 #endif
50     return AUDIO_HAL_ERR_NOT_SUPPORT;
51 }
52 
FastRenderStop(AudioHandle handle)53 int32_t FastRenderStop(AudioHandle handle)
54 {
55     HDF_LOGI("%{public}s enter", __func__);
56     (void)handle;
57 #ifdef A2DP_HDI_SERVICE
58     return OHOS::Bluetooth::FastStopPlaying();
59 #endif
60     return AUDIO_HAL_ERR_NOT_SUPPORT;
61 }
62 
FastRenderPause(AudioHandle handle)63 int32_t FastRenderPause(AudioHandle handle)
64 {
65     HDF_LOGI("%{public}s enter", __func__);
66     (void)handle;
67 #ifdef A2DP_HDI_SERVICE
68     return OHOS::Bluetooth::FastSuspendPlaying();
69 #endif
70     return AUDIO_HAL_ERR_NOT_SUPPORT;
71 }
72 
FastRenderResume(AudioHandle handle)73 int32_t FastRenderResume(AudioHandle handle)
74 {
75     HDF_LOGI("%{public}s enter", __func__);
76 #ifdef A2DP_HDI_SERVICE
77     AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender>(handle);
78     if (hwRender == nullptr) {
79         return AUDIO_HAL_ERR_INVALID_PARAM;
80     }
81     AudioSampleAttributes *attr = &hwRender->RenderParam.frameRenderMode.attrs;
82     uint32_t format = static_cast<uint32_t>(attrs->format);
83     return OHOS::Bluetooth::FastStartPlaying(attrs->sampleRate, attrs->channelCount, format);
84 #endif
85     return AUDIO_HAL_ERR_NOT_SUPPORT;
86 }
87 
FastRenderFlush(AudioHandle handle)88 int32_t FastRenderFlush(AudioHandle handle)
89 {
90     HDF_LOGI("%{public}s enter", __func__);
91     (void)handle;
92     return AUDIO_HAL_ERR_NOT_SUPPORT;
93 }
94 
FastRenderGetFrameSize(AudioHandle handle,uint64_t * size)95 int32_t FastRenderGetFrameSize(AudioHandle handle, uint64_t *size)
96 {
97     HDF_LOGI("%{public}s enter", __func__);
98     (void)handle;
99     (void)size;
100     return AUDIO_HAL_ERR_NOT_SUPPORT;
101 }
102 
FastRenderGetFrameCount(AudioHandle handle,uint64_t * count)103 int32_t FastRenderGetFrameCount(AudioHandle handle, uint64_t *count)
104 {
105     HDF_LOGI("%{public}s enter", __func__);
106     (void)handle;
107     (void)count;
108     return AUDIO_HAL_ERR_NOT_SUPPORT;
109 }
110 
FastRenderSetSampleAttributes(AudioHandle handle,const struct AudioSampleAttributes * attrs)111 int32_t FastRenderSetSampleAttributes(AudioHandle handle, const struct AudioSampleAttributes *attrs)
112 {
113     HDF_LOGI("%{public}s enter", __func__);
114     (void)handle;
115     (void)attrs;
116     return AUDIO_HAL_ERR_NOT_SUPPORT;
117 }
118 
FastRenderGetSampleAttributes(AudioHandle handle,struct AudioSampleAttributes * attrs)119 int32_t FastRenderGetSampleAttributes(AudioHandle handle, struct AudioSampleAttributes *attrs)
120 {
121     HDF_LOGI("%{public}s enter", __func__);
122     (void)handle;
123     (void)attrs;
124     return AUDIO_HAL_ERR_NOT_SUPPORT;
125 }
126 
FastRenderGetCurrentChannelId(AudioHandle handle,uint32_t * channelId)127 int32_t FastRenderGetCurrentChannelId(AudioHandle handle, uint32_t *channelId)
128 {
129     HDF_LOGI("%{public}s enter", __func__);
130     (void)handle;
131     (void)channelId;
132     return AUDIO_HAL_ERR_NOT_SUPPORT;
133 }
134 
FastRenderCheckSceneCapability(AudioHandle handle,const struct AudioSceneDescriptor * scene,bool * supported)135 int32_t FastRenderCheckSceneCapability(AudioHandle handle, const struct AudioSceneDescriptor *scene, bool *supported)
136 {
137     HDF_LOGI("%{public}s enter", __func__);
138     (void)handle;
139     (void)scene;
140     (void)supported;
141     return AUDIO_HAL_ERR_NOT_SUPPORT;
142 }
143 
FastRenderSelectScene(AudioHandle handle,const struct AudioSceneDescriptor * scene)144 int32_t FastRenderSelectScene(AudioHandle handle, const struct AudioSceneDescriptor *scene)
145 {
146     HDF_LOGI("%{public}s enter", __func__);
147     (void)handle;
148     (void)scene;
149     return AUDIO_HAL_ERR_NOT_SUPPORT;
150 }
151 
FastRenderSetMute(AudioHandle handle,bool mute)152 int32_t FastRenderSetMute(AudioHandle handle, bool mute)
153 {
154     HDF_LOGI("%{public}s enter", __func__);
155     (void)handle;
156     (void)mute;
157     return AUDIO_HAL_ERR_NOT_SUPPORT;
158 }
159 
FastRenderGetMute(AudioHandle handle,bool * mute)160 int32_t FastRenderGetMute(AudioHandle handle, bool *mute)
161 {
162     HDF_LOGI("%{public}s enter", __func__);
163     (void)handle;
164     (void)mute;
165     return AUDIO_HAL_ERR_NOT_SUPPORT;
166 }
167 
FastRenderSetVolume(AudioHandle handle,float volume)168 int32_t FastRenderSetVolume(AudioHandle handle, float volume)
169 {
170     HDF_LOGI("%{public}s enter", __func__);
171     (void)handle;
172     (void)volume;
173     return AUDIO_HAL_ERR_NOT_SUPPORT;
174 }
175 
FastRenderGetVolume(AudioHandle handle,float * volume)176 int32_t FastRenderGetVolume(AudioHandle handle, float *volume)
177 {
178     HDF_LOGI("%{public}s enter", __func__);
179     (void)handle;
180     (void)volume;
181     return AUDIO_HAL_ERR_NOT_SUPPORT;
182 }
183 
FastRenderGetGainThreshold(AudioHandle handle,float * min,float * max)184 int32_t FastRenderGetGainThreshold(AudioHandle handle, float *min, float *max)
185 {
186     HDF_LOGI("%{public}s enter", __func__);
187     (void)handle;
188     (void)min;
189     (void)max;
190     return AUDIO_HAL_ERR_NOT_SUPPORT;
191 }
192 
FastRenderGetGain(AudioHandle handle,float * gain)193 int32_t FastRenderGetGain(AudioHandle handle, float *gain)
194 {
195     HDF_LOGI("%{public}s enter", __func__);
196     (void)handle;
197     (void)gain;
198     return AUDIO_HAL_ERR_NOT_SUPPORT;
199 }
200 
FastRenderSetGain(AudioHandle handle,float gain)201 int32_t FastRenderSetGain(AudioHandle handle, float gain)
202 {
203     HDF_LOGI("%{public}s enter", __func__);
204     (void)handle;
205     (void)gain;
206     return AUDIO_HAL_ERR_NOT_SUPPORT;
207 }
208 
FastRenderGetLatency(struct AudioRender * render,uint32_t * ms)209 int32_t FastRenderGetLatency(struct AudioRender *render, uint32_t *ms)
210 {
211     HDF_LOGI("%{public}s enter", __func__);
212     (void)render;
213     (void)ms;
214 #ifdef A2DP_HDI_SERVICE
215     uint32_t latency = 0;
216     OHOS::Bluetooth::FastGetLatency(latency);
217     *ms = latency;
218     return AUDIO_HAL_SUCCESS;
219 #endif
220     return AUDIO_HAL_ERR_NOT_SUPPORT;
221 }
222 
FastRenderRenderFrame(struct AudioRender * render,const void * frame,uint64_t requestBytes,uint64_t * replyBytes)223 int32_t FastRenderRenderFrame(
224     struct AudioRender *render, const void *frame, uint64_t requestBytes, uint64_t *replyBytes)
225 {
226     HDF_LOGI("%{public}s enter", __func__);
227     (void)render;
228     (void)frame;
229     (void)requestBytes;
230     (void)replyBytes;
231     return AUDIO_HAL_ERR_NOT_SUPPORT;
232 }
233 
FastRenderGetRenderPosition(struct AudioRender * render,uint64_t * frames,struct AudioTimeStamp * time)234 int32_t FastRenderGetRenderPosition(struct AudioRender *render, uint64_t *frames, struct AudioTimeStamp *time)
235 {
236     HDF_LOGI("%{public}s enter", __func__);
237     (void)render;
238     (void)frames;
239     (void)time;
240     return AUDIO_HAL_ERR_NOT_SUPPORT;
241 }
242 
FastRenderSetRenderSpeed(struct AudioRender * render,float speed)243 int32_t FastRenderSetRenderSpeed(struct AudioRender *render, float speed)
244 {
245     HDF_LOGI("%{public}s enter", __func__);
246     (void)render;
247     (void)speed;
248     return AUDIO_HAL_ERR_NOT_SUPPORT;
249 }
250 
FastRenderGetRenderSpeed(struct AudioRender * render,float * speed)251 int32_t FastRenderGetRenderSpeed(struct AudioRender *render, float *speed)
252 {
253     HDF_LOGI("%{public}s enter", __func__);
254     (void)render;
255     (void)speed;
256     return AUDIO_HAL_ERR_NOT_SUPPORT;
257 }
258 
FastRenderSetChannelMode(struct AudioRender * render,AudioChannelMode mode)259 int32_t FastRenderSetChannelMode(struct AudioRender *render, AudioChannelMode mode)
260 {
261     HDF_LOGI("%{public}s enter", __func__);
262     (void)render;
263     (void)mode;
264     return AUDIO_HAL_ERR_NOT_SUPPORT;
265 }
266 
FastRenderGetChannelMode(struct AudioRender * render,AudioChannelMode * mode)267 int32_t FastRenderGetChannelMode(struct AudioRender *render, AudioChannelMode *mode)
268 {
269     HDF_LOGI("%{public}s enter", __func__);
270     (void)render;
271     (void)mode;
272     return AUDIO_HAL_ERR_NOT_SUPPORT;
273 }
274 
FastRenderSetExtraParams(AudioHandle handle,const char * keyValueList)275 int32_t FastRenderSetExtraParams(AudioHandle handle, const char *keyValueList)
276 {
277     HDF_LOGI("%{public}s enter", __func__);
278     struct AudioHwRender *render = reinterpret_cast<struct AudioHwRender *>(handle);
279     if (render == nullptr || keyValueList == nullptr) {
280         return AUDIO_HAL_ERR_INVALID_PARAM;
281     }
282     int32_t count = 0;
283     int32_t sumOk = 0;
284     struct ExtraParams mExtraParams;
285     if (AudioSetExtraParams(keyValueList, &count, &mExtraParams, &sumOk) < 0) {
286         return AUDIO_HAL_ERR_INTERNAL;
287     }
288     if (count != 0 && sumOk == count) {
289 #ifdef A2DP_HDI_SERVICE
290         if (mExtraParams.audioStreamCtl == 1) {
291             HDF_LOGI("SetValue, try to fastSuspendPlaying=1");
292             OHOS::Bluetooth::FastSuspendPlayingFromParam();
293         } else if (mExtraParams.audioStreamCtl == 0) {
294             HDF_LOGI("SetValue, try to fastSuspendPlaying=0");
295             OHOS::Bluetooth::UnBlockStart();
296         }
297 #endif
298         return AUDIO_HAL_SUCCESS;
299     } else {
300         return AUDIO_HAL_ERR_INTERNAL;
301     }
302 }
303 
FastRenderGetExtraParams(AudioHandle handle,char * keyValueList,int32_t listLength)304 int32_t FastRenderGetExtraParams(AudioHandle handle, char *keyValueList, int32_t listLength)
305 {
306     HDF_LOGI("%{public}s enter", __func__);
307     (void)handle;
308     (void)keyValueList;
309     (void)listLength;
310     return AUDIO_HAL_ERR_NOT_SUPPORT;
311 }
312 
FastRenderReqMmapBuffer(AudioHandle handle,int32_t reqSize,struct AudioMmapBufferDescriptor * desc)313 int32_t FastRenderReqMmapBuffer(AudioHandle handle, int32_t reqSize, struct AudioMmapBufferDescriptor *desc)
314 {
315     HDF_LOGI("%{public}s enter", __func__);
316 #ifdef A2DP_HDI_SERVICE
317     AudioHwRender *render = reinterpret_cast<AudioHwRender *>(handle);
318     if (render == nullptr) {
319         return AUDIO_HAL_ERR_INVALID_PARAM;
320     }
321     AudioSampleAttributes attr = render->renderParam.frameRenderMode.attrs;
322 
323     int32_t minSize = CalculateSampleNum(attr.sampleRate, MIN_TIME_INTERVAL);
324     int32_t maxSize = CalculateSampleNum(attr.sampleRate, MAX_TIME_INTERVAL);
325     int32_t realSize = reqSize;
326     if (reqSize < minSize) {
327         realSize = minSize;
328     } else if (reqSize > maxSize) {
329         realSize = maxSize;
330     }
331     int32_t ashmemLength = realSize * static_cast<int32_t>(attr.channelCount) * attr.format;
332     if (ashmemLength < MIN_ASHMEM_LEN || ashmemLength > MAX_ASHMEM_LEN) {
333         HDF_LOGE("reqMmapBuffer failed, length is illegal %{public}d", ashmemLength);
334         return AUDIO_HAL_ERR_INVALID_PARAM;
335     }
336     int32_t fd = OHOS::Bluetooth::FastReqMmapBuffer(ashmemLength);
337     if (fd < 0) {
338         HDF_LOGE("reqMmapBuffer failed");
339         return HDF_FAILURE;
340     }
341     desc->memoryFd = fd;
342     desc->transferFrameSize = static_cast<int32_t>(CalculateSampleNum(attr.sampleRate, RENDER_TIME_INTERVAL));
343     desc->totalBufferFrames = realSize;
344     desc->isShareable = false;
345     HDF_LOGI("%{public}s, fd=%{public}d, length=%{public}d, transferFrameSize=%{public}d, totalBufferFrames=%{public}d",
346         __func__, desc->memoryFd, desc->transferFrameSize, desc->totalBufferFrames);
347 #endif
348     return AUDIO_HAL_ERR_NOT_SUPPORT;
349 }
350 
FastRenderGetMmapPosition(AudioHandle handle,uint64_t * frames,struct AudioTimeStamp * time)351 int32_t FastRenderGetMmapPosition(AudioHandle handle, uint64_t *frames, struct AudioTimeStamp *time)
352 {
353     HDF_LOGI("%{public}s enter", __func__);
354     (void)handle;
355 #ifdef A2DP_HDI_SERVICE
356     int64_t sec = 0;
357     int64_t nSec = 0;
358     uint64_t readFrames = 0;
359     OHOS::Bluetooth::FastReadMmapPosition(sec, nSec, readFrames);
360     *frames = readFrames;
361     time->tvSec = sec;
362     time->tvNSec = nSec;
363     return AUDIO_HAL_ERR_NOT_SUPPORT;
364 #endif
365     return AUDIO_HAL_ERR_NOT_SUPPORT;
366 }
367 
FastRenderTurnStandbyMode(AudioHandle handle)368 int32_t FastRenderTurnStandbyMode(AudioHandle handle)
369 {
370     HDF_LOGI("%{public}s enter", __func__);
371     (void)handle;
372     return AUDIO_HAL_ERR_NOT_SUPPORT;
373 }
374 
FastRenderAudioDevDump(AudioHandle handle,int32_t range,int32_t fd)375 int32_t FastRenderAudioDevDump(AudioHandle handle, int32_t range, int32_t fd)
376 {
377     HDF_LOGI("%{public}s enter", __func__);
378     (void)handle;
379     (void)range;
380     (void)fd;
381     return AUDIO_HAL_ERR_NOT_SUPPORT;
382 }
383 
FastRenderRegCallback(struct AudioRender * render,RenderCallback callback,void * cookie)384 int32_t FastRenderRegCallback(struct AudioRender *render, RenderCallback callback, void *cookie)
385 {
386     HDF_LOGI("%{public}s enter", __func__);
387     (void)render;
388     (void)callback;
389     (void)cookie;
390     return AUDIO_HAL_ERR_NOT_SUPPORT;
391 }
392 
FastRenderDrainBuffer(struct AudioRender * render,AudioDrainNotifyType * type)393 int32_t FastRenderDrainBuffer(struct AudioRender *render, AudioDrainNotifyType *type)
394 {
395     HDF_LOGI("%{public}s enter", __func__);
396     (void)render;
397     (void)type;
398     return AUDIO_HAL_ERR_NOT_SUPPORT;
399 }
400 } // namespace OHOS::HDI::Audio_Bluetooth