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_core.h"
10 #include "audio_driver_log.h"
11
12 static const char *g_audioDaiControlsList[AUDIO_CTRL_LIST_MAX] = {
13 "Main Playback Volume", "Main Capture Volume",
14 "Playback Mute", "Capture Mute", "Mic Left Gain",
15 "Mic Right Gain", "External Codec Enable",
16 "Internally Codec Enable", "Render Channel Mode", "Captrue Channel Mode"
17 };
18
DaiDataFromCard(const struct AudioCard * card)19 struct DaiData *DaiDataFromCard(const struct AudioCard *card)
20 {
21 if (card == NULL || card->rtd == NULL || card->rtd->cpuDai == NULL) {
22 AUDIO_DRIVER_LOG_ERR("param is null.");
23 return NULL;
24 }
25 return card->rtd->cpuDai->devData;
26 }
27
28
DaiGetConfigInfo(const struct HdfDeviceObject * device,struct DaiData * data)29 int32_t DaiGetConfigInfo(const struct HdfDeviceObject *device, struct DaiData *data)
30 {
31 if (device == NULL || data == NULL) {
32 AUDIO_DRIVER_LOG_ERR("param is null!");
33 return HDF_FAILURE;
34 }
35
36 if (data->regConfig != NULL) {
37 ADM_LOG_ERR("g_codecData regConfig fail!");
38 return HDF_FAILURE;
39 }
40
41 data->regConfig = (struct AudioRegCfgData *)OsalMemCalloc(sizeof(*(data->regConfig)));
42 if (data->regConfig == NULL) {
43 ADM_LOG_ERR("malloc AudioRegCfgData fail!");
44 return HDF_FAILURE;
45 }
46
47 if (CodecGetRegConfig(device, data->regConfig) != HDF_SUCCESS) {
48 ADM_LOG_ERR("dai GetRegConfig fail!");
49 OsalMemFree(data->regConfig);
50 data->regConfig = NULL;
51 return HDF_FAILURE;
52 }
53
54 return HDF_SUCCESS;
55 }
56
DaiCheckSampleRate(unsigned int sampleRates)57 int32_t DaiCheckSampleRate(unsigned int sampleRates)
58 {
59 bool check = (sampleRates == AUDIO_SAMPLE_RATE_8000 || sampleRates == AUDIO_SAMPLE_RATE_12000 ||
60 sampleRates == AUDIO_SAMPLE_RATE_11025 || sampleRates == AUDIO_SAMPLE_RATE_16000 ||
61 sampleRates == AUDIO_SAMPLE_RATE_22050 || sampleRates == AUDIO_SAMPLE_RATE_24000 ||
62 sampleRates == AUDIO_SAMPLE_RATE_32000 || sampleRates == AUDIO_SAMPLE_RATE_44100 ||
63 sampleRates == AUDIO_SAMPLE_RATE_48000 || sampleRates == AUDIO_SAMPLE_RATE_64000 ||
64 sampleRates == AUDIO_SAMPLE_RATE_96000);
65 if (check) {
66 return HDF_SUCCESS;
67 } else {
68 AUDIO_DRIVER_LOG_ERR("FramatToSampleRate fail: Invalid sampling rate: %d.", sampleRates);
69 return HDF_ERR_NOT_SUPPORT;
70 }
71 }
72
DaiSetConfigInfo(struct DaiData * data)73 int32_t DaiSetConfigInfo(struct DaiData *data)
74 {
75 uint16_t index;
76 struct AudioRegCfgGroupNode **regCfgGroup = NULL;
77 struct AudioMixerControl *patRegCfgItemTmp = NULL;
78 struct AudioControlConfig *item = NULL;
79
80 if (data == NULL || data->regConfig == NULL) {
81 AUDIO_DRIVER_LOG_ERR("input para is NULL.");
82 return HDF_FAILURE;
83 }
84
85 regCfgGroup = data->regConfig->audioRegParams;
86 if (regCfgGroup == NULL) {
87 AUDIO_DRIVER_LOG_DEBUG("regCfgGroup is null.");
88 return HDF_SUCCESS;
89 }
90
91 patRegCfgItemTmp = regCfgGroup[AUDIO_CTRL_PATAM_GROUP]->regCfgItem;
92 item = regCfgGroup[AUDIO_CTRL_CFG_GROUP]->ctrlCfgItem;
93
94 if (patRegCfgItemTmp == NULL || item == NULL) {
95 AUDIO_DRIVER_LOG_ERR("patRegCfgItemTmp or item is NULL.");
96 return HDF_FAILURE;
97 }
98
99 data->numControls = regCfgGroup[AUDIO_CTRL_CFG_GROUP]->itemNum;
100 data->controls = (struct AudioKcontrol *)OsalMemCalloc(data->numControls * sizeof(struct AudioKcontrol));
101 if (data->controls == NULL) {
102 AUDIO_DRIVER_LOG_ERR("OsalMemCalloc failed.");
103 return HDF_FAILURE;
104 }
105
106 for (index = 0; index < data->numControls; index++) {
107 data->controls[index].iface = item[index].iface;
108 if (item[index].arrayIndex >= AUDIO_CTRL_LIST_MAX) {
109 AUDIO_DRIVER_LOG_ERR("Array super index.");
110 return HDF_FAILURE;
111 }
112 data->controls[index].name = g_audioDaiControlsList[item[index].arrayIndex];
113 data->controls[index].Info = AudioInfoCtrlOps;
114 data->controls[index].privateValue = (unsigned long)(uintptr_t)(void*)(&patRegCfgItemTmp[index]);
115 data->controls[index].Get = AudioCpuDaiGetCtrlOps;
116 data->controls[index].Set = AudioCpuDaiSetCtrlOps;
117 }
118
119 return HDF_SUCCESS;
120 }
121
122