1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "audio_stream_dispatch.h"
10 #include "audio_driver_log.h"
11 #include "audio_platform_base.h"
12
13 #define HDF_LOG_TAG audio_stream_dispatch
14
15 #define BUFF_SIZE_MAX 64
16
StreamHostFromDevice(const struct HdfDeviceObject * device)17 static inline struct StreamHost *StreamHostFromDevice(const struct HdfDeviceObject *device)
18 {
19 return (device == NULL) ? NULL : (struct StreamHost *)device->service;
20 }
21
HwCpuDaiDispatch(const struct AudioCard * audioCard,const struct AudioPcmHwParams * params)22 static int32_t HwCpuDaiDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params)
23 {
24 struct AudioRuntimeDeivces *rtd;
25 struct DaiDevice *cpuDai;
26 if ((audioCard == NULL) || (params == NULL)) {
27 ADM_LOG_ERR("CpuDai input param is NULL.");
28 return HDF_FAILURE;
29 }
30
31 rtd = audioCard->rtd;
32 if (rtd == NULL) {
33 ADM_LOG_ERR("CpuDai audioCard rtd is NULL.");
34 return HDF_FAILURE;
35 }
36
37 cpuDai = rtd->cpuDai;
38 if (cpuDai == NULL || cpuDai->devData == NULL || cpuDai->devData->ops == NULL) {
39 ADM_LOG_ERR("cpuDai param is NULL.");
40 return HDF_FAILURE;
41 }
42
43 /* If there are HwParams function, it will be executed directly.
44 * If not, skip the if statement and execute in sequence.
45 */
46 if (cpuDai->devData->ops->HwParams != NULL) {
47 int ret = cpuDai->devData->ops->HwParams(audioCard, params);
48 if (ret < 0) {
49 ADM_LOG_ERR("cpuDai hardware params failed ret=%d", ret);
50 return HDF_ERR_IO;
51 }
52 }
53
54 return HDF_SUCCESS;
55 }
56
HwCodecDaiDispatch(const struct AudioCard * audioCard,const struct AudioPcmHwParams * params)57 static int32_t HwCodecDaiDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params)
58 {
59 struct AudioRuntimeDeivces *rtd;
60 struct DaiDevice *codecDai;
61 if ((audioCard == NULL) || (params == NULL)) {
62 ADM_LOG_ERR("CodecDai input param is NULL.");
63 return HDF_FAILURE;
64 }
65
66 rtd = audioCard->rtd;
67 if (rtd == NULL) {
68 ADM_LOG_ERR("CodecDai audioCard rtd is NULL.");
69 return HDF_FAILURE;
70 }
71 codecDai = rtd->codecDai;
72 if (codecDai == NULL) {
73 codecDai = rtd->accessoryDai;
74 }
75 if (codecDai == NULL || codecDai->devData == NULL || codecDai->devData->ops == NULL) {
76 ADM_LOG_ERR("codecDai param is NULL.");
77 return HDF_FAILURE;
78 }
79
80 /* If there are HwParams function, it will be executed directly.
81 * If not, skip the if statement and execute in sequence.
82 */
83 if (codecDai->devData->ops->HwParams != NULL) {
84 int ret = codecDai->devData->ops->HwParams(audioCard, params);
85 if (ret < 0) {
86 ADM_LOG_ERR("codecDai hardware params failed ret=%d", ret);
87 return HDF_ERR_IO;
88 }
89 }
90
91 return HDF_SUCCESS;
92 }
93
HwDspDaiDispatch(const struct AudioCard * audioCard,const struct AudioPcmHwParams * params)94 static int32_t HwDspDaiDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params)
95 {
96 struct AudioRuntimeDeivces *rtd;
97 struct DaiDevice *dspDai;
98 if ((audioCard == NULL) || (params == NULL)) {
99 ADM_LOG_ERR("DspDai input param is NULL.");
100 return HDF_FAILURE;
101 }
102 rtd = audioCard->rtd;
103 if (rtd == NULL) {
104 ADM_LOG_ERR("DspDai audioCard rtd is NULL.");
105 return HDF_FAILURE;
106 }
107 dspDai = rtd->dspDai;
108
109 if (dspDai != NULL && dspDai->devData != NULL && dspDai->devData->ops != NULL &&
110 dspDai->devData->ops->HwParams != NULL) {
111 int ret = dspDai->devData->ops->HwParams(audioCard, params);
112 if (ret < 0) {
113 ADM_LOG_ERR("dspDai hardware params failed ret=%d", ret);
114 return HDF_ERR_IO;
115 }
116 }
117 return HDF_SUCCESS;
118 }
119
HwPlatfromDispatch(const struct AudioCard * audioCard,const struct AudioPcmHwParams * params)120 static int32_t HwPlatfromDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params)
121 {
122 int ret = 0;
123 struct AudioRuntimeDeivces *rtd;
124 if ((audioCard == NULL) || (params == NULL)) {
125 ADM_LOG_ERR("Platfrom input param is NULL.");
126 return HDF_FAILURE;
127 }
128
129 rtd = audioCard->rtd;
130 if (rtd == NULL) {
131 ADM_LOG_ERR("audioCard rtd is NULL.");
132 return HDF_FAILURE;
133 }
134
135 /* If there are HwParams function, it will be executed directly.
136 * If not, skip the if statement and execute in sequence.
137 */
138 ret = AudioHwParams(audioCard, params);
139 if (ret < 0) {
140 ADM_LOG_ERR("platform hardware params failed ret=%d", ret);
141 return HDF_ERR_IO;
142 }
143
144 return HDF_SUCCESS;
145 }
146
HwParamsDispatch(const struct AudioCard * audioCard,const struct AudioPcmHwParams * params)147 static int32_t HwParamsDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params)
148 {
149 if ((audioCard == NULL) || (params == NULL)) {
150 ADM_LOG_ERR("input param is NULL.");
151 return HDF_FAILURE;
152 }
153
154 /* Traverse through each driver method; Enter if you have, if not, exectue in order */
155 if (HwCodecDaiDispatch(audioCard, params) != HDF_SUCCESS) {
156 ADM_LOG_ERR("codec dai hardware params failed.");
157 return HDF_FAILURE;
158 }
159
160 if (HwCpuDaiDispatch(audioCard, params) != HDF_SUCCESS) {
161 ADM_LOG_ERR("cpu dai hardware params failed.");
162 return HDF_FAILURE;
163 }
164
165 if (HwPlatfromDispatch(audioCard, params) != HDF_SUCCESS) {
166 ADM_LOG_ERR("platform dai hardware params failed.");
167 return HDF_FAILURE;
168 }
169
170 if (HwDspDaiDispatch(audioCard, params) != HDF_SUCCESS) {
171 ADM_LOG_ERR("dsp dai hardware params failed.");
172 return HDF_FAILURE;
173 }
174
175 return HDF_SUCCESS;
176 }
177
CpuDaiDevStartup(const struct AudioCard * audioCard,const struct DaiDevice * cpuDai)178 static int32_t CpuDaiDevStartup(const struct AudioCard *audioCard, const struct DaiDevice *cpuDai)
179 {
180 int32_t ret;
181 if (audioCard == NULL || audioCard->rtd == NULL) {
182 ADM_LOG_ERR("audioCard is null.");
183 return HDF_FAILURE;
184 }
185 if (cpuDai != NULL && cpuDai->devData != NULL && cpuDai->devData->ops != NULL &&
186 cpuDai->devData->ops->Startup != NULL) {
187 ret = cpuDai->devData->ops->Startup(audioCard, cpuDai);
188 if (ret != HDF_SUCCESS) {
189 ADM_LOG_ERR("cpuDai Startup failed.");
190 return HDF_FAILURE;
191 }
192 } else {
193 ADM_LOG_DEBUG("cpu dai startup is null.");
194 }
195 return HDF_SUCCESS;
196 }
197
CodecDaiDevStartup(const struct AudioCard * audioCard,const struct DaiDevice * codecDai)198 static int32_t CodecDaiDevStartup(const struct AudioCard *audioCard, const struct DaiDevice *codecDai)
199 {
200 int32_t ret;
201 if (audioCard == NULL || audioCard->rtd == NULL) {
202 ADM_LOG_ERR("audioCard is null.");
203 return HDF_FAILURE;
204 }
205 if (codecDai != NULL && codecDai->devData != NULL && codecDai->devData->ops != NULL &&
206 codecDai->devData->ops->Startup != NULL) {
207 ret = codecDai->devData->ops->Startup(audioCard, codecDai);
208 if (ret != HDF_SUCCESS) {
209 ADM_LOG_ERR("codecDai Startup failed.");
210 return HDF_FAILURE;
211 }
212 } else {
213 ADM_LOG_DEBUG("codec dai startup is null.");
214 }
215
216 return HDF_SUCCESS;
217 }
218
DspDaiDevStartup(const struct AudioCard * audioCard,const struct DaiDevice * dspDai)219 static int32_t DspDaiDevStartup(const struct AudioCard *audioCard, const struct DaiDevice *dspDai)
220 {
221 int32_t ret;
222 if (audioCard == NULL || audioCard->rtd == NULL) {
223 ADM_LOG_ERR("audioCard is null.");
224 return HDF_FAILURE;
225 }
226 if (dspDai != NULL && dspDai->devData != NULL && dspDai->devData->ops != NULL &&
227 dspDai->devData->ops->Startup != NULL) {
228 ret = dspDai->devData->ops->Startup(audioCard, dspDai);
229 if (ret != HDF_SUCCESS) {
230 ADM_LOG_ERR("dspDai Startup failed.");
231 return HDF_FAILURE;
232 }
233 } else {
234 ADM_LOG_DEBUG("dsp dai startup is null.");
235 }
236 return HDF_SUCCESS;
237 }
238
AccessoryDaiDevStartup(const struct AudioCard * audioCard,const struct DaiDevice * accessoryDai)239 static int32_t AccessoryDaiDevStartup(const struct AudioCard *audioCard, const struct DaiDevice *accessoryDai)
240 {
241 int32_t ret;
242 if (audioCard == NULL || audioCard->rtd == NULL) {
243 ADM_LOG_ERR("audioCard is null.");
244 return HDF_FAILURE;
245 }
246 if (accessoryDai != NULL && accessoryDai->devData != NULL && accessoryDai->devData->ops != NULL &&
247 accessoryDai->devData->ops->Startup != NULL) {
248 ret = accessoryDai->devData->ops->Startup(audioCard, accessoryDai);
249 if (ret != HDF_SUCCESS) {
250 ADM_LOG_ERR("accessoryDai Startup failed.");
251 return HDF_FAILURE;
252 }
253 } else {
254 ADM_LOG_DEBUG("accessory dai startup is null.");
255 }
256 return HDF_SUCCESS;
257 }
258
AudioDaiDeviceStartup(const struct AudioCard * audioCard)259 static int32_t AudioDaiDeviceStartup(const struct AudioCard *audioCard)
260 {
261 struct DaiDevice *cpuDai = NULL;
262 struct DaiDevice *codecDai = NULL;
263 struct DaiDevice *dspDai = NULL;
264 struct DaiDevice *accessoryDai = NULL;
265 int32_t ret;
266
267 if (audioCard == NULL || audioCard->rtd == NULL) {
268 ADM_LOG_ERR("audioCard is null.");
269 return HDF_FAILURE;
270 }
271 cpuDai = audioCard->rtd->cpuDai;
272 ret = CpuDaiDevStartup(audioCard, cpuDai);
273 if (ret != HDF_SUCCESS) {
274 ADM_LOG_ERR("CpuDaiDevStartup failed.");
275 return HDF_FAILURE;
276 }
277 codecDai = audioCard->rtd->codecDai;
278 ret = CodecDaiDevStartup(audioCard, codecDai);
279 if (ret != HDF_SUCCESS) {
280 ADM_LOG_ERR("CodecDaiDevStartup failed.");
281 return HDF_FAILURE;
282 }
283 dspDai = audioCard->rtd->dspDai;
284 ret = DspDaiDevStartup(audioCard, dspDai);
285 if (ret != HDF_SUCCESS) {
286 ADM_LOG_ERR("DspDaiDevStartup failed.");
287 return HDF_FAILURE;
288 }
289 accessoryDai = audioCard->rtd->accessoryDai;
290 ret = AccessoryDaiDevStartup(audioCard, accessoryDai);
291 if (ret != HDF_SUCCESS) {
292 ADM_LOG_ERR("AccessoryDaiDevStartup failed.");
293 return HDF_FAILURE;
294 }
295 return HDF_SUCCESS;
296 }
297
HwParamsDataAnalysis(struct HdfSBuf * reqData,struct AudioPcmHwParams * params)298 static int32_t HwParamsDataAnalysis(struct HdfSBuf *reqData, struct AudioPcmHwParams *params)
299 {
300 if ((reqData == NULL) || (params == NULL)) {
301 ADM_LOG_ERR(" input param is NULL.");
302 return HDF_FAILURE;
303 }
304 if (!HdfSbufReadUint32(reqData, ¶ms->streamType)) {
305 ADM_LOG_ERR("read request streamType failed!");
306 return HDF_FAILURE;
307 }
308 if (!HdfSbufReadUint32(reqData, ¶ms->channels)) {
309 ADM_LOG_ERR("read request channels failed!");
310 return HDF_FAILURE;
311 }
312 if (!HdfSbufReadUint32(reqData, ¶ms->rate)) {
313 ADM_LOG_ERR("read request rate failed!");
314 return HDF_FAILURE;
315 }
316 if (!HdfSbufReadUint32(reqData, ¶ms->periodSize)) {
317 ADM_LOG_ERR("read request periodSize failed!");
318 return HDF_FAILURE;
319 }
320 if (!HdfSbufReadUint32(reqData, ¶ms->periodCount)) {
321 ADM_LOG_ERR("read request periodCount failed!");
322 return HDF_FAILURE;
323 }
324 if (!HdfSbufReadUint32(reqData, (uint32_t *)¶ms->format)) {
325 ADM_LOG_ERR("read request format failed!");
326 return HDF_FAILURE;
327 }
328 if (!(params->cardServiceName = HdfSbufReadString(reqData))) {
329 ADM_LOG_ERR("read request cardServiceName failed!");
330 return HDF_FAILURE;
331 }
332 if (!HdfSbufReadUint32(reqData, ¶ms->period)) {
333 HDF_LOGE("read request perid failed!");
334 return HDF_FAILURE;
335 }
336 if (!HdfSbufReadUint32(reqData, ¶ms->frameSize)) {
337 HDF_LOGE("read request frameSize failed!");
338 return HDF_FAILURE;
339 }
340 if (!HdfSbufReadUint32(reqData, (uint32_t *)¶ms->isBigEndian)) {
341 HDF_LOGE("read request isBigEndian failed!");
342 return HDF_FAILURE;
343 }
344 if (!HdfSbufReadUint32(reqData, (uint32_t *)¶ms->isSignedData)) {
345 HDF_LOGE("read request isSignedData failed!");
346 return HDF_FAILURE;
347 }
348 if (!HdfSbufReadUint32(reqData, ¶ms->startThreshold)) {
349 HDF_LOGE("read request startThreshold failed!");
350 return HDF_FAILURE;
351 }
352 if (!HdfSbufReadUint32(reqData, ¶ms->stopThreshold)) {
353 HDF_LOGE("read request stopThreshold failed!");
354 return HDF_FAILURE;
355 }
356 if (!HdfSbufReadUint32(reqData, ¶ms->silenceThreshold)) {
357 HDF_LOGE("read request silenceThreshold failed!");
358 return HDF_FAILURE;
359 }
360 return HDF_SUCCESS;
361 }
362
StreamHostHwParams(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)363 static int32_t StreamHostHwParams(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
364 struct HdfSBuf *reply)
365 {
366 struct AudioPcmHwParams params;
367 struct AudioCard *audioCard = NULL;
368 int ret;
369 ADM_LOG_DEBUG("entry.");
370
371 if ((client == NULL || client->device == NULL) || (data == NULL)) {
372 ADM_LOG_ERR("input param is NULL.");
373 return HDF_FAILURE;
374 }
375 (void)reply;
376
377 (void)memset_s(¶ms, sizeof(struct AudioPcmHwParams), 0, sizeof(struct AudioPcmHwParams));
378
379 ret = HwParamsDataAnalysis(data, ¶ms);
380 if (ret != HDF_SUCCESS) {
381 ADM_LOG_ERR("hwparams data analysis failed ret=%d", ret);
382 return HDF_FAILURE;
383 }
384 audioCard = GetCardInstance(params.cardServiceName);
385 if (audioCard == NULL) {
386 ADM_LOG_ERR("get card instance failed.");
387 return HDF_FAILURE;
388 }
389 ret = HwParamsDispatch(audioCard, ¶ms);
390 if (ret != HDF_SUCCESS) {
391 ADM_LOG_ERR("hwparams dispatch failed ret=%d", ret);
392 return HDF_FAILURE;
393 }
394 ADM_LOG_DEBUG("success.");
395 return HDF_SUCCESS;
396 }
397
StreamHostGetCardInstance(const struct HdfDeviceIoClient * client)398 static struct AudioCard *StreamHostGetCardInstance(const struct HdfDeviceIoClient *client)
399 {
400 char *cardName = NULL;
401 struct StreamHost *streamHost = NULL;
402 struct AudioCard *audioCard = NULL;
403
404 if (client == NULL || client->device == NULL) {
405 ADM_LOG_ERR("input param is NULL.");
406 return NULL;
407 }
408
409 streamHost = StreamHostFromDevice(client->device);
410 if (streamHost == NULL) {
411 ADM_LOG_ERR("streamHost is NULL");
412 return NULL;
413 }
414
415 cardName = (char *)streamHost->priv;
416 if (cardName == NULL) {
417 ADM_LOG_ERR("streamHost priv is NULL.");
418 return NULL;
419 }
420
421 audioCard = GetCardInstance(cardName);
422 if (audioCard == NULL) {
423 ADM_LOG_ERR("get card instance failed.");
424 return NULL;
425 }
426
427 return audioCard;
428 }
429
StreamHostCapturePrepare(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)430 static int32_t StreamHostCapturePrepare(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
431 struct HdfSBuf *reply)
432 {
433 struct AudioCard *audioCard = NULL;
434 int ret = HDF_SUCCESS;
435 ADM_LOG_DEBUG("entry.");
436
437 if (client == NULL) {
438 ADM_LOG_ERR("CapturePrepare input param is NULL.");
439 return HDF_FAILURE;
440 }
441
442 (void)data;
443 (void)reply;
444
445 audioCard = StreamHostGetCardInstance(client);
446 if (audioCard == NULL) {
447 ADM_LOG_ERR("CapturePrepare get card instance or rtd failed.");
448 return HDF_FAILURE;
449 }
450
451 ret = AudioCapturePrepare(audioCard);
452 if (ret != HDF_SUCCESS) {
453 ADM_LOG_ERR("platform CapturePrepare failed ret=%d", ret);
454 return HDF_ERR_IO;
455 }
456
457 ADM_LOG_DEBUG("success.");
458 return HDF_SUCCESS;
459 }
460
StreamHostCaptureOpen(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)461 static int32_t StreamHostCaptureOpen(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
462 struct HdfSBuf *reply)
463 {
464 char *cardName = NULL;
465 const char *carNameTemp = NULL;
466 struct StreamHost *streamHost = NULL;
467 struct AudioCard *audioCard = NULL;
468
469 ADM_LOG_DEBUG("entry.");
470
471 if (client == NULL) {
472 ADM_LOG_ERR("StreamHostCaptureOpen input param is NULL.");
473 return HDF_FAILURE;
474 }
475
476 (void)reply;
477
478 cardName = (char *)OsalMemCalloc(sizeof(char) * BUFF_SIZE_MAX);
479 if (cardName == NULL) {
480 ADM_LOG_ERR("malloc cardServiceName failed!");
481 return HDF_FAILURE;
482 }
483
484 streamHost = StreamHostFromDevice(client->device);
485 if (streamHost == NULL) {
486 OsalMemFree(cardName);
487 ADM_LOG_ERR("renderHost is NULL");
488 return HDF_FAILURE;
489 }
490
491 if (!(carNameTemp = HdfSbufReadString(data))) {
492 OsalMemFree(cardName);
493 ADM_LOG_ERR("read request cardServiceName failed!");
494 return HDF_FAILURE;
495 }
496
497 if (strncpy_s(cardName, BUFF_SIZE_MAX - 1, carNameTemp, strlen(carNameTemp) + 1) != EOK) {
498 ADM_LOG_ERR("memcpy cardName failed.");
499 OsalMemFree(cardName);
500 return HDF_FAILURE;
501 }
502 ADM_LOG_DEBUG("card name: %s.", cardName);
503 streamHost->priv = cardName;
504
505 audioCard = StreamHostGetCardInstance(client);
506 if (audioCard == NULL) {
507 ADM_LOG_ERR("StreamHostCaptureOpen get card instance or rtd failed.");
508 return HDF_FAILURE;
509 }
510
511 if (AudioCaptureOpen(audioCard) != HDF_SUCCESS) {
512 ADM_LOG_ERR("platform CaptureOpen failed");
513 return HDF_ERR_IO;
514 }
515
516 if (AudioDaiDeviceStartup(audioCard) != HDF_SUCCESS) {
517 ADM_LOG_ERR("Dai Device Startup failed.");
518 return HDF_FAILURE;
519 }
520
521 ADM_LOG_DEBUG("success.");
522 return HDF_SUCCESS;
523 }
524
StreamHostRenderPrepare(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)525 static int32_t StreamHostRenderPrepare(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
526 struct HdfSBuf *reply)
527 {
528 struct AudioCard *audioCard = NULL;
529 int ret = HDF_SUCCESS;
530 ADM_LOG_DEBUG("entry.");
531
532 if (client == NULL) {
533 ADM_LOG_ERR("RenderPrepare input param is NULL.");
534 return HDF_FAILURE;
535 }
536
537 (void)data;
538 (void)reply;
539
540 audioCard = StreamHostGetCardInstance(client);
541 if (audioCard == NULL || audioCard->rtd == NULL) {
542 ADM_LOG_ERR("RenderPrepare get card instance or rtd failed.");
543 return HDF_FAILURE;
544 }
545
546 ret = AudioRenderPrepare(audioCard);
547 if (ret != HDF_SUCCESS) {
548 ADM_LOG_ERR("platform RenderPrepare failed ret=%d", ret);
549 return HDF_ERR_IO;
550 }
551
552 ADM_LOG_DEBUG("success.");
553 return HDF_SUCCESS;
554 }
555
StreamHostRenderOpen(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)556 static int32_t StreamHostRenderOpen(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
557 struct HdfSBuf *reply)
558 {
559 char *cardName = NULL;
560 const char *carNameTemp = NULL;
561 struct StreamHost *streamHost = NULL;
562 struct AudioCard *audioCard = NULL;
563
564 ADM_LOG_DEBUG("entry.");
565
566 if (client == NULL) {
567 ADM_LOG_ERR("StreamHostRenderOpen input param is NULL.");
568 return HDF_FAILURE;
569 }
570
571 (void)reply;
572
573 cardName = (char *)OsalMemCalloc(sizeof(char) * BUFF_SIZE_MAX);
574 if (cardName == NULL) {
575 ADM_LOG_ERR("malloc cardServiceName failed!");
576 return HDF_FAILURE;
577 }
578
579 streamHost = StreamHostFromDevice(client->device);
580 if (streamHost == NULL) {
581 ADM_LOG_ERR("renderHost is NULL");
582 OsalMemFree(cardName);
583 return HDF_FAILURE;
584 }
585
586 if (!(carNameTemp = HdfSbufReadString(data))) {
587 ADM_LOG_ERR("read request cardServiceName failed!");
588 OsalMemFree(cardName);
589 return HDF_FAILURE;
590 }
591
592 if (strncpy_s(cardName, BUFF_SIZE_MAX - 1, carNameTemp, strlen(carNameTemp) + 1) != EOK) {
593 ADM_LOG_ERR("memcpy cardName failed.");
594 OsalMemFree(cardName);
595 return HDF_FAILURE;
596 }
597
598 ADM_LOG_DEBUG("card name: %s.", cardName);
599
600 streamHost->priv = cardName;
601
602 audioCard = StreamHostGetCardInstance(client);
603 if (audioCard == NULL || audioCard->rtd == NULL) {
604 ADM_LOG_ERR("StreamHostRenderOpen get card instance or rtd failed.");
605 return HDF_FAILURE;
606 }
607
608 if (AudioRenderOpen(audioCard) != HDF_SUCCESS) {
609 ADM_LOG_ERR("platform RenderOpen failed.");
610 return HDF_FAILURE;
611 }
612
613 if (AudioDaiDeviceStartup(audioCard) != HDF_SUCCESS) {
614 ADM_LOG_ERR("Dai Device Startup failed.");
615 return HDF_FAILURE;
616 }
617
618 ADM_LOG_DEBUG("success.");
619 return HDF_SUCCESS;
620 }
621
StreamTransferWrite(const struct AudioCard * audioCard,struct AudioTxData * transfer)622 static int32_t StreamTransferWrite(const struct AudioCard *audioCard, struct AudioTxData *transfer)
623 {
624 int32_t ret;
625
626 if (audioCard == NULL || transfer == NULL) {
627 ADM_LOG_ERR("input param is NULL.");
628 return HDF_FAILURE;
629 }
630
631 ret = AudioPcmWrite(audioCard, transfer);
632 if (ret != HDF_SUCCESS) {
633 ADM_LOG_ERR("pcm write failed ret=%d", ret);
634 return HDF_FAILURE;
635 }
636
637 return HDF_SUCCESS;
638 }
639
StreamTransferMmapWrite(const struct AudioCard * audioCard,const struct AudioMmapData * txMmapData)640 static int32_t StreamTransferMmapWrite(const struct AudioCard *audioCard, const struct AudioMmapData *txMmapData)
641 {
642 int32_t ret;
643 ADM_LOG_DEBUG("entry.");
644
645 if (audioCard == NULL || txMmapData == NULL) {
646 ADM_LOG_ERR("input param is NULL.");
647 return HDF_FAILURE;
648 }
649
650 ret = AudioPcmMmapWrite(audioCard, txMmapData);
651 if (ret != HDF_SUCCESS) {
652 ADM_LOG_ERR("platform write failed ret=%d", ret);
653 return HDF_FAILURE;
654 }
655
656 ADM_LOG_DEBUG("sucess.");
657 return HDF_SUCCESS;
658 }
659
StreamTransferMmapRead(const struct AudioCard * audioCard,const struct AudioMmapData * rxMmapData)660 static int32_t StreamTransferMmapRead(const struct AudioCard *audioCard, const struct AudioMmapData *rxMmapData)
661 {
662 int32_t ret;
663 ADM_LOG_DEBUG("entry.");
664
665 if (audioCard == NULL || rxMmapData == NULL) {
666 ADM_LOG_ERR("input param is NULL.");
667 return HDF_FAILURE;
668 }
669
670 ret = AudioPcmMmapRead(audioCard, rxMmapData);
671 if (ret != HDF_SUCCESS) {
672 ADM_LOG_ERR("platform read failed ret=%d", ret);
673 return HDF_FAILURE;
674 }
675
676 ADM_LOG_DEBUG("sucess.");
677 return HDF_SUCCESS;
678 }
679
StreamHostWrite(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)680 static int32_t StreamHostWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
681 {
682 struct AudioTxData transfer;
683 struct AudioCard *audioCard = NULL;
684 int32_t ret = HDF_SUCCESS;
685 uint32_t dataSize = 0;
686 ADM_LOG_DEBUG("entry.");
687
688 if (client == NULL || reply == NULL) {
689 ADM_LOG_ERR("input param is NULL.");
690 return HDF_FAILURE;
691 }
692 (void)memset_s(&transfer, sizeof(struct AudioTxData), 0, sizeof(struct AudioTxData));
693 if (!HdfSbufReadUint32(data, (uint32_t *)&(transfer.frames))) {
694 ADM_LOG_ERR("read request frames failed!");
695 return HDF_FAILURE;
696 }
697 if (!HdfSbufReadBuffer(data, (const void **)&(transfer.buf), &dataSize)) {
698 ADM_LOG_ERR("read request buf failed!");
699 return HDF_FAILURE;
700 }
701
702 audioCard = StreamHostGetCardInstance(client);
703 if (audioCard == NULL || audioCard->rtd == NULL) {
704 ADM_LOG_ERR("get card instance or rtd failed.");
705 return HDF_FAILURE;
706 }
707
708 ret = StreamTransferWrite(audioCard, &transfer);
709 if (ret != HDF_SUCCESS) {
710 ADM_LOG_ERR("write reg value failed ret=%d", ret);
711 return HDF_FAILURE;
712 }
713
714 if (!HdfSbufWriteUint32(reply, (uint32_t)(transfer.status))) {
715 ADM_LOG_ERR("read response status failed!");
716 return HDF_FAILURE;
717 }
718 ADM_LOG_DEBUG("success.");
719 return HDF_SUCCESS;
720 }
721
StreamHostRead(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)722 static int32_t StreamHostRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
723 {
724 struct AudioCard *audioCard = NULL;
725 struct AudioRxData rxData;
726 int ret = HDF_SUCCESS;
727 ADM_LOG_DEBUG("entry.");
728
729 if (client == NULL || reply == NULL) {
730 ADM_LOG_ERR("input param is NULL.");
731 return HDF_FAILURE;
732 }
733 (void)data;
734
735 audioCard = StreamHostGetCardInstance(client);
736 if (audioCard == NULL) {
737 ADM_LOG_ERR("get card instance or rtd failed.");
738 return HDF_FAILURE;
739 }
740
741 ret = AudioPcmRead(audioCard, &rxData);
742 if (ret != HDF_SUCCESS) {
743 ADM_LOG_ERR("pcm read failed ret=%d", ret);
744 return HDF_FAILURE;
745 }
746
747 if (!HdfSbufWriteUint32(reply, (uint32_t)(rxData.status))) {
748 ADM_LOG_ERR("write request data status failed!");
749 return HDF_FAILURE;
750 }
751
752 if (rxData.bufSize != 0) {
753 if (!HdfSbufWriteBuffer(reply, rxData.buf, (uint32_t)(rxData.bufSize))) {
754 ADM_LOG_ERR("write request data buf failed!");
755 return HDF_FAILURE;
756 }
757
758 if (!HdfSbufWriteUint32(reply, (uint32_t)(rxData.frames))) {
759 ADM_LOG_ERR("write frames failed!");
760 return HDF_FAILURE;
761 }
762 }
763
764 ADM_LOG_DEBUG("success.");
765 return HDF_SUCCESS;
766 }
767
StreamHostMmapWrite(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)768 static int32_t StreamHostMmapWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
769 {
770 struct AudioMmapData txMmapData;
771 struct AudioCard *audioCard = NULL;
772 uint64_t mAddress = 0;
773 ADM_LOG_DEBUG("entry.");
774 if (client == NULL || reply == NULL) {
775 ADM_LOG_ERR("input param is NULL.");
776 return HDF_FAILURE;
777 }
778 if (!HdfSbufReadUint64(data, &mAddress)) {
779 ADM_LOG_ERR("render mmap read request memory address failed!");
780 return HDF_FAILURE;
781 }
782
783 (void)memset_s(&txMmapData, sizeof(struct AudioMmapData), 0, sizeof(struct AudioMmapData));
784 txMmapData.memoryAddress = (void *)((uintptr_t)mAddress);
785 if (txMmapData.memoryAddress == NULL) {
786 ADM_LOG_ERR("txMmapData.memoryAddress is NULL.");
787 return HDF_FAILURE;
788 }
789
790 if (!HdfSbufReadInt32(data, (uint32_t *)&(txMmapData.memoryFd))) {
791 ADM_LOG_ERR("render mmap read request memory fd failed!");
792 return HDF_FAILURE;
793 }
794 if (!HdfSbufReadInt32(data, (uint32_t *)&(txMmapData.totalBufferFrames))) {
795 ADM_LOG_ERR("render mmap read request total buffer frames failed!");
796 return HDF_FAILURE;
797 }
798 if (!HdfSbufReadInt32(data, (uint32_t *)&(txMmapData.transferFrameSize))) {
799 ADM_LOG_ERR("render mmap read request transfer frame size failed!");
800 return HDF_FAILURE;
801 }
802 if (!HdfSbufReadInt32(data, (uint32_t *)&(txMmapData.isShareable))) {
803 ADM_LOG_ERR("render mmap read request is share able failed!");
804 return HDF_FAILURE;
805 }
806 if (!HdfSbufReadUint32(data, (uint32_t *)&(txMmapData.offset))) {
807 ADM_LOG_ERR("render mmap read request offset failed!");
808 return HDF_FAILURE;
809 }
810 audioCard = StreamHostGetCardInstance(client);
811 if (StreamTransferMmapWrite(audioCard, &txMmapData) != HDF_SUCCESS) {
812 ADM_LOG_ERR("render mmap write reg value failed!");
813 return HDF_FAILURE;
814 }
815 ADM_LOG_DEBUG("success.");
816 return HDF_SUCCESS;
817 }
StreamHostMmapPositionWrite(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)818 static int32_t StreamHostMmapPositionWrite(const struct HdfDeviceIoClient *client,
819 struct HdfSBuf *data, struct HdfSBuf *reply)
820 {
821 struct AudioCard *audioCard = NULL;
822 struct PlatformData *platformData;
823 ADM_LOG_DEBUG("entry.");
824 if (client == NULL || reply == NULL) {
825 ADM_LOG_ERR("input param is NULL.");
826 return HDF_FAILURE;
827 }
828 audioCard = StreamHostGetCardInstance(client);
829 if (audioCard == NULL) {
830 ADM_LOG_ERR("audioCard instance is NULL.");
831 return HDF_FAILURE;
832 }
833 platformData = PlatformDataFromCard(audioCard);
834 if (platformData == NULL) {
835 ADM_LOG_ERR("platformHost instance is NULL.");
836 return HDF_FAILURE;
837 }
838 if (!HdfSbufWriteUint64(reply, platformData->renderBufInfo.framesPosition)) {
839 ADM_LOG_ERR("render mmap write position failed!");
840 return HDF_FAILURE;
841 }
842 ADM_LOG_DEBUG("success.");
843 return HDF_SUCCESS;
844 }
845
StreamHostMmapRead(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)846 static int32_t StreamHostMmapRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply)
847 {
848 uint64_t mAddress = 0;
849 struct AudioCard *audioCard = NULL;
850 struct AudioMmapData rxMmapData;
851 ADM_LOG_DEBUG("entry.");
852 if (client == NULL || reply == NULL) {
853 ADM_LOG_ERR("input param is NULL.");
854 return HDF_FAILURE;
855 }
856 if (!HdfSbufReadUint64(data, &mAddress)) {
857 ADM_LOG_ERR("capture mmap read request memory address failed!");
858 return HDF_FAILURE;
859 }
860
861 (void)memset_s(&rxMmapData, sizeof(struct AudioMmapData), 0, sizeof(struct AudioMmapData));
862 rxMmapData.memoryAddress = (void *)((uintptr_t)mAddress);
863 if (rxMmapData.memoryAddress == NULL) {
864 ADM_LOG_ERR("rxMmapData.memoryAddress is NULL.");
865 return HDF_FAILURE;
866 }
867
868 if (!HdfSbufReadInt32(data, (uint32_t *)&(rxMmapData.memoryFd))) {
869 ADM_LOG_ERR("capture mmap read request memory fd failed!");
870 return HDF_FAILURE;
871 }
872 if (!HdfSbufReadInt32(data, (uint32_t *)&(rxMmapData.totalBufferFrames))) {
873 ADM_LOG_ERR("capture mmap read request total buffer frames failed!");
874 return HDF_FAILURE;
875 }
876 if (!HdfSbufReadInt32(data, (uint32_t *)&(rxMmapData.transferFrameSize))) {
877 ADM_LOG_ERR("capture mmap read request transfer frame size failed!");
878 return HDF_FAILURE;
879 }
880 if (!HdfSbufReadInt32(data, (uint32_t *)&(rxMmapData.isShareable))) {
881 ADM_LOG_ERR("capture mmap read request is share able failed!");
882 return HDF_FAILURE;
883 }
884 if (!HdfSbufReadUint32(data, (uint32_t *)&(rxMmapData.offset))) {
885 ADM_LOG_ERR("capture mmap read request offset failed!");
886 return HDF_FAILURE;
887 }
888 audioCard = StreamHostGetCardInstance(client);
889 if (StreamTransferMmapRead(audioCard, &rxMmapData) != HDF_SUCCESS) {
890 ADM_LOG_ERR("capture mmap read reg value failed!");
891 return HDF_FAILURE;
892 }
893 ADM_LOG_DEBUG("success.");
894 return HDF_SUCCESS;
895 }
896
StreamHostMmapPositionRead(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)897 static int32_t StreamHostMmapPositionRead(const struct HdfDeviceIoClient *client,
898 struct HdfSBuf *data, struct HdfSBuf *reply)
899 {
900 struct AudioCard *audioCard = NULL;
901 struct PlatformData *platformData;
902 ADM_LOG_DEBUG("entry.");
903 if (client == NULL || reply == NULL) {
904 ADM_LOG_ERR("input param is NULL.");
905 return HDF_FAILURE;
906 }
907 audioCard = StreamHostGetCardInstance(client);
908 if (audioCard == NULL) {
909 ADM_LOG_ERR("audioCard is NULL.");
910 return HDF_FAILURE;
911 }
912 platformData = PlatformDataFromCard(audioCard);
913 if (platformData == NULL) {
914 ADM_LOG_ERR("platformHost is NULL.");
915 return HDF_FAILURE;
916 }
917 if (!HdfSbufWriteUint64(reply, platformData->captureBufInfo.framesPosition)) {
918 ADM_LOG_ERR("render mmap write position failed!");
919 return HDF_FAILURE;
920 }
921 ADM_LOG_DEBUG("success.");
922 return HDF_SUCCESS;
923 }
924
StreamTriggerRouteImpl(const struct AudioCard * audioCard,const struct AudioRuntimeDeivces * rtd,enum StreamDispMethodCmd methodCmd)925 static int32_t StreamTriggerRouteImpl(const struct AudioCard *audioCard, const struct AudioRuntimeDeivces *rtd,
926 enum StreamDispMethodCmd methodCmd)
927 {
928 int32_t ret = HDF_SUCCESS;
929 struct DaiDevice *cpuDai = NULL;
930 struct DaiDevice *codecDai = NULL;
931 struct DaiDevice *accessoryDai = NULL;
932 struct DaiDevice *dspDai = NULL;
933 if (audioCard == NULL || rtd == NULL) {
934 ADM_LOG_ERR("input param is NULL.");
935 return HDF_FAILURE;
936 }
937 cpuDai = rtd->cpuDai;
938 if (cpuDai != NULL && cpuDai->devData != NULL && cpuDai->devData->ops != NULL &&
939 cpuDai->devData->ops->Trigger != NULL) {
940 ret = cpuDai->devData->ops->Trigger(audioCard, methodCmd, cpuDai);
941 if (ret != HDF_SUCCESS) {
942 ADM_LOG_ERR("cpuDai Trigger failed.");
943 return HDF_FAILURE;
944 }
945 }
946 codecDai = rtd->codecDai;
947 if (codecDai != NULL && codecDai->devData != NULL && codecDai->devData->ops != NULL &&
948 codecDai->devData->ops->Trigger != NULL) {
949 ret = codecDai->devData->ops->Trigger(audioCard, methodCmd, codecDai);
950 if (ret != HDF_SUCCESS) {
951 ADM_LOG_ERR("codecDai Trigger failed.");
952 return HDF_FAILURE;
953 }
954 }
955 accessoryDai = rtd->accessoryDai;
956 if (accessoryDai != NULL && accessoryDai->devData != NULL && accessoryDai->devData->ops != NULL &&
957 accessoryDai->devData->ops->Trigger != NULL) {
958 ret = accessoryDai->devData->ops->Trigger(audioCard, methodCmd, accessoryDai);
959 if (ret != HDF_SUCCESS) {
960 ADM_LOG_ERR("accessoryDai Trigger failed.");
961 return HDF_FAILURE;
962 }
963 }
964 dspDai = rtd->dspDai;
965 if (dspDai != NULL && dspDai->devData != NULL && dspDai->devData->ops != NULL &&
966 dspDai->devData->ops->Trigger != NULL) {
967 ret = dspDai->devData->ops->Trigger(audioCard, methodCmd, dspDai);
968 if (ret != HDF_SUCCESS) {
969 ADM_LOG_ERR("dspDai Trigger failed.");
970 return HDF_FAILURE;
971 }
972 }
973 return HDF_SUCCESS;
974 }
975
StreamHostRenderStart(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)976 static int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client,
977 struct HdfSBuf *data, struct HdfSBuf *reply)
978 {
979 struct AudioRuntimeDeivces *rtd = NULL;
980 struct AudioCard *audioCard = NULL;
981 int ret = HDF_SUCCESS;
982 ADM_LOG_DEBUG("entry.");
983 if (client == NULL) {
984 ADM_LOG_ERR("RenderStart input param is NULL.");
985 return HDF_FAILURE;
986 }
987 (void)data;
988 (void)reply;
989 audioCard = StreamHostGetCardInstance(client);
990 if (audioCard == NULL || audioCard->rtd == NULL) {
991 ADM_LOG_ERR("RenderStart get card instance or rtd failed.");
992 return HDF_FAILURE;
993 }
994 rtd = audioCard->rtd;
995 audioCard->standbyMode = AUDIO_SAPM_TURN_STANDBY_LATER;
996 ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_RENDER_START);
997 if (ret != HDF_SUCCESS) {
998 ADM_LOG_ERR("StreamTriggerRouteImpl failed");
999 return HDF_FAILURE;
1000 }
1001 ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_RENDER_START);
1002 if (ret != HDF_SUCCESS) {
1003 ADM_LOG_ERR("platform render start failed ret=%d", ret);
1004 return HDF_ERR_IO;
1005 }
1006 ADM_LOG_DEBUG("success.");
1007 return HDF_SUCCESS;
1008 }
1009
StreamHostCaptureStart(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1010 static int32_t StreamHostCaptureStart(const struct HdfDeviceIoClient *client,
1011 struct HdfSBuf *data, struct HdfSBuf *reply)
1012 {
1013 struct AudioRuntimeDeivces *rtd = NULL;
1014 struct AudioCard *audioCard = NULL;
1015 int ret = HDF_SUCCESS;
1016 ADM_LOG_DEBUG("entry.");
1017 if (client == NULL) {
1018 ADM_LOG_ERR("CaptureStart input param is NULL.");
1019 return HDF_FAILURE;
1020 }
1021 (void)data;
1022 (void)reply;
1023 audioCard = StreamHostGetCardInstance(client);
1024 if (audioCard == NULL || audioCard->rtd == NULL) {
1025 ADM_LOG_ERR("CaptureStart get card instance or rtd failed.");
1026 return HDF_FAILURE;
1027 }
1028 audioCard->standbyMode = AUDIO_SAPM_TURN_STANDBY_LATER;
1029 rtd = audioCard->rtd;
1030 ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_CAPTURE_START);
1031 if (ret != HDF_SUCCESS) {
1032 ADM_LOG_ERR("StreamTriggerRouteImpl failed");
1033 return HDF_FAILURE;
1034 }
1035 ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_CAPTURE_START);
1036 if (ret != HDF_SUCCESS) {
1037 ADM_LOG_ERR("platform capture start failed ret=%d", ret);
1038 return HDF_ERR_IO;
1039 }
1040
1041 ADM_LOG_DEBUG("success.");
1042 return HDF_SUCCESS;
1043 }
1044
StreamHostRenderStop(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1045 static int32_t StreamHostRenderStop(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
1046 struct HdfSBuf *reply)
1047 {
1048 struct AudioRuntimeDeivces *rtd = NULL;
1049 struct AudioCard *audioCard = NULL;
1050 int ret = HDF_SUCCESS;
1051 ADM_LOG_DEBUG("entry.");
1052 if (client == NULL) {
1053 ADM_LOG_ERR("RenderStop input param is NULL.");
1054 return HDF_FAILURE;
1055 }
1056 (void)reply;
1057 audioCard = StreamHostGetCardInstance(client);
1058 if (audioCard == NULL || audioCard->rtd == NULL) {
1059 ADM_LOG_ERR("RenderStop get card instance or rtd failed.");
1060 return HDF_FAILURE;
1061 }
1062 if (!HdfSbufReadUint32(data, &audioCard->standbyMode)) {
1063 ADM_LOG_ERR("read request streamType failed!");
1064 return HDF_FAILURE;
1065 }
1066 rtd = audioCard->rtd;
1067 ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_RENDER_STOP);
1068 if (ret != HDF_SUCCESS) {
1069 ADM_LOG_ERR("StreamTriggerRouteImpl failed");
1070 return HDF_FAILURE;
1071 }
1072 ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_RENDER_STOP);
1073 if (ret != HDF_SUCCESS) {
1074 ADM_LOG_ERR("platform render stop failed ret=%d", ret);
1075 return HDF_ERR_IO;
1076 }
1077
1078 ADM_LOG_DEBUG("success.");
1079 return HDF_SUCCESS;
1080 }
1081
StreamHostRenderClose(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1082 static int32_t StreamHostRenderClose(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
1083 struct HdfSBuf *reply)
1084 {
1085 struct AudioCard *audioCard = NULL;
1086 int ret;
1087 ADM_LOG_DEBUG("entry.");
1088
1089 if (client == NULL) {
1090 ADM_LOG_ERR("RenderClose input param is NULL.");
1091 return HDF_FAILURE;
1092 }
1093
1094 (void)data;
1095 (void)reply;
1096
1097 audioCard = StreamHostGetCardInstance(client);
1098 if (audioCard == NULL || audioCard->rtd == NULL) {
1099 ADM_LOG_ERR("RenderStop get card instance or rtd failed.");
1100 return HDF_FAILURE;
1101 }
1102
1103 ret = AudioRenderClose(audioCard);
1104 if (ret != HDF_SUCCESS) {
1105 ADM_LOG_ERR("platform RenderClose failed ret=%d", ret);
1106 return HDF_ERR_IO;
1107 }
1108
1109 ADM_LOG_DEBUG("success.");
1110 return HDF_SUCCESS;
1111 }
1112
1113
StreamHostCaptureStop(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1114 static int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client,
1115 struct HdfSBuf *data, struct HdfSBuf *reply)
1116 {
1117 struct AudioRuntimeDeivces *rtd = NULL;
1118 struct AudioCard *audioCard = NULL;
1119 int ret = HDF_SUCCESS;
1120 ADM_LOG_DEBUG("entry.");
1121
1122 if (client == NULL) {
1123 ADM_LOG_ERR("CaptureStop input param is NULL.");
1124 return HDF_FAILURE;
1125 }
1126
1127 (void)reply;
1128
1129 audioCard = StreamHostGetCardInstance(client);
1130 if (audioCard == NULL || audioCard->rtd == NULL) {
1131 ADM_LOG_ERR("CaptureStop get card instance or rtd failed.");
1132 return HDF_FAILURE;
1133 }
1134
1135 if (!HdfSbufReadUint32(data, &audioCard->standbyMode)) {
1136 ADM_LOG_ERR("read request streamType failed!");
1137 return HDF_FAILURE;
1138 }
1139 rtd = audioCard->rtd;
1140 ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_CAPTURE_STOP);
1141 if (ret != HDF_SUCCESS) {
1142 ADM_LOG_ERR("StreamTriggerRouteImpl failed");
1143 return HDF_FAILURE;
1144 }
1145 ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_CAPTURE_STOP);
1146 if (ret != HDF_SUCCESS) {
1147 ADM_LOG_ERR("platform capture stop failed ret=%d", ret);
1148 return HDF_ERR_IO;
1149 }
1150
1151 ADM_LOG_DEBUG("success.");
1152 return HDF_SUCCESS;
1153 }
1154
StreamHostCaptureClose(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1155 static int32_t StreamHostCaptureClose(const struct HdfDeviceIoClient *client,
1156 struct HdfSBuf *data, struct HdfSBuf *reply)
1157 {
1158 struct AudioCard *audioCard = NULL;
1159 int ret;
1160 ADM_LOG_DEBUG("entry.");
1161
1162 if (client == NULL) {
1163 ADM_LOG_ERR("CaptureClose input param is NULL.");
1164 return HDF_FAILURE;
1165 }
1166
1167 (void)data;
1168 (void)reply;
1169
1170 audioCard = StreamHostGetCardInstance(client);
1171 if (audioCard == NULL || audioCard->rtd == NULL) {
1172 ADM_LOG_ERR("CaptureStop get card instance or rtd failed.");
1173 return HDF_FAILURE;
1174 }
1175
1176 ret = AudioCaptureClose(audioCard);
1177 if (ret != HDF_SUCCESS) {
1178 ADM_LOG_ERR("platform capture close failed ret=%d", ret);
1179 return HDF_ERR_IO;
1180 }
1181
1182 ADM_LOG_DEBUG("success.");
1183 return HDF_SUCCESS;
1184 }
1185
1186
StreamHostRenderPause(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1187 static int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client,
1188 struct HdfSBuf *data, struct HdfSBuf *reply)
1189 {
1190 struct AudioRuntimeDeivces *rtd = NULL;
1191 struct AudioCard *audioCard = NULL;
1192 int ret = HDF_SUCCESS;
1193 ADM_LOG_DEBUG("entry.");
1194
1195 if (client == NULL) {
1196 ADM_LOG_ERR("RenderPause input param is NULL.");
1197 return HDF_FAILURE;
1198 }
1199
1200 (void)data;
1201 (void)reply;
1202
1203 audioCard = StreamHostGetCardInstance(client);
1204 if (audioCard == NULL || audioCard->rtd == NULL) {
1205 ADM_LOG_ERR("RenderPause get card instance or rtd failed.");
1206 return HDF_FAILURE;
1207 }
1208 rtd = audioCard->rtd;
1209 ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_RENDER_PAUSE);
1210 if (ret != HDF_SUCCESS) {
1211 ADM_LOG_ERR("StreamTriggerRouteImpl failed");
1212 return HDF_FAILURE;
1213 }
1214 ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_RENDER_PAUSE);
1215 if (ret != HDF_SUCCESS) {
1216 ADM_LOG_ERR("platform render pause failed ret=%d", ret);
1217 return HDF_ERR_IO;
1218 }
1219
1220 ADM_LOG_DEBUG("success.");
1221 return HDF_SUCCESS;
1222 }
1223
StreamHostCapturePause(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1224 static int32_t StreamHostCapturePause(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
1225 struct HdfSBuf *reply)
1226 {
1227 struct AudioRuntimeDeivces *rtd = NULL;
1228 struct AudioCard *audioCard = NULL;
1229 int ret = HDF_SUCCESS;
1230 ADM_LOG_DEBUG("entry.");
1231
1232 if (client == NULL) {
1233 ADM_LOG_ERR("CapturePause input param is NULL.");
1234 return HDF_FAILURE;
1235 }
1236
1237 (void)data;
1238 (void)reply;
1239
1240 audioCard = StreamHostGetCardInstance(client);
1241 if (audioCard == NULL || audioCard->rtd == NULL) {
1242 ADM_LOG_ERR("CapturePause get card instance or rtd failed.");
1243 return HDF_FAILURE;
1244 }
1245 rtd = audioCard->rtd;
1246 ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_CAPTURE_PAUSE);
1247 if (ret != HDF_SUCCESS) {
1248 ADM_LOG_ERR("StreamTriggerRouteImpl failed");
1249 return HDF_FAILURE;
1250 }
1251 ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_CAPTURE_PAUSE);
1252 if (ret != HDF_SUCCESS) {
1253 ADM_LOG_ERR("platform captur pause failed ret=%d", ret);
1254 return HDF_ERR_IO;
1255 }
1256
1257 ADM_LOG_DEBUG("success.");
1258 return HDF_SUCCESS;
1259 }
1260
StreamHostRenderResume(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1261 static int32_t StreamHostRenderResume(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
1262 struct HdfSBuf *reply)
1263 {
1264 struct AudioRuntimeDeivces *rtd = NULL;
1265 struct AudioCard *audioCard = NULL;
1266 int ret;
1267 ADM_LOG_DEBUG("entry.");
1268
1269 if (client == NULL) {
1270 ADM_LOG_ERR("RenderResume input param is NULL.");
1271 return HDF_FAILURE;
1272 }
1273
1274 (void)data;
1275 (void)reply;
1276
1277 audioCard = StreamHostGetCardInstance(client);
1278 if (audioCard == NULL || audioCard->rtd == NULL) {
1279 ADM_LOG_ERR("RenderResume get card instance or rtd failed.");
1280 return HDF_FAILURE;
1281 }
1282 rtd = audioCard->rtd;
1283 ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_RENDER_RESUME);
1284 if (ret != HDF_SUCCESS) {
1285 ADM_LOG_ERR("StreamTriggerRouteImpl failed");
1286 return HDF_FAILURE;
1287 }
1288 ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_RENDER_RESUME);
1289 if (ret != HDF_SUCCESS) {
1290 ADM_LOG_ERR("platform RenderResume failed ret=%d", ret);
1291 return HDF_ERR_IO;
1292 }
1293
1294 ADM_LOG_DEBUG("success.");
1295 return HDF_SUCCESS;
1296 }
1297
StreamHostCaptureResume(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1298 static int32_t StreamHostCaptureResume(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
1299 struct HdfSBuf *reply)
1300 {
1301 struct AudioRuntimeDeivces *rtd = NULL;
1302 struct AudioCard *audioCard = NULL;
1303 int ret = HDF_SUCCESS;
1304 ADM_LOG_DEBUG("entry.");
1305
1306 if (client == NULL) {
1307 ADM_LOG_ERR("CaptureResume input param is NULL.");
1308 return HDF_FAILURE;
1309 }
1310
1311 (void)data;
1312 (void)reply;
1313
1314 audioCard = StreamHostGetCardInstance(client);
1315 if (audioCard == NULL || audioCard->rtd == NULL) {
1316 ADM_LOG_ERR("CaptureResume get card instance or rtd failed.");
1317 return HDF_FAILURE;
1318 }
1319 rtd = audioCard->rtd;
1320 ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME);
1321 if (ret != HDF_SUCCESS) {
1322 ADM_LOG_ERR("StreamTriggerRouteImpl failed");
1323 return HDF_FAILURE;
1324 }
1325 ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME);
1326 if (ret != HDF_SUCCESS) {
1327 ADM_LOG_ERR("platform CaptureResume failed ret=%d", ret);
1328 return HDF_ERR_IO;
1329 }
1330
1331 ADM_LOG_DEBUG("success.");
1332 return HDF_SUCCESS;
1333 }
1334
StreamHostDspDecode(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1335 static int32_t StreamHostDspDecode(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
1336 struct HdfSBuf *reply)
1337 {
1338 struct AudioRuntimeDeivces *rtd = NULL;
1339 struct DspDevice *dspDev = NULL;
1340 struct AudioCard *audioCard = NULL;
1341 int ret = HDF_SUCCESS;
1342 ADM_LOG_DEBUG("Dsp Decode Entry.");
1343
1344 if (client == NULL) {
1345 ADM_LOG_ERR("DspDecode input param is NULL.");
1346 return HDF_FAILURE;
1347 }
1348
1349 (void)reply;
1350
1351 audioCard = StreamHostGetCardInstance(client);
1352 if (audioCard == NULL || audioCard->rtd == NULL) {
1353 ADM_LOG_ERR("DspDecode get card instance or rtd failed.");
1354 return HDF_FAILURE;
1355 }
1356 rtd = audioCard->rtd;
1357
1358 dspDev = rtd->dsp;
1359 if (dspDev == NULL || dspDev->devData == NULL || dspDev->devData->Decode == NULL) {
1360 ADM_LOG_ERR("audioCard rtd dsp is NULL.");
1361 return HDF_FAILURE;
1362 }
1363
1364 ret = dspDev->devData->Decode(audioCard, (void*)data, dspDev);
1365 if (ret != HDF_SUCCESS) {
1366 ADM_LOG_ERR("DeCode render pause failed ret=%d", ret);
1367 return HDF_ERR_IO;
1368 }
1369
1370 ADM_LOG_DEBUG("Decode Success.");
1371 return HDF_SUCCESS;
1372 }
1373
StreamHostDspEncode(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1374 static int32_t StreamHostDspEncode(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
1375 struct HdfSBuf *reply)
1376 {
1377 struct AudioRuntimeDeivces *rtd = NULL;
1378 struct DspDevice *dspDev = NULL;
1379 struct AudioCard *audioCard = NULL;
1380 int ret = HDF_SUCCESS;
1381 ADM_LOG_DEBUG("Dsp Encode Entry.");
1382
1383 if (client == NULL) {
1384 ADM_LOG_ERR("DspEncode input param is NULL.");
1385 return HDF_FAILURE;
1386 }
1387
1388 (void)reply;
1389
1390 audioCard = StreamHostGetCardInstance(client);
1391 if (audioCard == NULL || audioCard->rtd == NULL) {
1392 ADM_LOG_ERR("DspEncode get card instance or rtd failed.");
1393 return HDF_FAILURE;
1394 }
1395 rtd = audioCard->rtd;
1396
1397 dspDev = rtd->dsp;
1398 if (dspDev == NULL || dspDev->devData == NULL || dspDev->devData->Encode == NULL) {
1399 ADM_LOG_ERR("audioCard rtd dsp is NULL.");
1400 return HDF_FAILURE;
1401 }
1402
1403 ret = dspDev->devData->Encode(audioCard, (void*)data, dspDev);
1404 if (ret != HDF_SUCCESS) {
1405 ADM_LOG_ERR("EnCode render pause failed ret=%d", ret);
1406 return HDF_ERR_IO;
1407 }
1408
1409 ADM_LOG_DEBUG("Encode Success.");
1410 return HDF_SUCCESS;
1411 }
1412
StreamHostDspEqualizer(const struct HdfDeviceIoClient * client,struct HdfSBuf * data,struct HdfSBuf * reply)1413 static int32_t StreamHostDspEqualizer(const struct HdfDeviceIoClient *client, struct HdfSBuf *data,
1414 struct HdfSBuf *reply)
1415 {
1416 struct AudioRuntimeDeivces *rtd = NULL;
1417 struct DspDevice *dspDev = NULL;
1418 struct AudioCard *audioCard = NULL;
1419 int ret = HDF_SUCCESS;
1420 ADM_LOG_DEBUG("Dsp Equalizer Entry.");
1421
1422 if (client == NULL) {
1423 ADM_LOG_ERR("DspEqualizer input param is NULL.");
1424 return HDF_FAILURE;
1425 }
1426
1427 (void)reply;
1428
1429 audioCard = StreamHostGetCardInstance(client);
1430 if (audioCard == NULL || audioCard->rtd == NULL) {
1431 ADM_LOG_ERR("DspEqualizer get card instance or rtd failed.");
1432 return HDF_FAILURE;
1433 }
1434 rtd = audioCard->rtd;
1435
1436 dspDev = rtd->dsp;
1437 if (dspDev == NULL || dspDev->devData == NULL || dspDev->devData->Equalizer == NULL) {
1438 ADM_LOG_ERR("audioCard rtd dsp is NULL.");
1439 return HDF_FAILURE;
1440 }
1441
1442 ret = dspDev->devData->Equalizer(audioCard, (void*)data, dspDev);
1443 if (ret != HDF_SUCCESS) {
1444 ADM_LOG_ERR("Equalizer render pause failed ret=%d", ret);
1445 return HDF_ERR_IO;
1446 }
1447
1448 ADM_LOG_DEBUG("Equalizer Success.");
1449 return HDF_SUCCESS;
1450 }
1451
1452 static struct StreamDispCmdHandleList g_streamDispCmdHandle[] = {
1453 {AUDIO_DRV_PCM_IOCTL_WRITE, StreamHostWrite},
1454 {AUDIO_DRV_PCM_IOCTL_READ, StreamHostRead},
1455 {AUDIO_DRV_PCM_IOCTL_HW_PARAMS, StreamHostHwParams},
1456 {AUDIO_DRV_PCM_IOCTL_RENDER_PREPARE, StreamHostRenderPrepare},
1457 {AUDIO_DRV_PCM_IOCTL_CAPTURE_PREPARE, StreamHostCapturePrepare},
1458 {AUDIO_DRV_PCM_IOCTL_RENDER_OPEN, StreamHostRenderOpen},
1459 {AUDIO_DRV_PCM_IOCTL_RENDER_CLOSE, StreamHostRenderClose},
1460 {AUDIO_DRV_PCM_IOCTL_RENDER_START, StreamHostRenderStart},
1461 {AUDIO_DRV_PCM_IOCTL_RENDER_STOP, StreamHostRenderStop},
1462 {AUDIO_DRV_PCM_IOCTL_CAPTURE_OPEN, StreamHostCaptureOpen},
1463 {AUDIO_DRV_PCM_IOCTL_CAPTURE_CLOSE, StreamHostCaptureClose},
1464 {AUDIO_DRV_PCM_IOCTL_CAPTURE_START, StreamHostCaptureStart},
1465 {AUDIO_DRV_PCM_IOCTL_CAPTURE_STOP, StreamHostCaptureStop},
1466 {AUDIO_DRV_PCM_IOCTL_RENDER_PAUSE, StreamHostRenderPause},
1467 {AUDIO_DRV_PCM_IOCTL_CAPTURE_PAUSE, StreamHostCapturePause},
1468 {AUDIO_DRV_PCM_IOCTL_RENDER_RESUME, StreamHostRenderResume},
1469 {AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME, StreamHostCaptureResume},
1470 {AUDIO_DRV_PCM_IOCTL_MMAP_BUFFER, StreamHostMmapWrite},
1471 {AUDIO_DRV_PCM_IOCTL_MMAP_BUFFER_CAPTURE, StreamHostMmapRead},
1472 {AUDIO_DRV_PCM_IOCTL_MMAP_POSITION, StreamHostMmapPositionWrite},
1473 {AUDIO_DRV_PCM_IOCTL_MMAP_POSITION_CAPTURE, StreamHostMmapPositionRead},
1474 {AUDIO_DRV_PCM_IOCTL_DSPDECODE, StreamHostDspDecode},
1475 {AUDIO_DRV_PCM_IOCTL_DSPENCODE, StreamHostDspEncode},
1476 {AUDIO_DRV_PCM_IOCTL_DSPEQUALIZER, StreamHostDspEqualizer},
1477 };
1478
StreamDispatch(struct HdfDeviceIoClient * client,int cmdId,struct HdfSBuf * data,struct HdfSBuf * reply)1479 static int32_t StreamDispatch(struct HdfDeviceIoClient *client, int cmdId,
1480 struct HdfSBuf *data, struct HdfSBuf *reply)
1481 {
1482 unsigned int count = sizeof(g_streamDispCmdHandle) / sizeof(g_streamDispCmdHandle[0]);
1483 unsigned int i = 0;
1484 for (i = 0; i < count; ++i) {
1485 if ((cmdId == (int)(g_streamDispCmdHandle[i].cmd)) && (g_streamDispCmdHandle[i].func != NULL)) {
1486 return g_streamDispCmdHandle[i].func(client, data, reply);
1487 }
1488 }
1489 ADM_LOG_ERR("invalid [cmdId=%d]", cmdId);
1490 return HDF_FAILURE;
1491 }
1492
StreamHostCreateAndBind(struct HdfDeviceObject * device)1493 static struct StreamHost *StreamHostCreateAndBind(struct HdfDeviceObject *device)
1494 {
1495 struct StreamHost *streamHost;
1496 if (device == NULL) {
1497 return NULL;
1498 }
1499
1500 streamHost = (struct StreamHost *)OsalMemCalloc(sizeof(*streamHost));
1501 if (streamHost == NULL) {
1502 ADM_LOG_ERR("malloc host failed!");
1503 return NULL;
1504 }
1505 streamHost->device = device;
1506 device->service = &streamHost->service;
1507 return streamHost;
1508 }
1509
AudioStreamBind(struct HdfDeviceObject * device)1510 static int32_t AudioStreamBind(struct HdfDeviceObject *device)
1511 {
1512 struct StreamHost *streamHost;
1513 ADM_LOG_DEBUG("entry!");
1514 if (device == NULL) {
1515 return HDF_ERR_INVALID_PARAM;
1516 }
1517
1518 streamHost = StreamHostCreateAndBind(device);
1519 if (streamHost == NULL || streamHost->device == NULL) {
1520 ADM_LOG_ERR("StreamHostCreateAndBind failed");
1521 return HDF_FAILURE;
1522 }
1523
1524 streamHost->service.Dispatch = StreamDispatch;
1525
1526 ADM_LOG_INFO("success!");
1527 return HDF_SUCCESS;
1528 }
1529
AudioStreamInit(struct HdfDeviceObject * device)1530 static int32_t AudioStreamInit(struct HdfDeviceObject *device)
1531 {
1532 struct StreamHost *streamHost = NULL;
1533
1534 if (device == NULL) {
1535 ADM_LOG_ERR("device is NULL");
1536 return HDF_FAILURE;
1537 }
1538 ADM_LOG_DEBUG("entry.");
1539
1540 streamHost = StreamHostFromDevice(device);
1541 if (streamHost == NULL) {
1542 ADM_LOG_ERR("renderHost is NULL");
1543 return HDF_FAILURE;
1544 }
1545
1546 ADM_LOG_INFO("Success!");
1547 return HDF_SUCCESS;
1548 }
1549
AudioStreamRelease(struct HdfDeviceObject * device)1550 static void AudioStreamRelease(struct HdfDeviceObject *device)
1551 {
1552 struct StreamHost *streamHost;
1553 if (device == NULL) {
1554 ADM_LOG_ERR("device is NULL");
1555 return;
1556 }
1557
1558 streamHost = StreamHostFromDevice(device);
1559 if (streamHost == NULL) {
1560 ADM_LOG_ERR("renderHost is NULL");
1561 return;
1562 }
1563
1564 if (streamHost->priv != NULL) {
1565 OsalMemFree(streamHost->priv);
1566 }
1567 OsalMemFree(streamHost);
1568 }
1569
1570 /* HdfDriverEntry definitions */
1571 struct HdfDriverEntry g_audioStreamEntry = {
1572 .moduleVersion = 1,
1573 .moduleName = "HDF_AUDIO_STREAM",
1574 .Bind = AudioStreamBind,
1575 .Init = AudioStreamInit,
1576 .Release = AudioStreamRelease,
1577 };
1578 HDF_INIT(g_audioStreamEntry);
1579