• 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 
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