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 }