• 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 (data == NULL || dataBlock == NULL) {
1076         HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1077         goto ERROR;
1078     }
1079 
1080     if (!HdfSbufReadInt32(data, &dataBlock->moduleId)) {
1081         HDF_LOGE("%{public}s: read dataBlock->moduleId failed!", __func__);
1082         goto ERROR;
1083     }
1084 
1085     if (!HdfSbufReadInt32(data, (int32_t*)&dataBlock->type)) {
1086         HDF_LOGE("%{public}s: read dataBlock->type failed!", __func__);
1087         goto ERROR;
1088     }
1089 
1090     const char *descCp = HdfSbufReadString(data);
1091     if (descCp == NULL) {
1092         HDF_LOGE("%{public}s: read descCp failed!", __func__);
1093         goto ERROR;
1094     }
1095 
1096     dataBlock->desc = strdup(descCp);
1097     if (dataBlock->desc == NULL) {
1098         HDF_LOGE("strdup fail in %{public}s", __func__);
1099         goto ERROR;
1100     }
1101 
1102     return true;
1103 ERROR:
1104     if (dataBlock->desc != NULL) {
1105         OsalMemFree((void*)dataBlock->desc);
1106         dataBlock->desc = NULL;
1107     }
1108 
1109     return false;
1110 }
1111 
AudioMixExtInfoBlockUnmarshalling(struct HdfSBuf * data,struct AudioMixExtInfo * dataBlock)1112 static bool AudioMixExtInfoBlockUnmarshalling(struct HdfSBuf *data, struct AudioMixExtInfo *dataBlock)
1113 {
1114     if (data == NULL || dataBlock == NULL) {
1115         HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1116         return false;
1117     }
1118 
1119     const struct AudioMixExtInfo *dataBlockPtr = (const struct AudioMixExtInfo *)HdfSbufReadUnpadBuffer(data,
1120         sizeof(struct AudioMixExtInfo));
1121     if (dataBlockPtr == NULL) {
1122         HDF_LOGE("%{public}s: failed to read buffer data", __func__);
1123         return false;
1124     }
1125 
1126     if (memcpy_s(dataBlock, sizeof(struct AudioMixExtInfo), dataBlockPtr, sizeof(struct AudioMixExtInfo)) != EOK) {
1127         HDF_LOGE("%{public}s: failed to memcpy data", __func__);
1128         return false;
1129     }
1130 
1131     return true;
1132 }
1133 
AudioSessionExtInfoBlockUnmarshalling(struct HdfSBuf * data,struct AudioSessionExtInfo * dataBlock)1134 static bool AudioSessionExtInfoBlockUnmarshalling(struct HdfSBuf *data, struct AudioSessionExtInfo *dataBlock)
1135 {
1136     if (data == NULL || dataBlock == NULL) {
1137         HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1138         return false;
1139     }
1140 
1141     const struct AudioSessionExtInfo *dataBlockPtr = (const struct AudioSessionExtInfo *)HdfSbufReadUnpadBuffer(data,
1142                                                       sizeof(struct AudioSessionExtInfo));
1143     if (dataBlockPtr == NULL) {
1144         HDF_LOGE("%{public}s: failed to read buffer data", __func__);
1145         return false;
1146     }
1147 
1148     if (memcpy_s(dataBlock, sizeof(struct AudioSessionExtInfo), dataBlockPtr,
1149                  sizeof(struct AudioSessionExtInfo)) != EOK) {
1150         HDF_LOGE("%{public}s: failed to memcpy data", __func__);
1151         return false;
1152     }
1153 
1154     return true;
1155 }
1156 
AudioDevExtInfoFree(struct AudioDevExtInfo * dataBlock,bool freeSelf)1157 static void AudioDevExtInfoFree(struct AudioDevExtInfo *dataBlock, bool freeSelf)
1158 {
1159     if (dataBlock == NULL) {
1160         return;
1161     }
1162 
1163     if (dataBlock->desc != NULL) {
1164         OsalMemFree((void*)dataBlock->desc);
1165         dataBlock->desc = NULL;
1166     }
1167 
1168     if (freeSelf) {
1169         OsalMemFree(dataBlock);
1170     }
1171 }
1172 
AudioInfoBlockUnmarshalling(enum AudioPortType type,struct HdfSBuf * data,RouteExtInfo * dataBlock)1173 static bool AudioInfoBlockUnmarshalling(enum AudioPortType type, struct HdfSBuf *data, RouteExtInfo *dataBlock)
1174 {
1175     if (data == NULL || dataBlock == NULL) {
1176         HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1177         return false;
1178     }
1179     bool ret = true;
1180     switch (type) {
1181         case AUDIO_PORT_DEVICE_TYPE:
1182             if (!AudioDevExtInfoBlockUnmarshalling(data, &dataBlock->device)) {
1183                 HDF_LOGE("%{public}s: write dataBlock->device failed!", __func__);
1184                 AudioDevExtInfoFree(&dataBlock->device, false);
1185                 ret = false;
1186             }
1187             break;
1188         case AUDIO_PORT_MIX_TYPE:
1189             if (!AudioMixExtInfoBlockUnmarshalling(data, &dataBlock->mix)) {
1190                 HDF_LOGE("%{public}s: write dataBlock->mix failed!", __func__);
1191                 ret = false;
1192             }
1193             break;
1194         case AUDIO_PORT_SESSION_TYPE:
1195             if (!AudioSessionExtInfoBlockUnmarshalling(data, &dataBlock->session)) {
1196                 HDF_LOGE("%{public}s: write dataBlock->session failed!", __func__);
1197                 ret = false;
1198             }
1199             break;
1200         case AUDIO_PORT_UNASSIGNED_TYPE:
1201         default:
1202             ret = false;
1203             break;
1204     }
1205 
1206     return ret;
1207 }
1208 
AudioRouteNodeBlockUnmarshalling(struct HdfSBuf * data,struct AudioRouteNode * dataBlock)1209 static bool AudioRouteNodeBlockUnmarshalling(struct HdfSBuf *data, struct AudioRouteNode *dataBlock)
1210 {
1211     if (data == NULL || dataBlock == NULL) {
1212         HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1213         return false;
1214     }
1215 
1216     if (!HdfSbufReadInt32(data, &dataBlock->portId)) {
1217         HDF_LOGE("%{public}s: read dataBlock->portId failed!", __func__);
1218         return false;
1219     }
1220 
1221     if (!HdfSbufReadInt32(data, (int32_t*)&dataBlock->role)) {
1222         HDF_LOGE("%{public}s: read dataBlock->role failed!", __func__);
1223         return false;
1224     }
1225 
1226     if (!HdfSbufReadInt32(data, (int32_t*)&dataBlock->type)) {
1227         HDF_LOGE("%{public}s: read dataBlock->type failed!", __func__);
1228         return false;
1229     }
1230 
1231     if (!AudioInfoBlockUnmarshalling(dataBlock->type, data, (RouteExtInfo*)&dataBlock->ext)) {
1232         HDF_LOGE("%{public}s: read &dataBlock->ext failed!", __func__);
1233         return false;
1234     }
1235 
1236     return true;
1237 }
1238 
AudioRouteSinksBlockUnmarshalling(struct HdfSBuf * data,struct AudioRouteNode ** sourcesOrSinksCp,uint32_t * sourcesOrSinksNum)1239 static bool AudioRouteSinksBlockUnmarshalling(
1240     struct HdfSBuf *data,
1241     struct AudioRouteNode **sourcesOrSinksCp,
1242     uint32_t *sourcesOrSinksNum)
1243 {
1244     if (!HdfSbufReadUint32(data, sourcesOrSinksNum)) {
1245         HDF_LOGE("%{public}s: read sourcesOrSinksNum failed!", __func__);
1246         return false;
1247     }
1248     if (*sourcesOrSinksNum > 0) {
1249         *sourcesOrSinksCp = (struct AudioRouteNode*)OsalMemCalloc(sizeof(struct AudioRouteNode) * (*sourcesOrSinksNum));
1250         if (*sourcesOrSinksCp == NULL) {
1251             return false;
1252         }
1253         for (uint32_t i = 0; i < *sourcesOrSinksNum; i++) {
1254             if (!AudioRouteNodeBlockUnmarshalling(data, (*sourcesOrSinksCp) + i)) {
1255                 HDF_LOGE("%{public}s: read &sourcesOrSinksCp[i] failed!", __func__);
1256                 OsalMemFree((void*)*sourcesOrSinksCp);
1257                 return false;
1258             }
1259         }
1260     }
1261 
1262     return true;
1263 }
1264 
AudioRouteSourceBlockUnmarshalling(struct HdfSBuf * data,struct AudioRoute * dataBlock)1265 static bool AudioRouteSourceBlockUnmarshalling(struct HdfSBuf *data, struct AudioRoute *dataBlock)
1266 {
1267     if (data == NULL || dataBlock == NULL) {
1268         HDF_LOGE("%{public}s: invalid sbuf or data block", __func__);
1269         return false;
1270     }
1271 
1272     struct AudioRouteNode* sourcesCp = NULL;
1273     uint32_t sourcesNum = 0;
1274     struct AudioRouteNode* sinksCp = NULL;
1275     uint32_t sinksNum = 0;
1276 
1277     if (!AudioRouteSinksBlockUnmarshalling(data, &sourcesCp, &sourcesNum)) {
1278         HDF_LOGE("%{public}s: read sources failed!", __func__);
1279         return false;
1280     }
1281     dataBlock->sources = sourcesCp;
1282     dataBlock->sourcesNum = sourcesNum;
1283 
1284     if (!AudioRouteSinksBlockUnmarshalling(data, &sinksCp, &sinksNum)) {
1285         HDF_LOGE("%{public}s: read sinks failed!", __func__);
1286         OsalMemFree((void*)sourcesCp);
1287         return false;
1288     }
1289     dataBlock->sinks = sinksCp;
1290     dataBlock->sinksNum = sinksNum;
1291 
1292     return true;
1293 }
1294 
AudioRouteDevFreeByNum(const struct AudioRouteNode * routeNode,uint32_t num)1295 static void AudioRouteDevFreeByNum(const struct AudioRouteNode *routeNode, uint32_t num)
1296 {
1297     uint32_t nodeCnt;
1298     if (routeNode == NULL) {
1299         AUDIO_FUNC_LOGI("routeNode has been freed");
1300         return;
1301     }
1302 
1303     for (nodeCnt = 0; nodeCnt < num; nodeCnt++) {
1304         if (routeNode[nodeCnt].type == AUDIO_PORT_DEVICE_TYPE) {
1305             AudioDevExtInfoFree((struct AudioDevExtInfo *)&routeNode[nodeCnt].ext.device, false);
1306         }
1307     }
1308 }
1309 
AudioRouteFree(struct AudioRoute * dataBlock,bool freeSelf)1310 static void AudioRouteFree(struct AudioRoute *dataBlock, bool freeSelf)
1311 {
1312     if (dataBlock == NULL) {
1313         AUDIO_FUNC_LOGI("dataBlock has been freed");
1314         return;
1315     }
1316 
1317     if (dataBlock->sources != NULL) {
1318         AudioRouteDevFreeByNum(dataBlock->sources, dataBlock->sourcesNum);
1319         OsalMemFree((void*)dataBlock->sources);
1320     }
1321 
1322     if (dataBlock->sinks != NULL) {
1323         AudioRouteDevFreeByNum(dataBlock->sinks, dataBlock->sinksNum);
1324         OsalMemFree((void*)dataBlock->sinks);
1325     }
1326 
1327     if (freeSelf) {
1328         OsalMemFree((void*)dataBlock);
1329     }
1330 }
1331 
HdiSerStubUpdateAudioRoute(const struct HdfDeviceIoClient * client,struct HdfSBuf * audioAdapterData,struct HdfSBuf * audioAdapterReply)1332 static int32_t HdiSerStubUpdateAudioRoute(const struct HdfDeviceIoClient *client, struct HdfSBuf *audioAdapterData,
1333                                           struct HdfSBuf *audioAdapterReply)
1334 {
1335     int32_t audioAdapterRet = HDF_FAILURE;
1336     struct AudioRoute* route = NULL;
1337     int32_t routeHandle = 0;
1338     struct AudioAdapter *adapter = NULL;
1339     const char *adapterName = NULL;
1340 
1341     if ((adapterName = HdfSbufReadString(audioAdapterData)) == NULL) {
1342         AUDIO_FUNC_LOGE("adapterNameCase Is NULL");
1343         return AUDIO_HAL_ERR_INVALID_PARAM;
1344     }
1345 
1346     route = (struct AudioRoute*)OsalMemAlloc(sizeof(struct AudioRoute));
1347     if (route == NULL) {
1348         HDF_LOGE("%{public}s: malloc route failed", __func__);
1349         audioAdapterRet = HDF_ERR_MALLOC_FAIL;
1350         goto FINISHED;
1351     }
1352 
1353     if (!AudioRouteSourceBlockUnmarshalling(audioAdapterData, route)) {
1354         HDF_LOGE("%{public}s: read route failed!", __func__);
1355         audioAdapterRet = HDF_ERR_INVALID_PARAM;
1356         goto FINISHED;
1357     }
1358 
1359     if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
1360         AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1361         return AUDIO_HAL_ERR_INTERNAL;
1362     }
1363     if (adapter == NULL) {
1364         AUDIO_FUNC_LOGE("adapter is NULL!");
1365         return AUDIO_HAL_ERR_INVALID_PARAM;
1366     }
1367 
1368     if (adapter->UpdateAudioRoute == NULL) {
1369         AUDIO_FUNC_LOGE("UpdateAudioRoute is NULL");
1370         return AUDIO_HAL_ERR_INTERNAL;
1371     }
1372     audioAdapterRet = adapter->UpdateAudioRoute(adapter, route, &routeHandle);
1373     if (audioAdapterRet != HDF_SUCCESS) {
1374         HDF_LOGE("%{public}s: call UpdateAudioRoute function failed!", __func__);
1375         goto FINISHED;
1376     }
1377 
1378     if (!HdfSbufWriteInt32(audioAdapterReply, routeHandle)) {
1379         HDF_LOGE("%{public}s: write routeHandle failed!", __func__);
1380         audioAdapterRet = HDF_ERR_INVALID_PARAM;
1381         goto FINISHED;
1382     }
1383 
1384 FINISHED:
1385     if (route != NULL) {
1386         AudioRouteFree(route, true);
1387         route = NULL;
1388     }
1389     return audioAdapterRet;
1390 }
1391 
HdiSerStubReleaseAudioRoute(const struct HdfDeviceIoClient * client,struct HdfSBuf * audioAdapterData,struct HdfSBuf * audioAdapterReply)1392 static int32_t HdiSerStubReleaseAudioRoute(const struct HdfDeviceIoClient *client, struct HdfSBuf *audioAdapterData,
1393                                            struct HdfSBuf *audioAdapterReply)
1394 {
1395     int32_t audioAdapterRet = HDF_FAILURE;
1396     int32_t routeHandle = 0;
1397     struct AudioAdapter *adapter = NULL;
1398     const char *adapterName = NULL;
1399 
1400     if ((adapterName = HdfSbufReadString(audioAdapterData)) == NULL) {
1401         AUDIO_FUNC_LOGE("adapterNameCase Is NULL");
1402         return AUDIO_HAL_ERR_INVALID_PARAM;
1403     }
1404 
1405     if (!HdfSbufReadInt32(audioAdapterData, &routeHandle)) {
1406         HDF_LOGE("%{public}s: read &routeHandle failed!", __func__);
1407         return HDF_ERR_INVALID_PARAM;
1408     }
1409 
1410     if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
1411         AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1412         return AUDIO_HAL_ERR_INTERNAL;
1413     }
1414 
1415     if (adapter == NULL || adapter->ReleaseAudioRoute == NULL) {
1416         AUDIO_FUNC_LOGE("adapter or ReleaseAudioRoute is NULL");
1417         return AUDIO_HAL_ERR_INTERNAL;
1418     }
1419     audioAdapterRet = adapter->ReleaseAudioRoute(adapter, routeHandle);
1420     if (audioAdapterRet != HDF_SUCCESS) {
1421         HDF_LOGE("%{public}s: call ReleaseAudioRoute function failed!", __func__);
1422     }
1423 
1424     return audioAdapterRet;
1425 }
1426 
HdiServiceAdapterSetMicMute(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1427 static int32_t HdiServiceAdapterSetMicMute(const struct HdfDeviceIoClient *client,
1428     struct HdfSBuf *data, struct HdfSBuf *reply)
1429 {
1430     bool mute = false;
1431     uint32_t tempMute = 0;
1432     struct AudioAdapter *adapter = NULL;
1433     const char *adapterName = NULL;
1434 
1435     if (client == NULL || data == NULL || reply == NULL) {
1436         AUDIO_FUNC_LOGE("client or data or reply is NULL");
1437         return AUDIO_HAL_ERR_INVALID_PARAM;
1438     }
1439 
1440     if ((adapterName = HdfSbufReadString(data)) == NULL) {
1441         AUDIO_FUNC_LOGE("adapterName Is NULL ");
1442         return HDF_FAILURE;
1443     }
1444 
1445     if (!HdfSbufReadUint32(data, &tempMute)) {
1446         AUDIO_FUNC_LOGE("tempMute Is NULL ");
1447         return HDF_FAILURE;
1448     }
1449     mute = (bool)tempMute;
1450 
1451     if (AudioAdapterListGetAdapter(adapterName, &adapter) != HDF_SUCCESS) {
1452         AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1453         return AUDIO_HAL_ERR_INTERNAL;
1454     }
1455 
1456     if (adapter == NULL || adapter->SetMicMute == NULL) {
1457         AUDIO_FUNC_LOGE("adapter or SetMicMute is NULL");
1458         return AUDIO_HAL_ERR_INTERNAL;
1459     }
1460 
1461     return adapter->SetMicMute(adapter, mute);
1462 }
1463 
HdiServiceAdapterGetMicMute(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1464 static int32_t HdiServiceAdapterGetMicMute(const struct HdfDeviceIoClient *client,
1465     struct HdfSBuf *data, struct HdfSBuf *reply)
1466 {
1467     if (client == NULL || data == NULL || reply == NULL) {
1468         AUDIO_FUNC_LOGE("client or data or reply is NULL");
1469         return AUDIO_HAL_ERR_INVALID_PARAM;
1470     }
1471 
1472     bool mute = false;
1473     struct AudioAdapter *adapter = NULL;
1474     const char *adapterName = NULL;
1475 
1476     if ((adapterName = HdfSbufReadString(data)) == NULL) {
1477         AUDIO_FUNC_LOGE("adapterName Is NULL ");
1478         return HDF_FAILURE;
1479     }
1480 
1481     if (AudioAdapterListGetAdapter(adapterName, &adapter) != HDF_SUCCESS) {
1482         AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1483         return AUDIO_HAL_ERR_INTERNAL;
1484     }
1485 
1486     if (adapter == NULL || adapter->GetMicMute == NULL) {
1487         AUDIO_FUNC_LOGE("adapter or SetMicMute is NULL");
1488         return AUDIO_HAL_ERR_INTERNAL;
1489     }
1490 
1491     int ret = adapter->GetMicMute(adapter, &mute);
1492     if (ret < 0) {
1493         AUDIO_FUNC_LOGE("GetMicMute FAIL");
1494         return ret;
1495     }
1496 
1497     if (!HdfSbufWriteUint32(reply, (uint32_t)mute)) {
1498         return AUDIO_HAL_ERR_INTERNAL;
1499     }
1500 
1501     return AUDIO_HAL_SUCCESS;
1502 }
1503 
HdiServiceAdapterSetVoiceVolume(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1504 static int32_t HdiServiceAdapterSetVoiceVolume(const struct HdfDeviceIoClient *client,
1505                                                struct HdfSBuf *data, struct HdfSBuf *reply)
1506 {
1507     float volume = 0;
1508     struct AudioAdapter *adapter = NULL;
1509     const char *adapterName = NULL;
1510 
1511     if (client == NULL || data == NULL || reply == NULL) {
1512         AUDIO_FUNC_LOGE("client or data or reply is NULL");
1513         return AUDIO_HAL_ERR_INVALID_PARAM;
1514     }
1515 
1516     if ((adapterName = HdfSbufReadString(data)) == NULL) {
1517         AUDIO_FUNC_LOGE("adapterName Is NULL ");
1518         return HDF_FAILURE;
1519     }
1520 
1521     if (!HdfSbufReadFloat(data, &volume)) {
1522         AUDIO_FUNC_LOGE("volume Is NULL ");
1523         return HDF_FAILURE;
1524     }
1525 
1526     if (AudioAdapterListGetAdapter(adapterName, &adapter) != HDF_SUCCESS) {
1527         AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter fail");
1528         return AUDIO_HAL_ERR_INTERNAL;
1529     }
1530 
1531     if (adapter == NULL || adapter->SetVoiceVolume == NULL) {
1532         AUDIO_FUNC_LOGE("adapter or SetVoiceVolume is NULL");
1533         return AUDIO_HAL_ERR_INTERNAL;
1534     }
1535 
1536     return adapter->SetVoiceVolume(adapter, volume);
1537 }
1538 
HdiServiceAdapterSetExtraParams(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1539 static int32_t HdiServiceAdapterSetExtraParams(const struct HdfDeviceIoClient *client,
1540                                                struct HdfSBuf *data, struct HdfSBuf *reply)
1541 {
1542     if (client == NULL || data == NULL || reply == NULL) {
1543         AUDIO_FUNC_LOGE("the parameter is empty");
1544         return AUDIO_HAL_ERR_INVALID_PARAM;
1545     }
1546 
1547     struct AudioAdapter *adapter = NULL;
1548     const char *adapterName = NULL;
1549     const char *value = NULL;
1550     enum AudioExtParamKey key = AUDIO_EXT_PARAM_KEY_NONE;
1551     const char *condition = NULL;
1552 
1553     if ((adapterName = HdfSbufReadString(data)) == NULL) {
1554         AUDIO_FUNC_LOGE("adapterName is NULL");
1555         return HDF_FAILURE;
1556     }
1557 
1558     if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
1559         AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter FAIL");
1560         return AUDIO_HAL_ERR_INTERNAL;
1561     }
1562     if (adapter == NULL) {
1563         AUDIO_FUNC_LOGE("adapter is NULL");
1564         return AUDIO_HAL_ERR_INTERNAL;
1565     }
1566 
1567     value = HdfSbufReadString(data);
1568     if (value == NULL) {
1569         AUDIO_FUNC_LOGE("value is NULL");
1570         return AUDIO_HAL_ERR_INTERNAL;
1571     }
1572 
1573     if (adapter->SetExtraParams == NULL) {
1574         AUDIO_FUNC_LOGE("adapter or SetExtraParams is NULL");
1575         return AUDIO_HAL_ERR_INTERNAL;
1576     }
1577 
1578     return adapter->SetExtraParams(adapter, key, condition, value);
1579 }
1580 
HdiServiceAdapterGetExtraParams(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1581 static int32_t HdiServiceAdapterGetExtraParams(const struct HdfDeviceIoClient *client,
1582                                                struct HdfSBuf *data, struct HdfSBuf *reply)
1583 {
1584     if (client == NULL || data == NULL || reply == NULL) {
1585         AUDIO_FUNC_LOGE("the parameter is empty");
1586         return AUDIO_HAL_ERR_INVALID_PARAM;
1587     }
1588 
1589     int32_t length = 0;
1590     struct AudioAdapter *adapter = NULL;
1591     const char *adapterName = NULL;
1592     enum AudioExtParamKey key = AUDIO_EXT_PARAM_KEY_NONE;
1593     const char *condition = NULL;
1594     char value[STR_MAX] = { 0 };
1595 
1596     if ((adapterName = HdfSbufReadString(data)) == NULL) {
1597         AUDIO_FUNC_LOGE("adapterName is NULL");
1598         return HDF_FAILURE;
1599     }
1600 
1601     if (AudioAdapterListGetAdapter(adapterName, &adapter)) {
1602         AUDIO_FUNC_LOGE("AudioAdapterListGetAdapter FAIL");
1603         return AUDIO_HAL_ERR_INTERNAL;
1604     }
1605     if (adapter == NULL) {
1606         AUDIO_FUNC_LOGE("adapter is NULL");
1607         return AUDIO_HAL_ERR_INTERNAL;
1608     }
1609 
1610     if (!HdfSbufReadInt32(data, &length)) {
1611         AUDIO_FUNC_LOGE("HdiServiceAdapterGetExtraParams FAIL! length is 0.");
1612         return AUDIO_HAL_ERR_INTERNAL;
1613     }
1614 
1615     if (adapter->GetExtraParams == NULL) {
1616         AUDIO_FUNC_LOGE("adapter or GetExtraParams is NULL");
1617         return AUDIO_HAL_ERR_INTERNAL;
1618     }
1619 
1620     int32_t ret = adapter->GetExtraParams(adapter, key, condition, value, length);
1621     if (ret < 0) {
1622         AUDIO_FUNC_LOGE("GetExtraParams FAIL");
1623         return ret;
1624     }
1625 
1626     if (!HdfSbufWriteString(reply, value)) {
1627         AUDIO_FUNC_LOGE("value write fail");
1628         return AUDIO_HAL_ERR_INTERNAL;
1629     }
1630 
1631     return AUDIO_HAL_SUCCESS;
1632 }
1633 
1634 struct HdiServiceDispatchCmdHandleList g_hdiServiceDispatchCmdHandleList[] = {
1635     {AUDIO_HDI_MGR_GET_FUNCS, HdiServiceGetFuncs},
1636     {AUDIO_HDI_MGR_GET_ALL_ADAPTER, HdiServiceGetAllAdapter},
1637     {AUDIO_HDI_MGR_RELEASE, HdiServiceReleaseAudioManagerObject},
1638     {AUDIO_HDI_MGR_LOAD_ADAPTER, HdiServiceLoadAdapter},
1639     {AUDIO_HDI_MGR_UNLOAD_ADAPTER, HdiServiceUnloadAdapter},
1640     {AUDIO_HDI_ADT_INIT_PORTS, HdiServiceInitAllPorts},
1641     {AUDIO_HDI_ADT_GET_PORT_CAPABILITY, HdiServiceGetPortCapability},
1642     {AUDIO_HDI_ADT_SET_PASS_MODE, HdiServiceSetPassthroughMode},
1643     {AUDIO_HDI_ADT_GET_PASS_MODE, HdiServiceGetPassthroughMode},
1644     {AUDIO_HDI_ADT_UPDATE_ROUTE, HdiSerStubUpdateAudioRoute},
1645     {AUDIO_HDI_ADT_RELEASE_ROUTE, HdiSerStubReleaseAudioRoute},
1646     {AUDIO_HDI_ADT_SET_MIC_MUTE, HdiServiceAdapterSetMicMute},
1647     {AUDIO_HDI_ADT_GET_MIC_MUTE, HdiServiceAdapterGetMicMute},
1648     {AUDIO_HDI_ADT_SET_VOICE_VOLUME, HdiServiceAdapterSetVoiceVolume},
1649     {AUDIO_HDI_ADT_SET_EXTRA_PARAMS, HdiServiceAdapterSetExtraParams},
1650     {AUDIO_HDI_ADT_GET_EXTRA_PARAMS, HdiServiceAdapterGetExtraParams},
1651     {AUDIO_HDI_PNP_DEV_STATUS, HdiServiceGetDevStatusByPnp},
1652     {AUDIO_HDI_RENDER_CREATE_RENDER, HdiServiceCreatRender},
1653     {AUDIO_HDI_RENDER_DESTROY, HdiServiceRenderDestory},
1654     {AUDIO_HDI_RENDER_START, HdiServiceRenderStart},
1655     {AUDIO_HDI_RENDER_STOP, HdiServiceRenderStop},
1656     {AUDIO_HDI_RENDER_PAUSE, HdiServiceRenderPause},
1657     {AUDIO_HDI_RENDER_RESUME, HdiServiceRenderResume},
1658     {AUDIO_HDI_RENDER_FLUSH, HdiServiceRenderFlush},
1659     {AUDIO_HDI_RENDER_GET_FRAME_SIZE, HdiServiceRenderGetFrameSize},
1660     {AUDIO_HDI_RENDER_GET_FRAME_COUNT, HdiServiceRenderGetFrameCount},
1661     {AUDIO_HDI_RENDER_SET_SAMPLE_ATTR, HdiServiceRenderSetSampleAttr},
1662     {AUDIO_HDI_RENDER_GET_SAMPLE_ATTR, HdiServiceRenderGetSampleAttr},
1663     {AUDIO_HDI_RENDER_GET_CUR_CHANNEL_ID, HdiServiceRenderGetCurChannelId},
1664     {AUDIO_HDI_RENDER_CHECK_SCENE_CAPABILITY, HdiServiceRenderCheckSceneCapability},
1665     {AUDIO_HDI_RENDER_SELECT_SCENE, HdiServiceRenderSelectScene},
1666     {AUDIO_HDI_RENDER_GET_MUTE, HdiServiceRenderGetMute},
1667     {AUDIO_HDI_RENDER_SET_MUTE, HdiServiceRenderSetMute},
1668     {AUDIO_HDI_RENDER_SET_VOLUME, HdiServiceRenderSetVolume},
1669     {AUDIO_HDI_RENDER_GET_VOLUME, HdiServiceRenderGetVolume},
1670     {AUDIO_HDI_RENDER_GET_GAIN_THRESHOLD, HdiServiceRenderGetGainThreshold},
1671     {AUDIO_HDI_RENDER_GET_GAIN, HdiServiceRenderGetGain},
1672     {AUDIO_HDI_RENDER_SET_GAIN, HdiServiceRenderSetGain},
1673     {AUDIO_HDI_RENDER_GET_LATENCY, HdiServiceRenderGetLatency},
1674     {AUDIO_HDI_RENDER_RENDER_FRAME, HdiServiceRenderRenderFrame},
1675     {AUDIO_HDI_RENDER_GET_RENDER_POSITION, HdiServiceRenderGetRenderPosition},
1676     {AUDIO_HDI_RENDER_GET_SPEED, HdiServiceRenderGetSpeed},
1677     {AUDIO_HDI_RENDER_SET_SPEED, HdiServiceRenderSetSpeed},
1678     {AUDIO_HDI_RENDER_SET_CHANNEL_MODE, HdiServiceRenderSetChannelMode},
1679     {AUDIO_HDI_RENDER_GET_CHANNEL_MODE, HdiServiceRenderGetChannelMode},
1680     {AUDIO_HDI_RENDER_SET_EXTRA_PARAMS, HdiServiceRenderSetExtraParams},
1681     {AUDIO_HDI_RENDER_GET_EXTRA_PARAMS, HdiServiceRenderGetExtraParams},
1682     {AUDIO_HDI_RENDER_REQ_MMAP_BUFFER, HdiServiceRenderReqMmapBuffer},
1683     {AUDIO_HDI_RENDER_GET_MMAP_POSITION, HdiServiceRenderGetMmapPosition},
1684     {AUDIO_HDI_RENDER_ADD_EFFECT, HdiServiceRenderAddEffect},
1685     {AUDIO_HDI_RENDER_REMOVE_EFFECT, HdiServiceRenderRemoveEffect},
1686     {AUDIO_HDI_RENDER_TURN_STAND_BY_MODE, HdiServiceRenderTurnStandbyMode},
1687     {AUDIO_HDI_RENDER_DEV_DUMP, HdiServiceRenderDevDump},
1688     {AUDIO_HDI_RENDER_REG_CALLBACK, HdiServiceRenderRegCallback},
1689     {AUDIO_HDI_RENDER_DRAIN_BUFFER, HdiServiceRenderDrainBuffer},
1690 };
1691 
1692 static struct HdiServiceDispatchCmdHandleList g_hdiServiceDispatchCmdHandleCapList[] = {
1693     {AUDIO_HDI_CAPTURE_CREATE_CAPTURE, HdiServiceCreatCapture},
1694     {AUDIO_HDI_CAPTURE_DESTROY, HdiServiceCaptureDestory},
1695     {AUDIO_HDI_CAPTURE_START, HdiServiceCaptureStart},
1696     {AUDIO_HDI_CAPTURE_STOP, HdiServiceCaptureStop},
1697     {AUDIO_HDI_CAPTURE_PAUSE, HdiServiceCapturePause},
1698     {AUDIO_HDI_CAPTURE_RESUME, HdiServiceCaptureResume},
1699     {AUDIO_HDI_CAPTURE_FLUSH, HdiServiceCaptureFlush},
1700     {AUDIO_HDI_CAPTURE_GET_FRAME_SIZE, HdiServiceCaptureGetFrameSize},
1701     {AUDIO_HDI_CAPTURE_GET_FRAME_COUNT, HdiServiceCaptureGetFrameCount},
1702     {AUDIO_HDI_CAPTURE_SET_SAMPLE_ATTR, HdiServiceCaptureSetSampleAttr},
1703     {AUDIO_HDI_CAPTURE_GET_SAMPLE_ATTR, HdiServiceCaptureGetSampleAttr},
1704     {AUDIO_HDI_CAPTURE_GET_CUR_CHANNEL_ID, HdiServiceCaptureGetCurChannelId},
1705     {AUDIO_HDI_CAPTURE_CHECK_SCENE_CAPABILITY, HdiServiceCaptureCheckSceneCapability},
1706     {AUDIO_HDI_CAPTURE_SELECT_SCENE, HdiServiceCaptureSelectScene},
1707     {AUDIO_HDI_CAPTURE_GET_MUTE, HdiServiceCaptureGetMute},
1708     {AUDIO_HDI_CAPTURE_SET_MUTE, HdiServiceCaptureSetMute},
1709     {AUDIO_HDI_CAPTURE_SET_VOLUME, HdiServiceCaptureSetVolume},
1710     {AUDIO_HDI_CAPTURE_GET_VOLUME, HdiServiceCaptureGetVolume},
1711     {AUDIO_HDI_CAPTURE_GET_GAIN_THRESHOLD, HdiServiceCaptureGetGainThreshold},
1712     {AUDIO_HDI_CAPTURE_GET_GAIN, HdiServiceCaptureGetGain},
1713     {AUDIO_HDI_CAPTURE_SET_GAIN, HdiServiceCaptureSetGain},
1714     {AUDIO_HDI_CAPTURE_CAPTURE_FRAME, HdiServiceCaptureCaptureFrame},
1715     {AUDIO_HDI_CAPTURE_GET_CAPTURE_POSITION, HdiServiceCaptureGetCapturePosition},
1716     {AUDIO_HDI_CAPTURE_SET_EXTRA_PARAMS, HdiServiceCaptureSetExtraParams},
1717     {AUDIO_HDI_CAPTURE_GET_EXTRA_PARAMS, HdiServiceCaptureGetExtraParams},
1718     {AUDIO_HDI_CAPTURE_REQ_MMAP_BUFFER, HdiServiceCaptureReqMmapBuffer},
1719     {AUDIO_HDI_CAPTURE_GET_MMAP_POSITION, HdiServiceCaptureGetMmapPosition},
1720     {AUDIO_HDI_CAPTURE_ADD_EFFECT, HdiServiceCaptureAddEffect},
1721     {AUDIO_HDI_CAPTURE_REMOVE_EFFECT, HdiServiceCaptureRemoveEffect},
1722     {AUDIO_HDI_CAPTURE_TURN_STAND_BY_MODE, HdiServiceCaptureTurnStandbyMode},
1723     {AUDIO_HDI_CAPTURE_DEV_DUMP, HdiServiceCaptureDevDump},
1724 };
1725 
HdiServiceDispatch(struct HdfDeviceIoClient * client,int cmdId,struct HdfSBuf * data,struct HdfSBuf * reply)1726 int32_t HdiServiceDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data,
1727     struct HdfSBuf *reply)
1728 {
1729     unsigned int i;
1730     AUDIO_FUNC_LOGD("cmdId = %{public}d", cmdId);
1731     if (client == NULL) {
1732         AUDIO_FUNC_LOGE("ControlDispatch: input para is NULL.");
1733         return AUDIO_HAL_ERR_INVALID_PARAM;
1734     }
1735 
1736     if (!HdfDeviceObjectCheckInterfaceDesc(client->device, data)) {
1737         AUDIO_FUNC_LOGE("check interface token failed");
1738         return AUDIO_HAL_ERR_INVALID_PARAM;
1739     }
1740     if (cmdId > AUDIO_HDI_CAPTURE_DEV_DUMP || cmdId < 0) {
1741         AUDIO_FUNC_LOGE("ControlDispatch: invalid cmdId = %{public}d", cmdId);
1742         return AUDIO_HAL_ERR_INTERNAL;
1743     } else if (cmdId <= AUDIO_HDI_RENDER_DRAIN_BUFFER) {
1744         for (i = 0; i < sizeof(g_hdiServiceDispatchCmdHandleList) /
1745             sizeof(g_hdiServiceDispatchCmdHandleList[0]); ++i) {
1746             if ((cmdId == (int)(g_hdiServiceDispatchCmdHandleList[i].cmd)) &&
1747                 (g_hdiServiceDispatchCmdHandleList[i].func != NULL)) {
1748                 return g_hdiServiceDispatchCmdHandleList[i].func(client, data, reply);
1749             }
1750         }
1751     } else {
1752         for (i = 0; i < sizeof(g_hdiServiceDispatchCmdHandleCapList) /
1753             sizeof(g_hdiServiceDispatchCmdHandleCapList[0]); ++i) {
1754             if ((cmdId == (int)(g_hdiServiceDispatchCmdHandleCapList[i].cmd)) &&
1755                 (g_hdiServiceDispatchCmdHandleCapList[i].func != NULL)) {
1756                 return g_hdiServiceDispatchCmdHandleCapList[i].func(client, data, reply);
1757             }
1758         }
1759     }
1760     return AUDIO_HAL_ERR_INTERNAL;
1761 }
1762