• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2023 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 
16 #include "hdf_audio_server_manager.h"
17 #include "audio_adapter_info_common.h"
18 #include "audio_uhdf_log.h"
19 #include "osal_mem.h"
20 
21 #define MAX_AUDIO_ADAPTER_NUM_SERVER 8 // Limit the number of sound cards supported to a maximum of 8
22 #define MANAGER_ADAPTER_NAME_LEN     32
23 
24 static struct AudioInfoInAdapter g_renderAndCaptureManage[MAX_AUDIO_ADAPTER_NUM_SERVER];
25 static int32_t g_serverAdapterNum = 0;
26 
AudioServerGetAdapterNum(void)27 int32_t AudioServerGetAdapterNum(void)
28 {
29     return g_serverAdapterNum;
30 }
31 
AudioInfoInAdapterFindDesc(int32_t index,const char * adapterName)32 static int32_t AudioInfoInAdapterFindDesc(int32_t index, const char *adapterName)
33 {
34     if (adapterName == NULL) {
35         AUDIO_FUNC_LOGE("adapterName is NULL");
36         return HDF_ERR_INVALID_PARAM;
37     }
38 
39     for (int i = 0; i < g_serverAdapterNum; i++) {
40         if (g_renderAndCaptureManage[i].adapterName == NULL) {
41             AUDIO_FUNC_LOGW("g_renderAndCaptureManage[%{public}d].adapterName is NULL", i);
42             continue;
43         }
44         if (strncmp(g_renderAndCaptureManage[i].adapterName, adapterName, strlen(adapterName)) == 0) {
45             if (i != index) {
46                 (void)memcpy_s(&g_renderAndCaptureManage[index], sizeof(struct AudioInfoInAdapter),
47                     &g_renderAndCaptureManage[i], sizeof(struct AudioInfoInAdapter));
48                 (void)memset_s(&g_renderAndCaptureManage[i], sizeof(struct AudioInfoInAdapter),
49                     0, sizeof(struct AudioInfoInAdapter));
50             }
51             return HDF_SUCCESS;
52         }
53     }
54 
55     return HDF_FAILURE;
56 }
57 
AudioAdapterInfoInit(struct AudioInfoInAdapter * adapterManage,const char * adapterName)58 static int32_t AudioAdapterInfoInit(struct AudioInfoInAdapter *adapterManage, const char *adapterName)
59 {
60     if (adapterManage == NULL || adapterName == NULL) {
61         AUDIO_FUNC_LOGE("Parameter error! ");
62         return HDF_ERR_INVALID_PARAM;
63     }
64 
65     if (adapterManage->adapterName != NULL) {
66         AUDIO_FUNC_LOGI("adapterManage->adapterName = %{public}s", adapterManage->adapterName);
67     } else {
68         adapterManage->adapterName = (char *)OsalMemCalloc(MANAGER_ADAPTER_NAME_LEN);
69     }
70 
71     if (adapterManage->adapterName == NULL) {
72         AUDIO_FUNC_LOGE("alloc adapter name failed!");
73         return HDF_FAILURE;
74     }
75 
76     int32_t ret = memcpy_s((void *)adapterManage->adapterName, MANAGER_ADAPTER_NAME_LEN,
77         adapterName, strlen(adapterName));
78     if (ret != EOK) {
79         AUDIO_FUNC_LOGE("memcpy adapter name fail!");
80         OsalMemFree((void *)&adapterManage->adapterName);
81         return HDF_FAILURE;
82     }
83 
84     adapterManage->adapter = NULL;
85     adapterManage->adapterUserNum = 0;
86     adapterManage->renderStatus = 0;
87     adapterManage->renderPriority = -1;
88     adapterManage->render = NULL;
89     adapterManage->renderBusy = false;
90     adapterManage->renderDestory = false;
91     adapterManage->renderPid = 0;
92     adapterManage->captureStatus = 0;
93     adapterManage->capturePriority = -1;
94     adapterManage->capture = NULL;
95     adapterManage->captureBusy = false;
96     adapterManage->captureDestory = false;
97     adapterManage->capturePid = 0;
98 
99     return HDF_SUCCESS;
100 }
101 
AdapterManageInit(const struct AudioAdapterDescriptor * descs,int32_t num)102 int32_t AdapterManageInit(const struct AudioAdapterDescriptor *descs, int32_t num)
103 {
104     int32_t index = 0;
105     if (descs == NULL || num <= 0) {
106         HDF_LOGE("Invaild parameters: num=%{public}d", num);
107         return HDF_FAILURE;
108     }
109     struct AudioInfoInAdapter *adapterManage = g_renderAndCaptureManage;
110 
111     for (index = 0; index < num; index++) {
112         if (AudioInfoInAdapterFindDesc(index, descs[index].adapterName) != HDF_SUCCESS) {
113             if (AudioAdapterInfoInit(&adapterManage[index], descs[index].adapterName)) {
114                 return HDF_FAILURE;
115             }
116         }
117     }
118 
119     g_serverAdapterNum = num;
120     return HDF_SUCCESS;
121 }
122 
ServerManageGetAdapterNum(int32_t serverAdapterNum)123 int32_t ServerManageGetAdapterNum(int32_t serverAdapterNum)
124 {
125     return ((serverAdapterNum > MAX_AUDIO_ADAPTER_NUM_SERVER) ? MAX_AUDIO_ADAPTER_NUM_SERVER : serverAdapterNum);
126 }
127 
AdaptersServerManageRelease(struct AudioInfoInAdapter * adaptersManage,int32_t num)128 static void AdaptersServerManageRelease(struct AudioInfoInAdapter *adaptersManage, int32_t num)
129 {
130     int32_t i;
131 
132     if (adaptersManage == NULL || num <= 0) {
133         AUDIO_FUNC_LOGE("Parameter error! ");
134 
135         return;
136     }
137     num = ServerManageGetAdapterNum(num);
138     for (i = 0; i < num; i++) {
139         if (adaptersManage[i].adapterName != NULL) {
140             OsalMemFree((void *)&adaptersManage[i].adapterName);
141         }
142     }
143 
144     (void)memset_s(adaptersManage, MAX_AUDIO_ADAPTER_NUM_SERVER * sizeof(struct AudioInfoInAdapter),
145         0, MAX_AUDIO_ADAPTER_NUM_SERVER * sizeof(struct AudioInfoInAdapter));
146 }
147 
AdaptersServerManageInfomationRecycle(void)148 void AdaptersServerManageInfomationRecycle(void)
149 {
150     AdaptersServerManageRelease(g_renderAndCaptureManage, g_serverAdapterNum);
151     g_serverAdapterNum = 0;
152 }
153 
AudioAdapterListGetAdapterCapture(const char * adapterName,struct AudioAdapter ** adapter,struct AudioCapture ** capture)154 int32_t AudioAdapterListGetAdapterCapture(const char *adapterName,
155     struct AudioAdapter **adapter, struct AudioCapture **capture)
156 {
157     int32_t i;
158 
159     if (adapterName == NULL || adapter == NULL || capture == NULL) {
160         AUDIO_FUNC_LOGE("The pointer is null ");
161         return HDF_ERR_INVALID_PARAM;
162     }
163 
164     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
165     for (i = 0; i < num; i++) {
166         if (g_renderAndCaptureManage[i].adapterName == NULL) {
167             AUDIO_FUNC_LOGE("The pointer is null ");
168             return HDF_ERR_INVALID_PARAM;
169         }
170         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
171             *adapter = g_renderAndCaptureManage[i].adapter;
172             *capture = g_renderAndCaptureManage[i].capture;
173             return HDF_SUCCESS;
174         }
175     }
176     return HDF_ERR_INVALID_PARAM;
177 }
178 
AudioDestroyCaptureInfoInAdapter(const char * adapterName)179 int32_t AudioDestroyCaptureInfoInAdapter(const char *adapterName)
180 {
181     int32_t i;
182 
183     if (adapterName == NULL) {
184         AUDIO_FUNC_LOGE("Param Is NULL ");
185         return HDF_FAILURE;
186     }
187 
188     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
189     for (i = 0; i < num; i++) {
190         if (g_renderAndCaptureManage[i].adapterName == NULL) {
191             return HDF_FAILURE;
192         }
193         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
194             g_renderAndCaptureManage[i].captureStatus = 0;
195             g_renderAndCaptureManage[i].capturePriority = -1;
196             g_renderAndCaptureManage[i].capture = NULL;
197             g_renderAndCaptureManage[i].capturePid = 0;
198             return HDF_SUCCESS;
199         }
200     }
201     AUDIO_FUNC_LOGE("Can not find Adapter! ");
202     return HDF_FAILURE;
203 }
204 
AudioDestroyFormerCapture(struct AudioInfoInAdapter * captureManage)205 static int32_t AudioDestroyFormerCapture(struct AudioInfoInAdapter *captureManage)
206 {
207     if (captureManage == NULL || captureManage->adapter == NULL || captureManage->capture == NULL) {
208         AUDIO_FUNC_LOGE("input para is NULL ");
209         return HDF_FAILURE;
210     }
211     int count = 0;
212     captureManage->captureDestory = true;
213     while (captureManage->captureBusy) {
214         if (count > 1000) { // Less than 1000
215             AUDIO_FUNC_LOGE(", count = %{public}d", count);
216             captureManage->captureDestory = false;
217             return AUDIO_HAL_ERR_AI_BUSY; // capture is busy now
218         }
219         usleep(500); // sleep 500us
220         count++;
221     }
222     captureManage->capturePid = 0;
223     if (captureManage->adapter->DestroyCapture(captureManage->adapter, captureManage->capture)) {
224         captureManage->captureDestory = false;
225         return HDF_FAILURE;
226     }
227     captureManage->capture = NULL;
228     captureManage->captureStatus = 0;
229     captureManage->captureBusy = false;
230     captureManage->captureDestory = false;
231     captureManage->renderPriority = -1;
232     return HDF_SUCCESS;
233 }
234 
AudioJudgeCapturePriority(const int32_t priority,int which)235 static int32_t AudioJudgeCapturePriority(const int32_t priority, int which)
236 {
237     int num = ServerManageGetAdapterNum(g_serverAdapterNum);
238     if (which < 0 || which >= num) {
239         AUDIO_FUNC_LOGE("invalid value! ");
240         return HDF_FAILURE;
241     }
242     if (!(g_renderAndCaptureManage[which].captureStatus)) {
243         return HDF_SUCCESS;
244     } else {
245         if (g_renderAndCaptureManage[which].capturePriority <= priority) {
246             return AudioDestroyFormerCapture(&g_renderAndCaptureManage[which]);
247         } else {
248             return AUDIO_HAL_ERR_AI_BUSY; // capture is busy now
249         }
250     }
251     return HDF_FAILURE;
252 }
253 
AudioCreatCaptureCheck(const char * adapterName,const int32_t priority)254 int32_t AudioCreatCaptureCheck(const char *adapterName, const int32_t priority)
255 {
256     int32_t i;
257 
258     if (adapterName == NULL) {
259         AUDIO_FUNC_LOGE("adapterName is NULL! ");
260         return HDF_FAILURE;
261     }
262     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
263     for (i = 0; i < num; i++) {
264         if (g_renderAndCaptureManage[i].adapterName == NULL) {
265             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
266             return HDF_FAILURE;
267         }
268         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
269             return AudioJudgeCapturePriority(priority, i);
270         }
271     }
272     AUDIO_FUNC_LOGE("Can not find Adapter! ");
273     return HDF_FAILURE;
274 }
275 
AudioAddCaptureInfoInAdapter(const char * adapterName,struct AudioCapture * capture,const struct AudioAdapter * adapter,const int32_t priority,uint32_t capturePid)276 int32_t AudioAddCaptureInfoInAdapter(const char *adapterName, struct AudioCapture *capture,
277     const struct AudioAdapter *adapter, const int32_t priority, uint32_t capturePid)
278 {
279     int32_t i;
280 
281     if (adapterName == NULL || adapter == NULL || capture == NULL) {
282         AUDIO_FUNC_LOGE("input para is NULL. ");
283         return HDF_FAILURE;
284     }
285     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
286     for (i = 0; i < num; i++) {
287         if (g_renderAndCaptureManage[i].adapterName == NULL) {
288             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
289             return HDF_FAILURE;
290         }
291         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
292             g_renderAndCaptureManage[i].captureStatus = 1;
293             g_renderAndCaptureManage[i].capturePriority = priority;
294             g_renderAndCaptureManage[i].capture = capture;
295             g_renderAndCaptureManage[i].capturePid = capturePid;
296             return HDF_SUCCESS;
297         }
298     }
299     AUDIO_FUNC_LOGE("Can not find Adapter! ");
300     return HDF_FAILURE;
301 }
302 
AudioAdapterListGetAdapter(const char * adapterName,struct AudioAdapter ** adapter)303 int32_t AudioAdapterListGetAdapter(const char *adapterName, struct AudioAdapter **adapter)
304 {
305     int32_t i;
306 
307     AUDIO_FUNC_LOGI();
308     if (adapterName == NULL || adapter == NULL) {
309         AUDIO_FUNC_LOGE("The pointer is null ");
310         return HDF_ERR_INVALID_PARAM;
311     }
312 
313     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
314     for (i = 0; i < num; i++) {
315         if (g_renderAndCaptureManage[i].adapterName == NULL) {
316             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
317             return HDF_ERR_INVALID_PARAM;
318         }
319         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
320             *adapter = g_renderAndCaptureManage[i].adapter;
321             return HDF_SUCCESS;
322         }
323     }
324     return HDF_ERR_INVALID_PARAM;
325 }
326 
AudioDestroyFormerRender(struct AudioInfoInAdapter * renderManage)327 static int32_t AudioDestroyFormerRender(struct AudioInfoInAdapter *renderManage)
328 {
329     AUDIO_FUNC_LOGI();
330     if (renderManage == NULL || renderManage->adapter == NULL || renderManage->render == NULL) {
331         AUDIO_FUNC_LOGE("input para is NULL. ");
332         return HDF_FAILURE;
333     }
334     int count = 0;
335     renderManage->renderDestory = true;
336     while (renderManage->renderBusy) {
337         if (count > 1000) { // Less than 1000
338             AUDIO_FUNC_LOGE(", count = %{public}d", count);
339             renderManage->renderDestory = false;
340             return AUDIO_HAL_ERR_AO_BUSY; // render is busy now
341         }
342         usleep(500); // sleep 500us
343         count++;
344     }
345     renderManage->renderPid = 0;
346     if (renderManage->adapter->DestroyRender(renderManage->adapter, renderManage->render)) {
347         renderManage->renderDestory = false;
348         return HDF_FAILURE;
349     }
350     renderManage->render = NULL;
351     renderManage->renderStatus = 0;
352     renderManage->renderBusy = false;
353     renderManage->renderDestory = false;
354     renderManage->renderPriority = -1;
355     return HDF_SUCCESS;
356 }
357 
AudioJudgeRenderPriority(const int32_t priority,int which)358 static int32_t AudioJudgeRenderPriority(const int32_t priority, int which)
359 {
360     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
361     if (which < 0 || which >= num) {
362         AUDIO_FUNC_LOGE("invalid value! ");
363         return HDF_FAILURE;
364     }
365     if (g_renderAndCaptureManage[which].renderPriority <= priority) {
366         if (AudioDestroyFormerRender(&g_renderAndCaptureManage[which])) {
367             AUDIO_FUNC_LOGE("AudioDestroyFormerRender: Fail. ");
368             return HDF_FAILURE;
369         }
370         return HDF_SUCCESS;
371     } else {
372         return AUDIO_HAL_ERR_AO_BUSY; // render is busy now
373     }
374     return HDF_FAILURE;
375 }
376 
AudioCreatRenderCheck(const char * adapterName,const int32_t priority)377 int32_t AudioCreatRenderCheck(const char *adapterName, const int32_t priority)
378 {
379     int32_t i;
380 
381     if (adapterName == NULL) {
382         return HDF_FAILURE;
383     }
384 
385     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
386     for (i = 0; i < num; i++) {
387         if (g_renderAndCaptureManage[i].adapterName == NULL) {
388             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
389             return HDF_FAILURE;
390         }
391         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
392             if (!(g_renderAndCaptureManage[i].renderStatus)) {
393                 return HDF_SUCCESS;
394             } else {
395                 return AudioJudgeRenderPriority(priority, i);
396             }
397         }
398     }
399     AUDIO_FUNC_LOGE("Can not find Adapter! ");
400     return HDF_FAILURE;
401 }
402 
AudioAddRenderInfoInAdapter(const char * adapterName,struct AudioRender * render,const struct AudioAdapter * adapter,const int32_t priority,uint32_t renderPid)403 int32_t AudioAddRenderInfoInAdapter(const char *adapterName, struct AudioRender *render,
404     const struct AudioAdapter *adapter, const int32_t priority, uint32_t renderPid)
405 {
406     int32_t i;
407 
408     if (adapterName == NULL || adapter == NULL || render == NULL) {
409         AUDIO_FUNC_LOGE("input para is NULL. ");
410         return HDF_FAILURE;
411     }
412     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
413     for (i = 0; i < num; i++) {
414         if (g_renderAndCaptureManage[i].adapterName == NULL) {
415             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
416             return HDF_FAILURE;
417         }
418         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
419             g_renderAndCaptureManage[i].renderStatus = 1;
420             g_renderAndCaptureManage[i].renderPriority = priority;
421             g_renderAndCaptureManage[i].render = render;
422             g_renderAndCaptureManage[i].renderPid = renderPid;
423             return HDF_SUCCESS;
424         }
425     }
426     AUDIO_FUNC_LOGE("Can not find Adapter! ");
427     return HDF_FAILURE;
428 }
429 
AudioSetRenderStatus(const char * adapterName,bool renderStatus)430 void AudioSetRenderStatus(const char *adapterName, bool renderStatus)
431 {
432     int32_t i;
433     if (adapterName == NULL) {
434         AUDIO_FUNC_LOGE("adapterName is null ");
435         return;
436     }
437 
438     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
439     for (i = 0; i < num; i++) {
440         if (g_renderAndCaptureManage[i].adapterName == NULL) {
441             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
442             return;
443         }
444         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
445             g_renderAndCaptureManage[i].renderBusy = renderStatus;
446             return;
447         }
448     }
449     AUDIO_FUNC_LOGE("AudioDestroyRenderInfoInAdapter: Can not find Adapter! ");
450     return;
451 }
452 
AudioGetRenderStatus(const char * adapterName)453 int32_t AudioGetRenderStatus(const char *adapterName)
454 {
455     int32_t i;
456 
457     if (adapterName == NULL) {
458         return HDF_FAILURE;
459     }
460 
461     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
462     for (i = 0; i < num; i++) {
463         if (g_renderAndCaptureManage[i].adapterName == NULL) {
464             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL!", i);
465             return HDF_FAILURE;
466         }
467         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
468             if (!g_renderAndCaptureManage[i].renderDestory) {
469                 return HDF_SUCCESS;
470             } else {
471                 g_renderAndCaptureManage[i].renderBusy = false;
472                 AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].renderBusy is NULL!", i);
473                 return HDF_FAILURE;
474             }
475         }
476     }
477     AUDIO_FUNC_LOGE("AudioDestroyRenderInfoInAdapter: Can not find Adapter!");
478     return HDF_FAILURE;
479 }
480 
AudioDestroyRenderInfoInAdapter(const char * adapterName)481 int32_t AudioDestroyRenderInfoInAdapter(const char *adapterName)
482 {
483     int32_t i;
484 
485     if (adapterName == NULL) {
486         AUDIO_FUNC_LOGE("adapterName is null ");
487         return HDF_FAILURE;
488     }
489 
490     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
491     for (i = 0; i < num; i++) {
492         if (g_renderAndCaptureManage[i].adapterName == NULL) {
493             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
494             return HDF_FAILURE;
495         }
496         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
497             g_renderAndCaptureManage[i].renderStatus = 0;
498             g_renderAndCaptureManage[i].renderPriority = -1;
499             g_renderAndCaptureManage[i].render = NULL;
500             g_renderAndCaptureManage[i].renderPid = 0;
501             return HDF_SUCCESS;
502         }
503     }
504     AUDIO_FUNC_LOGE("Can not find Adapter! ");
505     return HDF_FAILURE;
506 }
507 
AudioAdapterListGetAdapterRender(const char * adapterName,struct AudioAdapter ** adapter,struct AudioRender ** render)508 int32_t AudioAdapterListGetAdapterRender(const char *adapterName,
509     struct AudioAdapter **adapter, struct AudioRender **render)
510 {
511     int32_t i;
512 
513     if (adapterName == NULL || adapter == NULL || render == NULL) {
514         AUDIO_FUNC_LOGE("The pointer is null ");
515         return HDF_ERR_INVALID_PARAM;
516     }
517 
518     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
519     for (i = 0; i < num; i++) {
520         if (g_renderAndCaptureManage[i].adapterName == NULL) {
521             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
522             return HDF_ERR_INVALID_PARAM;
523         }
524         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
525             *adapter = g_renderAndCaptureManage[i].adapter;
526             *render = g_renderAndCaptureManage[i].render;
527             return HDF_SUCCESS;
528         }
529     }
530     AUDIO_FUNC_LOGE("AudioAdapterListGetAdapterRender failed!");
531     return HDF_ERR_INVALID_PARAM;
532 }
533 
AudioAdapterListGetRender(const char * adapterName,struct AudioRender ** render,uint32_t pid)534 int32_t AudioAdapterListGetRender(const char *adapterName, struct AudioRender **render, uint32_t pid)
535 {
536     if (adapterName == NULL || render == NULL) {
537         AUDIO_FUNC_LOGE("pointer is null ");
538         return HDF_ERR_INVALID_PARAM;
539     }
540     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
541     for (int32_t i = 0; i < num; i++) {
542         if (g_renderAndCaptureManage[i].adapterName == NULL) {
543             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
544             return HDF_ERR_INVALID_PARAM;
545         }
546         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
547             if (g_renderAndCaptureManage[i].renderPid != pid) {
548                 AUDIO_FUNC_LOGE("[%{public}d].renderPid:%{public}d != pid:%{public}d ", i,
549                     g_renderAndCaptureManage[i].renderPid, pid);
550                 return AUDIO_HAL_ERR_INVALID_OBJECT;
551             }
552             *render = g_renderAndCaptureManage[i].render;
553             return HDF_SUCCESS;
554         }
555     }
556     AUDIO_FUNC_LOGE("AudioAdapterListGetRender failed!");
557     return HDF_ERR_INVALID_PARAM;
558 }
559 
AudioAdapterListGetCapture(const char * adapterName,struct AudioCapture ** capture,uint32_t pid)560 int32_t AudioAdapterListGetCapture(const char *adapterName, struct AudioCapture **capture, uint32_t pid)
561 {
562     int32_t i;
563     if (adapterName == NULL || capture == NULL) {
564         AUDIO_FUNC_LOGE("The pointer is null");
565         return HDF_ERR_INVALID_PARAM;
566     }
567     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
568     for (i = 0; i < num; i++) {
569         if (g_renderAndCaptureManage[i].adapterName == NULL) {
570             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
571             return HDF_ERR_INVALID_PARAM;
572         }
573         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
574             if (g_renderAndCaptureManage[i].capturePid != pid) {
575                 AUDIO_FUNC_LOGE("managerList[%{public}d].capturePid:%{public}d != pid:%{public}d ", i,
576                     g_renderAndCaptureManage[i].capturePid, pid);
577                 return AUDIO_HAL_ERR_INVALID_OBJECT;
578             }
579             *capture = g_renderAndCaptureManage[i].capture;
580             return HDF_SUCCESS;
581         }
582     }
583     AUDIO_FUNC_LOGE("AudioAdapterListGetCapture failed!");
584     return HDF_ERR_INVALID_PARAM;
585 }
586 
AudioAdapterFrameGetCapture(const char * adapterName,struct AudioCapture ** capture,uint32_t pid,uint32_t * index)587 int32_t AudioAdapterFrameGetCapture(const char *adapterName,
588     struct AudioCapture **capture, uint32_t pid, uint32_t *index)
589 {
590     int32_t i;
591     if (adapterName == NULL || capture == NULL || index == NULL) {
592         AUDIO_FUNC_LOGE("The pointer is null");
593         return HDF_ERR_INVALID_PARAM;
594     }
595     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
596     *index = MAX_AUDIO_ADAPTER_NUM_SERVER;
597     for (i = 0; i < num; i++) {
598         if (g_renderAndCaptureManage[i].adapterName == NULL) {
599             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
600             return HDF_ERR_INVALID_PARAM;
601         }
602         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
603             if (g_renderAndCaptureManage[i].capturePid != pid) {
604                 AUDIO_FUNC_LOGE("[%{public}d].capturePid: %{public}d != pid: %{public}d ", i,
605                     g_renderAndCaptureManage[i].capturePid, pid);
606                 return AUDIO_HAL_ERR_INVALID_OBJECT;
607             }
608             if (!g_renderAndCaptureManage[i].captureDestory) {
609                 *capture = g_renderAndCaptureManage[i].capture;
610                 *index = i;
611                 return HDF_SUCCESS;
612             } else {
613                 g_renderAndCaptureManage[i].captureBusy = false;
614                 AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].captureBusy is false! ", i);
615                 return HDF_FAILURE;
616             }
617         }
618     }
619     AUDIO_FUNC_LOGE("AudioAdapterFrameGetCapture failed!");
620     return HDF_FAILURE;
621 }
622 
AudioAdapterCheckListExist(const char * adapterName)623 int32_t AudioAdapterCheckListExist(const char *adapterName)
624 {
625     int32_t i;
626 
627     if (adapterName == NULL) {
628         AUDIO_FUNC_LOGE("The pointer is null.");
629         return AUDIO_HAL_ERR_INVALID_PARAM;
630     }
631 
632     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
633     for (i = 0; i < num; i++) {
634         if (g_renderAndCaptureManage[i].adapterName == NULL) {
635             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
636             return AUDIO_HAL_ERR_INVALID_PARAM;
637         }
638         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
639             if (g_renderAndCaptureManage[i].adapterUserNum == 0) {
640                 AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterUserNum is zero! ", i);
641                 return AUDIO_HAL_ERR_INTERNAL;
642             } else if (g_renderAndCaptureManage[i].adapterUserNum > 0) {
643                 g_renderAndCaptureManage[i].adapterUserNum++;
644                 return AUDIO_HAL_SUCCESS;
645             }
646         }
647     }
648     AUDIO_FUNC_LOGE("AudioAdapterCheckListExist failed!");
649     return AUDIO_HAL_ERR_INVALID_PARAM;
650 }
651 
AudioAdapterListDestory(const char * adapterName,struct AudioAdapter ** adapter)652 int32_t AudioAdapterListDestory(const char *adapterName, struct AudioAdapter **adapter)
653 {
654     int32_t i;
655     if (adapter == NULL || adapterName == NULL) {
656         AUDIO_FUNC_LOGE("adapter or adapterName is NULL.");
657         return AUDIO_HAL_ERR_INVALID_PARAM;
658     }
659 
660     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
661     for (i = 0; i < num; i++) {
662         if (g_renderAndCaptureManage[i].adapterName == NULL) {
663             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
664             return AUDIO_HAL_ERR_INVALID_PARAM;
665         }
666         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
667             if (g_renderAndCaptureManage[i].adapterUserNum == 1) {
668                 g_renderAndCaptureManage[i].adapterUserNum--;
669                 *adapter = g_renderAndCaptureManage[i].adapter;
670                 g_renderAndCaptureManage[i].adapter = NULL;
671                 return AUDIO_HAL_SUCCESS;
672             } else if (g_renderAndCaptureManage[i].adapterUserNum > 1) {
673                 g_renderAndCaptureManage[i].adapterUserNum--;
674                 AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterUserNum > 1! ", i);
675                 return AUDIO_HAL_ERR_INTERNAL;
676             }
677         }
678     }
679     AUDIO_FUNC_LOGE("AudioAdapterListDestory failed!");
680     return AUDIO_HAL_ERR_INVALID_PARAM;
681 }
682 
AudioAdapterListAdd(const char * adapterName,struct AudioAdapter * adapter)683 int32_t AudioAdapterListAdd(const char *adapterName, struct AudioAdapter *adapter)
684 {
685     int32_t i;
686 
687     if (adapterName == NULL || adapter == NULL) {
688         AUDIO_FUNC_LOGE("adapterName is NULL. ");
689         return HDF_ERR_INVALID_PARAM;
690     }
691     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
692     for (i = 0; i < num; i++) {
693         if (g_renderAndCaptureManage[i].adapterName == NULL) {
694             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
695             return HDF_ERR_INVALID_PARAM;
696         }
697         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
698             g_renderAndCaptureManage[i].adapter = adapter;
699             g_renderAndCaptureManage[i].adapterUserNum = 1;
700             return HDF_SUCCESS;
701         }
702     }
703     AUDIO_FUNC_LOGE("AudioAdapterListAdd failed!");
704     return HDF_ERR_INVALID_PARAM;
705 }
706 
AudioSetCaptureStatus(const char * adapterName,bool captureStatus)707 void AudioSetCaptureStatus(const char *adapterName, bool captureStatus)
708 {
709     int32_t i;
710     if (adapterName == NULL) {
711         AUDIO_FUNC_LOGE("adapterName is NULL. ");
712         return;
713     }
714 
715     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
716     for (i = 0; i < num; i++) {
717         if (g_renderAndCaptureManage[i].adapterName == NULL) {
718             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
719             return;
720         }
721         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
722             g_renderAndCaptureManage[i].captureBusy = captureStatus;
723             return;
724         }
725     }
726     AUDIO_FUNC_LOGE("AudioSetCaptureStatus failed! ");
727     return;
728 }
729 
AudioSetCaptureBusy(uint32_t index,bool captureStatus)730 void AudioSetCaptureBusy(uint32_t index, bool captureStatus)
731 {
732     if (index < MAX_AUDIO_ADAPTER_NUM_SERVER) {
733         g_renderAndCaptureManage[index].captureBusy = captureStatus;
734     }
735     return;
736 }
737 
AudioGetCaptureStatus(const char * adapterName)738 int32_t AudioGetCaptureStatus(const char *adapterName)
739 {
740     int32_t i;
741     if (adapterName == NULL) {
742         AUDIO_FUNC_LOGE("adapterName is NULL. ");
743         return HDF_FAILURE;
744     }
745 
746     int32_t num = ServerManageGetAdapterNum(g_serverAdapterNum);
747     for (i = 0; i < num; i++) {
748         if (g_renderAndCaptureManage[i].adapterName == NULL) {
749             AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d].adapterName is NULL! ", i);
750             return HDF_FAILURE;
751         }
752         if (strcmp(g_renderAndCaptureManage[i].adapterName, adapterName) == 0) {
753             if (!g_renderAndCaptureManage[i].captureDestory) {
754                 return HDF_SUCCESS;
755             } else {
756                 g_renderAndCaptureManage[i].captureBusy = false;
757                 AUDIO_FUNC_LOGE("g_renderAndCaptureManage[%{public}d]! ", i);
758                 return HDF_FAILURE;
759             }
760         }
761     }
762     AUDIO_FUNC_LOGE("AudioGetCaptureStatus failed! ");
763     return HDF_FAILURE;
764 }