• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &params->streamType)) {
305         ADM_LOG_ERR("read request streamType failed!");
306         return HDF_FAILURE;
307     }
308     if (!HdfSbufReadUint32(reqData, &params->channels)) {
309         ADM_LOG_ERR("read request channels failed!");
310         return HDF_FAILURE;
311     }
312     if (!HdfSbufReadUint32(reqData, &params->rate)) {
313         ADM_LOG_ERR("read request rate failed!");
314         return HDF_FAILURE;
315     }
316     if (!HdfSbufReadUint32(reqData, &params->periodSize)) {
317         ADM_LOG_ERR("read request periodSize failed!");
318         return HDF_FAILURE;
319     }
320     if (!HdfSbufReadUint32(reqData, &params->periodCount)) {
321         ADM_LOG_ERR("read request periodCount failed!");
322         return HDF_FAILURE;
323     }
324     if (!HdfSbufReadUint32(reqData, (uint32_t *)&params->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, &params->period)) {
333         HDF_LOGE("read request perid failed!");
334         return HDF_FAILURE;
335     }
336     if (!HdfSbufReadUint32(reqData, &params->frameSize)) {
337         HDF_LOGE("read request frameSize failed!");
338         return HDF_FAILURE;
339     }
340     if (!HdfSbufReadUint32(reqData, (uint32_t *)&params->isBigEndian)) {
341         HDF_LOGE("read request isBigEndian failed!");
342         return HDF_FAILURE;
343     }
344     if (!HdfSbufReadUint32(reqData, (uint32_t *)&params->isSignedData)) {
345         HDF_LOGE("read request isSignedData failed!");
346         return HDF_FAILURE;
347     }
348     if (!HdfSbufReadUint32(reqData, &params->startThreshold)) {
349         HDF_LOGE("read request startThreshold failed!");
350         return HDF_FAILURE;
351     }
352     if (!HdfSbufReadUint32(reqData, &params->stopThreshold)) {
353         HDF_LOGE("read request stopThreshold failed!");
354         return HDF_FAILURE;
355     }
356     if (!HdfSbufReadUint32(reqData, &params->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(&params, sizeof(struct AudioPcmHwParams), 0, sizeof(struct AudioPcmHwParams));
378 
379     ret = HwParamsDataAnalysis(data, &params);
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, &params);
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