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_adapter_info_common.h"
17 #include "audio_internal.h"
18 #include "audio_bluetooth_manager.h"
19 #include "fast_audio_render.h"
20 namespace OHOS::HDI::Audio_Bluetooth {
AudioManagerGetAllAdapters(struct AudioManager * manager,struct AudioAdapterDescriptor ** descs,int * size)21 int32_t AudioManagerGetAllAdapters(struct AudioManager *manager,
22 struct AudioAdapterDescriptor **descs,
23 int *size)
24 {
25 int32_t ret;
26 HDF_LOGD("%s", __func__);
27 if (manager == NULL || descs == NULL || size == NULL) {
28 return AUDIO_HAL_ERR_INVALID_PARAM;
29 }
30 ret = AudioAdaptersForUser(descs, size);
31 if (ret < 0) {
32 HDF_LOGE("AudioAdaptersForUser FAIL!");
33 return AUDIO_HAL_ERR_NOTREADY; // Failed to read sound card configuration file
34 }
35 return AUDIO_HAL_SUCCESS;
36 }
37
SetupBluetoothInterface(struct AudioHwAdapter * hwAdapter,const struct AudioAdapterDescriptor * desc)38 bool SetupBluetoothInterface(struct AudioHwAdapter *hwAdapter, const struct AudioAdapterDescriptor *desc)
39 {
40 #ifndef A2DP_HDI_SERVICE
41 OHOS::Bluetooth::GetProxy();
42 OHOS::Bluetooth::RegisterObserver();
43 return true;
44 #else
45 bool ret = false;
46 if (strcmp(desc->adapterName, "bt_a2dp_fast") == 0) {
47 HDF_LOGI("%{public}s, fast set up", __func__);
48 ret = OHOS::Bluetooth::FastSetUp();
49 } else if (strcmp(desc->adapterName, "bt_hdap") == 0) {
50 HDF_LOGI("%{public}s, hdap set up", __func__);
51 ret = OHOS::Bluetooth::SetUpCapture();
52 } else {
53 HDF_LOGI("%{public}s, normal set up", __func__);
54 ret = OHOS::Bluetooth::SetUp();
55 }
56 return ret;
57 #endif
58 }
59
AudioManagerLoadAdapter(struct AudioManager * manager,const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter)60 int32_t AudioManagerLoadAdapter(struct AudioManager *manager, const struct AudioAdapterDescriptor *desc,
61 struct AudioAdapter **adapter)
62 {
63 HDF_LOGD("%s", __func__);
64 if (manager == NULL || desc == NULL || desc->adapterName == NULL || desc->ports == NULL || adapter == NULL) {
65 return AUDIO_HAL_ERR_INVALID_PARAM;
66 }
67 HDF_LOGI("%s: adapter name %s", __func__, desc->adapterName);
68 if (AudioAdapterExist(desc->adapterName)) {
69 HDF_LOGE("%s: not supported this adapter %s", __func__, desc->adapterName);
70 return AUDIO_HAL_ERR_INTERNAL;
71 }
72 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(calloc(1, sizeof(*hwAdapter)));
73 if (hwAdapter == NULL) {
74 HDF_LOGE("%s: calloc AudioHwAdapter failed", __func__);
75 return AUDIO_HAL_ERR_MALLOC_FAIL;
76 }
77 hwAdapter->common.InitAllPorts = AudioAdapterInitAllPorts;
78 hwAdapter->common.CreateRender = AudioAdapterCreateRender;
79 hwAdapter->common.DestroyRender = AudioAdapterDestroyRender;
80 hwAdapter->common.CreateCapture = AudioAdapterCreateCapture;
81 hwAdapter->common.DestroyCapture = AudioAdapterDestroyCapture;
82 hwAdapter->common.GetPortCapability = AudioAdapterGetPortCapability;
83 hwAdapter->common.SetPassthroughMode = AudioAdapterSetPassthroughMode;
84 hwAdapter->common.GetPassthroughMode = AudioAdapterGetPassthroughMode;
85 hwAdapter->common.SetExtraParams = AudioAdapterSetExtraParams;
86 hwAdapter->common.GetExtraParams = AudioAdapterGetExtraParams;
87 *adapter = &hwAdapter->common;
88 hwAdapter->adapterDescriptor = *desc;
89 hwAdapter->adapterMgrRenderFlag = 0; // The adapterMgrRenderFlag init is zero
90 hwAdapter->adapterMgrCaptureFlag = 0;
91 HDF_LOGI("%s call bluetooth RegisterObserver interface", __func__);
92 if (!SetupBluetoothInterface(hwAdapter, desc)) {
93 return AUDIO_HAL_ERR_INTERNAL;
94 }
95 return AUDIO_HAL_SUCCESS;
96 }
97
AudioManagerUnloadAdapter(struct AudioManager * manager,struct AudioAdapter * adapter)98 void AudioManagerUnloadAdapter(struct AudioManager *manager, struct AudioAdapter *adapter)
99 {
100 struct AudioHwAdapter *hwAdapter = reinterpret_cast<struct AudioHwAdapter *>(adapter);
101 if (manager == NULL || hwAdapter == NULL) {
102 return;
103 }
104 #ifdef A2DP_HDI_SERVICE
105 bool isFastAdapter = (strcmp(hwAdapter->adapterDescriptor.adapterName, "bt_a2dp_fast") == 0);
106 bool isHdapAdapter = (strcmp(hwAdapter->adapterDescriptor.adapterName, "bt_hdap") == 0);
107 #endif
108 if (hwAdapter->portCapabilitys != NULL) {
109 int32_t portNum = hwAdapter->adapterDescriptor.portNum;
110 int32_t i = 0;
111 while (i < portNum) {
112 if (&hwAdapter->portCapabilitys[i] != NULL) {
113 AudioMemFree((void **)&hwAdapter->portCapabilitys[i].capability.subPorts);
114 }
115 i++;
116 }
117 AudioMemFree(reinterpret_cast<void **>(&hwAdapter->portCapabilitys));
118 }
119 AudioMemFree(reinterpret_cast<void **>(&adapter));
120
121 HDF_LOGI("%s call bluetooth DeRegisterObserver interface", __func__);
122 #ifndef A2DP_HDI_SERVICE
123 OHOS::Bluetooth::DeRegisterObserver();
124 #else
125 if (isFastAdapter) {
126 OHOS::Bluetooth::FastTearDown();
127 } else if (isHdapAdapter) {
128 OHOS::Bluetooth::TearDownCapture();
129 } else {
130 OHOS::Bluetooth::TearDown();
131 }
132 OHOS::Bluetooth::UnBlockStart();
133 #endif
134 }
135
136 static struct AudioManager g_audioManagerFuncs = {
137 .GetAllAdapters = AudioManagerGetAllAdapters,
138 .LoadAdapter = AudioManagerLoadAdapter,
139 .UnloadAdapter = AudioManagerUnloadAdapter,
140 };
141
GetAudioManagerFuncs(void)142 struct AudioManager *GetAudioManagerFuncs(void)
143 {
144 return &g_audioManagerFuncs;
145 }
146 }