• 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_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