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 <servmgr_hdi.h>
17 #include "audio_proxy_common.h"
18 #include "audio_proxy_internal.h"
19
20 #define HDI_SERVER_NAME "audio_hdi_service"
21 #define CONFIG_FRAME_SIZE (1024 * 2 * 1)
22 #define FRAME_SIZE 1024
23 #define CONFIG_FRAME_COUNT ((8000 * 2 * 1 + (CONFIG_FRAME_SIZE - 1)) / CONFIG_FRAME_SIZE)
24
AudioProxyManagerGetAllAdapters(struct AudioProxyManager * manager,struct AudioAdapterDescriptor ** descs,int * size)25 int32_t AudioProxyManagerGetAllAdapters(struct AudioProxyManager *manager,
26 struct AudioAdapterDescriptor **descs,
27 int *size)
28 {
29 LOG_FUN_INFO();
30 struct HdfSBuf *data = NULL;
31 struct HdfSBuf *reply = NULL;
32 int32_t ret;
33 if (manager == NULL || manager->remote == NULL || descs == NULL || size == NULL) {
34 return HDF_FAILURE;
35 }
36 if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
37 return HDF_FAILURE;
38 }
39 ret = AudioAdaptersForUser(descs, size);
40 if (ret < 0) {
41 AudioProxyBufReplyRecycle(data, reply);
42 LOG_FUN_ERR("AudioAdaptersForUser FAIL!");
43 return ret;
44 }
45 ret = AudioProxyDispatchCall(manager->remote, AUDIO_HDI_MGR_GET_ALL_ADAPTER, data, reply);
46 if (ret != HDF_SUCCESS) {
47 AudioProxyBufReplyRecycle(data, reply);
48 LOG_FUN_ERR("Failed to send service call!");
49 return ret;
50 }
51 AudioProxyBufReplyRecycle(data, reply);
52 return HDF_SUCCESS;
53 }
54
AudioProxyManagerLoadAdapter(struct AudioProxyManager * manager,const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter)55 int32_t AudioProxyManagerLoadAdapter(struct AudioProxyManager *manager, const struct AudioAdapterDescriptor *desc,
56 struct AudioAdapter **adapter)
57 {
58 LOG_FUN_INFO();
59 struct HdfSBuf *data = NULL;
60 struct HdfSBuf *reply = NULL;
61
62 if (manager == NULL || manager->remote == NULL || desc == NULL ||
63 desc->adapterName == NULL || desc->ports == NULL || adapter == NULL) {
64 return HDF_FAILURE;
65 }
66 if (AudioAdapterExist(desc->adapterName)) {
67 return HDF_FAILURE;
68 }
69 if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
70 return HDF_FAILURE;
71 }
72 // adapterName
73 if (!HdfSbufWriteString(data, desc->adapterName)) {
74 AudioProxyBufReplyRecycle(data, reply);
75 return HDF_FAILURE;
76 }
77 // dir
78 uint32_t tempDir = (uint32_t)desc->ports->dir;
79 if (!HdfSbufWriteUint32(data, tempDir)) {
80 AudioProxyBufReplyRecycle(data, reply);
81 return HDF_FAILURE;
82 }
83 struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)calloc(1, sizeof(struct AudioHwAdapter));
84 if (hwAdapter == NULL) {
85 AudioProxyBufReplyRecycle(data, reply);
86 return HDF_FAILURE;
87 }
88 int32_t ret;
89 ret = AudioProxyDispatchCall(manager->remote, AUDIO_HDI_MGR_LOAD_ADAPTER, data, reply);
90 if (ret < 0) {
91 LOG_FUN_ERR("Failed to send service call!!");
92 AudioProxyBufReplyRecycle(data, reply);
93 AudioMemFree((void **)&hwAdapter);
94 return ret;
95 }
96 /* check return result from server first */
97 hwAdapter->common.InitAllPorts = AudioProxyAdapterInitAllPorts;
98 hwAdapter->common.CreateRender = AudioProxyAdapterCreateRender;
99 hwAdapter->common.DestroyRender = AudioProxyAdapterDestroyRender;
100 hwAdapter->common.CreateCapture = AudioProxyAdapterCreateCapture;
101 hwAdapter->common.DestroyCapture = AudioProxyAdapterDestroyCapture;
102 hwAdapter->common.GetPortCapability = AudioProxyAdapterGetPortCapability;
103 hwAdapter->common.SetPassthroughMode = AudioProxyAdapterSetPassthroughMode;
104 hwAdapter->common.GetPassthroughMode = AudioProxyAdapterGetPassthroughMode;
105 hwAdapter->adapterDescriptor = *desc;
106 hwAdapter->proxyRemoteHandle = manager->remote; // get dispatch Server
107 *adapter = &hwAdapter->common;
108 AudioProxyBufReplyRecycle(data, reply);
109 LOG_FUN_INFO();
110 return HDF_SUCCESS;
111 }
112
AudioProxyManagerUnloadAdapter(struct AudioProxyManager * manager,struct AudioAdapter * adapter)113 void AudioProxyManagerUnloadAdapter(struct AudioProxyManager *manager, struct AudioAdapter *adapter)
114 {
115 struct HdfSBuf *data = NULL;
116 struct HdfSBuf *reply = NULL;
117 const char *adapterName = NULL;
118 int32_t i = 0;
119 int32_t portNum;
120 struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
121 if (manager == NULL || manager->remote == NULL || adapter == NULL) {
122 return;
123 }
124 if (hwAdapter->portCapabilitys != NULL) {
125 portNum = hwAdapter->adapterDescriptor.portNum;
126 while (i < portNum) {
127 if (&hwAdapter->portCapabilitys[i] != NULL) {
128 AudioMemFree((void **)&hwAdapter->portCapabilitys[i].capability.subPorts);
129 }
130 i++;
131 }
132 AudioMemFree((void **)&hwAdapter->portCapabilitys);
133 }
134 if (AudioProxyPreprocessSBuf(&data, &reply) == HDF_SUCCESS) {
135 adapterName = hwAdapter->adapterDescriptor.adapterName;
136 if (HdfSbufWriteString(data, adapterName)) {
137 int32_t ret = AudioProxyDispatchCall(manager->remote, AUDIO_HDI_MGR_UNLOAD_ADAPTER, data, reply);
138 if (ret < 0) {
139 LOG_FUN_ERR("Send Server fail!");
140 }
141 }
142 AudioProxyBufReplyRecycle(data, reply);
143 }
144 AudioMemFree((void **)&adapter);
145 return;
146 }
147
ProxyMgrConstruct(struct AudioProxyManager * proxyMgr)148 static void ProxyMgrConstruct(struct AudioProxyManager *proxyMgr)
149 {
150 proxyMgr->GetAllAdapters = AudioProxyManagerGetAllAdapters;
151 proxyMgr->LoadAdapter = AudioProxyManagerLoadAdapter;
152 proxyMgr->UnloadAdapter = AudioProxyManagerUnloadAdapter;
153 }
154
GetAudioProxyManagerFuncs(void)155 struct AudioProxyManager *GetAudioProxyManagerFuncs(void)
156 {
157 LOG_FUN_INFO();
158 struct HDIServiceManager *serviceMgr = HDIServiceManagerGet();
159 if (serviceMgr == NULL) {
160 LOG_FUN_ERR("HDIServiceManagerGet failed!");
161 return NULL;
162 }
163 struct HdfRemoteService *remote = serviceMgr->GetService(serviceMgr, HDI_SERVER_NAME);
164 if (remote == NULL) {
165 LOG_FUN_ERR("Remote GetService failed!");
166 HDIServiceManagerRelease(serviceMgr);
167 return NULL;
168 }
169 HDIServiceManagerRelease(serviceMgr);
170 struct AudioProxyManager *proxyDevMgr = OsalMemAlloc(sizeof(struct AudioProxyManager));
171 if (proxyDevMgr == NULL) {
172 LOG_FUN_ERR("malloc failed!");
173 HdfRemoteServiceRecycle(remote);
174 return NULL;
175 }
176 ProxyMgrConstruct(proxyDevMgr);
177 proxyDevMgr->remote = remote;
178 return proxyDevMgr;
179 }
180
181