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