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 "audio_proxy_manager.h"
16 #include "osal_mem.h"
17 #include "servmgr_hdi.h"
18 #include "audio_adapter_info_common.h"
19 #include "audio_proxy_common.h"
20 #include "audio_proxy_internal.h"
21 #include "audio_uhdf_log.h"
22
23 #define HDF_LOG_TAG HDF_AUDIO_HAL_PROXY
24
25 #define HDI_SERVER_PRIMARY_NAME "audio_hdi_service"
26 #define HDI_SERVER_USB_NAME "audio_hdi_usb_service"
27 #define HDI_SERVER_A2DP_NAME "audio_hdi_a2dp_service"
28
29 #define CONFIG_FRAME_SIZE (1024 * 2 * 1)
30 #define FRAME_SIZE 1024
31 #define CONFIG_FRAME_COUNT ((8000 * 2 * 1 + (CONFIG_FRAME_SIZE - 1)) / CONFIG_FRAME_SIZE)
32 #define AUDIO_MAGIC (0xAAAAAAAA)
33
34 static bool audioProxyAdapterAddrMgrFlag = false;
35 static struct AudioAdapterDescriptor *g_localAudioProxyAdapterAddrOut = NULL; // add for Fuzz
36 int g_localAudioProxyAdapterNum = 0; // add for Fuzz
37 static struct AudioProxyManager g_localAudioProxyMgr = {0}; // serverManager
38
AudioProxySendGetAllAdapter(struct HdfRemoteService * remoteHandle)39 static int32_t AudioProxySendGetAllAdapter(struct HdfRemoteService *remoteHandle)
40 {
41 if (remoteHandle == NULL) {
42 return AUDIO_HAL_ERR_INVALID_PARAM;
43 }
44 struct HdfSBuf *data = NULL;
45 struct HdfSBuf *reply = NULL;
46 int32_t ret;
47 if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
48 return AUDIO_HAL_ERR_INTERNAL;
49 }
50 if (!HdfRemoteServiceWriteInterfaceToken(remoteHandle, data)) {
51 AUDIO_FUNC_LOGE("write interface token failed");
52 AudioProxyBufReplyRecycle(data, reply);
53 return AUDIO_HAL_ERR_INTERNAL;
54 }
55 ret = AudioProxyDispatchCall(remoteHandle, AUDIO_HDI_MGR_GET_ALL_ADAPTER, data, reply);
56 if (ret != AUDIO_HAL_SUCCESS) {
57 AudioProxyBufReplyRecycle(data, reply);
58 AUDIO_FUNC_LOGE("AudioProxyDispatchCallsend service fail!");
59 return ret;
60 }
61 AudioProxyBufReplyRecycle(data, reply);
62 return AUDIO_HAL_SUCCESS;
63 }
64
AudioProxyManagerGetAllAdapters(struct AudioManager * manager,struct AudioAdapterDescriptor ** descs,int * size)65 int32_t AudioProxyManagerGetAllAdapters(struct AudioManager *manager,
66 struct AudioAdapterDescriptor **descs, int *size)
67 {
68 AUDIO_FUNC_LOGI();
69 int32_t ret;
70 if (manager == NULL || descs == NULL || size == NULL) {
71 AUDIO_FUNC_LOGE("param is null!");
72 return AUDIO_HAL_ERR_INVALID_PARAM;
73 }
74 struct AudioProxyManager *proxyManager = CONTAINER_OF(manager, struct AudioProxyManager, impl);
75 if ((&g_localAudioProxyMgr) != proxyManager || proxyManager == NULL || (proxyManager->remote == NULL &&
76 proxyManager->usbRemote == NULL && proxyManager->a2dpRemote == NULL) ||
77 proxyManager->audioMagic != AUDIO_MAGIC) {
78 AUDIO_FUNC_LOGE("Param is null!");
79 return AUDIO_HAL_ERR_INVALID_PARAM;
80 }
81 ret = AudioAdaptersForUser(descs, size);
82 if (ret < 0) {
83 AUDIO_FUNC_LOGE("AudioAdaptersForUser FAIL!");
84 return AUDIO_HAL_ERR_NOTREADY; // Failed to read sound card configuration file
85 }
86 /* add for Fuzz. */
87 if (*descs && size && (*size) > 0) {
88 g_localAudioProxyAdapterAddrOut = *descs;
89 g_localAudioProxyAdapterNum = *size;
90 } else {
91 AUDIO_FUNC_LOGE("Get AudioAdapterDescriptor Failed");
92 return AUDIO_HAL_ERR_INVALID_OBJECT;
93 }
94
95 int32_t retPri = AudioProxySendGetAllAdapter(proxyManager->remote);
96 int32_t retUsb = AudioProxySendGetAllAdapter(proxyManager->usbRemote);
97 int32_t retA2dp = AudioProxySendGetAllAdapter(proxyManager->a2dpRemote);
98 AUDIO_FUNC_LOGI("retPri=%{public}d, retUsb=%{public}d, retA2dp=%{public}d", retPri, retUsb, retA2dp);
99 if (retPri != AUDIO_HAL_SUCCESS && retUsb != AUDIO_HAL_SUCCESS && retA2dp != AUDIO_HAL_SUCCESS) {
100 AUDIO_FUNC_LOGE("Failed to send service call!");
101 return AUDIO_HAL_ERR_INTERNAL;
102 }
103 return AUDIO_HAL_SUCCESS;
104 }
105
LoadAdapterPrepareParameters(struct HdfRemoteService * remoteObj,const struct AudioAdapterDescriptor * desc,struct HdfSBuf ** data,struct HdfSBuf ** reply)106 static int32_t LoadAdapterPrepareParameters(struct HdfRemoteService * remoteObj,
107 const struct AudioAdapterDescriptor *desc, struct HdfSBuf **data, struct HdfSBuf **reply)
108 {
109 if (remoteObj == NULL || desc == NULL || desc->adapterName == NULL || desc->ports == NULL || data == NULL ||
110 reply == NULL) {
111 AUDIO_FUNC_LOGE("param is null!");
112 return AUDIO_HAL_ERR_INVALID_PARAM;
113 }
114 bool descFlag = false;
115 if (g_localAudioProxyAdapterNum <= 0 || g_localAudioProxyAdapterNum > SUPPORT_ADAPTER_NUM_MAX) {
116 AUDIO_FUNC_LOGE("g_localAudioProxyAdapterNum is invalid!");
117 return AUDIO_HAL_ERR_INTERNAL;
118 }
119 if (g_localAudioProxyAdapterAddrOut != NULL) { // add for Fuzz
120 for (int index = 0; index < g_localAudioProxyAdapterNum; index++) {
121 if (&g_localAudioProxyAdapterAddrOut[index] == desc) {
122 descFlag = true;
123 break;
124 }
125 }
126 if (!descFlag) {
127 AUDIO_FUNC_LOGE("The proxy desc address passed in is invalid");
128 return AUDIO_HAL_ERR_INVALID_OBJECT;
129 }
130 }
131 AUDIO_FUNC_LOGI("adapter name %{public}s", desc->adapterName);
132 if (AudioAdapterExist(desc->adapterName)) {
133 AUDIO_FUNC_LOGE("adapter not exist, adapterName=%{public}s !", desc->adapterName);
134 return AUDIO_HAL_ERR_INVALID_PARAM;
135 }
136 if (AudioProxyPreprocessSBuf(data, reply) < 0) {
137 AUDIO_FUNC_LOGE("AudioProxyPreprocessSBuf failed!");
138 return AUDIO_HAL_ERR_INTERNAL;
139 }
140 if (!HdfRemoteServiceWriteInterfaceToken(remoteObj, *data)) {
141 AUDIO_FUNC_LOGE("write interface token failed");
142 return AUDIO_HAL_ERR_INTERNAL;
143 }
144 // adapterName
145 if (!HdfSbufWriteString(*data, desc->adapterName)) {
146 AUDIO_FUNC_LOGE("HdfSbufWriteString adapterName failed!");
147 return AUDIO_HAL_ERR_INTERNAL;
148 }
149 // dir
150 uint32_t tempDir = (uint32_t)desc->ports->dir;
151 if (!HdfSbufWriteUint32(*data, tempDir)) {
152 AUDIO_FUNC_LOGE("HdfSbufWriteString tempDir failed!");
153 return AUDIO_HAL_ERR_INTERNAL;
154 }
155 return AUDIO_HAL_SUCCESS;
156 }
157
GetAudioProxyAdapterFunc(struct AudioHwAdapter * hwAdapter)158 static int32_t GetAudioProxyAdapterFunc(struct AudioHwAdapter *hwAdapter)
159 {
160 if (hwAdapter == NULL) {
161 return HDF_FAILURE;
162 }
163 hwAdapter->common.InitAllPorts = AudioProxyAdapterInitAllPorts;
164 hwAdapter->common.CreateRender = AudioProxyAdapterCreateRender;
165 hwAdapter->common.DestroyRender = AudioProxyAdapterDestroyRender;
166 hwAdapter->common.CreateCapture = AudioProxyAdapterCreateCapture;
167 hwAdapter->common.DestroyCapture = AudioProxyAdapterDestroyCapture;
168 hwAdapter->common.GetPortCapability = AudioProxyAdapterGetPortCapability;
169 hwAdapter->common.SetPassthroughMode = AudioProxyAdapterSetPassthroughMode;
170 hwAdapter->common.GetPassthroughMode = AudioProxyAdapterGetPassthroughMode;
171 hwAdapter->common.SetMicMute = AudioProxyAdapterSetMicMute;
172 hwAdapter->common.GetMicMute = AudioProxyAdapterGetMicMute;
173 hwAdapter->common.SetVoiceVolume = AudioProxyAdapterSetVoiceVolume;
174 hwAdapter->common.SetExtraParams = AudioProxyAdapterSetExtraParams;
175 hwAdapter->common.GetExtraParams = AudioProxyAdapterGetExtraParams;
176 hwAdapter->common.UpdateAudioRoute = AudioProxyAdapterUpdateAudioRoute;
177 hwAdapter->common.ReleaseAudioRoute = AudioProxyAdapterReleaseAudioRoute;
178 return HDF_SUCCESS;
179 }
180
AudioProxyManagerLoadAdapterDispatch(struct AudioHwAdapter * hwAdapter,struct AudioProxyManager * proxyManager,const struct AudioAdapterDescriptor * desc,struct HdfSBuf * data,struct HdfSBuf * reply)181 static int32_t AudioProxyManagerLoadAdapterDispatch(struct AudioHwAdapter *hwAdapter,
182 struct AudioProxyManager *proxyManager, const struct AudioAdapterDescriptor *desc,
183 struct HdfSBuf *data, struct HdfSBuf *reply)
184 {
185 int32_t ret = AUDIO_HAL_SUCCESS;
186 if (hwAdapter == NULL || proxyManager == NULL || desc == NULL || data == NULL || reply == NULL) {
187 AUDIO_FUNC_LOGE("param is null!");
188 return AUDIO_HAL_ERR_INVALID_PARAM;
189 }
190
191 ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_MGR_LOAD_ADAPTER, data, reply);
192 if (ret < 0) {
193 AUDIO_FUNC_LOGE("Failed to send service call!!");
194 if (AudioDelAdapterAddrFromList((AudioHandle)(&hwAdapter->common))) {
195 AUDIO_FUNC_LOGE("The proxy Adapter or proxyRender not in MgrList");
196 }
197 return ret;
198 }
199 return AUDIO_HAL_SUCCESS;
200 }
201
AudioProxyManagerLoadAdapter(struct AudioManager * manager,const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter)202 int32_t AudioProxyManagerLoadAdapter(struct AudioManager *manager, const struct AudioAdapterDescriptor *desc,
203 struct AudioAdapter **adapter)
204 {
205 struct HdfSBuf *data = NULL;
206 struct HdfSBuf *reply = NULL;
207 if (manager == NULL || desc == NULL || adapter == NULL) {
208 AUDIO_FUNC_LOGE("param is null!");
209 return AUDIO_HAL_ERR_INVALID_PARAM;
210 }
211 struct AudioProxyManager *proxyManager = CONTAINER_OF(manager, struct AudioProxyManager, impl);
212 if ((&g_localAudioProxyMgr) != proxyManager || proxyManager == NULL || proxyManager->remote == NULL ||
213 proxyManager->audioMagic != AUDIO_MAGIC) {
214 AUDIO_FUNC_LOGE("proxyManager is invalid!");
215 return AUDIO_HAL_ERR_INVALID_PARAM;
216 }
217 struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)OsalMemCalloc(sizeof(struct AudioHwAdapter));
218 if (hwAdapter == NULL) {
219 AUDIO_FUNC_LOGE("alloc hwAdapter failed!");
220 return AUDIO_HAL_ERR_MALLOC_FAIL;
221 }
222 if (AudioProxyAdapterGetRemoteHandle(proxyManager, hwAdapter, desc->adapterName) < 0) {
223 AudioMemFree((void **)&hwAdapter);
224 return AUDIO_HAL_ERR_INVALID_PARAM;
225 }
226 int32_t ret = LoadAdapterPrepareParameters(hwAdapter->proxyRemoteHandle, desc, &data, &reply);
227 if (ret < 0) {
228 AudioProxyBufReplyRecycle(data, reply);
229 AudioMemFree((void **)&hwAdapter);
230 return ret;
231 }
232 if (GetAudioProxyAdapterFunc(hwAdapter) < 0) {
233 AudioProxyBufReplyRecycle(data, reply);
234 AudioMemFree((void **)&hwAdapter);
235 return AUDIO_HAL_ERR_INTERNAL;
236 }
237 hwAdapter->adapterDescriptor = *desc;
238 ret = AudioProxyManagerLoadAdapterDispatch(hwAdapter, proxyManager, desc, data, reply);
239 if (ret < 0) {
240 AudioProxyBufReplyRecycle(data, reply);
241 AudioMemFree((void **)&hwAdapter);
242 return ret;
243 }
244 *adapter = &hwAdapter->common;
245 AudioProxyBufReplyRecycle(data, reply);
246 return AUDIO_HAL_SUCCESS;
247 }
248
AudioProxyManagerUnloadAdapter(struct AudioManager * manager,struct AudioAdapter * adapter)249 void AudioProxyManagerUnloadAdapter(struct AudioManager *manager, struct AudioAdapter *adapter)
250 {
251 struct HdfSBuf *data = NULL;
252 struct HdfSBuf *reply = NULL;
253 if (manager == NULL || adapter == NULL) {
254 return;
255 }
256 int32_t ret = AUDIO_HAL_SUCCESS;
257
258 struct AudioProxyManager *proxyManager = CONTAINER_OF(manager, struct AudioProxyManager, impl);
259 struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
260 if ((&g_localAudioProxyMgr) != proxyManager || proxyManager == NULL ||
261 proxyManager->audioMagic != AUDIO_MAGIC || proxyManager->remote == NULL) {
262 return;
263 }
264 if (hwAdapter->portCapabilitys != NULL) {
265 uint32_t i = 0;
266 while (i < hwAdapter->adapterDescriptor.portNum) {
267 if (&hwAdapter->portCapabilitys[i] != NULL) {
268 AudioMemFree((void **)&hwAdapter->portCapabilitys[i].capability.subPorts);
269 }
270 i++;
271 }
272 AudioMemFree((void **)&hwAdapter->portCapabilitys);
273 }
274 if (AudioProxyPreprocessSBuf(&data, &reply) == AUDIO_HAL_SUCCESS) {
275 if (!HdfRemoteServiceWriteInterfaceToken(hwAdapter->proxyRemoteHandle, data)) {
276 AUDIO_FUNC_LOGE("write interface token failed");
277 AudioProxyBufReplyRecycle(data, reply);
278 return;
279 }
280 if (HdfSbufWriteString(data, hwAdapter->adapterDescriptor.adapterName)) {
281 ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_MGR_UNLOAD_ADAPTER, data, reply);
282 if (ret < 0) {
283 AUDIO_FUNC_LOGE("Send Server fail!");
284 }
285 }
286 AudioProxyBufReplyRecycle(data, reply);
287 }
288 if (AudioDelAdapterAddrFromList((AudioHandle)adapter) < 0) {
289 AUDIO_FUNC_LOGE("The proxy Adapter or proxyRender not in MgrList");
290 }
291 AudioMemFree((void **)&adapter);
292 return;
293 }
294
ReleaseProxyAudioManagerObject(struct AudioManager * object)295 static bool ReleaseProxyAudioManagerObject(struct AudioManager *object)
296 {
297 if (object == NULL) {
298 AUDIO_FUNC_LOGE("Input pointer is null!");
299 return false;
300 }
301 struct AudioProxyManager *proxyManager = CONTAINER_OF(object, struct AudioProxyManager, impl);
302 if ((&g_localAudioProxyMgr) != proxyManager ||
303 proxyManager == NULL || proxyManager->audioMagic != AUDIO_MAGIC) {
304 return false;
305 }
306 ReleaseAudioManagerObjectComm(&(proxyManager->impl));
307 audioProxyAdapterAddrMgrFlag = false;
308 return true;
309 }
310
ProxyAudioMgrConstruct(struct AudioProxyManager * proxyMgr)311 static void ProxyAudioMgrConstruct(struct AudioProxyManager *proxyMgr)
312 {
313 if (proxyMgr == NULL) {
314 AUDIO_FUNC_LOGE("Input pointer is null!");
315 return;
316 }
317 proxyMgr->impl.GetAllAdapters = AudioProxyManagerGetAllAdapters;
318 proxyMgr->impl.LoadAdapter = AudioProxyManagerLoadAdapter;
319 proxyMgr->impl.UnloadAdapter = AudioProxyManagerUnloadAdapter;
320 proxyMgr->impl.ReleaseAudioManagerObject = ReleaseProxyAudioManagerObject;
321 proxyMgr->audioMagic = AUDIO_MAGIC;
322 }
323
GetAudioManagerFuncs(void)324 struct AudioManager *GetAudioManagerFuncs(void)
325 {
326 AUDIO_FUNC_LOGI();
327 if (audioProxyAdapterAddrMgrFlag) {
328 AUDIO_FUNC_LOGE("audioProxyAdapterAddrMgrFlag is true.");
329 return (&(g_localAudioProxyMgr.impl));
330 }
331 struct HDIServiceManager *serviceMgr = HDIServiceManagerGet();
332 if (serviceMgr == NULL) {
333 AUDIO_FUNC_LOGE("HDIServiceManagerGet failed!");
334 return NULL;
335 }
336 (void)memset_s(&g_localAudioProxyMgr, sizeof(struct AudioProxyManager), 0, sizeof(struct AudioProxyManager));
337 g_localAudioProxyMgr.remote = serviceMgr->GetService(serviceMgr, HDI_SERVER_PRIMARY_NAME);
338 g_localAudioProxyMgr.usbRemote = serviceMgr->GetService(serviceMgr, HDI_SERVER_USB_NAME);
339 g_localAudioProxyMgr.a2dpRemote = serviceMgr->GetService(serviceMgr, HDI_SERVER_A2DP_NAME);
340 HDIServiceManagerRelease(serviceMgr);
341 if (g_localAudioProxyMgr.remote == NULL &&
342 g_localAudioProxyMgr.usbRemote == NULL &&
343 g_localAudioProxyMgr.a2dpRemote == NULL) {
344 AUDIO_FUNC_LOGE("Remote GetService failed!");
345 return NULL;
346 }
347 bool remoteRet = HdfRemoteServiceSetInterfaceDesc(g_localAudioProxyMgr.remote, "ohos.hdi.audio_service");
348 bool usbRemoteRet = HdfRemoteServiceSetInterfaceDesc(g_localAudioProxyMgr.usbRemote, "ohos.hdi.audio_service");
349 bool a2dpRemoteRet = HdfRemoteServiceSetInterfaceDesc(g_localAudioProxyMgr.a2dpRemote, "ohos.hdi.audio_service");
350 AUDIO_FUNC_LOGI("remoteRet=%{public}d, usbRemoteRet=%{public}d, a2dpRemoteRet=%{public}d",
351 remoteRet, usbRemoteRet, a2dpRemoteRet);
352 if (!remoteRet && !usbRemoteRet && !a2dpRemoteRet) {
353 AUDIO_FUNC_LOGE("failed to init interface desc!");
354 HdfRemoteServiceRecycle(g_localAudioProxyMgr.remote);
355 HdfRemoteServiceRecycle(g_localAudioProxyMgr.usbRemote);
356 HdfRemoteServiceRecycle(g_localAudioProxyMgr.a2dpRemote);
357 return NULL;
358 }
359
360 ProxyAudioMgrConstruct(&g_localAudioProxyMgr);
361
362 AudioAdapterAddrMgrInit(); // memset for Fuzz
363 audioProxyAdapterAddrMgrFlag = true;
364 return (&(g_localAudioProxyMgr.impl));
365 }
366