1 /*
2 * Copyright (c) 2021-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_common.h"
17 #include "audio_adapter_info_common.h"
18 #include "audio_events.h"
19 #include "audio_types.h"
20 #include "audio_uhdf_log.h"
21 #include "hdf_audio_events.h"
22 #include "hdf_audio_server.h"
23 #include "hdf_audio_server_capture.h"
24 #include "hdf_audio_server_render.h"
25 #include "hdf_audio_server_manager.h"
26 #include "hdf_device_object.h"
27 #include "osal_mem.h"
28
29 #define HDF_LOG_TAG HDF_AUDIO_HAL_STUB
30
31 struct AudioAdapterDescriptor *g_descs = NULL;
32 struct AudioManager *g_serverManager = NULL;
33
34 #define MAX_AUDIO_ADAPTER_NUM_SERVER 8 // Limit the number of sound cards supported to a maximum of 8
35 #define SERVER_INFO_LEN 128
36
37 #define SUPPORT_PORT_NUM_MAX 10
38
39 static struct AudioEvent g_audioEventPnp = {
40 .eventType = HDF_AUDIO_EVENT_UNKOWN,
41 .deviceType = HDF_AUDIO_DEVICE_UNKOWN,
42 };
43
44 static struct AudioEvent g_audioEventLoad = {
45 .eventType = HDF_AUDIO_EVENT_UNKOWN,
46 .deviceType = HDF_AUDIO_DEVICE_UNKOWN,
47 };
48
49 static struct AudioEvent g_audioEventService = {
50 .eventType = HDF_AUDIO_EVENT_UNKOWN,
51 .deviceType = HDF_AUDIO_DEVICE_UNKOWN,
52 };
53
AdaptersServerManageInit(const struct AudioAdapterDescriptor * descs,int32_t num)54 static int32_t AdaptersServerManageInit(const struct AudioAdapterDescriptor *descs, int32_t num)
55 {
56 num = ServerManageGetAdapterNum(num);
57 if (AdapterManageInit(descs, num) != HDF_SUCCESS) {
58 AUDIO_FUNC_LOGE("AdapterManageInit Failed");
59 return HDF_FAILURE;
60 }
61
62 return HDF_SUCCESS;
63 }
64
HdiServiceRenderCaptureReadData(struct HdfSBuf * data,const char ** adapterName,uint32_t * pid)65 int32_t HdiServiceRenderCaptureReadData(struct HdfSBuf *data, const char **adapterName, uint32_t *pid)
66 {
67 if (adapterName == NULL || data == NULL || pid == NULL) {
68 return HDF_FAILURE;
69 }
70 if ((*adapterName = HdfSbufReadString(data)) == NULL) {
71 AUDIO_FUNC_LOGE("adapterName Is NULL ");
72 return HDF_FAILURE;
73 }
74 if (!HdfSbufReadUint32(data, pid)) {
75 AUDIO_FUNC_LOGE("read buf fail ");
76 return HDF_FAILURE;
77 }
78 return HDF_SUCCESS;
79 }
80
WriteAudioSampleAttributes(struct HdfSBuf * reply,const struct AudioSampleAttributes * attrs)81 int32_t WriteAudioSampleAttributes(struct HdfSBuf *reply, const struct AudioSampleAttributes *attrs)
82 {
83 if (reply == NULL || attrs == NULL) {
84 return HDF_FAILURE;
85 }
86 uint32_t tempAttrParam = (uint32_t)attrs->type;
87 if (!HdfSbufWriteUint32(reply, tempAttrParam)) {
88 return HDF_FAILURE;
89 }
90 tempAttrParam = (uint32_t)attrs->interleaved;
91 if (!HdfSbufWriteUint32(reply, tempAttrParam)) {
92 return HDF_FAILURE;
93 }
94 tempAttrParam = (uint32_t)attrs->format;
95 if (!HdfSbufWriteUint32(reply, tempAttrParam)) {
96 return HDF_FAILURE;
97 }
98 if (!HdfSbufWriteUint32(reply, attrs->sampleRate)) {
99 return HDF_FAILURE;
100 }
101 if (!HdfSbufWriteUint32(reply, attrs->channelCount)) {
102 return HDF_FAILURE;
103 }
104 if (!HdfSbufWriteUint32(reply, attrs->period)) {
105 return HDF_FAILURE;
106 }
107 if (!HdfSbufWriteUint32(reply, attrs->frameSize)) {
108 return HDF_FAILURE;
109 }
110 tempAttrParam = (uint32_t)(attrs->isBigEndian);
111 if (!HdfSbufWriteUint32(reply, tempAttrParam)) {
112 return HDF_FAILURE;
113 }
114 tempAttrParam = (uint32_t)(attrs->isSignedData);
115 if (!HdfSbufWriteUint32(reply, tempAttrParam)) {
116 return HDF_FAILURE;
117 }
118 if (!HdfSbufWriteUint32(reply, attrs->startThreshold)) {
119 return HDF_FAILURE;
120 }
121 if (!HdfSbufWriteUint32(reply, attrs->stopThreshold)) {
122 return HDF_FAILURE;
123 }
124 if (!HdfSbufWriteUint32(reply, attrs->silenceThreshold)) {
125 return HDF_FAILURE;
126 }
127 return HDF_SUCCESS;
128 }
129
ReadAudioSapmleAttrbutes(struct HdfSBuf * data,struct AudioSampleAttributes * attrs)130 int32_t ReadAudioSapmleAttrbutes(struct HdfSBuf *data, struct AudioSampleAttributes *attrs)
131 {
132 if (data == NULL || attrs == NULL) {
133 return HDF_FAILURE;
134 }
135 uint32_t tempAttrParam = 0;
136 if (!HdfSbufReadUint32(data, &tempAttrParam)) {
137 return HDF_FAILURE;
138 }
139 attrs->type = (enum AudioCategory)tempAttrParam;
140 if (!HdfSbufReadUint32(data, &tempAttrParam)) {
141 return HDF_FAILURE;
142 }
143 attrs->interleaved = (bool)tempAttrParam;
144 if (!HdfSbufReadUint32(data, &tempAttrParam)) {
145 return HDF_FAILURE;
146 }
147 attrs->format = (enum AudioFormat)tempAttrParam;
148 if (!HdfSbufReadUint32(data, &(attrs->sampleRate))) {
149 return HDF_FAILURE;
150 }
151 if (!HdfSbufReadUint32(data, &(attrs->channelCount))) {
152 return HDF_FAILURE;
153 }
154 if (!HdfSbufReadUint32(data, &(attrs->period))) {
155 return HDF_FAILURE;
156 }
157 if (!HdfSbufReadUint32(data, &(attrs->frameSize))) {
158 return HDF_FAILURE;
159 }
160 if (!HdfSbufReadUint32(data, &tempAttrParam)) {
161 return HDF_FAILURE;
162 }
163 attrs->isBigEndian = (bool)tempAttrParam;
164 if (!HdfSbufReadUint32(data, &tempAttrParam)) {
165 return HDF_FAILURE;
166 }
167 attrs->isSignedData = (bool)tempAttrParam;
168 if (!HdfSbufReadUint32(data, &(attrs->startThreshold))) {
169 return HDF_FAILURE;
170 }
171 if (!HdfSbufReadUint32(data, &(attrs->stopThreshold))) {
172 return HDF_FAILURE;
173 }
174 if (!HdfSbufReadUint32(data, &(attrs->silenceThreshold))) {
175 return HDF_FAILURE;
176 }
177 return HDF_SUCCESS;
178 }
179
AudioAdapterListCheckAndGetRender(struct AudioRender ** render,struct HdfSBuf * data)180 int32_t AudioAdapterListCheckAndGetRender(struct AudioRender **render, struct HdfSBuf *data)
181 {
182 if (render == NULL || data == NULL) {
183 AUDIO_FUNC_LOGE("render or data is null!");
184 return HDF_FAILURE;
185 }
186 struct AudioRender *renderTemp = NULL;
187 const char *adapterName = NULL;
188 uint32_t pid = 0;
189 if (HdiServiceRenderCaptureReadData(data, &adapterName, &pid) < 0) {
190 AUDIO_FUNC_LOGE("HdiServiceRenderStart: HdiServiceRenderCaptureReadData fail ");
191 return HDF_FAILURE;
192 }
193 int ret = AudioAdapterListGetRender(adapterName, &renderTemp, pid);
194 if (ret < 0) {
195 return ret;
196 }
197 if (renderTemp == NULL) {
198 return HDF_FAILURE;
199 }
200 *render = renderTemp;
201 return HDF_SUCCESS;
202 }
203
AudioAdapterListCheckAndGetCapture(struct AudioCapture ** capture,struct HdfSBuf * data)204 int32_t AudioAdapterListCheckAndGetCapture(struct AudioCapture **capture, struct HdfSBuf *data)
205 {
206 if (capture == NULL || data == NULL) {
207 AUDIO_FUNC_LOGE("capture or data is null!");
208 return HDF_FAILURE;
209 }
210 struct AudioCapture *captureTemp = NULL;
211 const char *adapterName = NULL;
212 uint32_t pid = 0;
213 if (HdiServiceRenderCaptureReadData(data, &adapterName, &pid) < 0) {
214 AUDIO_FUNC_LOGE("HdiServiceCaptureStart: HdiServiceRenderCaptureReadData fail ");
215 return HDF_FAILURE;
216 }
217 int ret = AudioAdapterListGetCapture(adapterName, &captureTemp, pid);
218 if (ret < 0) {
219 return ret;
220 }
221 if (captureTemp == NULL) {
222 return HDF_FAILURE;
223 }
224 *capture = captureTemp;
225 return HDF_SUCCESS;
226 }
227
HdiServicePositionWrite(struct HdfSBuf * reply,uint64_t frames,struct AudioTimeStamp time)228 int32_t HdiServicePositionWrite(struct HdfSBuf *reply,
229 uint64_t frames, struct AudioTimeStamp time)
230 {
231 if (reply == NULL) {
232 return HDF_FAILURE;
233 }
234 if (!HdfSbufWriteUint64(reply, frames)) {
235 return HDF_FAILURE;
236 }
237 if (!HdfSbufWriteInt64(reply, time.tvSec)) {
238 return HDF_FAILURE;
239 }
240 if (!HdfSbufWriteInt64(reply, time.tvNSec)) {
241 return HDF_FAILURE;
242 }
243 return HDF_SUCCESS;
244 }
245
HdiServiceReqMmapBuffer(struct AudioMmapBufferDescriptor * desc,struct HdfSBuf * data)246 int32_t HdiServiceReqMmapBuffer(struct AudioMmapBufferDescriptor *desc, struct HdfSBuf *data)
247 {
248 int32_t ret;
249 if (desc == NULL || data == NULL) {
250 AUDIO_FUNC_LOGE("desc or data is null!");
251 return AUDIO_HAL_ERR_INTERNAL;
252 }
253 uint64_t memAddr = 0;
254 if (!HdfSbufReadUint64(data, &memAddr)) {
255 AUDIO_FUNC_LOGE("memAddr Is NULL");
256 return AUDIO_HAL_ERR_INTERNAL;
257 }
258 desc->memoryAddress = (void *)(uintptr_t)memAddr;
259 ret = HdfSbufReadFileDescriptor(data);
260 if (ret < 0) {
261 return AUDIO_HAL_ERR_INTERNAL;
262 }
263 desc->memoryFd = ret;
264 if (!HdfSbufReadInt32(data, &desc->totalBufferFrames)) {
265 return AUDIO_HAL_ERR_INTERNAL;
266 }
267 if (!HdfSbufReadInt32(data, &desc->transferFrameSize)) {
268 return AUDIO_HAL_ERR_INTERNAL;
269 }
270 if (!HdfSbufReadInt32(data, &desc->isShareable)) {
271 return AUDIO_HAL_ERR_INTERNAL;
272 }
273 if (!HdfSbufReadUint32(data, &desc->offset)) {
274 return AUDIO_HAL_ERR_INTERNAL;
275 }
276 return AUDIO_HAL_SUCCESS;
277 }
278
AudioPortBlockMarshalling(struct HdfSBuf * data,const struct AudioPort * dataBlock)279 static bool AudioPortBlockMarshalling(struct HdfSBuf *data, const struct AudioPort *dataBlock)
280 {
281 if (data == NULL) {
282 HDF_LOGE("%{public}s: invalid sbuf", __func__);
283 return false;
284 }
285 if (dataBlock == NULL) {
286 HDF_LOGE("%{public}s: invalid data block", __func__);
287 return false;
288 }
289
290 if (!HdfSbufWriteInt32(data, dataBlock->dir)) {
291 HDF_LOGE("%{public}s: write dataBlock->dir failed!", __func__);
292 return false;
293 }
294
295 if (!HdfSbufWriteUint32(data, dataBlock->portId)) {
296 HDF_LOGE("%{public}s: write dataBlock->portId failed!", __func__);
297 return false;
298 }
299
300 if (!HdfSbufWriteString(data, dataBlock->portName)) {
301 HDF_LOGE("%{public}s: write dataBlock->portName failed!", __func__);
302 return false;
303 }
304
305 return true;
306 }
307
AudioAdapterDescriptorBlockMarshalling(struct HdfSBuf * data,const struct AudioAdapterDescriptor * dataBlock)308 static bool AudioAdapterDescriptorBlockMarshalling(struct HdfSBuf *data, const struct AudioAdapterDescriptor *dataBlock)
309 {
310 if (data == NULL) {
311 HDF_LOGE("%{public}s: invalid sbuf", __func__);
312 return false;
313 }
314
315 if (dataBlock == NULL) {
316 HDF_LOGE("%{public}s: invalid data block", __func__);
317 return false;
318 }
319
320 if (!HdfSbufWriteString(data, dataBlock->adapterName)) {
321 HDF_LOGE("%{public}s: write dataBlock->adapterName failed!", __func__);
322 return false;
323 }
324
325 if (!HdfSbufWriteUint32(data, dataBlock->portNum)) {
326 HDF_LOGE("%{public}s: write dataBlock->portNum failed!", __func__);
327 return false;
328 }
329
330 if (dataBlock->portNum == 0 || dataBlock->portNum > SUPPORT_PORT_NUM_MAX) {
331 HDF_LOGE("%{public}s: error portNum is %{public}u", __func__, dataBlock->portNum);
332 return false;
333 }
334
335 for (uint32_t i = 0; i < dataBlock->portNum; i++) {
336 if (!AudioPortBlockMarshalling(data, &(dataBlock->ports)[i])) {
337 HDF_LOGE("%{public}s: write (dataBlock->ports)[i] failed!", __func__);
338 return false;
339 }
340 }
341
342 return true;
343 }
344
AudioSubPortCapabilityBlockMarshalling(struct HdfSBuf * data,const struct AudioPortCapability * dataBlock)345 static bool AudioSubPortCapabilityBlockMarshalling(struct HdfSBuf *data, const struct AudioPortCapability *dataBlock)
346 {
347 if (!HdfSbufWriteUint32(data, dataBlock->subPortsNum)) {
348 HDF_LOGE("%{public}s: write dataBlock->subPortsLen failed!", __func__);
349 return false;
350 }
351
352 for (uint32_t i = 0; i < dataBlock->subPortsNum; i++) {
353 struct AudioSubPortCapability *item = &dataBlock->subPorts[i];
354 if (!HdfSbufWriteUint32(data, item->portId)) {
355 HDF_LOGE("%{public}s: write dataBlock->portId failed!", __func__);
356 return false;
357 }
358
359 if (!HdfSbufWriteString(data, item->desc)) {
360 HDF_LOGE("%{public}s: write dataBlock->desc failed!", __func__);
361 return false;
362 }
363
364 if (!HdfSbufWriteInt32(data, (int32_t)item->mask)) {
365 HDF_LOGE("%{public}s: write dataBlock->mask failed!", __func__);
366 return false;
367 }
368 }
369
370 return true;
371 }
372
AudioPortCapabilityBlockMarshalling(struct HdfSBuf * data,const struct AudioPortCapability * dataBlock)373 bool AudioPortCapabilityBlockMarshalling(struct HdfSBuf *data, const struct AudioPortCapability *dataBlock)
374 {
375 if (data == NULL || dataBlock == NULL) {
376 HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
377 return false;
378 }
379
380 if (!HdfSbufWriteUint32(data, dataBlock->deviceType)) {
381 HDF_LOGE("%{public}s: write dataBlock->deviceType failed!", __func__);
382 return false;
383 }
384
385 if (!HdfSbufWriteUint32(data, dataBlock->deviceId)) {
386 HDF_LOGE("%{public}s: write dataBlock->deviceId failed!", __func__);
387 return false;
388 }
389
390 if (!HdfSbufWriteInt8(data, dataBlock->hardwareMode ? 1 : 0)) {
391 HDF_LOGE("%{public}s: write dataBlock->hardwareMode failed!", __func__);
392 return false;
393 }
394
395 if (!HdfSbufWriteUint32(data, dataBlock->formatNum)) {
396 HDF_LOGE("%{public}s: write dataBlock->formatNum failed!", __func__);
397 return false;
398 }
399
400 if (!HdfSbufWriteInt32(data, *(dataBlock->formats))) {
401 HDF_LOGE("%{public}s: failed to write dataBlock->formats", __func__);
402 return false;
403 }
404
405 if (!HdfSbufWriteUint32(data, dataBlock->sampleRateMasks)) {
406 HDF_LOGE("%{public}s: write dataBlock->sampleRateMasks failed!", __func__);
407 return false;
408 }
409
410 if (!HdfSbufWriteInt32(data, (int32_t)dataBlock->channelMasks)) {
411 HDF_LOGE("%{public}s: write dataBlock->channelMasks failed!", __func__);
412 return false;
413 }
414
415 if (!HdfSbufWriteUint32(data, dataBlock->channelCount)) {
416 HDF_LOGE("%{public}s: write dataBlock->channelCount failed!", __func__);
417 return false;
418 }
419
420 if (!AudioSubPortCapabilityBlockMarshalling(data, dataBlock)) {
421 HDF_LOGE("%{public}s: write (dataBlock->subPorts)[i] failed!", __func__);
422 return false;
423 }
424
425 return true;
426 }
427
428 /**************************public************************/
HdiServiceGetFuncs()429 int32_t HdiServiceGetFuncs()
430 {
431 AUDIO_FUNC_LOGD("enter");
432 if (g_serverManager != NULL) {
433 return AUDIO_HAL_SUCCESS;
434 }
435
436 char *error = NULL;
437 struct AudioManager *(*managerFuncs)(void);
438 const char *hdiAudioVendorLibPath = HDF_LIBRARY_FULL_PATH("libhdi_audio");
439 void *handle = dlopen(hdiAudioVendorLibPath, RTLD_LAZY);
440 if (handle == NULL) {
441 error = dlerror();
442 AUDIO_FUNC_LOGE("audio load path %{public}s, dlopen err=%{public}s", hdiAudioVendorLibPath, error);
443 return AUDIO_HAL_ERR_INTERNAL;
444 }
445 managerFuncs = dlsym(handle, "GetAudioManagerFuncs");
446 g_serverManager = managerFuncs();
447 if (g_serverManager == NULL) {
448 error = dlerror();
449 AUDIO_FUNC_LOGE("dlsym GetAudioManagerFuncs err=%{public}s", error);
450 dlclose(handle);
451 handle = NULL;
452 return AUDIO_HAL_ERR_INTERNAL;
453 }
454 AUDIO_FUNC_LOGD("end");
455 return AUDIO_HAL_SUCCESS;
456 }
457
AudioHdiServerRelease(void)458 void AudioHdiServerRelease(void)
459 {
460 AUDIO_FUNC_LOGI("enter to %{public}s!", __func__);
461
462 if (g_serverManager == NULL) {
463 AUDIO_FUNC_LOGE("manager func is null!");
464 return;
465 }
466 ReleaseAudioManagerObjectComm(g_serverManager);
467 AUDIO_FUNC_LOGD("%{public}s success", __func__);
468 return;
469 }
470
HdiServiceGetAllAdapter(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)471 int32_t HdiServiceGetAllAdapter(const struct HdfDeviceIoClient *client,
472 struct HdfSBuf *data, struct HdfSBuf *reply)
473 {
474 (void)data;
475 (void)client;
476
477 if (reply == NULL) {
478 AUDIO_FUNC_LOGE("reply is NULL!");
479 return AUDIO_HAL_ERR_INVALID_PARAM;
480 }
481
482 int32_t index;
483 int32_t size = 0;
484 struct AudioAdapterDescriptor *descs = NULL;
485
486 int32_t ret = g_serverManager->GetAllAdapters(g_serverManager, &descs, &size);
487 if (ret < 0) {
488 AUDIO_FUNC_LOGE("g_manager->GetAllAdapters error");
489 return AUDIO_HAL_ERR_INTERNAL;
490 }
491 if (size > MAX_AUDIO_ADAPTER_NUM_SERVER || size <= 0 || descs == NULL) {
492 AUDIO_FUNC_LOGE("size or g_descs is error");
493 return AUDIO_HAL_ERR_NOT_SUPPORT;
494 }
495
496 if (!HdfSbufWriteUint32(reply, size)) {
497 AUDIO_FUNC_LOGE("write descs failed!");
498 return AUDIO_HAL_ERR_INTERNAL;
499 }
500
501 for (index = 0; index < size; index++) {
502 if (!AudioAdapterDescriptorBlockMarshalling(reply, &descs[index])) {
503 AUDIO_FUNC_LOGE("write &descs[%{public}d] failed!", index);
504 return AUDIO_HAL_ERR_INTERNAL;
505 }
506 }
507
508 g_descs = descs;
509
510 ret = AdaptersServerManageInit(descs, size);
511 if (ret != AUDIO_HAL_SUCCESS) {
512 AUDIO_FUNC_LOGE("AdapterServerManageInit fail");
513 return ret;
514 }
515 return AUDIO_HAL_SUCCESS;
516 }
517
HdiServiceReleaseAudioManagerObject(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)518 int32_t HdiServiceReleaseAudioManagerObject(const struct HdfDeviceIoClient *client,
519 struct HdfSBuf *data, struct HdfSBuf *reply)
520 {
521 (void)data;
522 (void)reply;
523 (void)client;
524 AUDIO_FUNC_LOGI();
525
526 if (g_descs == NULL) {
527 AUDIO_FUNC_LOGI("g_descs is NULL");
528 return AUDIO_HAL_SUCCESS;
529 }
530
531 AudioAdapterReleaseDescs(g_descs, AudioServerGetAdapterNum());
532
533 g_descs = NULL;
534 return AUDIO_HAL_SUCCESS;
535 }
536
SwitchAdapter(struct AudioAdapterDescriptor * descs,const char * adapterNameCase,enum AudioPortDirection portFlag,struct AudioPort * renderPort,const int size)537 static int SwitchAdapter(struct AudioAdapterDescriptor *descs, const char *adapterNameCase,
538 enum AudioPortDirection portFlag, struct AudioPort *renderPort, const int size)
539 {
540 if (descs == NULL || adapterNameCase == NULL || renderPort == NULL) {
541 return HDF_FAILURE;
542 }
543 for (int index = 0; index < size; index++) {
544 struct AudioAdapterDescriptor *desc = &descs[index];
545 if (desc == NULL) {
546 continue;
547 }
548 if (desc->adapterName == NULL) {
549 return HDF_FAILURE;
550 }
551
552 if (strcmp(desc->adapterName, adapterNameCase) != 0) {
553 continue;
554 }
555 for (uint32_t port = 0; port < desc->portNum; port++) {
556 if (desc->ports[port].dir == portFlag) {
557 *renderPort = desc->ports[port];
558 AUDIO_FUNC_LOGI("portFlag=%{public}d index=%{public}d success!", portFlag, index);
559 return index;
560 }
561 }
562 }
563 AUDIO_FUNC_LOGE("out! adapterNameCase=%{public}s", adapterNameCase);
564 return HDF_FAILURE;
565 }
566
567 /* Adapter Check */
568 static enum AudioServerType g_loadServerFlag = AUDIO_SERVER_BOTTOM;
AudioHdiGetLoadServerFlag(void)569 enum AudioServerType AudioHdiGetLoadServerFlag(void)
570 {
571 return g_loadServerFlag;
572 }
573
AudioHdiSetLoadServerFlag(enum AudioServerType serverType)574 void AudioHdiSetLoadServerFlag(enum AudioServerType serverType)
575 {
576 g_loadServerFlag = serverType;
577 }
578
AudioHdiClearLoadServerFlag(void)579 void AudioHdiClearLoadServerFlag(void)
580 {
581 g_loadServerFlag = AUDIO_SERVER_BOTTOM;
582 }
583
MatchAppropriateAdapter(enum AudioAdapterType adapterType)584 static int32_t MatchAppropriateAdapter(enum AudioAdapterType adapterType)
585 {
586 switch (adapterType) {
587 case AUDIO_ADAPTER_PRIMARY:
588 case AUDIO_ADAPTER_PRIMARY_EXT:
589 case AUDIO_ADAPTER_HDMI:
590 if (AudioHdiGetLoadServerFlag() != AUDIO_SERVER_PRIMARY) {
591 AUDIO_FUNC_LOGE("Can't loadAdapterPrimary.");
592 return AUDIO_HAL_ERR_INTERNAL;
593 }
594 break;
595 case AUDIO_ADAPTER_USB:
596 if (AudioHdiGetLoadServerFlag() != AUDIO_SERVER_USB) {
597 AUDIO_FUNC_LOGE("Can't loadAdapterUsb.");
598 return AUDIO_HAL_ERR_INTERNAL;
599 }
600 break;
601 case AUDIO_ADAPTER_A2DP:
602 if (AudioHdiGetLoadServerFlag() != AUDIO_SERVER_A2DP) {
603 AUDIO_FUNC_LOGE("Can't loadAdapterA2dp.");
604 return AUDIO_HAL_ERR_INTERNAL;
605 }
606 break;
607 default:
608 AUDIO_FUNC_LOGE("An unsupported Adapter.");
609 return AUDIO_HAL_ERR_NOT_SUPPORT;
610 }
611
612 return AUDIO_HAL_SUCCESS;
613 }
614
AudioServiceUpateDevice(struct HdfDeviceObject * device,const char * servInfo)615 static int AudioServiceUpateDevice(struct HdfDeviceObject *device, const char *servInfo)
616 {
617 if (device == NULL || servInfo == NULL) {
618 AUDIO_FUNC_LOGE("device or servInfo is null!");
619 return AUDIO_HAL_ERR_INVALID_PARAM;
620 }
621 if (HdfDeviceObjectSetServInfo(device, servInfo) != HDF_SUCCESS) {
622 AUDIO_FUNC_LOGW("HdfDeviceObjectSetServInfo failed!");
623 return AUDIO_HAL_ERR_INTERNAL;
624 }
625 if (HdfDeviceObjectUpdate(device) != AUDIO_HAL_SUCCESS) {
626 AUDIO_FUNC_LOGW("HdfDeviceObjectUpdate failed!");
627 return AUDIO_HAL_ERR_INTERNAL;
628 }
629
630 return AUDIO_HAL_SUCCESS;
631 }
632
AudioServiceStateChange(struct HdfDeviceObject * device,struct AudioEvent * audioSrvEvent)633 int32_t AudioServiceStateChange(struct HdfDeviceObject *device, struct AudioEvent *audioSrvEvent)
634 {
635 if (device == NULL || audioSrvEvent == NULL) {
636 AUDIO_FUNC_LOGE("device or audioSrvEvent is null!");
637 return AUDIO_HAL_ERR_INVALID_PARAM;
638 }
639 g_audioEventService.eventType = audioSrvEvent->eventType;
640 g_audioEventService.deviceType = audioSrvEvent->deviceType;
641 char strMsg[AUDIO_PNP_MSG_LEN_MAX] = {0};
642 int ret = snprintf_s(strMsg, AUDIO_PNP_MSG_LEN_MAX, AUDIO_PNP_MSG_LEN_MAX - 1,
643 "EVENT_SERVICE_TYPE=0x%x;EVENT_LOAD_TYPE=0x%x;DEVICE_TYPE=0x%x",
644 g_audioEventService.eventType,
645 g_audioEventLoad.eventType,
646 g_audioEventService.deviceType);
647 if (ret >= 0) {
648 if (AudioServiceUpateDevice(device, (const char *)strMsg) != AUDIO_HAL_SUCCESS) {
649 AUDIO_FUNC_LOGW("AudioServiceUpate fail!");
650 return AUDIO_HAL_ERR_INTERNAL;
651 }
652 }
653 return AUDIO_HAL_SUCCESS;
654 }
655
AudioLoadStateChange(struct HdfDeviceObject * device,struct AudioEvent * audioLoadEvent)656 static int32_t AudioLoadStateChange(struct HdfDeviceObject *device, struct AudioEvent *audioLoadEvent)
657 {
658 if (device == NULL || audioLoadEvent == NULL) {
659 AUDIO_FUNC_LOGE("device or audioLoadEvent is null!");
660 return AUDIO_HAL_ERR_INVALID_PARAM;
661 }
662 g_audioEventLoad.eventType = audioLoadEvent->eventType;
663 g_audioEventLoad.deviceType = audioLoadEvent->deviceType;
664 char strMsg[AUDIO_PNP_MSG_LEN_MAX] = {0};
665 int ret = snprintf_s(strMsg, AUDIO_PNP_MSG_LEN_MAX, AUDIO_PNP_MSG_LEN_MAX - 1,
666 "EVENT_SERVICE_TYPE=0x%x;EVENT_LOAD_TYPE=0x%x;DEVICE_TYPE=0x%x",
667 g_audioEventService.eventType,
668 g_audioEventLoad.eventType,
669 g_audioEventLoad.deviceType);
670 if (ret >= 0) {
671 if (AudioServiceUpateDevice(device, (const char *)strMsg) != AUDIO_HAL_SUCCESS) {
672 AUDIO_FUNC_LOGE("AudioLoadUpate fail!");
673 return AUDIO_HAL_ERR_INTERNAL;
674 }
675 }
676 return AUDIO_HAL_SUCCESS;
677 }
678
HdiServiceDevOnLine(struct HdfDeviceObject * device,struct AudioManager * manager,const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter,const char * adapterName)679 static int32_t HdiServiceDevOnLine(struct HdfDeviceObject *device, struct AudioManager *manager,
680 const struct AudioAdapterDescriptor *desc, struct AudioAdapter **adapter, const char* adapterName)
681 {
682 if (device == NULL || manager == NULL || desc == NULL || adapter == NULL || adapterName == NULL) {
683 AUDIO_FUNC_LOGE("param is null!");
684 return AUDIO_HAL_ERR_INVALID_PARAM;
685 }
686 int32_t ret = manager->LoadAdapter(manager, desc, adapter);
687 if (ret < 0) {
688 g_audioEventLoad.eventType = HDF_AUDIO_LOAD_FAILURE;
689 } else {
690 g_audioEventLoad.eventType = HDF_AUDIO_LOAD_SUCCESS;
691 }
692 if (AudioLoadStateChange(device, &g_audioEventLoad) != AUDIO_HAL_SUCCESS) {
693 AUDIO_FUNC_LOGE("AudioLoadStateChange fail!");
694 }
695 if (*adapter == NULL) {
696 AUDIO_FUNC_LOGE("load audio device failed");
697 return AUDIO_HAL_ERR_INVALID_PARAM;
698 }
699 if (AudioAdapterListAdd(adapterName, *adapter)) {
700 AUDIO_FUNC_LOGE("AudioAdapterListAdd error!");
701 manager->UnloadAdapter(manager, *adapter);
702 return AUDIO_HAL_ERR_INTERNAL;
703 }
704 return AUDIO_HAL_SUCCESS;
705 }
706
HdiServiceDevOffLine(struct HdfDeviceObject * device)707 static int32_t HdiServiceDevOffLine(struct HdfDeviceObject *device)
708 {
709 if (device == NULL) {
710 AUDIO_FUNC_LOGE("device is null!");
711 return AUDIO_HAL_ERR_INVALID_PARAM;
712 }
713 g_audioEventLoad.eventType = HDF_AUDIO_LOAD_FAILURE;
714 if (AudioLoadStateChange(device, &g_audioEventLoad) != AUDIO_HAL_SUCCESS) {
715 AUDIO_FUNC_LOGE("AudioLoadStateChange fail!");
716 return AUDIO_HAL_ERR_INTERNAL;
717 }
718 return AUDIO_HAL_SUCCESS;
719 }
720
HdiServiceLoadAdapterSubUsb(struct HdfDeviceObject * device,struct AudioManager * manager,const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter,const char * adapterName)721 static int32_t HdiServiceLoadAdapterSubUsb(struct HdfDeviceObject *device, struct AudioManager *manager,
722 const struct AudioAdapterDescriptor *desc, struct AudioAdapter **adapter, const char* adapterName)
723 {
724 if (device == NULL || manager == NULL || desc == NULL || adapter == NULL || adapterName == NULL) {
725 AUDIO_FUNC_LOGE("param is null!");
726 return AUDIO_HAL_ERR_INVALID_PARAM;
727 }
728
729 if (g_audioEventPnp.eventType == HDF_AUDIO_DEVICE_REMOVE || g_audioEventPnp.eventType == HDF_AUDIO_EVENT_UNKOWN) {
730 HdiServiceDevOffLine(device);
731 AUDIO_FUNC_LOGE("eventType=0x%{public}x", g_audioEventPnp.eventType);
732 return AUDIO_HAL_ERR_NOT_SUPPORT;
733 } else if (g_audioEventPnp.eventType == HDF_AUDIO_DEVICE_ADD) {
734 return HdiServiceDevOnLine(device, manager, desc, adapter, adapterName);
735 } else {
736 AUDIO_FUNC_LOGE("eventType=0x%{public}x nothing", g_audioEventPnp.eventType);
737 return AUDIO_HAL_ERR_INTERNAL;
738 }
739 }
740
HdiServiceLoadAdapterSub(struct HdfDeviceObject * device,struct AudioManager * manager,const struct AudioAdapterDescriptor * desc,struct AudioAdapter ** adapter,const char * adapterName)741 static int32_t HdiServiceLoadAdapterSub(struct HdfDeviceObject *device, struct AudioManager *manager,
742 const struct AudioAdapterDescriptor *desc, struct AudioAdapter **adapter, const char* adapterName)
743 {
744 AUDIO_FUNC_LOGD("enter");
745 if (device == NULL || manager == NULL || desc == NULL || adapter == NULL || adapterName == NULL) {
746 AUDIO_FUNC_LOGE("param is null!");
747 return AUDIO_HAL_ERR_INVALID_PARAM;
748 }
749 enum AudioAdapterType sndCardType = MatchAdapterType(adapterName, desc->ports[0].portId);
750 int32_t ret = MatchAppropriateAdapter(sndCardType);
751 if (ret != AUDIO_HAL_SUCCESS) {
752 AUDIO_FUNC_LOGE("load audio device not matched");
753 return AUDIO_HAL_ERR_INTERNAL;
754 }
755 switch (sndCardType) {
756 case AUDIO_ADAPTER_PRIMARY:
757 case AUDIO_ADAPTER_PRIMARY_EXT:
758 case AUDIO_ADAPTER_HDMI:
759 g_audioEventService.eventType = HDF_AUDIO_SERVICE_VALID;
760 g_audioEventLoad.deviceType = HDF_AUDIO_PRIMARY_DEVICE;
761 return HdiServiceDevOnLine(device, manager, desc, adapter, adapterName);
762 case AUDIO_ADAPTER_USB:
763 g_audioEventLoad.deviceType = HDF_AUDIO_USB_DEVICE;
764 return HdiServiceLoadAdapterSubUsb(device, manager, desc, adapter, adapterName);
765 case AUDIO_ADAPTER_A2DP:
766 return AUDIO_HAL_ERR_NOT_SUPPORT;
767 default:
768 return AUDIO_HAL_ERR_NOT_SUPPORT;
769 }
770 }
771
HdiServiceLoadAdapter(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)772 int32_t HdiServiceLoadAdapter(const struct HdfDeviceIoClient *client,
773 struct HdfSBuf *data, struct HdfSBuf *reply)
774 {
775 AUDIO_FUNC_LOGD("enter");
776 if (client == NULL || data == NULL || reply == NULL) {
777 return AUDIO_HAL_ERR_INVALID_PARAM;
778 }
779 struct AudioAdapter *adapter = NULL;
780 struct AudioPort renderPort;
781 const char *adapterName = NULL;
782 uint32_t tempDir = 0;
783 if ((adapterName = HdfSbufReadString(data)) == NULL) {
784 AUDIO_FUNC_LOGE("adapterNameCase Is NULL");
785 return AUDIO_HAL_ERR_INVALID_PARAM;
786 }
787 int32_t ret = AudioAdapterCheckListExist(adapterName);
788 if (ret == AUDIO_HAL_ERR_INVALID_PARAM) {
789 return AUDIO_HAL_ERR_INTERNAL;
790 }
791 if (ret == AUDIO_HAL_SUCCESS) {
792 AUDIO_FUNC_LOGE("adapte[%{public}s] already exist !", adapterName);
793 return AUDIO_HAL_SUCCESS;
794 }
795 if (!HdfSbufReadUint32(data, &tempDir)) {
796 AUDIO_FUNC_LOGE("sbuf read tempDir failed!");
797 return AUDIO_HAL_ERR_INTERNAL;
798 }
799 enum AudioPortDirection port = (enum AudioPortDirection)tempDir;
800 struct AudioManager *manager = g_serverManager;
801 if (adapterName == NULL || manager == NULL || g_descs == NULL) {
802 AUDIO_FUNC_LOGE("Point is NULL!");
803 return AUDIO_HAL_ERR_INTERNAL;
804 }
805 int index = SwitchAdapter(g_descs, adapterName, port,
806 &renderPort, ServerManageGetAdapterNum(AudioServerGetAdapterNum()));
807 if (index < 0) {
808 return AUDIO_HAL_ERR_NOT_SUPPORT;
809 }
810 struct AudioAdapterDescriptor *desc = &g_descs[index];
811 ret = HdiServiceLoadAdapterSub(client->device, manager, desc, &adapter, adapterName);
812 return ret;
813 }
814
HdiServiceInitAllPorts(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)815 int32_t HdiServiceInitAllPorts(const struct HdfDeviceIoClient *client,
816 struct HdfSBuf *data, struct HdfSBuf *reply)
817 {
818 if (client == NULL || data == NULL || reply == NULL) {
819 return AUDIO_HAL_ERR_INVALID_PARAM;
820 }
821 const char *adapterName = NULL;
822 struct AudioAdapter *adapter = NULL;
823 if ((adapterName = HdfSbufReadString(data)) == NULL) {
824 AUDIO_FUNC_LOGE("adapterNameCase Is NULL");
825 return AUDIO_HAL_ERR_INVALID_PARAM;
826 }
827 if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
828 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
829 return AUDIO_HAL_ERR_INTERNAL;
830 }
831 if (adapter == NULL) {
832 AUDIO_FUNC_LOGE("adapter is NULL");
833 return AUDIO_HAL_ERR_INTERNAL;
834 }
835 if (adapter->InitAllPorts(adapter)) {
836 AUDIO_FUNC_LOGE("InitAllPorts fail");
837 return AUDIO_HAL_ERR_INTERNAL;
838 }
839 return AUDIO_HAL_SUCCESS;
840 }
841
HdiServiceUnloadAdapter(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)842 int32_t HdiServiceUnloadAdapter(const struct HdfDeviceIoClient *client,
843 struct HdfSBuf *data, struct HdfSBuf *reply)
844 {
845 if (client == NULL || data == NULL || reply == NULL) {
846 return AUDIO_HAL_ERR_INVALID_PARAM;
847 }
848 struct AudioAdapter *adapter = NULL;
849 const char *adapterName = NULL;
850 int ret;
851 struct AudioManager *manager = g_serverManager;
852 if (manager == NULL) {
853 AUDIO_FUNC_LOGE("Point is NULL!");
854 return AUDIO_HAL_ERR_INVALID_PARAM;
855 }
856 if ((adapterName = HdfSbufReadString(data)) == NULL) {
857 AUDIO_FUNC_LOGE("adapterNameCase Is NULL");
858 return AUDIO_HAL_ERR_INVALID_PARAM;
859 }
860 ret = AudioAdapterListDestory(adapterName, &adapter);
861 if (ret == AUDIO_HAL_ERR_INTERNAL) {
862 AUDIO_FUNC_LOGI("Other dev Use the adapter");
863 return AUDIO_HAL_SUCCESS;
864 } else if (ret == AUDIO_HAL_ERR_INVALID_PARAM) {
865 AUDIO_FUNC_LOGE("param invalid!");
866 return AUDIO_HAL_ERR_INTERNAL;
867 }
868 if (adapter == NULL) {
869 return AUDIO_HAL_ERR_INVALID_PARAM;
870 }
871 manager->UnloadAdapter(manager, adapter);
872 g_audioEventLoad.eventType = HDF_AUDIO_UNLOAD;
873 if (AudioLoadStateChange(client->device, &g_audioEventLoad) != AUDIO_HAL_SUCCESS) {
874 AUDIO_FUNC_LOGE("AudioLoadStateChange fail!");
875 }
876 AUDIO_FUNC_LOGI("Unload the adapter success!");
877 return AUDIO_HAL_SUCCESS;
878 }
879
HdiServiceGetPortCapability(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)880 int32_t HdiServiceGetPortCapability(const struct HdfDeviceIoClient *client,
881 struct HdfSBuf *data, struct HdfSBuf *reply)
882 {
883 if (client == NULL || data == NULL || reply == NULL) {
884 return AUDIO_HAL_ERR_INVALID_PARAM;
885 }
886 struct AudioPort port;
887 struct AudioPortCapability capability;
888 struct AudioAdapter *adapter = NULL;
889
890 const char *adapterName = HdfSbufReadString(data);
891 if (adapterName == NULL) {
892 AUDIO_FUNC_LOGE("adapterNameCase Is NULL");
893 return AUDIO_HAL_ERR_INVALID_PARAM;
894 }
895
896 if (!HdfSbufReadUint32(data, (uint32_t *)&port.dir)) {
897 AUDIO_FUNC_LOGE("read port.dir error");
898 return AUDIO_HAL_ERR_INTERNAL;
899 }
900
901 if (!HdfSbufReadUint32(data, &port.portId)) {
902 AUDIO_FUNC_LOGE("read port.portId error");
903 return AUDIO_HAL_ERR_INTERNAL;
904 }
905
906 if ((port.portName = HdfSbufReadString(data)) == NULL) {
907 AUDIO_FUNC_LOGE("read port.portName error");
908 return AUDIO_HAL_ERR_INTERNAL;
909 }
910
911 if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
912 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
913 return AUDIO_HAL_ERR_INTERNAL;
914 }
915
916 if (adapter == NULL) {
917 AUDIO_FUNC_LOGE("HdiServiceCreatRender adapter is NULL!");
918 return AUDIO_HAL_ERR_INVALID_PARAM;
919 }
920
921 int32_t ret = adapter->GetPortCapability(adapter, &port, &capability);
922 if (ret < 0) {
923 AUDIO_FUNC_LOGE("GetPortCapability failed ret = %{public}d", ret);
924 return AUDIO_HAL_ERR_INTERNAL;
925 }
926
927 if (!AudioPortCapabilityBlockMarshalling(reply, &capability)) {
928 AUDIO_FUNC_LOGE("AudioPortCapabilityBlockMarshalling failed");
929 return AUDIO_HAL_ERR_INTERNAL;
930 }
931 return AUDIO_HAL_SUCCESS;
932 }
933
HdiServiceSetPassthroughMode(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)934 int32_t HdiServiceSetPassthroughMode(const struct HdfDeviceIoClient *client,
935 struct HdfSBuf *data, struct HdfSBuf *reply)
936 {
937 if (client == NULL || data == NULL || reply == NULL) {
938 return AUDIO_HAL_ERR_INVALID_PARAM;
939 }
940 struct AudioPort port;
941 enum AudioPortPassthroughMode mode;
942 struct AudioAdapter *adapter = NULL;
943 const char *adapterName = NULL;
944 if ((adapterName = HdfSbufReadString(data)) == NULL) {
945 AUDIO_FUNC_LOGE("adapterNameCase Is NULL");
946 return AUDIO_HAL_ERR_INVALID_PARAM;
947 }
948 uint32_t tempDir = 0;
949 if (!HdfSbufReadUint32(data, &tempDir)) {
950 return AUDIO_HAL_ERR_INTERNAL;
951 }
952 port.dir = (enum AudioPortDirection)tempDir;
953 AUDIO_FUNC_LOGD("port.dir = %{public}d", port.dir);
954 if (!HdfSbufReadUint32(data, &port.portId)) {
955 return AUDIO_HAL_ERR_INTERNAL;
956 }
957 if ((port.portName = HdfSbufReadString(data)) == NULL) {
958 AUDIO_FUNC_LOGE("read port.portName failed");
959 return AUDIO_HAL_ERR_INTERNAL;
960 }
961 uint32_t tempMode = 0;
962 if (!HdfSbufReadUint32(data, &tempMode)) {
963 return AUDIO_HAL_ERR_INTERNAL;
964 }
965 mode = (enum AudioPortPassthroughMode)tempMode;
966 AUDIO_FUNC_LOGD("ready in, mode = %{public}d", mode);
967 if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
968 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
969 return AUDIO_HAL_ERR_INTERNAL;
970 }
971 if (adapter == NULL) {
972 AUDIO_FUNC_LOGE("HdiServiceCreatRender adapter is NULL!");
973 return AUDIO_HAL_ERR_INVALID_PARAM;
974 }
975 if (adapter->SetPassthroughMode == NULL) {
976 AUDIO_FUNC_LOGE("SetPassthroughMode is NULL");
977 return AUDIO_HAL_ERR_INTERNAL;
978 }
979 int ret = adapter->SetPassthroughMode(adapter, &port, mode);
980 return ret;
981 }
982
HdiServiceGetPassthroughModePreReadData(const char * adapterName,struct HdfSBuf * data,struct AudioPort * port)983 static int32_t HdiServiceGetPassthroughModePreReadData(const char *adapterName,
984 struct HdfSBuf *data, struct AudioPort *port)
985 {
986 if ((adapterName = HdfSbufReadString(data)) == NULL) {
987 AUDIO_FUNC_LOGE("adapterNameCase Is NULL");
988 return AUDIO_HAL_ERR_INVALID_PARAM;
989 }
990 uint32_t tempDir = port->dir;
991 if (!HdfSbufReadUint32(data, &tempDir)) {
992 return AUDIO_HAL_ERR_INTERNAL;
993 }
994 port->dir = (enum AudioPortDirection)tempDir;
995 if (!HdfSbufReadUint32(data, &port->portId)) {
996 return AUDIO_HAL_ERR_INTERNAL;
997 }
998 if ((port->portName = HdfSbufReadString(data)) == NULL) {
999 AUDIO_FUNC_LOGE("read port->portName failed");
1000 return AUDIO_HAL_ERR_INTERNAL;
1001 }
1002 return HDF_SUCCESS;
1003 }
1004
HdiServiceGetPassthroughMode(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1005 int32_t HdiServiceGetPassthroughMode(const struct HdfDeviceIoClient *client,
1006 struct HdfSBuf *data, struct HdfSBuf *reply)
1007 {
1008 if (client == NULL || data == NULL || reply == NULL) {
1009 return AUDIO_HAL_ERR_INVALID_PARAM;
1010 }
1011 enum AudioPortPassthroughMode mode = PORT_PASSTHROUGH_AUTO;
1012 struct AudioAdapter *adapter = NULL;
1013 const char *adapterName = NULL;
1014 struct AudioPort port;
1015 int32_t ret = memset_s(&port, sizeof(struct AudioPort), 0, sizeof(struct AudioPort));
1016 if (ret != HDF_SUCCESS) {
1017 AUDIO_FUNC_LOGE("memset_s failed");
1018 return AUDIO_HAL_ERR_INTERNAL;
1019 }
1020
1021 if (HdiServiceGetPassthroughModePreReadData(adapterName, data, &port) != HDF_SUCCESS) {
1022 return AUDIO_HAL_ERR_INTERNAL;
1023 }
1024
1025 if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
1026 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1027 return AUDIO_HAL_ERR_INTERNAL;
1028 }
1029 if (adapter == NULL) {
1030 AUDIO_FUNC_LOGE("adapter is NULL!");
1031 return AUDIO_HAL_ERR_INVALID_PARAM;
1032 }
1033 if (adapter->GetPassthroughMode == NULL) {
1034 AUDIO_FUNC_LOGE("GetPassthroughMode is NULL");
1035 return AUDIO_HAL_ERR_INTERNAL;
1036 }
1037 ret = adapter->GetPassthroughMode(adapter, &port, &mode);
1038 if (ret < 0) {
1039 AUDIO_FUNC_LOGE("GetPassthroughMode ret failed");
1040 return AUDIO_HAL_ERR_INTERNAL;
1041 }
1042 uint32_t tempMode = (uint32_t)mode;
1043 if (!HdfSbufWriteUint32(reply, tempMode)) {
1044 return AUDIO_HAL_ERR_INTERNAL;
1045 }
1046 return AUDIO_HAL_SUCCESS;
1047 }
1048
HdiServiceGetDevStatusByPnp(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1049 static int32_t HdiServiceGetDevStatusByPnp(const struct HdfDeviceIoClient *client,
1050 struct HdfSBuf *data, struct HdfSBuf *reply)
1051 {
1052 (void)reply;
1053 const char *strDevPlugMsg = NULL;
1054 if (client == NULL || data == NULL) {
1055 AUDIO_FUNC_LOGE("client or data is null!");
1056 return AUDIO_HAL_ERR_INVALID_PARAM;
1057 }
1058 if ((strDevPlugMsg = HdfSbufReadString(data)) == NULL) {
1059 AUDIO_FUNC_LOGE("data is null!");
1060 return AUDIO_HAL_ERR_INTERNAL;
1061 }
1062
1063 if ((AudioPnpMsgReadValue(strDevPlugMsg, "EVENT_TYPE", &(g_audioEventPnp.eventType)) != HDF_SUCCESS) ||
1064 (AudioPnpMsgReadValue(strDevPlugMsg, "DEVICE_TYPE", &(g_audioEventPnp.deviceType)) != HDF_SUCCESS)) {
1065 AUDIO_FUNC_LOGE("DeSerialize fail!");
1066 return AUDIO_HAL_ERR_INTERNAL;
1067 }
1068 if (g_audioEventPnp.deviceType == HDF_AUDIO_USB_HEADSET ||
1069 g_audioEventPnp.deviceType == HDF_AUDIO_USB_HEADPHONE ||
1070 g_audioEventPnp.deviceType == HDF_AUDIO_USBA_HEADSET ||
1071 g_audioEventPnp.deviceType == HDF_AUDIO_USBA_HEADPHONE) {
1072 g_audioEventService.deviceType = HDF_AUDIO_USB_DEVICE;
1073 if (g_audioEventPnp.eventType == HDF_AUDIO_DEVICE_ADD) {
1074 g_audioEventService.eventType = HDF_AUDIO_SERVICE_VALID;
1075 } else if (g_audioEventPnp.eventType == HDF_AUDIO_DEVICE_REMOVE) {
1076 g_audioEventService.eventType = HDF_AUDIO_SERVICE_INVALID;
1077 }
1078 }
1079 if (AudioServiceStateChange(client->device, &g_audioEventService) != AUDIO_HAL_SUCCESS) {
1080 AUDIO_FUNC_LOGE("AudioServiceStateChange fail!");
1081 return AUDIO_HAL_ERR_INTERNAL;
1082 }
1083 return AUDIO_HAL_SUCCESS;
1084 }
1085
AudioDevExtInfoBlockUnmarshalling(struct HdfSBuf * data,struct AudioDevExtInfo * dataBlock)1086 static bool AudioDevExtInfoBlockUnmarshalling(struct HdfSBuf *data, struct AudioDevExtInfo *dataBlock)
1087 {
1088 if (data == NULL || dataBlock == NULL) {
1089 HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1090 goto ERROR;
1091 }
1092
1093 if (!HdfSbufReadInt32(data, &dataBlock->moduleId)) {
1094 HDF_LOGE("%{public}s: read dataBlock->moduleId failed!", __func__);
1095 goto ERROR;
1096 }
1097
1098 if (!HdfSbufReadInt32(data, (int32_t*)&dataBlock->type)) {
1099 HDF_LOGE("%{public}s: read dataBlock->type failed!", __func__);
1100 goto ERROR;
1101 }
1102
1103 const char *descCp = HdfSbufReadString(data);
1104 if (descCp == NULL) {
1105 HDF_LOGE("%{public}s: read descCp failed!", __func__);
1106 goto ERROR;
1107 }
1108
1109 dataBlock->desc = strdup(descCp);
1110 if (dataBlock->desc == NULL) {
1111 HDF_LOGE("strdup fail in %{public}s", __func__);
1112 goto ERROR;
1113 }
1114
1115 return true;
1116 ERROR:
1117 if (dataBlock->desc != NULL) {
1118 OsalMemFree((void*)dataBlock->desc);
1119 dataBlock->desc = NULL;
1120 }
1121
1122 return false;
1123 }
1124
AudioMixExtInfoBlockUnmarshalling(struct HdfSBuf * data,struct AudioMixExtInfo * dataBlock)1125 static bool AudioMixExtInfoBlockUnmarshalling(struct HdfSBuf *data, struct AudioMixExtInfo *dataBlock)
1126 {
1127 if (data == NULL || dataBlock == NULL) {
1128 HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1129 return false;
1130 }
1131
1132 const struct AudioMixExtInfo *dataBlockPtr = (const struct AudioMixExtInfo *)HdfSbufReadUnpadBuffer(data,
1133 sizeof(struct AudioMixExtInfo));
1134 if (dataBlockPtr == NULL) {
1135 HDF_LOGE("%{public}s: failed to read buffer data", __func__);
1136 return false;
1137 }
1138
1139 if (memcpy_s(dataBlock, sizeof(struct AudioMixExtInfo), dataBlockPtr, sizeof(struct AudioMixExtInfo)) != EOK) {
1140 HDF_LOGE("%{public}s: failed to memcpy data", __func__);
1141 return false;
1142 }
1143
1144 return true;
1145 }
1146
AudioSessionExtInfoBlockUnmarshalling(struct HdfSBuf * data,struct AudioSessionExtInfo * dataBlock)1147 static bool AudioSessionExtInfoBlockUnmarshalling(struct HdfSBuf *data, struct AudioSessionExtInfo *dataBlock)
1148 {
1149 if (data == NULL || dataBlock == NULL) {
1150 HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1151 return false;
1152 }
1153
1154 const struct AudioSessionExtInfo *dataBlockPtr = (const struct AudioSessionExtInfo *)HdfSbufReadUnpadBuffer(data,
1155 sizeof(struct AudioSessionExtInfo));
1156 if (dataBlockPtr == NULL) {
1157 HDF_LOGE("%{public}s: failed to read buffer data", __func__);
1158 return false;
1159 }
1160
1161 if (memcpy_s(dataBlock, sizeof(struct AudioSessionExtInfo), dataBlockPtr,
1162 sizeof(struct AudioSessionExtInfo)) != EOK) {
1163 HDF_LOGE("%{public}s: failed to memcpy data", __func__);
1164 return false;
1165 }
1166
1167 return true;
1168 }
1169
AudioDevExtInfoFree(struct AudioDevExtInfo * dataBlock,bool freeSelf)1170 static void AudioDevExtInfoFree(struct AudioDevExtInfo *dataBlock, bool freeSelf)
1171 {
1172 if (dataBlock == NULL) {
1173 return;
1174 }
1175
1176 if (dataBlock->desc != NULL) {
1177 OsalMemFree((void*)dataBlock->desc);
1178 dataBlock->desc = NULL;
1179 }
1180
1181 if (freeSelf) {
1182 OsalMemFree(dataBlock);
1183 }
1184 }
1185
AudioInfoBlockUnmarshalling(enum AudioPortType type,struct HdfSBuf * data,RouteExtInfo * dataBlock)1186 static bool AudioInfoBlockUnmarshalling(enum AudioPortType type, struct HdfSBuf *data, RouteExtInfo *dataBlock)
1187 {
1188 if (data == NULL || dataBlock == NULL) {
1189 HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1190 return false;
1191 }
1192 bool ret = true;
1193 switch (type) {
1194 case AUDIO_PORT_DEVICE_TYPE:
1195 if (!AudioDevExtInfoBlockUnmarshalling(data, &dataBlock->device)) {
1196 HDF_LOGE("%{public}s: write dataBlock->device failed!", __func__);
1197 AudioDevExtInfoFree(&dataBlock->device, false);
1198 ret = false;
1199 }
1200 break;
1201 case AUDIO_PORT_MIX_TYPE:
1202 if (!AudioMixExtInfoBlockUnmarshalling(data, &dataBlock->mix)) {
1203 HDF_LOGE("%{public}s: write dataBlock->mix failed!", __func__);
1204 ret = false;
1205 }
1206 break;
1207 case AUDIO_PORT_SESSION_TYPE:
1208 if (!AudioSessionExtInfoBlockUnmarshalling(data, &dataBlock->session)) {
1209 HDF_LOGE("%{public}s: write dataBlock->session failed!", __func__);
1210 ret = false;
1211 }
1212 break;
1213 case AUDIO_PORT_UNASSIGNED_TYPE:
1214 default:
1215 ret = false;
1216 break;
1217 }
1218
1219 return ret;
1220 }
1221
AudioRouteNodeBlockUnmarshalling(struct HdfSBuf * data,struct AudioRouteNode * dataBlock)1222 static bool AudioRouteNodeBlockUnmarshalling(struct HdfSBuf *data, struct AudioRouteNode *dataBlock)
1223 {
1224 if (data == NULL || dataBlock == NULL) {
1225 HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1226 return false;
1227 }
1228
1229 if (!HdfSbufReadInt32(data, &dataBlock->portId)) {
1230 HDF_LOGE("%{public}s: read dataBlock->portId failed!", __func__);
1231 return false;
1232 }
1233
1234 if (!HdfSbufReadInt32(data, (int32_t*)&dataBlock->role)) {
1235 HDF_LOGE("%{public}s: read dataBlock->role failed!", __func__);
1236 return false;
1237 }
1238
1239 if (!HdfSbufReadInt32(data, (int32_t*)&dataBlock->type)) {
1240 HDF_LOGE("%{public}s: read dataBlock->type failed!", __func__);
1241 return false;
1242 }
1243
1244 if (!AudioInfoBlockUnmarshalling(dataBlock->type, data, (RouteExtInfo*)&dataBlock->ext)) {
1245 HDF_LOGE("%{public}s: read &dataBlock->ext failed!", __func__);
1246 return false;
1247 }
1248
1249 return true;
1250 }
1251
GetAudioRouteNodeMem(struct HdfSBuf * data,struct AudioRouteNode * source,uint32_t * num)1252 static bool GetAudioRouteNodeMem(struct HdfSBuf *data, struct AudioRouteNode* source, uint32_t *num)
1253 {
1254 if (!HdfSbufReadUint32(data, num)) {
1255 HDF_LOGE("%{public}s: read num failed!", __func__);
1256 return false;
1257 }
1258 if (*num > 0) {
1259 source = (struct AudioRouteNode*)OsalMemCalloc(sizeof(struct AudioRouteNode) * (*num));
1260 if (source == NULL) {
1261 return false;
1262 }
1263 for (uint32_t i = 0; i < *num; i++) {
1264 if (!AudioRouteNodeBlockUnmarshalling(data, &source[i])) {
1265 HDF_LOGE("%{public}s: read &sourcesCp[i] failed!", __func__);
1266 OsalMemFree((void*)source);
1267 return false;
1268 }
1269 }
1270 }
1271 return true;
1272 }
1273
AudioRouteBlockUnmarshalling(struct HdfSBuf * data,struct AudioRoute * dataBlock)1274 static bool AudioRouteBlockUnmarshalling(struct HdfSBuf *data, struct AudioRoute *dataBlock)
1275 {
1276 if (data == NULL || dataBlock == NULL) {
1277 HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1278 return false;
1279 }
1280
1281 struct AudioRouteNode* sourcesCp = NULL;
1282 uint32_t sourcesNum = 0;
1283 struct AudioRouteNode* sinksCp = NULL;
1284 uint32_t sinksNum = 0;
1285
1286 if (!GetAudioRouteNodeMem(data, sourcesCp, &sourcesNum)) {
1287 return false;
1288 }
1289 dataBlock->sources = sourcesCp;
1290 dataBlock->sourcesNum = sourcesNum;
1291
1292 if (!GetAudioRouteNodeMem(data, sinksCp, &sinksNum)) {
1293 return false;
1294 }
1295 dataBlock->sinks = sinksCp;
1296 dataBlock->sinksNum = sinksNum;
1297
1298 return true;
1299 }
1300
AudioRouteDevFreeByNum(const struct AudioRouteNode * routeNode,uint32_t num)1301 static void AudioRouteDevFreeByNum(const struct AudioRouteNode *routeNode, uint32_t num)
1302 {
1303 uint32_t nodeCnt;
1304 if (routeNode == NULL) {
1305 AUDIO_FUNC_LOGI("routeNode has been freed");
1306 return;
1307 }
1308
1309 for (nodeCnt = 0; nodeCnt < num; nodeCnt++) {
1310 if (routeNode[nodeCnt].type == AUDIO_PORT_DEVICE_TYPE) {
1311 AudioDevExtInfoFree((struct AudioDevExtInfo *)&routeNode[nodeCnt].ext.device, false);
1312 }
1313 }
1314 }
1315
AudioRouteFree(struct AudioRoute * dataBlock,bool freeSelf)1316 static void AudioRouteFree(struct AudioRoute *dataBlock, bool freeSelf)
1317 {
1318 if (dataBlock == NULL) {
1319 AUDIO_FUNC_LOGI("dataBlock has been freed");
1320 return;
1321 }
1322
1323 if (dataBlock->sources != NULL) {
1324 AudioRouteDevFreeByNum(dataBlock->sources, dataBlock->sourcesNum);
1325 OsalMemFree((void*)dataBlock->sources);
1326 }
1327
1328 if (dataBlock->sinks != NULL) {
1329 AudioRouteDevFreeByNum(dataBlock->sinks, dataBlock->sinksNum);
1330 OsalMemFree((void*)dataBlock->sinks);
1331 }
1332
1333 if (freeSelf) {
1334 OsalMemFree((void*)dataBlock);
1335 }
1336 }
1337
HdiSerStubUpdateAudioRoute(const struct HdfDeviceIoClient * client,struct HdfSBuf * audioAdapterData,struct HdfSBuf * audioAdapterReply)1338 static int32_t HdiSerStubUpdateAudioRoute(const struct HdfDeviceIoClient *client, struct HdfSBuf *audioAdapterData,
1339 struct HdfSBuf *audioAdapterReply)
1340 {
1341 int32_t audioAdapterRet = HDF_FAILURE;
1342 struct AudioRoute* route = NULL;
1343 int32_t routeHandle = 0;
1344 struct AudioAdapter *adapter = NULL;
1345 const char *adapterName = NULL;
1346
1347 if ((adapterName = HdfSbufReadString(audioAdapterData)) == NULL) {
1348 AUDIO_FUNC_LOGE("adapterNameCase Is NULL");
1349 return AUDIO_HAL_ERR_INVALID_PARAM;
1350 }
1351
1352 route = (struct AudioRoute*)OsalMemAlloc(sizeof(struct AudioRoute));
1353 if (route == NULL) {
1354 HDF_LOGE("%{public}s: malloc route failed", __func__);
1355 audioAdapterRet = HDF_ERR_MALLOC_FAIL;
1356 goto FINISHED;
1357 }
1358
1359 if (!AudioRouteBlockUnmarshalling(audioAdapterData, route)) {
1360 HDF_LOGE("%{public}s: read route failed!", __func__);
1361 audioAdapterRet = HDF_ERR_INVALID_PARAM;
1362 goto FINISHED;
1363 }
1364
1365 if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
1366 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1367 return AUDIO_HAL_ERR_INTERNAL;
1368 }
1369 if (adapter == NULL) {
1370 AUDIO_FUNC_LOGE("adapter is NULL!");
1371 return AUDIO_HAL_ERR_INVALID_PARAM;
1372 }
1373
1374 if (adapter->UpdateAudioRoute == NULL) {
1375 AUDIO_FUNC_LOGE("UpdateAudioRoute is NULL");
1376 return AUDIO_HAL_ERR_INTERNAL;
1377 }
1378 audioAdapterRet = adapter->UpdateAudioRoute(adapter, route, &routeHandle);
1379 if (audioAdapterRet != HDF_SUCCESS) {
1380 HDF_LOGE("%{public}s: call UpdateAudioRoute function failed!", __func__);
1381 goto FINISHED;
1382 }
1383
1384 if (!HdfSbufWriteInt32(audioAdapterReply, routeHandle)) {
1385 HDF_LOGE("%{public}s: write routeHandle failed!", __func__);
1386 audioAdapterRet = HDF_ERR_INVALID_PARAM;
1387 goto FINISHED;
1388 }
1389
1390 FINISHED:
1391 if (route != NULL) {
1392 AudioRouteFree(route, true);
1393 route = NULL;
1394 }
1395 return audioAdapterRet;
1396 }
1397
HdiSerStubReleaseAudioRoute(const struct HdfDeviceIoClient * client,struct HdfSBuf * audioAdapterData,struct HdfSBuf * audioAdapterReply)1398 static int32_t HdiSerStubReleaseAudioRoute(const struct HdfDeviceIoClient *client, struct HdfSBuf *audioAdapterData,
1399 struct HdfSBuf *audioAdapterReply)
1400 {
1401 int32_t audioAdapterRet = HDF_FAILURE;
1402 int32_t routeHandle = 0;
1403 struct AudioAdapter *adapter = NULL;
1404 const char *adapterName = NULL;
1405
1406 if ((adapterName = HdfSbufReadString(audioAdapterData)) == NULL) {
1407 AUDIO_FUNC_LOGE("adapterNameCase Is NULL");
1408 return AUDIO_HAL_ERR_INVALID_PARAM;
1409 }
1410
1411 if (!HdfSbufReadInt32(audioAdapterData, &routeHandle)) {
1412 HDF_LOGE("%{public}s: read &routeHandle failed!", __func__);
1413 return HDF_ERR_INVALID_PARAM;
1414 }
1415
1416 if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
1417 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1418 return AUDIO_HAL_ERR_INTERNAL;
1419 }
1420
1421 if (adapter == NULL || adapter->ReleaseAudioRoute == NULL) {
1422 AUDIO_FUNC_LOGE("adapter or ReleaseAudioRoute is NULL");
1423 return AUDIO_HAL_ERR_INTERNAL;
1424 }
1425 audioAdapterRet = adapter->ReleaseAudioRoute(adapter, routeHandle);
1426 if (audioAdapterRet != HDF_SUCCESS) {
1427 HDF_LOGE("%{public}s: call ReleaseAudioRoute function failed!", __func__);
1428 }
1429
1430 return audioAdapterRet;
1431 }
1432
HdiServiceAdapterSetMicMute(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1433 static int32_t HdiServiceAdapterSetMicMute(const struct HdfDeviceIoClient *client,
1434 struct HdfSBuf *data, struct HdfSBuf *reply)
1435 {
1436 bool mute = false;
1437 uint32_t tempMute = 0;
1438 struct AudioAdapter *adapter = NULL;
1439 const char *adapterName = NULL;
1440
1441 if (client == NULL || data == NULL || reply == NULL) {
1442 AUDIO_FUNC_LOGE("client or data or reply is NULL");
1443 return AUDIO_HAL_ERR_INVALID_PARAM;
1444 }
1445
1446 if ((adapterName = HdfSbufReadString(data)) == NULL) {
1447 AUDIO_FUNC_LOGE("adapterName Is NULL ");
1448 return HDF_FAILURE;
1449 }
1450
1451 if (!HdfSbufReadUint32(data, &tempMute)) {
1452 AUDIO_FUNC_LOGE("tempMute Is NULL ");
1453 return HDF_FAILURE;
1454 }
1455 mute = (bool)tempMute;
1456
1457 if (AudioAdapterListGetAdapter(adapterName, &adapter) != HDF_SUCCESS) {
1458 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1459 return AUDIO_HAL_ERR_INTERNAL;
1460 }
1461
1462 if (adapter == NULL || adapter->SetMicMute == NULL) {
1463 AUDIO_FUNC_LOGE("adapter or SetMicMute is NULL");
1464 return AUDIO_HAL_ERR_INTERNAL;
1465 }
1466
1467 return adapter->SetMicMute(adapter, mute);
1468 }
1469
HdiServiceAdapterGetMicMute(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1470 static int32_t HdiServiceAdapterGetMicMute(const struct HdfDeviceIoClient *client,
1471 struct HdfSBuf *data, struct HdfSBuf *reply)
1472 {
1473 if (client == NULL || data == NULL || reply == NULL) {
1474 AUDIO_FUNC_LOGE("client or data or reply is NULL");
1475 return AUDIO_HAL_ERR_INVALID_PARAM;
1476 }
1477
1478 bool mute = false;
1479 struct AudioAdapter *adapter = NULL;
1480 const char *adapterName = NULL;
1481
1482 if ((adapterName = HdfSbufReadString(data)) == NULL) {
1483 AUDIO_FUNC_LOGE("adapterName Is NULL ");
1484 return HDF_FAILURE;
1485 }
1486
1487 if (AudioAdapterListGetAdapter(adapterName, &adapter) != HDF_SUCCESS) {
1488 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1489 return AUDIO_HAL_ERR_INTERNAL;
1490 }
1491
1492 if (adapter == NULL || adapter->GetMicMute == NULL) {
1493 AUDIO_FUNC_LOGE("adapter or SetMicMute is NULL");
1494 return AUDIO_HAL_ERR_INTERNAL;
1495 }
1496
1497 int ret = adapter->GetMicMute(adapter, &mute);
1498 if (ret < 0) {
1499 AUDIO_FUNC_LOGE("GetMicMute FAIL");
1500 return ret;
1501 }
1502
1503 if (!HdfSbufWriteUint32(reply, (uint32_t)mute)) {
1504 return AUDIO_HAL_ERR_INTERNAL;
1505 }
1506
1507 return AUDIO_HAL_SUCCESS;
1508 }
1509
HdiServiceAdapterSetVoiceVolume(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1510 static int32_t HdiServiceAdapterSetVoiceVolume(const struct HdfDeviceIoClient *client,
1511 struct HdfSBuf *data, struct HdfSBuf *reply)
1512 {
1513 float volume = 0;
1514 struct AudioAdapter *adapter = NULL;
1515 const char *adapterName = NULL;
1516
1517 if (client == NULL || data == NULL || reply == NULL) {
1518 AUDIO_FUNC_LOGE("client or data or reply is NULL");
1519 return AUDIO_HAL_ERR_INVALID_PARAM;
1520 }
1521
1522 if ((adapterName = HdfSbufReadString(data)) == NULL) {
1523 AUDIO_FUNC_LOGE("adapterName Is NULL ");
1524 return HDF_FAILURE;
1525 }
1526
1527 if (!HdfSbufReadFloat(data, &volume)) {
1528 AUDIO_FUNC_LOGE("volume Is NULL ");
1529 return HDF_FAILURE;
1530 }
1531
1532 if (AudioAdapterListGetAdapter(adapterName, &adapter) != HDF_SUCCESS) {
1533 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1534 return AUDIO_HAL_ERR_INTERNAL;
1535 }
1536
1537 if (adapter == NULL || adapter->SetVoiceVolume == NULL) {
1538 AUDIO_FUNC_LOGE("adapter or SetVoiceVolume is NULL");
1539 return AUDIO_HAL_ERR_INTERNAL;
1540 }
1541
1542 return adapter->SetVoiceVolume(adapter, volume);
1543 }
1544
HdiServiceAdapterSetExtraParams(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1545 static int32_t HdiServiceAdapterSetExtraParams(const struct HdfDeviceIoClient *client,
1546 struct HdfSBuf *data, struct HdfSBuf *reply)
1547 {
1548 if (client == NULL || data == NULL || reply == NULL) {
1549 AUDIO_FUNC_LOGE("the parameter is empty");
1550 return AUDIO_HAL_ERR_INVALID_PARAM;
1551 }
1552
1553 struct AudioAdapter *adapter = NULL;
1554 const char *adapterName = NULL;
1555 const char *value = NULL;
1556 enum AudioExtParamKey key = AUDIO_EXT_PARAM_KEY_NONE;
1557 const char *condition = NULL;
1558
1559 if ((adapterName = HdfSbufReadString(data)) == NULL) {
1560 AUDIO_FUNC_LOGE("adapterName is NULL");
1561 return HDF_FAILURE;
1562 }
1563
1564 if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
1565 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter FAIL");
1566 return AUDIO_HAL_ERR_INTERNAL;
1567 }
1568 if (adapter == NULL) {
1569 AUDIO_FUNC_LOGE("adapter is NULL");
1570 return AUDIO_HAL_ERR_INTERNAL;
1571 }
1572
1573 value = HdfSbufReadString(data);
1574 if (value == NULL) {
1575 AUDIO_FUNC_LOGE("value is NULL");
1576 return AUDIO_HAL_ERR_INTERNAL;
1577 }
1578
1579 if (adapter->SetExtraParams == NULL) {
1580 AUDIO_FUNC_LOGE("adapter or SetExtraParams is NULL");
1581 return AUDIO_HAL_ERR_INTERNAL;
1582 }
1583
1584 return adapter->SetExtraParams(adapter, key, condition, value);
1585 }
1586
HdiServiceAdapterGetExtraParams(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1587 static int32_t HdiServiceAdapterGetExtraParams(const struct HdfDeviceIoClient *client,
1588 struct HdfSBuf *data, struct HdfSBuf *reply)
1589 {
1590 if (client == NULL || data == NULL || reply == NULL) {
1591 AUDIO_FUNC_LOGE("the parameter is empty");
1592 return AUDIO_HAL_ERR_INVALID_PARAM;
1593 }
1594
1595 int32_t length = 0;
1596 struct AudioAdapter *adapter = NULL;
1597 const char *adapterName = NULL;
1598 enum AudioExtParamKey key = AUDIO_EXT_PARAM_KEY_NONE;
1599 const char *condition = NULL;
1600 char value[STR_MAX] = { 0 };
1601
1602 if ((adapterName = HdfSbufReadString(data)) == NULL) {
1603 AUDIO_FUNC_LOGE("adapterName is NULL");
1604 return HDF_FAILURE;
1605 }
1606
1607 if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
1608 AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter FAIL");
1609 return AUDIO_HAL_ERR_INTERNAL;
1610 }
1611 if (adapter == NULL) {
1612 AUDIO_FUNC_LOGE("adapter is NULL");
1613 return AUDIO_HAL_ERR_INTERNAL;
1614 }
1615
1616 if (!HdfSbufReadInt32(data, &length)) {
1617 AUDIO_FUNC_LOGE("HdiServiceAdapterGetExtraParams FAIL! length is 0.");
1618 return AUDIO_HAL_ERR_INTERNAL;
1619 }
1620
1621 if (adapter->GetExtraParams == NULL) {
1622 AUDIO_FUNC_LOGE("adapter or GetExtraParams is NULL");
1623 return AUDIO_HAL_ERR_INTERNAL;
1624 }
1625
1626 int32_t ret = adapter->GetExtraParams(adapter, key, condition, value, length);
1627 if (ret < 0) {
1628 AUDIO_FUNC_LOGE("GetExtraParams FAIL");
1629 return ret;
1630 }
1631
1632 if (!HdfSbufWriteString(reply, value)) {
1633 AUDIO_FUNC_LOGE("value write fail");
1634 return AUDIO_HAL_ERR_INTERNAL;
1635 }
1636
1637 return AUDIO_HAL_SUCCESS;
1638 }
1639
1640 struct HdiServiceDispatchCmdHandleList g_hdiServiceDispatchCmdHandleList[] = {
1641 {AUDIO_HDI_MGR_GET_FUNCS, HdiServiceGetFuncs},
1642 {AUDIO_HDI_MGR_GET_ALL_ADAPTER, HdiServiceGetAllAdapter},
1643 {AUDIO_HDI_MGR_RELEASE, HdiServiceReleaseAudioManagerObject},
1644 {AUDIO_HDI_MGR_LOAD_ADAPTER, HdiServiceLoadAdapter},
1645 {AUDIO_HDI_MGR_UNLOAD_ADAPTER, HdiServiceUnloadAdapter},
1646 {AUDIO_HDI_ADT_INIT_PORTS, HdiServiceInitAllPorts},
1647 {AUDIO_HDI_ADT_GET_PORT_CAPABILITY, HdiServiceGetPortCapability},
1648 {AUDIO_HDI_ADT_SET_PASS_MODE, HdiServiceSetPassthroughMode},
1649 {AUDIO_HDI_ADT_GET_PASS_MODE, HdiServiceGetPassthroughMode},
1650 {AUDIO_HDI_ADT_UPDATE_ROUTE, HdiSerStubUpdateAudioRoute},
1651 {AUDIO_HDI_ADT_RELEASE_ROUTE, HdiSerStubReleaseAudioRoute},
1652 {AUDIO_HDI_ADT_SET_MIC_MUTE, HdiServiceAdapterSetMicMute},
1653 {AUDIO_HDI_ADT_GET_MIC_MUTE, HdiServiceAdapterGetMicMute},
1654 {AUDIO_HDI_ADT_SET_VOICE_VOLUME, HdiServiceAdapterSetVoiceVolume},
1655 {AUDIO_HDI_ADT_SET_EXTRA_PARAMS, HdiServiceAdapterSetExtraParams},
1656 {AUDIO_HDI_ADT_GET_EXTRA_PARAMS, HdiServiceAdapterGetExtraParams},
1657 {AUDIO_HDI_PNP_DEV_STATUS, HdiServiceGetDevStatusByPnp},
1658 {AUDIO_HDI_RENDER_CREATE_RENDER, HdiServiceCreatRender},
1659 {AUDIO_HDI_RENDER_DESTROY, HdiServiceRenderDestory},
1660 {AUDIO_HDI_RENDER_START, HdiServiceRenderStart},
1661 {AUDIO_HDI_RENDER_STOP, HdiServiceRenderStop},
1662 {AUDIO_HDI_RENDER_PAUSE, HdiServiceRenderPause},
1663 {AUDIO_HDI_RENDER_RESUME, HdiServiceRenderResume},
1664 {AUDIO_HDI_RENDER_FLUSH, HdiServiceRenderFlush},
1665 {AUDIO_HDI_RENDER_GET_FRAME_SIZE, HdiServiceRenderGetFrameSize},
1666 {AUDIO_HDI_RENDER_GET_FRAME_COUNT, HdiServiceRenderGetFrameCount},
1667 {AUDIO_HDI_RENDER_SET_SAMPLE_ATTR, HdiServiceRenderSetSampleAttr},
1668 {AUDIO_HDI_RENDER_GET_SAMPLE_ATTR, HdiServiceRenderGetSampleAttr},
1669 {AUDIO_HDI_RENDER_GET_CUR_CHANNEL_ID, HdiServiceRenderGetCurChannelId},
1670 {AUDIO_HDI_RENDER_CHECK_SCENE_CAPABILITY, HdiServiceRenderCheckSceneCapability},
1671 {AUDIO_HDI_RENDER_SELECT_SCENE, HdiServiceRenderSelectScene},
1672 {AUDIO_HDI_RENDER_GET_MUTE, HdiServiceRenderGetMute},
1673 {AUDIO_HDI_RENDER_SET_MUTE, HdiServiceRenderSetMute},
1674 {AUDIO_HDI_RENDER_SET_VOLUME, HdiServiceRenderSetVolume},
1675 {AUDIO_HDI_RENDER_GET_VOLUME, HdiServiceRenderGetVolume},
1676 {AUDIO_HDI_RENDER_GET_GAIN_THRESHOLD, HdiServiceRenderGetGainThreshold},
1677 {AUDIO_HDI_RENDER_GET_GAIN, HdiServiceRenderGetGain},
1678 {AUDIO_HDI_RENDER_SET_GAIN, HdiServiceRenderSetGain},
1679 {AUDIO_HDI_RENDER_GET_LATENCY, HdiServiceRenderGetLatency},
1680 {AUDIO_HDI_RENDER_RENDER_FRAME, HdiServiceRenderRenderFrame},
1681 {AUDIO_HDI_RENDER_GET_RENDER_POSITION, HdiServiceRenderGetRenderPosition},
1682 {AUDIO_HDI_RENDER_GET_SPEED, HdiServiceRenderGetSpeed},
1683 {AUDIO_HDI_RENDER_SET_SPEED, HdiServiceRenderSetSpeed},
1684 {AUDIO_HDI_RENDER_SET_CHANNEL_MODE, HdiServiceRenderSetChannelMode},
1685 {AUDIO_HDI_RENDER_GET_CHANNEL_MODE, HdiServiceRenderGetChannelMode},
1686 {AUDIO_HDI_RENDER_SET_EXTRA_PARAMS, HdiServiceRenderSetExtraParams},
1687 {AUDIO_HDI_RENDER_GET_EXTRA_PARAMS, HdiServiceRenderGetExtraParams},
1688 {AUDIO_HDI_RENDER_REQ_MMAP_BUFFER, HdiServiceRenderReqMmapBuffer},
1689 {AUDIO_HDI_RENDER_GET_MMAP_POSITION, HdiServiceRenderGetMmapPosition},
1690 {AUDIO_HDI_RENDER_ADD_EFFECT, HdiServiceRenderAddEffect},
1691 {AUDIO_HDI_RENDER_REMOVE_EFFECT, HdiServiceRenderRemoveEffect},
1692 {AUDIO_HDI_RENDER_TURN_STAND_BY_MODE, HdiServiceRenderTurnStandbyMode},
1693 {AUDIO_HDI_RENDER_DEV_DUMP, HdiServiceRenderDevDump},
1694 {AUDIO_HDI_RENDER_REG_CALLBACK, HdiServiceRenderRegCallback},
1695 {AUDIO_HDI_RENDER_DRAIN_BUFFER, HdiServiceRenderDrainBuffer},
1696 };
1697
1698 static struct HdiServiceDispatchCmdHandleList g_hdiServiceDispatchCmdHandleCapList[] = {
1699 {AUDIO_HDI_CAPTURE_CREATE_CAPTURE, HdiServiceCreatCapture},
1700 {AUDIO_HDI_CAPTURE_DESTROY, HdiServiceCaptureDestory},
1701 {AUDIO_HDI_CAPTURE_START, HdiServiceCaptureStart},
1702 {AUDIO_HDI_CAPTURE_STOP, HdiServiceCaptureStop},
1703 {AUDIO_HDI_CAPTURE_PAUSE, HdiServiceCapturePause},
1704 {AUDIO_HDI_CAPTURE_RESUME, HdiServiceCaptureResume},
1705 {AUDIO_HDI_CAPTURE_FLUSH, HdiServiceCaptureFlush},
1706 {AUDIO_HDI_CAPTURE_GET_FRAME_SIZE, HdiServiceCaptureGetFrameSize},
1707 {AUDIO_HDI_CAPTURE_GET_FRAME_COUNT, HdiServiceCaptureGetFrameCount},
1708 {AUDIO_HDI_CAPTURE_SET_SAMPLE_ATTR, HdiServiceCaptureSetSampleAttr},
1709 {AUDIO_HDI_CAPTURE_GET_SAMPLE_ATTR, HdiServiceCaptureGetSampleAttr},
1710 {AUDIO_HDI_CAPTURE_GET_CUR_CHANNEL_ID, HdiServiceCaptureGetCurChannelId},
1711 {AUDIO_HDI_CAPTURE_CHECK_SCENE_CAPABILITY, HdiServiceCaptureCheckSceneCapability},
1712 {AUDIO_HDI_CAPTURE_SELECT_SCENE, HdiServiceCaptureSelectScene},
1713 {AUDIO_HDI_CAPTURE_GET_MUTE, HdiServiceCaptureGetMute},
1714 {AUDIO_HDI_CAPTURE_SET_MUTE, HdiServiceCaptureSetMute},
1715 {AUDIO_HDI_CAPTURE_SET_VOLUME, HdiServiceCaptureSetVolume},
1716 {AUDIO_HDI_CAPTURE_GET_VOLUME, HdiServiceCaptureGetVolume},
1717 {AUDIO_HDI_CAPTURE_GET_GAIN_THRESHOLD, HdiServiceCaptureGetGainThreshold},
1718 {AUDIO_HDI_CAPTURE_GET_GAIN, HdiServiceCaptureGetGain},
1719 {AUDIO_HDI_CAPTURE_SET_GAIN, HdiServiceCaptureSetGain},
1720 {AUDIO_HDI_CAPTURE_CAPTURE_FRAME, HdiServiceCaptureCaptureFrame},
1721 {AUDIO_HDI_CAPTURE_GET_CAPTURE_POSITION, HdiServiceCaptureGetCapturePosition},
1722 {AUDIO_HDI_CAPTURE_SET_EXTRA_PARAMS, HdiServiceCaptureSetExtraParams},
1723 {AUDIO_HDI_CAPTURE_GET_EXTRA_PARAMS, HdiServiceCaptureGetExtraParams},
1724 {AUDIO_HDI_CAPTURE_REQ_MMAP_BUFFER, HdiServiceCaptureReqMmapBuffer},
1725 {AUDIO_HDI_CAPTURE_GET_MMAP_POSITION, HdiServiceCaptureGetMmapPosition},
1726 {AUDIO_HDI_CAPTURE_ADD_EFFECT, HdiServiceCaptureAddEffect},
1727 {AUDIO_HDI_CAPTURE_REMOVE_EFFECT, HdiServiceCaptureRemoveEffect},
1728 {AUDIO_HDI_CAPTURE_TURN_STAND_BY_MODE, HdiServiceCaptureTurnStandbyMode},
1729 {AUDIO_HDI_CAPTURE_DEV_DUMP, HdiServiceCaptureDevDump},
1730 };
1731
HdiServiceDispatch(struct HdfDeviceIoClient * client,int cmdId,struct HdfSBuf * data,struct HdfSBuf * reply)1732 int32_t HdiServiceDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data,
1733 struct HdfSBuf *reply)
1734 {
1735 unsigned int i;
1736 AUDIO_FUNC_LOGD("cmdId = %{public}d", cmdId);
1737 if (client == NULL) {
1738 AUDIO_FUNC_LOGE("ControlDispatch: input para is NULL.");
1739 return AUDIO_HAL_ERR_INVALID_PARAM;
1740 }
1741
1742 if (!HdfDeviceObjectCheckInterfaceDesc(client->device, data)) {
1743 AUDIO_FUNC_LOGE("check interface token failed");
1744 return AUDIO_HAL_ERR_INVALID_PARAM;
1745 }
1746 if (cmdId > AUDIO_HDI_CAPTURE_DEV_DUMP || cmdId < 0) {
1747 AUDIO_FUNC_LOGE("ControlDispatch: invalid cmdId = %{public}d", cmdId);
1748 return AUDIO_HAL_ERR_INTERNAL;
1749 } else if (cmdId <= AUDIO_HDI_RENDER_DRAIN_BUFFER) {
1750 for (i = 0; i < sizeof(g_hdiServiceDispatchCmdHandleList) /
1751 sizeof(g_hdiServiceDispatchCmdHandleList[0]); ++i) {
1752 if ((cmdId == (int)(g_hdiServiceDispatchCmdHandleList[i].cmd)) &&
1753 (g_hdiServiceDispatchCmdHandleList[i].func != NULL)) {
1754 return g_hdiServiceDispatchCmdHandleList[i].func(client, data, reply);
1755 }
1756 }
1757 } else {
1758 for (i = 0; i < sizeof(g_hdiServiceDispatchCmdHandleCapList) /
1759 sizeof(g_hdiServiceDispatchCmdHandleCapList[0]); ++i) {
1760 if ((cmdId == (int)(g_hdiServiceDispatchCmdHandleCapList[i].cmd)) &&
1761 (g_hdiServiceDispatchCmdHandleCapList[i].func != NULL)) {
1762 return g_hdiServiceDispatchCmdHandleCapList[i].func(client, data, reply);
1763 }
1764 }
1765 }
1766 return AUDIO_HAL_ERR_INTERNAL;
1767 }
1768