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