• 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 "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