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