• 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_remote_service.h"
17 #include "osal_mem.h"
18 #include "audio_adapter_info_common.h"
19 #include "audio_proxy_common.h"
20 #include "audio_proxy_internal.h"
21 #include "audio_uhdf_log.h"
22 
23 #define HDF_LOG_TAG HDF_AUDIO_HAL_PROXY
24 
AudioProxyCommonInitAttrs(struct HdfSBuf * data,const struct AudioSampleAttributes * attrs)25 static int32_t AudioProxyCommonInitAttrs(struct HdfSBuf *data, const struct AudioSampleAttributes *attrs)
26 {
27     if (data == NULL || attrs == NULL) {
28         AUDIO_FUNC_LOGE("data == NULL || attrs == NULL");
29         return HDF_FAILURE;
30     }
31     uint32_t tempAtrr;
32     tempAtrr = (uint32_t)attrs->interleaved;
33     if (!HdfSbufWriteUint32(data, tempAtrr)) {
34         AUDIO_FUNC_LOGE("interleaved Write Fail");
35         return HDF_FAILURE;
36     }
37     tempAtrr = (uint32_t)attrs->type;
38     if (!HdfSbufWriteUint32(data, tempAtrr)) {
39         AUDIO_FUNC_LOGE("type Write Fail");
40         return HDF_FAILURE;
41     }
42     if (!HdfSbufWriteUint32(data, attrs->period)) {
43         AUDIO_FUNC_LOGE("period Write Fail");
44         return HDF_FAILURE;
45     }
46     if (!HdfSbufWriteUint32(data, attrs->frameSize)) {
47         AUDIO_FUNC_LOGE("frameSize Write Fail");
48         return HDF_FAILURE;
49     }
50     if (!HdfSbufWriteUint32(data, attrs->startThreshold)) {
51         AUDIO_FUNC_LOGE("startThreshold Write Fail");
52         return HDF_FAILURE;
53     }
54     if (!HdfSbufWriteUint32(data, attrs->stopThreshold)) {
55         AUDIO_FUNC_LOGE("stopThreshold Write Fail");
56         return HDF_FAILURE;
57     }
58     if (!HdfSbufWriteUint32(data, attrs->silenceThreshold)) {
59         AUDIO_FUNC_LOGE("silenceThreshold Write Fail");
60         return HDF_FAILURE;
61     }
62     tempAtrr = (uint32_t)attrs->isBigEndian;
63     if (!HdfSbufWriteUint32(data, tempAtrr)) {
64         AUDIO_FUNC_LOGE("isBigEndian Write Fail");
65         return HDF_FAILURE;
66     }
67     tempAtrr = (uint32_t)attrs->isSignedData;
68     if (!HdfSbufWriteUint32(data, tempAtrr)) {
69         AUDIO_FUNC_LOGE("isSignedData Write Fail");
70         return HDF_FAILURE;
71     }
72     return HDF_SUCCESS;
73 }
74 
AudioProxyCommonInitCreateData(struct HdfSBuf * data,const struct AudioHwAdapter * adapter,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs)75 static int32_t AudioProxyCommonInitCreateData(struct HdfSBuf *data, const struct AudioHwAdapter *adapter,
76     const struct AudioDeviceDescriptor *desc, const struct AudioSampleAttributes *attrs)
77 {
78     AUDIO_FUNC_LOGI();
79     if (data == NULL || adapter == NULL || desc == NULL || attrs == NULL) {
80         AUDIO_FUNC_LOGE("data == NULL || adapter == NULL || desc == NULL || attrs == NULL");
81         return HDF_FAILURE;
82     }
83     uint32_t tempDesc;
84     uint32_t tempAtrr;
85     int32_t pid = getpid();
86     const char *adapterName = adapter->adapterDescriptor.adapterName;
87     if (adapterName == NULL) {
88         return HDF_FAILURE;
89     }
90     if (!HdfSbufWriteString(data, adapterName)) {
91         AUDIO_FUNC_LOGE("adapterName Write Fail");
92         return HDF_FAILURE;
93     }
94     if (!HdfSbufWriteInt32(data, pid)) {
95         AUDIO_FUNC_LOGE("pid Write Fail");
96         return HDF_FAILURE;
97     }
98     tempAtrr = (uint32_t)attrs->format;
99     if (!HdfSbufWriteUint32(data, tempAtrr)) {
100         AUDIO_FUNC_LOGE("format Write Fail");
101         return HDF_FAILURE;
102     }
103     if (!HdfSbufWriteUint32(data, attrs->channelCount)) {
104         AUDIO_FUNC_LOGE("channelCount Write Fail");
105         return HDF_FAILURE;
106     }
107     if (!HdfSbufWriteUint32(data, attrs->sampleRate)) {
108         AUDIO_FUNC_LOGE("sampleRate Write Fail");
109         return HDF_FAILURE;
110     }
111     if (AudioProxyCommonInitAttrs(data, attrs) < 0) {
112         return HDF_FAILURE;
113     }
114     if (!HdfSbufWriteUint32(data, desc->portId)) {
115         AUDIO_FUNC_LOGE("portId Write Fail");
116         return HDF_FAILURE;
117     }
118     tempDesc = (uint32_t)desc->pins;
119     if (!HdfSbufWriteUint32(data, tempDesc)) {
120         AUDIO_FUNC_LOGE("pins Write Fail");
121         return HDF_FAILURE;
122     }
123     return HDF_SUCCESS;
124 }
125 
GetAudioProxyRenderFunc(struct AudioHwRender * hwRender)126 static int32_t GetAudioProxyRenderFunc(struct AudioHwRender *hwRender)
127 {
128     if (hwRender == NULL) {
129         AUDIO_FUNC_LOGE("hwRender is null");
130         return HDF_FAILURE;
131     }
132     hwRender->common.control.Start = AudioProxyRenderStart;
133     hwRender->common.control.Stop = AudioProxyRenderStop;
134     hwRender->common.control.Pause = AudioProxyRenderPause;
135     hwRender->common.control.Resume = AudioProxyRenderResume;
136     hwRender->common.control.Flush = AudioProxyRenderFlush;
137     hwRender->common.control.TurnStandbyMode = AudioProxyRenderTurnStandbyMode;
138     hwRender->common.control.AudioDevDump = AudioProxyRenderAudioDevDump;
139     hwRender->common.attr.GetFrameSize = AudioProxyRenderGetFrameSize;
140     hwRender->common.attr.GetFrameCount = AudioProxyRenderGetFrameCount;
141     hwRender->common.attr.SetSampleAttributes = AudioProxyRenderSetSampleAttributes;
142     hwRender->common.attr.GetSampleAttributes = AudioProxyRenderGetSampleAttributes;
143     hwRender->common.attr.GetCurrentChannelId = AudioProxyRenderGetCurrentChannelId;
144     hwRender->common.attr.SetExtraParams = AudioProxyRenderSetExtraParams;
145     hwRender->common.attr.GetExtraParams = AudioProxyRenderGetExtraParams;
146     hwRender->common.attr.ReqMmapBuffer = AudioProxyRenderReqMmapBuffer;
147     hwRender->common.attr.GetMmapPosition = AudioProxyRenderGetMmapPosition;
148     hwRender->common.attr.AddAudioEffect = AudioProxyRenderAddEffect;
149     hwRender->common.attr.RemoveAudioEffect = AudioProxyRenderRemoveEffect;
150     hwRender->common.scene.CheckSceneCapability = AudioProxyRenderCheckSceneCapability;
151     hwRender->common.scene.SelectScene = AudioProxyRenderSelectScene;
152     hwRender->common.volume.SetMute = AudioProxyRenderSetMute;
153     hwRender->common.volume.GetMute = AudioProxyRenderGetMute;
154     hwRender->common.volume.SetVolume = AudioProxyRenderSetVolume;
155     hwRender->common.volume.GetVolume = AudioProxyRenderGetVolume;
156     hwRender->common.volume.GetGainThreshold = AudioProxyRenderGetGainThreshold;
157     hwRender->common.volume.GetGain = AudioProxyRenderGetGain;
158     hwRender->common.volume.SetGain = AudioProxyRenderSetGain;
159     hwRender->common.GetLatency = AudioProxyRenderGetLatency;
160     hwRender->common.RenderFrame = AudioProxyRenderRenderFrame;
161     hwRender->common.GetRenderPosition = AudioProxyRenderGetRenderPosition;
162     hwRender->common.SetRenderSpeed = AudioProxyRenderSetRenderSpeed;
163     hwRender->common.GetRenderSpeed = AudioProxyRenderGetRenderSpeed;
164     hwRender->common.SetChannelMode = AudioProxyRenderSetChannelMode;
165     hwRender->common.GetChannelMode = AudioProxyRenderGetChannelMode;
166     hwRender->common.RegCallback = AudioProxyRenderRegCallback;
167     hwRender->common.DrainBuffer = AudioProxyRenderDrainBuffer;
168     return HDF_SUCCESS;
169 }
170 
InitHwRenderParam(struct AudioHwRender * hwRender,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs)171 int32_t InitHwRenderParam(struct AudioHwRender *hwRender, const struct AudioDeviceDescriptor *desc,
172                           const struct AudioSampleAttributes *attrs)
173 {
174     if (hwRender == NULL || desc == NULL || attrs == NULL) {
175         AUDIO_FUNC_LOGE("InitHwRenderParam param Is NULL");
176         return HDF_FAILURE;
177     }
178     hwRender->renderParam.renderMode.hwInfo.deviceDescript = *desc;
179     hwRender->renderParam.frameRenderMode.attrs = *attrs;
180     return HDF_SUCCESS;
181 }
182 
183 enum AudioFormat g_formatIdZero = AUDIO_FORMAT_PCM_16_BIT;
InitForGetPortCapability(struct AudioPort portIndex,struct AudioPortCapability * capabilityIndex)184 int32_t InitForGetPortCapability(struct AudioPort portIndex, struct AudioPortCapability *capabilityIndex)
185 {
186     if (capabilityIndex == NULL) {
187         AUDIO_FUNC_LOGE("Parameter is null");
188         return HDF_FAILURE;
189     }
190     /* get capabilityIndex from driver or default */
191     if (portIndex.dir != PORT_OUT) {
192         capabilityIndex->hardwareMode = true;
193         capabilityIndex->channelMasks = AUDIO_CHANNEL_STEREO;
194         capabilityIndex->channelCount = CONFIG_CHANNEL_COUNT;
195         return HDF_SUCCESS;
196     }
197     if (InitPortForCapabilitySub(portIndex, capabilityIndex) != HDF_SUCCESS) {
198         AUDIO_FUNC_LOGE("InitPortForCapability fail");
199         return HDF_FAILURE;
200     }
201     return HDF_SUCCESS;
202 }
203 
AudioAdapterReleaseCapSubPorts(const struct AudioPortAndCapability * portCapabilitys,const int32_t num)204 void AudioAdapterReleaseCapSubPorts(const struct AudioPortAndCapability *portCapabilitys, const int32_t num)
205 {
206     int32_t i = 0;
207     if (portCapabilitys == NULL) {
208         return;
209     }
210     while (i < num) {
211         if (&portCapabilitys[i] == NULL) {
212             break;
213         }
214         AudioMemFree((void **)(&portCapabilitys[i].capability.subPorts));
215         i++;
216     }
217     return;
218 }
InitAllPortsDispatchSplit(struct AudioHwAdapter * hwAdapter)219 static int32_t InitAllPortsDispatchSplit(struct AudioHwAdapter *hwAdapter)
220 {
221     if (hwAdapter == NULL || hwAdapter->adapterDescriptor.adapterName == NULL || hwAdapter->proxyRemoteHandle == NULL) {
222         return AUDIO_HAL_ERR_INVALID_PARAM;
223     }
224     struct HdfSBuf *data = NULL;
225     struct HdfSBuf *reply = NULL;
226     const char *adapterName = NULL;
227     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
228         return AUDIO_HAL_ERR_INTERNAL;
229     }
230     if (!HdfRemoteServiceWriteInterfaceToken(hwAdapter->proxyRemoteHandle, data)) {
231         AUDIO_FUNC_LOGE("write interface token failed");
232         AudioProxyBufReplyRecycle(data, reply);
233         return AUDIO_HAL_ERR_INTERNAL;
234     }
235     adapterName = hwAdapter->adapterDescriptor.adapterName;
236     if (!HdfSbufWriteString(data, adapterName)) {
237         AudioProxyBufReplyRecycle(data, reply);
238         return AUDIO_HAL_ERR_INTERNAL;
239     }
240     int32_t ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_INIT_PORTS, data, reply);
241     if (ret < 0) {
242         AUDIO_FUNC_LOGE("Get Failed AudioAdapter!");
243         AudioProxyBufReplyRecycle(data, reply);
244         return ret;
245     }
246     AudioProxyBufReplyRecycle(data, reply);
247     return AUDIO_HAL_SUCCESS;
248 }
249 
AudioProxyAdapterInitAllPorts(struct AudioAdapter * adapter)250 int32_t AudioProxyAdapterInitAllPorts(struct AudioAdapter *adapter)
251 {
252     int32_t ret = AUDIO_HAL_SUCCESS;
253 
254     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
255     if (hwAdapter == NULL || hwAdapter->adapterDescriptor.adapterName == NULL ||
256         hwAdapter->proxyRemoteHandle == NULL) {
257         AUDIO_FUNC_LOGE("hwAdapter Is NULL");
258         return AUDIO_HAL_ERR_INVALID_PARAM;
259     }
260     /* Fake data */
261     uint32_t portNum = hwAdapter->adapterDescriptor.portNum;
262     struct AudioPort *ports = hwAdapter->adapterDescriptor.ports;
263     if (ports == NULL || portNum == 0) {
264         AUDIO_FUNC_LOGE("ports is NULL!");
265         return AUDIO_HAL_ERR_INTERNAL;
266     }
267     struct AudioPortAndCapability *portCapability = (struct AudioPortAndCapability *)OsalMemCalloc(
268         portNum * sizeof(struct AudioPortAndCapability));
269     if (portCapability == NULL) {
270         AUDIO_FUNC_LOGE("portCapability is NULL!");
271         return AUDIO_HAL_ERR_MALLOC_FAIL;
272     }
273     for (uint32_t i = 0; i < portNum; i++) {
274         portCapability[i].port = ports[i];
275         if (InitForGetPortCapability(ports[i], &portCapability[i].capability)) {
276             AUDIO_FUNC_LOGE("ports Init Invalid!");
277             AudioAdapterReleaseCapSubPorts(portCapability, portNum);
278             AudioMemFree((void **)&portCapability);
279             return AUDIO_HAL_ERR_INTERNAL;
280         }
281     }
282     hwAdapter->portCapabilitys = portCapability;
283     hwAdapter->portCapabilitys->mode = PORT_PASSTHROUGH_LPCM;
284     ret = InitAllPortsDispatchSplit(hwAdapter);
285     if (ret < 0) {
286         AUDIO_FUNC_LOGE("InitAllPortsDispatchSplit Fail");
287         return ret;
288     }
289     return AUDIO_HAL_SUCCESS;
290 }
291 
AudioProxyAdapterCreateRenderSplit(const struct AudioHwAdapter * hwAdapter,struct AudioHwRender * hwRender)292 static int32_t AudioProxyAdapterCreateRenderSplit(const struct AudioHwAdapter *hwAdapter,
293     struct AudioHwRender *hwRender)
294 {
295     if (hwAdapter == NULL || hwRender == NULL) {
296         return HDF_FAILURE;
297     }
298     if (hwAdapter->adapterDescriptor.adapterName == NULL) {
299         AUDIO_FUNC_LOGE("hwAdapter->adapterDescriptor.adapterName is null!");
300         return HDF_FAILURE;
301     }
302     uint32_t adapterNameLen = strlen(hwAdapter->adapterDescriptor.adapterName);
303     /* Get Adapter name */
304     int32_t ret = strncpy_s(hwRender->renderParam.renderMode.hwInfo.adapterName, NAME_LEN,
305         hwAdapter->adapterDescriptor.adapterName, adapterNameLen);
306     if (ret != EOK) {
307         AUDIO_FUNC_LOGE("strncpy_s hwAdapter->adapterDescriptor.adapterName failed!");
308         return HDF_FAILURE;
309     }
310     return HDF_SUCCESS;
311 }
312 
AudioProxyRenderDispatchSplit(const struct AudioHwAdapter * hwAdapter,struct AudioHwRender * hwRender,struct HdfSBuf * data,struct HdfSBuf * reply)313 static int32_t AudioProxyRenderDispatchSplit(const struct AudioHwAdapter *hwAdapter,
314     struct AudioHwRender *hwRender, struct HdfSBuf *data, struct HdfSBuf *reply)
315 {
316     if (hwAdapter == NULL || hwRender == NULL ||
317         hwRender->proxyRemoteHandle == NULL || data == NULL || reply == NULL) {
318         return AUDIO_HAL_ERR_INVALID_PARAM;
319     }
320     if (AudioProxyAdapterCreateRenderSplit(hwAdapter, hwRender) < 0) {
321         return AUDIO_HAL_ERR_INTERNAL;
322     }
323     int32_t ret = AudioAddRenderAddrToList((AudioHandle)(&hwRender->common));
324     if (ret < 0) {
325         AUDIO_FUNC_LOGE("The proxyRender address get is invalid");
326         return ret;
327     }
328     ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_CREATE_RENDER, data, reply);
329     if (ret < 0) {
330         AUDIO_FUNC_LOGE("Send Server fail!");
331         if (AudioDelRenderAddrFromList((AudioHandle)(&hwRender->common)) < 0) {
332             AUDIO_FUNC_LOGE("AudioDelRenderAddrFromList failed.");
333         }
334         return ret;
335     }
336     return AUDIO_HAL_SUCCESS;
337 }
338 
AudioProxyWriteTokenAndInitData(struct AudioHwAdapter * hwAdapter,struct HdfSBuf * data,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs)339 static inline int32_t AudioProxyWriteTokenAndInitData(struct AudioHwAdapter *hwAdapter, struct HdfSBuf *data,
340     const struct AudioDeviceDescriptor *desc,
341     const struct AudioSampleAttributes *attrs)
342 {
343     if (!HdfRemoteServiceWriteInterfaceToken(hwAdapter->proxyRemoteHandle, data)) {
344         AUDIO_FUNC_LOGE("write interface token failed");
345         return AUDIO_HAL_ERR_INTERNAL;
346     }
347     if (AudioProxyCommonInitCreateData(data, hwAdapter, desc, attrs) < 0) {
348         AUDIO_FUNC_LOGE("Failed to obtain reply");
349         return AUDIO_HAL_ERR_INTERNAL;
350     }
351     return AUDIO_HAL_SUCCESS;
352 }
353 
AudioProxyAdapterCreateRender(struct AudioAdapter * adapter,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,struct AudioRender ** render)354 int32_t AudioProxyAdapterCreateRender(struct AudioAdapter *adapter, const struct AudioDeviceDescriptor *desc,
355                                       const struct AudioSampleAttributes *attrs, struct AudioRender **render)
356 {
357     AUDIO_FUNC_LOGI();
358     struct HdfSBuf *data = NULL;
359     struct HdfSBuf *reply = NULL;
360     int32_t ret = AUDIO_HAL_SUCCESS;
361 
362     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
363     if (hwAdapter == NULL || hwAdapter->proxyRemoteHandle == NULL || desc == NULL || attrs == NULL || render == NULL) {
364         return AUDIO_HAL_ERR_INVALID_PARAM;
365     }
366     struct AudioHwRender *hwRender = (struct AudioHwRender *)OsalMemCalloc(sizeof(*hwRender));
367     if (hwRender == NULL) {
368         AUDIO_FUNC_LOGE("hwRender is NULL!");
369         return AUDIO_HAL_ERR_MALLOC_FAIL;
370     }
371     hwRender->proxyRemoteHandle = hwAdapter->proxyRemoteHandle;
372     if (GetAudioProxyRenderFunc(hwRender) < 0) {
373         AudioMemFree((void **)&hwRender);
374         return AUDIO_HAL_ERR_INTERNAL;
375     }
376     /* Fill hwRender para */
377     if (InitHwRenderParam(hwRender, desc, attrs) < 0) {
378         AudioMemFree((void **)&hwRender);
379         return AUDIO_HAL_ERR_INTERNAL;
380     }
381     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
382         AudioMemFree((void **)&hwRender);
383         return AUDIO_HAL_ERR_INTERNAL;
384     }
385     if (AudioProxyWriteTokenAndInitData(hwAdapter, data, desc, attrs) != AUDIO_HAL_SUCCESS) {
386         AUDIO_FUNC_LOGE("Render write interface token or initdata failed");
387         AudioProxyBufReplyRecycle(data, reply);
388         AudioMemFree((void **)&hwRender);
389         return AUDIO_HAL_ERR_INTERNAL;
390     }
391     ret = AudioProxyRenderDispatchSplit(hwAdapter, hwRender, data, reply);
392     if (ret < 0) {
393         AudioProxyBufReplyRecycle(data, reply);
394         AudioMemFree((void **)&hwRender);
395         return ret;
396     }
397     *render = &hwRender->common;
398     AudioProxyBufReplyRecycle(data, reply);
399     return AUDIO_HAL_SUCCESS;
400 }
401 
AudioProxyAdapterDestroyRender(struct AudioAdapter * adapter,struct AudioRender * render)402 int32_t AudioProxyAdapterDestroyRender(struct AudioAdapter *adapter, struct AudioRender *render)
403 {
404     int32_t ret = AUDIO_HAL_SUCCESS;
405     if (adapter == NULL || render == NULL) {
406         return AUDIO_HAL_ERR_INVALID_PARAM;
407     }
408     ret = AudioCheckRenderAddr((AudioHandle)render);
409     if (ret < 0) {
410         AUDIO_FUNC_LOGE("The proxyRender address passed in is invalid");
411         return ret;
412     }
413     struct HdfSBuf *data = NULL;
414     struct HdfSBuf *reply = NULL;
415     struct AudioHwRender *hwRender = (struct AudioHwRender *)render;
416     if (hwRender->proxyRemoteHandle == NULL) {
417         return AUDIO_HAL_ERR_INVALID_PARAM;
418     }
419     if (AudioProxyPreprocessRender((AudioHandle)render, &data, &reply) < 0) {
420         return AUDIO_HAL_ERR_INTERNAL;
421     }
422     ret = AudioProxyDispatchCall(hwRender->proxyRemoteHandle, AUDIO_HDI_RENDER_DESTROY, data, reply);
423     if (ret < 0) {
424         if (ret != AUDIO_HAL_ERR_INVALID_OBJECT) {
425             AUDIO_FUNC_LOGE("AudioRenderRenderFrame FAIL");
426             AudioProxyBufReplyRecycle(data, reply);
427             return ret;
428         }
429     }
430     if (AudioDelRenderAddrFromList((AudioHandle)render) < 0) {
431         AUDIO_FUNC_LOGE("proxyAdapter or proxyRender not in MgrList");
432     }
433     AudioMemFree((void **)&hwRender->renderParam.frameRenderMode.buffer);
434     AudioMemFree((void **)&render);
435     AudioProxyBufReplyRecycle(data, reply);
436     return ret;
437 }
438 
GetAudioProxyCaptureFunc(struct AudioHwCapture * hwCapture)439 static int32_t GetAudioProxyCaptureFunc(struct AudioHwCapture *hwCapture)
440 {
441     if (hwCapture == NULL) {
442         AUDIO_FUNC_LOGE("hwCapture is null");
443         return HDF_FAILURE;
444     }
445     hwCapture->common.control.Start = AudioProxyCaptureStart;
446     hwCapture->common.control.Stop = AudioProxyCaptureStop;
447     hwCapture->common.control.Pause = AudioProxyCapturePause;
448     hwCapture->common.control.Resume = AudioProxyCaptureResume;
449     hwCapture->common.control.Flush = AudioProxyCaptureFlush;
450     hwCapture->common.control.TurnStandbyMode = AudioProxyCaptureTurnStandbyMode;
451     hwCapture->common.control.AudioDevDump = AudioProxyCaptureAudioDevDump;
452     hwCapture->common.attr.GetFrameSize = AudioProxyCaptureGetFrameSize;
453     hwCapture->common.attr.GetFrameCount = AudioProxyCaptureGetFrameCount;
454     hwCapture->common.attr.SetSampleAttributes = AudioProxyCaptureSetSampleAttributes;
455     hwCapture->common.attr.GetSampleAttributes = AudioProxyCaptureGetSampleAttributes;
456     hwCapture->common.attr.GetCurrentChannelId = AudioProxyCaptureGetCurrentChannelId;
457     hwCapture->common.attr.SetExtraParams = AudioProxyCaptureSetExtraParams;
458     hwCapture->common.attr.GetExtraParams = AudioProxyCaptureGetExtraParams;
459     hwCapture->common.attr.ReqMmapBuffer = AudioProxyCaptureReqMmapBuffer;
460     hwCapture->common.attr.GetMmapPosition = AudioProxyCaptureGetMmapPosition;
461     hwCapture->common.attr.AddAudioEffect = AudioProxyCaptureAddEffect;
462     hwCapture->common.attr.RemoveAudioEffect = AudioProxyCaptureRemoveEffect;
463     hwCapture->common.scene.CheckSceneCapability = AudioProxyCaptureCheckSceneCapability;
464     hwCapture->common.scene.SelectScene = AudioProxyCaptureSelectScene;
465     hwCapture->common.volume.SetMute = AudioProxyCaptureSetMute;
466     hwCapture->common.volume.GetMute = AudioProxyCaptureGetMute;
467     hwCapture->common.volume.SetVolume = AudioProxyCaptureSetVolume;
468     hwCapture->common.volume.GetVolume = AudioProxyCaptureGetVolume;
469     hwCapture->common.volume.GetGainThreshold = AudioProxyCaptureGetGainThreshold;
470     hwCapture->common.volume.GetGain = AudioProxyCaptureGetGain;
471     hwCapture->common.volume.SetGain = AudioProxyCaptureSetGain;
472     hwCapture->common.CaptureFrame = AudioProxyCaptureCaptureFrame;
473     hwCapture->common.GetCapturePosition = AudioProxyCaptureGetCapturePosition;
474     return HDF_SUCCESS;
475 }
476 
InitProxyHwCaptureParam(struct AudioHwCapture * hwCapture,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs)477 static int32_t InitProxyHwCaptureParam(struct AudioHwCapture *hwCapture, const struct AudioDeviceDescriptor *desc,
478     const struct AudioSampleAttributes *attrs)
479 {
480     if (hwCapture == NULL || desc == NULL || attrs == NULL) {
481         AUDIO_FUNC_LOGE("InitHwCaptureParam param Is NULL");
482         return HDF_FAILURE;
483     }
484     hwCapture->captureParam.captureMode.hwInfo.deviceDescript = *desc;
485     hwCapture->captureParam.frameCaptureMode.attrs = *attrs;
486     return HDF_SUCCESS;
487 }
488 
AudioProxyAdapterCreateCaptureSplit(const struct AudioHwAdapter * hwAdapter,struct AudioHwCapture * hwCapture)489 static int32_t AudioProxyAdapterCreateCaptureSplit(const struct AudioHwAdapter *hwAdapter,
490     struct AudioHwCapture *hwCapture)
491 {
492     if (hwAdapter == NULL || hwCapture == NULL) {
493         AUDIO_FUNC_LOGE("param Is NULL");
494         return HDF_FAILURE;
495     }
496     if (hwAdapter->adapterDescriptor.adapterName == NULL) {
497         AUDIO_FUNC_LOGE("adapterName Is NULL");
498         return HDF_FAILURE;
499     }
500     uint32_t adapterNameLen = strlen(hwAdapter->adapterDescriptor.adapterName);
501     /* Get AdapterName */
502     int32_t ret = strncpy_s(hwCapture->captureParam.captureMode.hwInfo.adapterName, NAME_LEN,
503         hwAdapter->adapterDescriptor.adapterName, adapterNameLen);
504     if (ret != EOK) {
505         AUDIO_FUNC_LOGE("strncpy_s failed!");
506         return HDF_FAILURE;
507     }
508     return HDF_SUCCESS;
509 }
510 
AudioProxyCaptureDispatchSplit(const struct AudioHwAdapter * hwAdapter,struct AudioHwCapture * hwCapture,struct HdfSBuf * data,struct HdfSBuf * reply)511 static int32_t AudioProxyCaptureDispatchSplit(const struct AudioHwAdapter *hwAdapter,
512     struct AudioHwCapture *hwCapture, struct HdfSBuf *data, struct HdfSBuf *reply)
513 {
514     if (hwAdapter == NULL || hwCapture == NULL || hwCapture->proxyRemoteHandle == NULL ||
515         data == NULL || reply == NULL) {
516         return AUDIO_HAL_ERR_INVALID_PARAM;
517     }
518     if (AudioProxyAdapterCreateCaptureSplit(hwAdapter, hwCapture) < 0) {
519         return AUDIO_HAL_ERR_INTERNAL;
520     }
521     int32_t ret = AudioAddCaptureAddrToList((AudioHandle)(&hwCapture->common));
522     if (ret < 0) {
523         AUDIO_FUNC_LOGE("The proxyCapture address get is invalid");
524         return ret;
525     }
526     ret = AudioProxyDispatchCall(hwCapture->proxyRemoteHandle, AUDIO_HDI_CAPTURE_CREATE_CAPTURE, data, reply);
527     if (ret < 0) {
528         AUDIO_FUNC_LOGE("Send Server fail!");
529         if (AudioDelCaptureAddrFromList((AudioHandle)(&hwCapture->common)) < 0) {
530             AUDIO_FUNC_LOGE("AudioDelRenderAddrFromList failed.");
531         }
532         return ret;
533     }
534     return AUDIO_HAL_SUCCESS;
535 }
536 
AudioProxyAdapterCreateCapture(struct AudioAdapter * adapter,const struct AudioDeviceDescriptor * desc,const struct AudioSampleAttributes * attrs,struct AudioCapture ** capture)537 int32_t AudioProxyAdapterCreateCapture(struct AudioAdapter *adapter, const struct AudioDeviceDescriptor *desc,
538                                        const struct AudioSampleAttributes *attrs, struct AudioCapture **capture)
539 {
540     AUDIO_FUNC_LOGI();
541     int32_t ret = AUDIO_HAL_SUCCESS;
542 
543     struct HdfSBuf *data = NULL;
544     struct HdfSBuf *reply = NULL;
545     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
546     if (hwAdapter == NULL || hwAdapter->proxyRemoteHandle == NULL || desc == NULL ||
547         attrs == NULL || capture == NULL) {
548         return AUDIO_HAL_ERR_INVALID_PARAM;
549     }
550     struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)OsalMemCalloc(sizeof(struct AudioHwCapture));
551     if (hwCapture == NULL) {
552         AUDIO_FUNC_LOGE("hwCapture is NULL!");
553         return AUDIO_HAL_ERR_MALLOC_FAIL;
554     }
555     hwCapture->proxyRemoteHandle = hwAdapter->proxyRemoteHandle;
556     if (GetAudioProxyCaptureFunc(hwCapture) < 0) {
557         AudioMemFree((void **)&hwCapture);
558         return AUDIO_HAL_ERR_INTERNAL;
559     }
560     /* Fill hwRender para */
561     if (InitProxyHwCaptureParam(hwCapture, desc, attrs) < 0) {
562         AudioMemFree((void **)&hwCapture);
563         return AUDIO_HAL_ERR_INTERNAL;
564     }
565     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
566         AudioMemFree((void **)&hwCapture);
567         return AUDIO_HAL_ERR_INTERNAL;
568     }
569     if (AudioProxyWriteTokenAndInitData(hwAdapter, data, desc, attrs) != AUDIO_HAL_SUCCESS) {
570         AUDIO_FUNC_LOGE("Capture write interface token or initdata failed");
571         AudioProxyBufReplyRecycle(data, reply);
572         AudioMemFree((void **)&hwCapture);
573         return AUDIO_HAL_ERR_INTERNAL;
574     }
575     ret = AudioProxyCaptureDispatchSplit(hwAdapter, hwCapture, data, reply);
576     if (ret < 0) {
577         AudioProxyBufReplyRecycle(data, reply);
578         AudioMemFree((void **)&hwCapture);
579         return ret;
580     }
581     *capture = &hwCapture->common;
582     AudioProxyBufReplyRecycle(data, reply);
583     return AUDIO_HAL_SUCCESS;
584 }
585 
AudioProxyAdapterDestroyCapture(struct AudioAdapter * adapter,struct AudioCapture * capture)586 int32_t AudioProxyAdapterDestroyCapture(struct AudioAdapter *adapter, struct AudioCapture *capture)
587 {
588     struct HdfSBuf *data = NULL;
589     struct HdfSBuf *reply = NULL;
590     if (adapter == NULL || capture == NULL) {
591         return AUDIO_HAL_ERR_INVALID_PARAM;
592     }
593     int32_t ret = AUDIO_HAL_SUCCESS;
594 
595     ret = AudioCheckCaptureAddr((AudioHandle)capture);
596     if (ret < 0) {
597         AUDIO_FUNC_LOGE("The proxy capture address passed in is invalid");
598         return ret;
599     }
600     struct AudioHwCapture *hwCapture = (struct AudioHwCapture *)capture;
601     if (hwCapture == NULL || hwCapture->proxyRemoteHandle == NULL) {
602         return AUDIO_HAL_ERR_INVALID_PARAM;
603     }
604     if (AudioProxyPreprocessCapture((AudioHandle)capture, &data, &reply) < 0) {
605         return AUDIO_HAL_ERR_INTERNAL;
606     }
607     ret = AudioProxyDispatchCall(hwCapture->proxyRemoteHandle, AUDIO_HDI_CAPTURE_DESTROY, data, reply);
608     if (ret < 0) {
609         if (ret != AUDIO_HAL_ERR_INVALID_OBJECT) {
610             AUDIO_FUNC_LOGE("AudioCaptureCaptuerFrame fail!");
611             AudioProxyBufReplyRecycle(data, reply);
612             return ret;
613         }
614     }
615     if (AudioDelCaptureAddrFromList((AudioHandle)capture)) {
616         AUDIO_FUNC_LOGE("proxy adapter or capture not in MgrList");
617     }
618     AudioMemFree((void **)&hwCapture->captureParam.frameCaptureMode.buffer);
619     AudioMemFree((void **)&capture);
620     AudioProxyBufReplyRecycle(data, reply);
621     return ret;
622 }
AudioProxyAdapterWritePortCapability(const struct AudioHwAdapter * hwAdapter,const struct AudioPort * port,struct HdfSBuf * data)623 static int32_t AudioProxyAdapterWritePortCapability(const struct AudioHwAdapter *hwAdapter,
624     const struct AudioPort *port, struct HdfSBuf *data)
625 {
626     if (hwAdapter == NULL || port == NULL || data == NULL) {
627         return HDF_FAILURE;
628     }
629     if (hwAdapter->adapterDescriptor.adapterName == NULL) {
630         return HDF_FAILURE;
631     }
632     const char *adapterName = hwAdapter->adapterDescriptor.adapterName;
633     if (!HdfSbufWriteString(data, adapterName)) {
634         return HDF_FAILURE;
635     }
636     uint32_t tempDir = (uint32_t)port->dir;
637     if (!HdfSbufWriteUint32(data, tempDir)) {
638         return HDF_FAILURE;
639     }
640     if (!HdfSbufWriteUint32(data, port->portId)) {
641         return HDF_FAILURE;
642     }
643     if (port->portName == NULL) {
644         return HDF_FAILURE;
645     }
646     if (!HdfSbufWriteString(data, port->portName)) {
647         return HDF_FAILURE;
648     }
649     return HDF_SUCCESS;
650 }
651 
AudioProxyAdapterGetPortCapability(struct AudioAdapter * adapter,const struct AudioPort * port,struct AudioPortCapability * capability)652 int32_t AudioProxyAdapterGetPortCapability(struct AudioAdapter *adapter,
653     const struct AudioPort *port, struct AudioPortCapability *capability)
654 {
655     AUDIO_FUNC_LOGI();
656     int32_t ret = AUDIO_HAL_SUCCESS;
657 
658     if (adapter == NULL || port == NULL || port->portName == NULL || capability == NULL || (port->portId < 0)) {
659         return AUDIO_HAL_ERR_INVALID_PARAM;
660     }
661 
662     struct HdfSBuf *data = NULL;
663     struct HdfSBuf *reply = NULL;
664     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
665         return AUDIO_HAL_ERR_INTERNAL;
666     }
667     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
668     if (hwAdapter->proxyRemoteHandle == NULL) {
669         AudioProxyBufReplyRecycle(data, reply);
670         return AUDIO_HAL_ERR_INTERNAL;
671     }
672     if (!HdfRemoteServiceWriteInterfaceToken(hwAdapter->proxyRemoteHandle, data)) {
673         AudioProxyBufReplyRecycle(data, reply);
674         return AUDIO_HAL_ERR_INTERNAL;
675     }
676     if (AudioProxyAdapterWritePortCapability(hwAdapter, port, data)) {
677         AudioProxyBufReplyRecycle(data, reply);
678         return AUDIO_HAL_ERR_INTERNAL;
679     }
680     ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_GET_PORT_CAPABILITY, data, reply);
681     if (ret < 0) {
682         AudioProxyBufReplyRecycle(data, reply);
683         return ret;
684     }
685     AudioProxyBufReplyRecycle(data, reply);
686     /* proxy must init local capability ,this capability the same of Server's */
687     struct AudioPortAndCapability *hwAdapterPortCapabilitys = hwAdapter->portCapabilitys;
688     if (hwAdapterPortCapabilitys == NULL) {
689         AUDIO_FUNC_LOGE("hwAdapter portCapabilitys is NULL!");
690         return AUDIO_HAL_ERR_INTERNAL;
691     }
692     uint32_t portNum = hwAdapter->adapterDescriptor.portNum;
693     while (hwAdapterPortCapabilitys != NULL && (portNum > 0)) {
694         if (hwAdapterPortCapabilitys->port.portId == port->portId) {
695             *capability = hwAdapterPortCapabilitys->capability;
696             return AUDIO_HAL_SUCCESS;
697         }
698         hwAdapterPortCapabilitys++;
699         portNum--;
700     }
701     return AUDIO_HAL_ERR_INTERNAL;
702 }
703 
AudioProxyAdapterSetAndGetPassthroughModeSBuf(struct HdfSBuf * data,const struct HdfSBuf * reply,const struct AudioPort * port)704 static int32_t AudioProxyAdapterSetAndGetPassthroughModeSBuf(struct HdfSBuf *data,
705     const struct HdfSBuf *reply, const struct AudioPort *port)
706 {
707     (void)reply;
708     if (data == NULL || port == NULL || port->portName == NULL) {
709         return HDF_FAILURE;
710     }
711     uint32_t tempDir = port->dir;
712     if (!HdfSbufWriteUint32(data, tempDir)) {
713         return HDF_FAILURE;
714     }
715     if (!HdfSbufWriteUint32(data, port->portId)) {
716         return HDF_FAILURE;
717     }
718     if (!HdfSbufWriteString(data, port->portName)) {
719         AUDIO_FUNC_LOGE("HdfSbufWriteString error");
720         return HDF_FAILURE;
721     }
722     return HDF_SUCCESS;
723 }
724 
AudioProxyWriteTokenAndNameForSetPassThrough(struct AudioHwAdapter * hwAdapter,struct HdfSBuf * data)725 static int32_t AudioProxyWriteTokenAndNameForSetPassThrough(struct AudioHwAdapter *hwAdapter, struct HdfSBuf *data)
726 {
727     if (hwAdapter == NULL || hwAdapter->proxyRemoteHandle == NULL ||
728         hwAdapter->adapterDescriptor.adapterName == NULL) {
729         AUDIO_FUNC_LOGE("The input para is NULL");
730         return AUDIO_HAL_ERR_INVALID_PARAM;
731     }
732     if (!HdfRemoteServiceWriteInterfaceToken(hwAdapter->proxyRemoteHandle, data)) {
733         AUDIO_FUNC_LOGE("write interface token failed");
734         return AUDIO_HAL_ERR_INTERNAL;
735     }
736     const char *adapterName = hwAdapter->adapterDescriptor.adapterName;
737     if (!HdfSbufWriteString(data, adapterName)) {
738         AUDIO_FUNC_LOGE("adapterName Write Fail");
739         return AUDIO_HAL_ERR_INTERNAL;
740     }
741     return AUDIO_HAL_SUCCESS;
742 }
743 
AudioProxyAdapterSetPassthroughMode(struct AudioAdapter * adapter,const struct AudioPort * port,enum AudioPortPassthroughMode mode)744 int32_t AudioProxyAdapterSetPassthroughMode(struct AudioAdapter *adapter,
745     const struct AudioPort *port, enum AudioPortPassthroughMode mode)
746 {
747     AUDIO_FUNC_LOGI();
748     struct HdfSBuf *data = NULL;
749     struct HdfSBuf *reply = NULL;
750     int32_t ret = AUDIO_HAL_SUCCESS;
751 
752     if (adapter == NULL || port == NULL || port->portName == NULL) {
753         AUDIO_FUNC_LOGE("Params is null.");
754         return AUDIO_HAL_ERR_INVALID_PARAM;
755     }
756     if (port->dir != PORT_OUT || port->portId < 0 || strcmp(port->portName, "AOP") != 0) {
757         return AUDIO_HAL_ERR_INTERNAL;
758     }
759     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
760         return AUDIO_HAL_ERR_INTERNAL;
761     }
762     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
763     if (hwAdapter->proxyRemoteHandle == NULL ||
764         hwAdapter->adapterDescriptor.adapterName == NULL) {
765         AudioProxyBufReplyRecycle(data, reply);
766         return AUDIO_HAL_ERR_INTERNAL;
767     }
768 
769     if (AudioProxyWriteTokenAndNameForSetPassThrough(hwAdapter, data) != AUDIO_HAL_SUCCESS) {
770         AudioProxyBufReplyRecycle(data, reply);
771         return AUDIO_HAL_ERR_INTERNAL;
772     }
773     if (AudioProxyAdapterSetAndGetPassthroughModeSBuf(data, reply, port) < 0) {
774         AudioProxyBufReplyRecycle(data, reply);
775         return AUDIO_HAL_ERR_INTERNAL;
776     }
777 
778     if (!HdfSbufWriteUint32(data, (uint32_t)mode)) {
779         AUDIO_FUNC_LOGE("Mode Write Fail");
780         AudioProxyBufReplyRecycle(data, reply);
781         return AUDIO_HAL_ERR_INTERNAL;
782     }
783     ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_SET_PASS_MODE, data, reply);
784     if (ret < 0) {
785         AudioProxyBufReplyRecycle(data, reply);
786         AUDIO_FUNC_LOGE("Failed to send server, ret = %{public}d", ret);
787         return ret;
788     }
789     AudioProxyBufReplyRecycle(data, reply);
790     return AUDIO_HAL_SUCCESS;
791 }
792 
AudioProxyWriteTokenAndNameForGetPassThrough(struct AudioHwAdapter * hwAdapter,struct HdfSBuf * data)793 static int32_t AudioProxyWriteTokenAndNameForGetPassThrough(struct AudioHwAdapter *hwAdapter, struct HdfSBuf *data)
794 {
795     if (hwAdapter == NULL || hwAdapter->proxyRemoteHandle == NULL ||
796         hwAdapter->adapterDescriptor.adapterName == NULL) {
797         AUDIO_FUNC_LOGE("The input para is NULL");
798         return AUDIO_HAL_ERR_INVALID_PARAM;
799     }
800     if (!HdfRemoteServiceWriteInterfaceToken(hwAdapter->proxyRemoteHandle, data)) {
801         AUDIO_FUNC_LOGE("write interface token failed");
802         return AUDIO_HAL_ERR_INTERNAL;
803     }
804     const char *adapterName = hwAdapter->adapterDescriptor.adapterName;
805     if (!HdfSbufWriteString(data, adapterName)) {
806         AUDIO_FUNC_LOGE("adapterName Write Fail");
807         return AUDIO_HAL_ERR_INTERNAL;
808     }
809     return AUDIO_HAL_SUCCESS;
810 }
811 
AudioProxyAdapterGetPassthroughMode(struct AudioAdapter * adapter,const struct AudioPort * port,enum AudioPortPassthroughMode * mode)812 int32_t AudioProxyAdapterGetPassthroughMode(struct AudioAdapter *adapter,
813     const struct AudioPort *port, enum AudioPortPassthroughMode *mode)
814 {
815     int32_t ret = AUDIO_HAL_SUCCESS;
816 
817     struct HdfSBuf *data = NULL;
818     struct HdfSBuf *reply = NULL;
819     if (adapter == NULL || port == NULL || port->portName == NULL || mode == NULL) {
820         return AUDIO_HAL_ERR_INVALID_PARAM;
821     }
822     if (port->dir != PORT_OUT || port->portId < 0 || strcmp(port->portName, "AOP") != 0) {
823         return AUDIO_HAL_ERR_INTERNAL;
824     }
825     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
826         return AUDIO_HAL_ERR_INTERNAL;
827     }
828     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
829     if (hwAdapter->proxyRemoteHandle == NULL) {
830         AudioProxyBufReplyRecycle(data, reply);
831         return AUDIO_HAL_ERR_INTERNAL;
832     }
833     if (AudioProxyWriteTokenAndNameForGetPassThrough(hwAdapter, data) != AUDIO_HAL_SUCCESS) {
834         AUDIO_FUNC_LOGE("Failed to write token or adapter name");
835         AudioProxyBufReplyRecycle(data, reply);
836         return AUDIO_HAL_ERR_INTERNAL;
837     }
838     if (AudioProxyAdapterSetAndGetPassthroughModeSBuf(data, reply, port) < 0) {
839         AUDIO_FUNC_LOGE("Failed to obtain data");
840         AudioProxyBufReplyRecycle(data, reply);
841         return AUDIO_HAL_ERR_INTERNAL;
842     }
843     ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_GET_PASS_MODE, data, reply);
844     if (ret < 0) {
845         AudioProxyBufReplyRecycle(data, reply);
846         return ret;
847     }
848     uint32_t tempMode = 0;
849     if (!HdfSbufReadUint32(reply, &tempMode)) {
850         AudioProxyBufReplyRecycle(data, reply);
851         return AUDIO_HAL_ERR_INTERNAL;
852     }
853     *mode = (enum AudioPortPassthroughMode)tempMode;
854     AudioProxyBufReplyRecycle(data, reply);
855     return AUDIO_HAL_SUCCESS;
856 }
857 
AudioProxyAdapterSetMicMute(struct AudioAdapter * adapter,bool mute)858 int32_t AudioProxyAdapterSetMicMute(struct AudioAdapter *adapter, bool mute)
859 {
860     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
861     if (hwAdapter == NULL || hwAdapter->proxyRemoteHandle == NULL) {
862         AUDIO_FUNC_LOGE("the parameter is null");
863         return AUDIO_HAL_ERR_INTERNAL;
864     }
865 
866     struct HdfSBuf *data = NULL;
867     struct HdfSBuf *reply = NULL;
868     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
869         AUDIO_FUNC_LOGE("AudioProxyAdapterSetMicMute FAIL");
870         return AUDIO_HAL_ERR_INTERNAL;
871     }
872 
873     if (AudioProxyWriteTokenAndNameForSetPassThrough(hwAdapter, data) != AUDIO_HAL_SUCCESS) {
874         HDF_LOGE("%{public}s: write interface token failed!", __func__);
875         AudioProxyBufReplyRecycle(data, reply);
876         return AUDIO_HAL_ERR_INTERNAL;
877     }
878 
879     if (!HdfSbufWriteUint32(data, (uint32_t)mute)) {
880         AUDIO_FUNC_LOGE("tempMute Write Fail");
881         AudioProxyBufReplyRecycle(data, reply);
882         return HDF_FAILURE;
883     }
884 
885     int ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_SET_MIC_MUTE, data, reply);
886     if (ret != AUDIO_HAL_SUCCESS) {
887         AUDIO_FUNC_LOGE("%{public}s:set parameter failed!", __func__);
888         AudioProxyBufReplyRecycle(data, reply);
889         return AUDIO_HAL_ERR_INTERNAL;
890     }
891     AudioProxyBufReplyRecycle(data, reply);
892     return ret;
893 }
894 
AudioProxyAdapterGetMicMute(struct AudioAdapter * adapter,bool * mute)895 int32_t AudioProxyAdapterGetMicMute(struct AudioAdapter *adapter, bool *mute)
896 {
897     uint32_t tempMute = 0;
898     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
899     if (hwAdapter == NULL || hwAdapter->proxyRemoteHandle == NULL || mute == NULL) {
900         AUDIO_FUNC_LOGE("the parameter is null");
901         return AUDIO_HAL_ERR_INVALID_PARAM;
902     }
903 
904     struct HdfSBuf *data = NULL;
905     struct HdfSBuf *reply = NULL;
906     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
907         AUDIO_FUNC_LOGE("AudioProxyAdapterGetMicMute FAIL");
908         return AUDIO_HAL_ERR_INTERNAL;
909     }
910 
911     if (AudioProxyWriteTokenAndNameForSetPassThrough(hwAdapter, data) != AUDIO_HAL_SUCCESS) {
912         HDF_LOGE("%{public}s: write interface token failed!", __func__);
913         AudioProxyBufReplyRecycle(data, reply);
914         return AUDIO_HAL_ERR_INTERNAL;
915     }
916 
917     int32_t ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_GET_MIC_MUTE, data, reply);
918     if (ret < 0) {
919         AUDIO_FUNC_LOGE("AudioProxyAdapterGetMicMute FAIL");
920         AudioProxyBufReplyRecycle(data, reply);
921         return ret;
922     }
923 
924     if (!HdfSbufReadUint32(reply, &tempMute)) {
925         AUDIO_FUNC_LOGE("tempMute Read Fail");
926         AudioProxyBufReplyRecycle(data, reply);
927         return AUDIO_HAL_ERR_INTERNAL;
928     }
929     *mute = (bool)tempMute;
930     AudioProxyBufReplyRecycle(data, reply);
931     return ret;
932 }
933 
AudioProxyAdapterSetVoiceVolume(struct AudioAdapter * adapter,float volume)934 int32_t AudioProxyAdapterSetVoiceVolume(struct AudioAdapter *adapter, float volume)
935 {
936     if (adapter == NULL) {
937         AUDIO_FUNC_LOGE("the parameter is empty");
938         return AUDIO_HAL_ERR_INVALID_PARAM;
939     }
940 
941     struct HdfSBuf *data = NULL;
942     struct HdfSBuf *reply = NULL;
943     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
944         return AUDIO_HAL_ERR_INTERNAL;
945     }
946 
947     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
948     if (hwAdapter->proxyRemoteHandle == NULL) {
949         AudioProxyBufReplyRecycle(data, reply);
950         return AUDIO_HAL_ERR_INTERNAL;
951     }
952 
953     if (AudioProxyWriteTokenAndNameForSetPassThrough(hwAdapter, data) != AUDIO_HAL_SUCCESS) {
954         HDF_LOGE("%{public}s: write interface token failed!", __func__);
955         AudioProxyBufReplyRecycle(data, reply);
956         return AUDIO_HAL_ERR_INTERNAL;
957     }
958 
959     if (!HdfSbufWriteFloat(data, volume)) {
960         AUDIO_FUNC_LOGE("adapterName Write Fail");
961         AudioProxyBufReplyRecycle(data, reply);
962         return HDF_FAILURE;
963     }
964 
965     int ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_SET_VOICE_VOLUME, data, reply);
966     if (ret != AUDIO_HAL_SUCCESS) {
967         AUDIO_FUNC_LOGE("%{public}s:set parameter failed!", __func__);
968         AudioProxyBufReplyRecycle(data, reply);
969         return AUDIO_HAL_ERR_INTERNAL;
970     }
971     AudioProxyBufReplyRecycle(data, reply);
972     return ret;
973 }
974 
AudioProxyAdapterSetExtraParams(struct AudioAdapter * adapter,enum AudioExtParamKey key,const char * condition,const char * value)975 int32_t AudioProxyAdapterSetExtraParams(struct AudioAdapter *adapter, enum AudioExtParamKey key,
976                                         const char *condition, const char *value)
977 {
978     if (adapter == NULL || value == NULL) {
979         AUDIO_FUNC_LOGE("the parameter is empty");
980         return AUDIO_HAL_ERR_INVALID_PARAM;
981     }
982 
983     (void)key;
984     (void)condition;
985     struct HdfSBuf *data = NULL;
986     struct HdfSBuf *reply = NULL;
987     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
988         AUDIO_FUNC_LOGE("AudioProxyAdapterSetExtraParams FAIL");
989         return AUDIO_HAL_ERR_INTERNAL;
990     }
991 
992     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
993     if (hwAdapter->proxyRemoteHandle == NULL) {
994         AUDIO_FUNC_LOGE("hwAdapter->proxyRemoteHandle is NULL");
995         AudioProxyBufReplyRecycle(data, reply);
996         return AUDIO_HAL_ERR_INTERNAL;
997     }
998 
999     if (AudioProxyWriteTokenAndNameForSetPassThrough(hwAdapter, data) != AUDIO_HAL_SUCCESS) {
1000         HDF_LOGE("%{public}s: write interface token failed!", __func__);
1001         AudioProxyBufReplyRecycle(data, reply);
1002         return AUDIO_HAL_ERR_INTERNAL;
1003     }
1004 
1005     if (!HdfSbufWriteString(data, value)) {
1006         AUDIO_FUNC_LOGE("value write fail");
1007         AudioProxyBufReplyRecycle(data, reply);
1008         return HDF_FAILURE;
1009     }
1010 
1011     int ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_SET_EXTRA_PARAMS, data, reply);
1012     if (ret != AUDIO_HAL_SUCCESS) {
1013         AUDIO_FUNC_LOGE("%{public}s:set parameter failed!", __func__);
1014         AudioProxyBufReplyRecycle(data, reply);
1015         return AUDIO_HAL_ERR_INTERNAL;
1016     }
1017     AudioProxyBufReplyRecycle(data, reply);
1018     return ret;
1019 }
1020 
AudioProxyAdapterGetExtraParams(struct AudioAdapter * adapter,enum AudioExtParamKey key,const char * condition,char * value,int32_t length)1021 int32_t AudioProxyAdapterGetExtraParams(struct AudioAdapter *adapter, enum AudioExtParamKey key,
1022                                         const char *condition, char *value, int32_t length)
1023 {
1024     if (adapter == NULL || value == NULL || condition == NULL || length <= 0) {
1025         AUDIO_FUNC_LOGE("AudioProxyAdapterGetExtraParams FAIL");
1026         return AUDIO_HAL_ERR_INVALID_PARAM;
1027     }
1028 
1029     (void)key;
1030     struct HdfSBuf *data = NULL;
1031     struct HdfSBuf *reply = NULL;
1032     const char *strValue = NULL;
1033     if (AudioProxyPreprocessSBuf(&data, &reply) < 0) {
1034         AUDIO_FUNC_LOGE("AudioProxyAdapterGetExtraParams FAIL");
1035         return AUDIO_HAL_ERR_INTERNAL;
1036     }
1037 
1038     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
1039     if (hwAdapter->proxyRemoteHandle == NULL) {
1040         AUDIO_FUNC_LOGE("parameter is null");
1041         AudioProxyBufReplyRecycle(data, reply);
1042         return AUDIO_HAL_ERR_INTERNAL;
1043     }
1044 
1045     if (AudioProxyWriteTokenAndNameForSetPassThrough(hwAdapter, data) != AUDIO_HAL_SUCCESS) {
1046         HDF_LOGE("%{public}s: write interface token failed!", __func__);
1047         AudioProxyBufReplyRecycle(data, reply);
1048         return AUDIO_HAL_ERR_INTERNAL;
1049     }
1050 
1051     if (!HdfSbufWriteString(data, condition)) {
1052         AUDIO_FUNC_LOGE("condition write fail");
1053         AudioProxyBufReplyRecycle(data, reply);
1054         return HDF_FAILURE;
1055     }
1056 
1057     if (!HdfSbufWriteInt32(data, length)) {
1058         AUDIO_FUNC_LOGE("length write fail");
1059         AudioProxyBufReplyRecycle(data, reply);
1060         return AUDIO_HAL_ERR_INTERNAL;
1061     }
1062 
1063     int ret = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_GET_EXTRA_PARAMS, data, reply);
1064     if (ret < 0) {
1065         AUDIO_FUNC_LOGE("AudioProxyAdapterGetExtraParams FAIL");
1066         AudioProxyBufReplyRecycle(data, reply);
1067         return ret;
1068     }
1069 
1070     strValue = HdfSbufReadString(reply);
1071     if (strValue == NULL) {
1072         AUDIO_FUNC_LOGE("value is empty");
1073         AudioProxyBufReplyRecycle(data, reply);
1074         return AUDIO_HAL_ERR_INTERNAL;
1075     }
1076 
1077     if (length < (int32_t)(strlen(strValue) + 1)) {
1078         AUDIO_FUNC_LOGE("length less than strlen(strValue)!");
1079         return AUDIO_HAL_ERR_INVALID_PARAM;
1080     }
1081     ret = strncpy_s(value, length, strValue, strlen(strValue));
1082     if (ret != 0) {
1083         AUDIO_FUNC_LOGE("copy failed!");
1084         AudioProxyBufReplyRecycle(data, reply);
1085         return AUDIO_HAL_ERR_INTERNAL;
1086     }
1087 
1088     AudioProxyBufReplyRecycle(data, reply);
1089     return ret;
1090 }
1091 
AudioProxyAdapterUpdateAudioRoute(struct AudioAdapter * adapter,const struct AudioRoute * route,int32_t * routeHandle)1092 int32_t AudioProxyAdapterUpdateAudioRoute(struct AudioAdapter *adapter,
1093     const struct AudioRoute *route, int32_t *routeHandle)
1094 {
1095     int32_t audioAdapterRet = HDF_FAILURE;
1096     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
1097     if (hwAdapter == NULL || hwAdapter->proxyRemoteHandle == NULL) {
1098         return AUDIO_HAL_ERR_INVALID_PARAM;
1099     }
1100     struct HdfSBuf *audioAdapterData = HdfSbufTypedObtain(SBUF_IPC);
1101     struct HdfSBuf *audioAdapterReply = HdfSbufTypedObtain(SBUF_IPC);
1102 
1103     if (audioAdapterData == NULL || audioAdapterReply == NULL) {
1104         HDF_LOGE("%{public}s: HdfSubf malloc failed!", __func__);
1105         audioAdapterRet = HDF_ERR_MALLOC_FAIL;
1106         goto FINISHED;
1107     }
1108 
1109     if (AudioProxyWriteTokenAndNameForSetPassThrough(hwAdapter, audioAdapterData) != AUDIO_HAL_SUCCESS) {
1110         HDF_LOGE("%{public}s: write interface token failed!", __func__);
1111         audioAdapterRet = HDF_ERR_INVALID_PARAM;
1112         goto FINISHED;
1113     }
1114 
1115     if (!AudioRouteBlockMarshalling(audioAdapterData, route)) {
1116         HDF_LOGE("%{public}s: write route failed!", __func__);
1117         audioAdapterRet = HDF_ERR_INVALID_PARAM;
1118         goto FINISHED;
1119     }
1120 
1121     audioAdapterRet = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_UPDATE_ROUTE,
1122                                              audioAdapterData, audioAdapterReply);
1123     if (audioAdapterRet != HDF_SUCCESS) {
1124         HDF_LOGE("%{public}s: call failed! error code is %{public}d", __func__, audioAdapterRet);
1125         goto FINISHED;
1126     }
1127 
1128     if (!HdfSbufReadInt32(audioAdapterReply, routeHandle)) {
1129         HDF_LOGE("%{public}s: read routeHandle failed!", __func__);
1130         audioAdapterRet = HDF_ERR_INVALID_PARAM;
1131         goto FINISHED;
1132     }
1133 
1134 FINISHED:
1135     if (audioAdapterData != NULL) {
1136         HdfSbufRecycle(audioAdapterData);
1137     }
1138     if (audioAdapterReply != NULL) {
1139         HdfSbufRecycle(audioAdapterReply);
1140     }
1141     return audioAdapterRet;
1142 }
1143 
AudioProxyAdapterReleaseAudioRoute(struct AudioAdapter * adapter,int32_t routeHandle)1144 int32_t AudioProxyAdapterReleaseAudioRoute(struct AudioAdapter *adapter, int32_t routeHandle)
1145 {
1146     int32_t audioAdapterRet = HDF_FAILURE;
1147     struct AudioHwAdapter *hwAdapter = (struct AudioHwAdapter *)adapter;
1148     if (hwAdapter == NULL || hwAdapter->proxyRemoteHandle == NULL) {
1149         return AUDIO_HAL_ERR_INVALID_PARAM;
1150     }
1151 
1152     struct HdfSBuf *audioAdapterData = HdfSbufTypedObtain(SBUF_IPC);
1153     struct HdfSBuf *audioAdapterReply = HdfSbufTypedObtain(SBUF_IPC);
1154     if (audioAdapterData == NULL || audioAdapterReply == NULL) {
1155         HDF_LOGE("%{public}s: HdfSubf malloc failed!", __func__);
1156         audioAdapterRet = HDF_ERR_MALLOC_FAIL;
1157         goto FINISHED;
1158     }
1159 
1160     if (AudioProxyWriteTokenAndNameForSetPassThrough(hwAdapter, audioAdapterData) != AUDIO_HAL_SUCCESS) {
1161         HDF_LOGE("%{public}s: write interface token failed!", __func__);
1162         audioAdapterRet = HDF_ERR_INVALID_PARAM;
1163         goto FINISHED;
1164     }
1165 
1166     if (!HdfSbufWriteInt32(audioAdapterData, routeHandle)) {
1167         HDF_LOGE("%{public}s: write routeHandle failed!", __func__);
1168         audioAdapterRet = HDF_ERR_INVALID_PARAM;
1169         goto FINISHED;
1170     }
1171 
1172     audioAdapterRet = AudioProxyDispatchCall(hwAdapter->proxyRemoteHandle, AUDIO_HDI_ADT_RELEASE_ROUTE,
1173                                              audioAdapterData, audioAdapterData);
1174     if (audioAdapterRet != HDF_SUCCESS) {
1175         HDF_LOGE("%{public}s: call failed! error code is %{public}d", __func__, audioAdapterRet);
1176         goto FINISHED;
1177     }
1178 
1179 FINISHED:
1180     if (audioAdapterData != NULL) {
1181         HdfSbufRecycle(audioAdapterData);
1182     }
1183     if (audioAdapterReply != NULL) {
1184         HdfSbufRecycle(audioAdapterReply);
1185     }
1186     return audioAdapterRet;
1187 }
AudioProxyAdapterGetDeviceStatus(struct AudioAdapter * adapter,struct AudioDeviceStatus * status)1188 int32_t AudioProxyAdapterGetDeviceStatus(struct AudioAdapter *adapter, struct AudioDeviceStatus *status)
1189 {
1190     (void)adapter;
1191     (void)status;
1192     return HDF_ERR_NOT_SUPPORT;
1193 }
1194