• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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