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_adapter.h"
19 #include "fast_audio_render.h"
20 namespace OHOS::HDI::Audio_Bluetooth {
21 constexpr int CONFIG_CHANNEL_COUNT = 2; // two channels
22 constexpr float GAIN_MAX = 50.0;
23
24 constexpr int DEFAULT_RENDER_SAMPLING_RATE = 48000;
25 constexpr int DEEP_BUFFER_RENDER_PERIOD_SIZE = 4096;
26 constexpr int DEEP_BUFFER_RENDER_PERIOD_COUNT = 8;
27 constexpr const char *TYPE_RENDER = "Render";
28 constexpr const char *TYPE_CAPTURE = "Capture";
29 constexpr const int SHIFT_RIGHT_31_BITS = 31;
30
GetFastRenderFuncs(struct AudioHwRender * hwRender)31 static void GetFastRenderFuncs(struct AudioHwRender *hwRender)
32 {
33 hwRender->common.control.Start = FastRenderStart;
34 hwRender->common.control.Stop = FastRenderStop;
35 hwRender->common.control.Pause = FastRenderPause;
36 hwRender->common.control.Resume = FastRenderResume;
37 hwRender->common.control.Flush = FastRenderFlush;
38 hwRender->common.control.TurnStandbyMode = FastRenderTurnStandbyMode;
39 hwRender->common.control.AudioDevDump = FastRenderAudioDevDump;
40 hwRender->common.attr.GetFrameSize = FastRenderGetFrameSize;
41 hwRender->common.attr.GetFrameCount = FastRenderGetFrameCount;
42 hwRender->common.attr.SetSampleAttributes = FastRenderSetSampleAttributes;
43 hwRender->common.attr.GetSampleAttributes = FastRenderGetSampleAttributes;
44 hwRender->common.attr.GetCurrentChannelId = FastRenderGetCurrentChannelId;
45 hwRender->common.attr.SetExtraParams = FastRenderSetExtraParams;
46 hwRender->common.attr.GetExtraParams = FastRenderGetExtraParams;
47 hwRender->common.attr.ReqMmapBuffer = FastRenderReqMmapBuffer;
48 hwRender->common.attr.GetMmapPosition = FastRenderGetMmapPosition;
49 hwRender->common.scene.CheckSceneCapability = FastRenderCheckSceneCapability;
50 hwRender->common.scene.SelectScene = FastRenderSelectScene;
51 hwRender->common.volume.SetMute = FastRenderSetMute;
52 hwRender->common.volume.GetMute = FastRenderGetMute;
53 hwRender->common.volume.SetVolume = FastRenderSetVolume;
54 hwRender->common.volume.GetVolume = FastRenderGetVolume;
55 hwRender->common.volume.GetGainThreshold = FastRenderGetGainThreshold;
56 hwRender->common.volume.GetGain = FastRenderGetGain;
57 hwRender->common.volume.SetGain = FastRenderSetGain;
58 hwRender->common.GetLatency = FastRenderGetLatency;
59 hwRender->common.RenderFrame = FastRenderRenderFrame;
60 hwRender->common.GetRenderPosition = FastRenderGetRenderPosition;
61 hwRender->common.SetRenderSpeed = FastRenderSetRenderSpeed;
62 hwRender->common.GetRenderSpeed = FastRenderGetRenderSpeed;
63 hwRender->common.SetChannelMode = FastRenderSetChannelMode;
64 hwRender->common.GetChannelMode = FastRenderGetChannelMode;
65 hwRender->common.RegCallback = FastRenderRegCallback;
66 hwRender->common.DrainBuffer = FastRenderDrainBuffer;
67 }
68
GetNormalRenderFuncs(struct AudioHwRender * hwRender)69 static void GetNormalRenderFuncs(struct AudioHwRender *hwRender)
70 {
71 hwRender->common.control.Start = AudioRenderStart;
72 hwRender->common.control.Stop = AudioRenderStop;
73 hwRender->common.control.Pause = AudioRenderPause;
74 hwRender->common.control.Resume = AudioRenderResume;
75 hwRender->common.control.Flush = AudioRenderFlush;
76 hwRender->common.control.TurnStandbyMode = AudioRenderTurnStandbyMode;
77 hwRender->common.control.AudioDevDump = AudioRenderAudioDevDump;
78 hwRender->common.attr.GetFrameSize = AudioRenderGetFrameSize;
79 hwRender->common.attr.GetFrameCount = AudioRenderGetFrameCount;
80 hwRender->common.attr.SetSampleAttributes = AudioRenderSetSampleAttributes;
81 hwRender->common.attr.GetSampleAttributes = AudioRenderGetSampleAttributes;
82 hwRender->common.attr.GetCurrentChannelId = AudioRenderGetCurrentChannelId;
83 hwRender->common.attr.SetExtraParams = AudioRenderSetExtraParams;
84 hwRender->common.attr.GetExtraParams = AudioRenderGetExtraParams;
85 hwRender->common.attr.ReqMmapBuffer = AudioRenderReqMmapBuffer;
86 hwRender->common.attr.GetMmapPosition = AudioRenderGetMmapPosition;
87 hwRender->common.scene.CheckSceneCapability = AudioRenderCheckSceneCapability;
88 hwRender->common.scene.SelectScene = AudioRenderSelectScene;
89 hwRender->common.volume.SetMute = AudioRenderSetMute;
90 hwRender->common.volume.GetMute = AudioRenderGetMute;
91 hwRender->common.volume.SetVolume = AudioRenderSetVolume;
92 hwRender->common.volume.GetVolume = AudioRenderGetVolume;
93 hwRender->common.volume.GetGainThreshold = AudioRenderGetGainThreshold;
94 hwRender->common.volume.GetGain = AudioRenderGetGain;
95 hwRender->common.volume.SetGain = AudioRenderSetGain;
96 hwRender->common.GetLatency = AudioRenderGetLatency;
97 hwRender->common.RenderFrame = AudioRenderRenderFrame;
98 hwRender->common.GetRenderPosition = AudioRenderGetRenderPosition;
99 hwRender->common.SetRenderSpeed = AudioRenderSetRenderSpeed;
100 hwRender->common.GetRenderSpeed = AudioRenderGetRenderSpeed;
101 hwRender->common.SetChannelMode = AudioRenderSetChannelMode;
102 hwRender->common.GetChannelMode = AudioRenderGetChannelMode;
103 hwRender->common.RegCallback = AudioRenderRegCallback;
104 hwRender->common.DrainBuffer = AudioRenderDrainBuffer;
105 }
106
GetHearingAidFuncs(struct AudioHwRender * hwRender)107 static void GetHearingAidFuncs(struct AudioHwRender *hwRender)
108 {
109 hwRender->common.control.Start = HearingAidStart;
110 hwRender->common.control.Stop = HearingAidStop;
111 hwRender->common.control.Pause = HearingAidPause;
112 hwRender->common.control.Resume = HearingAidResume;
113 hwRender->common.control.Flush = HearingAidFlush;
114 hwRender->common.control.TurnStandbyMode = HearingAidTurnStandbyMode;
115 hwRender->common.control.AudioDevDump = HearingAidAudioDevDump;
116 hwRender->common.attr.GetFrameSize = HearingAidGetFrameSize;
117 hwRender->common.attr.GetFrameCount = HearingAidGetFrameCount;
118 hwRender->common.attr.SetSampleAttributes = HearingAidSetSampleAttributes;
119 hwRender->common.attr.GetSampleAttributes = HearingAidGetSampleAttributes;
120 hwRender->common.attr.GetCurrentChannelId = HearingAidGetCurrentChannelId;
121 hwRender->common.attr.SetExtraParams = HearingAidSetExtraParams;
122 hwRender->common.attr.GetExtraParams = HearingAidGetExtraParams;
123 hwRender->common.attr.ReqMmapBuffer = HearingAidReqMmapBuffer;
124 hwRender->common.attr.GetMmapPosition = HearingAidGetMmapPosition;
125 hwRender->common.scene.CheckSceneCapability = HearingAidCheckSceneCapability;
126 hwRender->common.scene.SelectScene = HearingAidSelectScene;
127 hwRender->common.volume.SetMute = HearingAidSetMute;
128 hwRender->common.volume.GetMute = HearingAidGetMute;
129 hwRender->common.volume.SetVolume = HearingAidSetVolume;
130 hwRender->common.volume.GetVolume = HearingAidGetVolume;
131 hwRender->common.volume.GetGainThreshold = HearingAidGetGainThreshold;
132 hwRender->common.volume.GetGain = HearingAidGetGain;
133 hwRender->common.volume.SetGain = HearingAidSetGain;
134 hwRender->common.GetLatency = HearingAidGetLatency;
135 hwRender->common.RenderFrame = HearingAidRenderFrame;
136 hwRender->common.GetRenderPosition = HearingAidGetRenderPosition;
137 hwRender->common.SetRenderSpeed = HearingAidSetRenderSpeed;
138 hwRender->common.GetRenderSpeed = HearingAidGetRenderSpeed;
139 hwRender->common.SetChannelMode = HearingAidSetChannelMode;
140 hwRender->common.GetChannelMode = HearingAidGetChannelMode;
141 hwRender->common.RegCallback = HearingAidRegCallback;
142 hwRender->common.DrainBuffer = HearingAidDrainBuffer;
143 }
144
GetCaptureFuncs(struct AudioHwCapture * hwCapture)145 static void GetCaptureFuncs(struct AudioHwCapture *hwCapture)
146 {
147 hwCapture->common.control.Start = AudioCaptureStart;
148 hwCapture->common.control.Stop = AudioCaptureStop;
149 hwCapture->common.control.Pause = AudioCapturePause;
150 hwCapture->common.control.Resume = AudioCaptureResume;
151 hwCapture->common.control.Flush = AudioCaptureFlush;
152 hwCapture->common.volume.SetMute = AudioCaptureSetMute;
153 hwCapture->common.volume.GetMute = AudioCaptureGetMute;
154 hwCapture->common.CaptureFrame = AudioCaptureCaptureFrame;
155 }
156
GetAudioRenderFunc(struct AudioHwRender * hwRender,const char * adapterName)157 int32_t GetAudioRenderFunc(struct AudioHwRender *hwRender, const char *adapterName)
158 {
159 if (hwRender == nullptr || adapterName == nullptr) {
160 return HDF_FAILURE;
161 }
162 if (strcmp(adapterName, "bt_a2dp_fast") == 0) {
163 GetFastRenderFuncs(hwRender);
164 } else if (strcmp(adapterName, "bt_hearing_aid") == 0) {
165 GetHearingAidFuncs(hwRender);
166 } else {
167 GetNormalRenderFuncs(hwRender);
168 }
169 return HDF_SUCCESS;
170 }
171
GetAudioCaptureFunc(struct AudioHwCapture * hwCapture,const char * adapterName)172 int32_t GetAudioCaptureFunc(struct AudioHwCapture *hwCapture, const char *adapterName)
173 {
174 if (hwCapture == nullptr || adapterName == nullptr) {
175 return HDF_FAILURE;
176 }
177 GetCaptureFuncs(hwCapture);
178 return HDF_SUCCESS;
179 }
180
CheckParaDesc(const struct AudioDeviceDescriptor * desc,const char * type)181 int32_t CheckParaDesc(const struct AudioDeviceDescriptor *desc, const char *type)
182 {
183 if (desc == NULL || type == NULL) {
184 return HDF_FAILURE;
185 }
186 if ((desc->portId) >> SHIFT_RIGHT_31_BITS) {
187 return HDF_ERR_NOT_SUPPORT;
188 }
189 AudioPortPin pins = desc->pins;
190 if (!strcmp(type, TYPE_CAPTURE)) {
191 if (pins == PIN_IN_MIC || pins == PIN_IN_HS_MIC || pins == PIN_IN_LINEIN) {
192 return HDF_SUCCESS;
193 } else {
194 return HDF_ERR_NOT_SUPPORT;
195 }
196 } else if (!strcmp(type, TYPE_RENDER)) {
197 if (pins == PIN_OUT_SPEAKER || pins == PIN_OUT_HEADSET || pins == PIN_OUT_LINEOUT || pins == PIN_OUT_HDMI) {
198 return HDF_SUCCESS;
199 } else {
200 return HDF_ERR_NOT_SUPPORT;
201 }
202 }
203 return HDF_ERR_NOT_SUPPORT;
204 }
205
CheckParaAttr(const struct AudioSampleAttributes * attrs)206 int32_t CheckParaAttr(const struct AudioSampleAttributes *attrs)
207 {
208 if (attrs == NULL) {
209 return HDF_FAILURE;
210 }
211 int32_t ret = ((attrs->sampleRate) >> SHIFT_RIGHT_31_BITS) + ((attrs->channelCount) >> SHIFT_RIGHT_31_BITS) +
212 ((attrs->period) >> SHIFT_RIGHT_31_BITS) + ((attrs->frameSize) >> SHIFT_RIGHT_31_BITS) +
213 ((attrs->startThreshold) >> SHIFT_RIGHT_31_BITS) + ((attrs->stopThreshold) >> SHIFT_RIGHT_31_BITS) +
214 ((attrs->silenceThreshold) >> SHIFT_RIGHT_31_BITS);
215 if (ret > 0) {
216 return HDF_ERR_NOT_SUPPORT;
217 }
218 AudioCategory audioCategory = attrs->type;
219 if (audioCategory < AUDIO_IN_MEDIA || audioCategory > AUDIO_MMAP_NOIRQ) {
220 return HDF_ERR_NOT_SUPPORT;
221 }
222 AudioFormat audioFormat = attrs->format;
223 return CheckAttrFormat(audioFormat);
224 }
225
AttrFormatToBit(const struct AudioSampleAttributes * attrs,int32_t * format)226 int32_t AttrFormatToBit(const struct AudioSampleAttributes *attrs, int32_t *format)
227 {
228 if (attrs == NULL || format == NULL) {
229 return HDF_FAILURE;
230 }
231 AudioFormat audioFormat = attrs->format;
232 switch (audioFormat) {
233 case AUDIO_FORMAT_TYPE_PCM_8_BIT:
234 *format = BIT_NUM_8;
235 return HDF_SUCCESS;
236 case AUDIO_FORMAT_TYPE_PCM_16_BIT:
237 *format = BIT_NUM_16;
238 return HDF_SUCCESS;
239 case AUDIO_FORMAT_TYPE_PCM_24_BIT:
240 *format = BIT_NUM_24;
241 return HDF_SUCCESS;
242 case AUDIO_FORMAT_TYPE_PCM_32_BIT:
243 *format = BIT_NUM_32;
244 return HDF_SUCCESS;
245 default:
246 return HDF_ERR_NOT_SUPPORT;
247 }
248 }
249
InitHwRenderParam(struct AudioHwRender * hwRender,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs)250 int32_t InitHwRenderParam(struct AudioHwRender *hwRender, const struct AudioDeviceDescriptor *desc,
251 const struct AudioSampleAttributes *attrs)
252 {
253 if (hwRender == NULL || desc == NULL || attrs == NULL) {
254 HDF_LOGE("InitHwRenderParam param Is NULL");
255 return HDF_FAILURE;
256 }
257 int32_t ret = CheckParaDesc(desc, TYPE_RENDER);
258 if (ret != HDF_SUCCESS) {
259 HDF_LOGE("CheckParaDesc Fail");
260 return ret;
261 }
262 ret = CheckParaAttr(attrs);
263 if (ret != HDF_SUCCESS) {
264 HDF_LOGE("CheckParaAttr Fail");
265 return ret;
266 }
267 int32_t formatValue = -1;
268 ret = AttrFormatToBit(attrs, &formatValue);
269 if (ret != HDF_SUCCESS) {
270 HDF_LOGE("AttrFormatToBit Fail");
271 return ret;
272 }
273 if (attrs->channelCount == 0) {
274 return HDF_FAILURE;
275 }
276 hwRender->renderParam.renderMode.hwInfo.deviceDescript = *desc;
277 hwRender->renderParam.frameRenderMode.attrs = *attrs;
278 hwRender->renderParam.renderMode.ctlParam.audioGain.gainMax = GAIN_MAX; // init gainMax
279 hwRender->renderParam.renderMode.ctlParam.audioGain.gainMin = 0;
280 hwRender->renderParam.frameRenderMode.frames = 0;
281 hwRender->renderParam.frameRenderMode.time.tvNSec = 0;
282 hwRender->renderParam.frameRenderMode.time.tvSec = 0;
283 hwRender->renderParam.frameRenderMode.byteRate = DEFAULT_RENDER_SAMPLING_RATE;
284 hwRender->renderParam.frameRenderMode.periodSize = DEEP_BUFFER_RENDER_PERIOD_SIZE;
285 hwRender->renderParam.frameRenderMode.periodCount = DEEP_BUFFER_RENDER_PERIOD_COUNT;
286 hwRender->renderParam.frameRenderMode.attrs.period = attrs->period;
287 hwRender->renderParam.frameRenderMode.attrs.frameSize = attrs->frameSize;
288 hwRender->renderParam.frameRenderMode.attrs.startThreshold = attrs->startThreshold;
289 hwRender->renderParam.frameRenderMode.attrs.stopThreshold = attrs->stopThreshold;
290 hwRender->renderParam.frameRenderMode.attrs.silenceThreshold = attrs->silenceThreshold;
291 hwRender->renderParam.frameRenderMode.attrs.isBigEndian = attrs->isBigEndian;
292 hwRender->renderParam.frameRenderMode.attrs.isSignedData = attrs->isSignedData;
293 return HDF_SUCCESS;
294 }
295
InitHwCaptureParam(struct AudioHwCapture * hwCapture,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs)296 int32_t InitHwCaptureParam(struct AudioHwCapture *hwCapture, const struct AudioDeviceDescriptor *desc,
297 const struct AudioSampleAttributes *attrs)
298 {
299 if (hwCapture == nullptr || desc == nullptr || attrs == nullptr) {
300 HDF_LOGE("InitHwCaptureParam param Is NULL");
301 return HDF_FAILURE;
302 }
303 int32_t ret = CheckParaDesc(desc, TYPE_CAPTURE);
304 if (ret != HDF_SUCCESS) {
305 HDF_LOGE("CheckParaDesc Fail");
306 return ret;
307 }
308 ret = CheckParaAttr(attrs);
309 if (ret != HDF_SUCCESS) {
310 HDF_LOGE("CheckParaAttr Fail");
311 return ret;
312 }
313 int32_t formatValue = -1;
314 ret = AttrFormatToBit(attrs, &formatValue);
315 if (ret != HDF_SUCCESS) {
316 HDF_LOGE("AttrFormatToBit Fail");
317 return ret;
318 }
319 if (attrs->channelCount == 0) {
320 return HDF_FAILURE;
321 }
322 hwCapture->captureParam.captureMode.hwInfo.deviceDescript = *desc;
323 hwCapture->captureParam.frameCaptureMode.attrs = *attrs;
324 hwCapture->captureParam.captureMode.ctlParam.audioGain.gainMax = GAIN_MAX; // init gainMax
325 hwCapture->captureParam.captureMode.ctlParam.audioGain.gainMin = 0;
326 hwCapture->captureParam.frameCaptureMode.frames = 0;
327 hwCapture->captureParam.frameCaptureMode.time.tvNSec = 0;
328 hwCapture->captureParam.frameCaptureMode.time.tvSec = 0;
329 hwCapture->captureParam.frameCaptureMode.byteRate = DEFAULT_RENDER_SAMPLING_RATE;
330 hwCapture->captureParam.frameCaptureMode.periodSize = DEEP_BUFFER_RENDER_PERIOD_SIZE;
331 hwCapture->captureParam.frameCaptureMode.periodCount = DEEP_BUFFER_RENDER_PERIOD_COUNT;
332 hwCapture->captureParam.frameCaptureMode.attrs.period = attrs->period;
333 hwCapture->captureParam.frameCaptureMode.attrs.frameSize = attrs->frameSize;
334 hwCapture->captureParam.frameCaptureMode.attrs.startThreshold = attrs->startThreshold;
335 hwCapture->captureParam.frameCaptureMode.attrs.stopThreshold = attrs->stopThreshold;
336 hwCapture->captureParam.frameCaptureMode.attrs.silenceThreshold = attrs->silenceThreshold;
337 hwCapture->captureParam.frameCaptureMode.attrs.isBigEndian = attrs->isBigEndian;
338 hwCapture->captureParam.frameCaptureMode.attrs.isSignedData = attrs->isSignedData;
339 return HDF_SUCCESS;
340 }
341
342 AudioFormat g_formatIdZero = AUDIO_FORMAT_TYPE_PCM_16_BIT;
InitForGetPortCapability(struct AudioPort portIndex,struct AudioPortCapability * capabilityIndex)343 int32_t InitForGetPortCapability(struct AudioPort portIndex, struct AudioPortCapability *capabilityIndex)
344 {
345 if (capabilityIndex == NULL) {
346 HDF_LOGE("capabilityIndex Is NULL");
347 return HDF_FAILURE;
348 }
349 /* get capabilityIndex from driver or default */
350 if (portIndex.dir != PORT_OUT) {
351 capabilityIndex->hardwareMode = true;
352 capabilityIndex->channelMasks = AUDIO_CHANNEL_STEREO;
353 capabilityIndex->channelCount = CONFIG_CHANNEL_COUNT;
354 return HDF_SUCCESS;
355 }
356 if (portIndex.portId == 0) {
357 capabilityIndex->hardwareMode = true;
358 capabilityIndex->channelMasks = AUDIO_CHANNEL_STEREO;
359 capabilityIndex->channelCount = CONFIG_CHANNEL_COUNT;
360 capabilityIndex->deviceType = portIndex.dir;
361 capabilityIndex->deviceId = PIN_OUT_SPEAKER;
362 capabilityIndex->formatNum = 1;
363 capabilityIndex->formats = &g_formatIdZero;
364 capabilityIndex->sampleRateMasks = AUDIO_SAMPLE_RATE_MASK_16000;
365 capabilityIndex->subPortsNum = 1;
366 capabilityIndex->subPorts =
367 reinterpret_cast<struct AudioSubPortCapability *>(calloc(capabilityIndex->subPortsNum,
368 sizeof(struct AudioSubPortCapability)));
369 if (capabilityIndex->subPorts == NULL) {
370 HDF_LOGE("capabilityIndex subPorts is NULL!");
371 return HDF_FAILURE;
372 }
373 capabilityIndex->subPorts->portId = portIndex.portId;
374 capabilityIndex->subPorts->desc = portIndex.portName;
375 capabilityIndex->subPorts->mask = PORT_PASSTHROUGH_LPCM;
376 return HDF_SUCCESS;
377 }
378 if (portIndex.portId == 1) {
379 capabilityIndex->hardwareMode = true;
380 capabilityIndex->channelMasks = AUDIO_CHANNEL_STEREO;
381 capabilityIndex->channelCount = CONFIG_CHANNEL_COUNT;
382 capabilityIndex->deviceType = portIndex.dir;
383 capabilityIndex->deviceId = PIN_OUT_HEADSET;
384 capabilityIndex->formatNum = 1;
385 capabilityIndex->formats = &g_formatIdZero;
386 capabilityIndex->sampleRateMasks = AUDIO_SAMPLE_RATE_MASK_16000 | AUDIO_SAMPLE_RATE_MASK_8000;
387 return HDF_SUCCESS;
388 }
389 if (portIndex.portId == HDMI_PORT_ID) {
390 return HdmiPortInit(portIndex, capabilityIndex);
391 }
392 return HDF_FAILURE;
393 }
394
AudioAdapterReleaseCapSubPorts(const struct AudioPortAndCapability * portCapabilitys,int32_t num)395 void AudioAdapterReleaseCapSubPorts(const struct AudioPortAndCapability *portCapabilitys, int32_t num)
396 {
397 int32_t i = 0;
398 if (portCapabilitys == NULL) {
399 return;
400 }
401 while (i < num) {
402 if (&portCapabilitys[i] == NULL) {
403 break;
404 }
405 AudioMemFree((void **)(&portCapabilitys[i].capability.subPorts));
406 i++;
407 }
408 return;
409 }
410
AudioAdapterInitAllPorts(struct AudioAdapter * adapter)411 int32_t AudioAdapterInitAllPorts(struct AudioAdapter *adapter)
412 {
413 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter);
414 if (hwAdapter == NULL) {
415 HDF_LOGE("hwAdapter Is NULL");
416 return AUDIO_HAL_ERR_INVALID_PARAM;
417 }
418 if (hwAdapter->portCapabilitys != NULL) {
419 HDF_LOGE("portCapabilitys already Init!");
420 return AUDIO_HAL_SUCCESS;
421 }
422 uint32_t portNum = hwAdapter->adapterDescriptor.portNum;
423 struct AudioPort *ports = hwAdapter->adapterDescriptor.ports;
424 if (ports == NULL) {
425 HDF_LOGE("ports is NULL!");
426 return AUDIO_HAL_ERR_INTERNAL;
427 }
428 if (portNum == 0) {
429 return AUDIO_HAL_ERR_INTERNAL;
430 }
431 struct AudioPortAndCapability *portCapability =
432 reinterpret_cast<struct AudioPortAndCapability *>(calloc(portNum, sizeof(struct AudioPortAndCapability)));
433 if (portCapability == NULL) {
434 HDF_LOGE("portCapability is NULL!");
435 return AUDIO_HAL_ERR_INTERNAL;
436 }
437 for (uint32_t i = 0; i < portNum; i++) {
438 portCapability[i].port = ports[i];
439 if (InitForGetPortCapability(ports[i], &portCapability[i].capability)) {
440 HDF_LOGE("ports Init Fail!");
441 AudioAdapterReleaseCapSubPorts(portCapability, portNum);
442 AudioMemFree((void **)&portCapability);
443 return AUDIO_HAL_ERR_INTERNAL;
444 }
445 }
446 hwAdapter->portCapabilitys = portCapability;
447 hwAdapter->portCapabilitys->mode = PORT_PASSTHROUGH_LPCM;
448 return AUDIO_HAL_SUCCESS;
449 }
450
AudioReleaseRenderHandle(struct AudioHwRender * hwRender)451 void AudioReleaseRenderHandle(struct AudioHwRender *hwRender)
452 {
453 return;
454 }
455
AudioReleaseCaptureHandle(struct AudioHwCapture * hwCapture)456 void AudioReleaseCaptureHandle(struct AudioHwCapture *hwCapture)
457 {
458 return;
459 }
460
AudioAdapterCreateRenderPre(struct AudioHwRender * hwRender,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,const struct AudioHwAdapter * hwAdapter)461 int32_t AudioAdapterCreateRenderPre(struct AudioHwRender *hwRender, const struct AudioDeviceDescriptor *desc,
462 const struct AudioSampleAttributes *attrs, const struct AudioHwAdapter *hwAdapter)
463 {
464 HDF_LOGD("%{public}s", __func__);
465 if (hwAdapter == NULL || hwRender == NULL || desc == NULL || attrs == NULL) {
466 HDF_LOGE("Pointer is null!");
467 return HDF_FAILURE;
468 }
469
470 /* Fill hwRender para */
471 if (InitHwRenderParam(hwRender, desc, attrs) < 0) {
472 return HDF_FAILURE;
473 }
474
475 if (GetAudioRenderFunc(hwRender, hwAdapter->adapterDescriptor.adapterName) < 0) {
476 return HDF_FAILURE;
477 }
478 /* Select Path */
479 if (hwAdapter->adapterDescriptor.adapterName == NULL) {
480 HDF_LOGE("pointer is null!");
481 return HDF_FAILURE;
482 }
483 uint32_t adapterNameLen = strlen(hwAdapter->adapterDescriptor.adapterName);
484 if (adapterNameLen == 0) {
485 HDF_LOGE("adapterNameLen is null!");
486 return HDF_FAILURE;
487 }
488 /* Get Adapter name */
489 int32_t ret = strncpy_s(hwRender->renderParam.renderMode.hwInfo.adapterName, NAME_LEN - 1,
490 hwAdapter->adapterDescriptor.adapterName, adapterNameLen);
491 if (ret != EOK) {
492 HDF_LOGE("copy fail");
493 return HDF_FAILURE;
494 }
495 return HDF_SUCCESS;
496 }
497
AudioAdapterCreateCapturePre(struct AudioHwCapture * hwCapture,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,const struct AudioHwAdapter * hwAdapter)498 int32_t AudioAdapterCreateCapturePre(struct AudioHwCapture *hwCapture, const struct AudioDeviceDescriptor *desc,
499 const struct AudioSampleAttributes *attrs, const struct AudioHwAdapter *hwAdapter)
500 {
501 HDF_LOGD("%s", __func__);
502 if (hwAdapter == nullptr || hwCapture == nullptr || desc == nullptr || attrs == nullptr) {
503 HDF_LOGE("Pointer is null!");
504 return HDF_FAILURE;
505 }
506 if (InitHwCaptureParam(hwCapture, desc, attrs) < 0) {
507 return HDF_FAILURE;
508 }
509 if (GetAudioCaptureFunc(hwCapture, hwAdapter->adapterDescriptor.adapterName) < 0) {
510 return HDF_FAILURE;
511 }
512 if (hwAdapter->adapterDescriptor.adapterName == nullptr) {
513 HDF_LOGE("pointer is null!");
514 return HDF_FAILURE;
515 }
516 uint32_t adapterNameLen = strlen(hwAdapter->adapterDescriptor.adapterName);
517 if (adapterNameLen == 0) {
518 HDF_LOGE("adapterNameLen is null!");
519 return HDF_FAILURE;
520 }
521 int32_t ret = strncpy_s(hwCapture->captureParam.captureMode.hwInfo.adapterName, NAME_LEN - 1,
522 hwAdapter->adapterDescriptor.adapterName, adapterNameLen);
523 if (ret != EOK) {
524 HDF_LOGE("copy fail");
525 return HDF_FAILURE;
526 }
527 return HDF_SUCCESS;
528 }
529
AudioAdapterCreateRender(struct AudioAdapter * adapter,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,struct AudioRender ** render)530 int32_t AudioAdapterCreateRender(struct AudioAdapter *adapter, const struct AudioDeviceDescriptor *desc,
531 const struct AudioSampleAttributes *attrs, struct AudioRender **render)
532 {
533 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter);
534 if (hwAdapter == NULL || desc == NULL || attrs == NULL || render == NULL) {
535 return AUDIO_HAL_ERR_INVALID_PARAM;
536 }
537 if (hwAdapter->adapterMgrRenderFlag > 0) {
538 HDF_LOGE("Create render repeatedly!");
539 return AUDIO_HAL_ERR_INTERNAL;
540 }
541 struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(calloc(1, sizeof(*hwRender)));
542 if (hwRender == NULL) {
543 HDF_LOGE("hwRender is NULL!");
544 return AUDIO_HAL_ERR_MALLOC_FAIL;
545 }
546 int32_t ret = AudioAdapterCreateRenderPre(hwRender, desc, attrs, hwAdapter);
547 if (ret != 0) {
548 HDF_LOGE("AudioAdapterCreateRenderPre fail");
549 AudioMemFree(reinterpret_cast<void **>(&hwRender));
550 return AUDIO_HAL_ERR_INTERNAL;
551 }
552 hwAdapter->adapterMgrRenderFlag++;
553 *render = &hwRender->common;
554 return AUDIO_HAL_SUCCESS;
555 }
556
AudioAdapterCreateCapture(struct AudioAdapter * adapter,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,struct AudioCapture ** capture)557 int32_t AudioAdapterCreateCapture(struct AudioAdapter *adapter, const struct AudioDeviceDescriptor *desc,
558 const struct AudioSampleAttributes *attrs, struct AudioCapture **capture)
559 {
560 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter);
561 if (hwAdapter == nullptr || desc == nullptr || attrs == nullptr || capture == nullptr) {
562 return AUDIO_HAL_ERR_INVALID_PARAM;
563 }
564 if (hwAdapter->adapterMgrCaptureFlag > 0) {
565 HDF_LOGE("Create capture repeatedly!");
566 return AUDIO_HAL_ERR_INTERNAL;
567 }
568 struct AudioHwCapture *hwCapture = reinterpret_cast<struct AudioHwCapture *>(calloc(1, sizeof(*hwCapture)));
569 if (hwCapture == nullptr) {
570 HDF_LOGE("hwCapture is NULL!");
571 return AUDIO_HAL_ERR_MALLOC_FAIL;
572 }
573 int32_t ret = AudioAdapterCreateCapturePre(hwCapture, desc, attrs, hwAdapter);
574 if (ret != 0) {
575 HDF_LOGE("AudioAdapterCreateCapturePre fail");
576 AudioMemFree(reinterpret_cast<void **>(&hwCapture));
577 return AUDIO_HAL_ERR_INTERNAL;
578 }
579 hwAdapter->adapterMgrCaptureFlag++;
580 *capture = &hwCapture->common;
581 return AUDIO_HAL_SUCCESS;
582 }
583
AudioAdapterDestroyRender(struct AudioAdapter * adapter,struct AudioRender * render)584 int32_t AudioAdapterDestroyRender(struct AudioAdapter *adapter, struct AudioRender *render)
585 {
586 HDF_LOGI("enter");
587 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter);
588 if (hwAdapter == NULL || render == NULL) {
589 return AUDIO_HAL_ERR_INVALID_PARAM;
590 }
591 if (hwAdapter->adapterMgrRenderFlag > 0) {
592 hwAdapter->adapterMgrRenderFlag--;
593 }
594 struct AudioHwRender *hwRender = reinterpret_cast<struct AudioHwRender *>(render);
595 if (hwRender == NULL) {
596 return AUDIO_HAL_ERR_INTERNAL;
597 }
598 if (hwRender->renderParam.frameRenderMode.buffer != NULL) {
599 HDF_LOGI("render not stop, first stop it.");
600 int ret = render->control.Stop((AudioHandle)render);
601 if (ret < 0) {
602 HDF_LOGE("render Stop failed");
603 }
604 }
605 AudioReleaseRenderHandle(hwRender);
606 AudioMemFree(reinterpret_cast<void **>(&hwRender->renderParam.frameRenderMode.buffer));
607 AudioMemFree(reinterpret_cast<void **>(&render));
608 HDF_LOGI("AudioAdapterDestroyRender cleaned.");
609 return AUDIO_HAL_SUCCESS;
610 }
611
AudioAdapterDestroyCapture(struct AudioAdapter * adapter,struct AudioCapture * capture)612 int32_t AudioAdapterDestroyCapture(struct AudioAdapter *adapter, struct AudioCapture *capture)
613 {
614 HDF_LOGI("enter");
615 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter);
616 if (hwAdapter == nullptr || capture == nullptr) {
617 return AUDIO_HAL_ERR_INVALID_PARAM;
618 }
619 if (hwAdapter->adapterMgrCaptureFlag > 0) {
620 hwAdapter->adapterMgrCaptureFlag--;
621 }
622 struct AudioHwCapture *hwCapture = reinterpret_cast<struct AudioHwCapture *>(capture);
623 if (hwCapture == nullptr) {
624 return AUDIO_HAL_ERR_INTERNAL;
625 }
626 AudioReleaseCaptureHandle(hwCapture);
627 AudioMemFree(reinterpret_cast<void **>(&capture));
628 HDF_LOGI("AudioAdapterDestroyCapture cleaned.");
629 return AUDIO_HAL_SUCCESS;
630 }
631
AudioAdapterGetPortCapability(struct AudioAdapter * adapter,const struct AudioPort * port,struct AudioPortCapability * capability)632 int32_t AudioAdapterGetPortCapability(struct AudioAdapter *adapter, const struct AudioPort *port,
633 struct AudioPortCapability *capability)
634 {
635 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter);
636 if (hwAdapter == NULL || port == NULL || port->portName == NULL || capability == NULL) {
637 return AUDIO_HAL_ERR_INVALID_PARAM;
638 }
639 if (port->portId < 0) {
640 return AUDIO_HAL_ERR_INTERNAL;
641 }
642 struct AudioPortAndCapability *hwAdapterPortCapabilitys = hwAdapter->portCapabilitys;
643 if (hwAdapterPortCapabilitys == NULL) {
644 HDF_LOGE("hwAdapter portCapabilitys is NULL!");
645 return AUDIO_HAL_ERR_INTERNAL;
646 }
647 int32_t portNum = hwAdapter->adapterDescriptor.portNum;
648 while (hwAdapterPortCapabilitys != NULL && portNum) {
649 if (hwAdapterPortCapabilitys->port.portId == port->portId) {
650 *capability = hwAdapterPortCapabilitys->capability;
651 return AUDIO_HAL_SUCCESS;
652 }
653 hwAdapterPortCapabilitys++;
654 portNum--;
655 }
656 return AUDIO_HAL_ERR_INTERNAL;
657 }
658
AudioAdapterSetPassthroughMode(struct AudioAdapter * adapter,const struct AudioPort * port,AudioPortPassthroughMode mode)659 int32_t AudioAdapterSetPassthroughMode(struct AudioAdapter *adapter,
660 const struct AudioPort *port, AudioPortPassthroughMode mode)
661 {
662 if (adapter == NULL || port == NULL || port->portName == NULL) {
663 return AUDIO_HAL_ERR_INVALID_PARAM;
664 }
665 if (port->dir != PORT_OUT || port->portId < 0 || strcmp(port->portName, "AOP") != 0) {
666 return AUDIO_HAL_ERR_INTERNAL;
667 }
668 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter);
669 if (hwAdapter->portCapabilitys == NULL) {
670 HDF_LOGE("The pointer is null!");
671 return AUDIO_HAL_ERR_INTERNAL;
672 }
673 struct AudioPortAndCapability *portCapabilityTemp = hwAdapter->portCapabilitys;
674 struct AudioPortCapability *portCapability = NULL;
675 int32_t portNum = hwAdapter->adapterDescriptor.portNum;
676 while (portCapabilityTemp != NULL && portNum > 0) {
677 if (portCapabilityTemp->port.portId == port->portId) {
678 portCapability = &portCapabilityTemp->capability;
679 break;
680 }
681 portCapabilityTemp++;
682 portNum--;
683 }
684 if (portCapability == NULL || portNum <= 0) {
685 HDF_LOGE("hwAdapter portCapabilitys is Not Find!");
686 return AUDIO_HAL_ERR_INTERNAL;
687 }
688 struct AudioSubPortCapability *subPortCapability = portCapability->subPorts;
689 if (subPortCapability == NULL) {
690 HDF_LOGE("portCapability->subPorts is NULL!");
691 return AUDIO_HAL_ERR_INTERNAL;
692 }
693 int32_t subPortNum = portCapability->subPortsNum;
694 while (subPortCapability != NULL && subPortNum > 0) {
695 if (subPortCapability->mask == mode) {
696 portCapabilityTemp->mode = mode;
697 break;
698 }
699 subPortCapability++;
700 subPortNum--;
701 }
702 if (subPortNum > 0) {
703 return AUDIO_HAL_SUCCESS;
704 }
705 return AUDIO_HAL_ERR_INTERNAL;
706 }
707
AudioAdapterGetPassthroughMode(struct AudioAdapter * adapter,const struct AudioPort * port,AudioPortPassthroughMode * mode)708 int32_t AudioAdapterGetPassthroughMode(struct AudioAdapter *adapter, const struct AudioPort *port,
709 AudioPortPassthroughMode *mode)
710 {
711 if (adapter == NULL || port == NULL || port->portName == NULL || mode == NULL) {
712 return AUDIO_HAL_ERR_INVALID_PARAM;
713 }
714 if (port->dir != PORT_OUT || port->portId < 0 || strcmp(port->portName, "AOP") != 0) {
715 return AUDIO_HAL_ERR_INTERNAL;
716 }
717 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter);
718 if (hwAdapter->portCapabilitys == NULL) {
719 HDF_LOGE("portCapabilitys pointer is null!");
720 return AUDIO_HAL_ERR_INTERNAL;
721 }
722 struct AudioPortAndCapability *portCapabilitys = hwAdapter->portCapabilitys;
723 int32_t portNum = hwAdapter->adapterDescriptor.portNum;
724 while (portCapabilitys != NULL && portNum > 0) {
725 if (portCapabilitys->port.portId == port->portId) {
726 *mode = portCapabilitys->mode;
727 return AUDIO_HAL_SUCCESS;
728 }
729 portCapabilitys++;
730 portNum--;
731 }
732 return AUDIO_HAL_ERR_INTERNAL;
733 }
734
AudioAdapterSetExtraParams(struct AudioAdapter * adapter,enum AudioExtParamKey key,const char * condition,const char * value)735 int32_t AudioAdapterSetExtraParams(struct AudioAdapter *adapter, enum AudioExtParamKey key,
736 const char *condition, const char *value)
737 {
738 (void)adapter;
739 (void)key;
740 (void)condition;
741 (void)value;
742 return HDF_ERR_NOT_SUPPORT;
743 }
744
AudioAdapterGetExtraParams(struct AudioAdapter * adapter,enum AudioExtParamKey key,const char * condition,char * value,int32_t length)745 int32_t AudioAdapterGetExtraParams(struct AudioAdapter *adapter, enum AudioExtParamKey key,
746 const char *condition, char *value, int32_t length)
747 {
748 (void)adapter;
749 (void)key;
750 (void)condition;
751 (void)value;
752 (void)length;
753 return HDF_ERR_NOT_SUPPORT;
754 }
755
756 }