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