audio: hal: Initialize AFE configs by querying the kernel
- AFE configuration is not reset to default after a 24 bit playback.
- To fix this initialize the configurations by querying the
kernel for mixer bitwidth, samplerate, and channel configurations
everytime.
Change-Id: Id68a41e36f40ce0d6720d92ee0ce048a266e48fa
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 45b02e3..4987f8b 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -972,6 +972,8 @@
#define ULL_PLATFORM_DELAY (6*1000LL)
#define MMAP_PLATFORM_DELAY (3*1000LL)
+static const char *platform_get_mixer_control(struct mixer_ctl *);
+
static void update_interface(const char *snd_card_name) {
if (!strncmp(snd_card_name, "apq8009-tashalite-snd-card",
sizeof("apq8009-tashalite-snd-card"))) {
@@ -2149,6 +2151,8 @@
int idx;
int wsaCount =0;
bool is_wsa_combo_supported = false;
+ const char *id_string = NULL;
+ int cfg_value = -1;
snd_card_num = audio_extn_utils_get_snd_card_num();
if(snd_card_num < 0) {
@@ -2599,6 +2603,41 @@
my_data->current_backend_cfg[HDMI_TX_BACKEND].channels_mixer_ctl =
strdup("QUAT_MI2S_TX Channels");
+ for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
+ if (my_data->current_backend_cfg[idx].bitwidth_mixer_ctl) {
+ ctl = mixer_get_ctl_by_name(adev->mixer,
+ my_data->current_backend_cfg[idx].bitwidth_mixer_ctl);
+ id_string = platform_get_mixer_control(ctl);
+ if (id_string) {
+ cfg_value = audio_extn_utils_get_bit_width_from_string(id_string);
+ if (cfg_value > 0)
+ my_data->current_backend_cfg[idx].bit_width = cfg_value;
+ }
+ }
+
+ if (my_data->current_backend_cfg[idx].samplerate_mixer_ctl) {
+ ctl = mixer_get_ctl_by_name(adev->mixer,
+ my_data->current_backend_cfg[idx].samplerate_mixer_ctl);
+ id_string = platform_get_mixer_control(ctl);
+ if (id_string) {
+ cfg_value = audio_extn_utils_get_sample_rate_from_string(id_string);
+ if (cfg_value > 0)
+ my_data->current_backend_cfg[idx].sample_rate = cfg_value;
+ }
+ }
+
+ if (my_data->current_backend_cfg[idx].channels_mixer_ctl) {
+ ctl = mixer_get_ctl_by_name(adev->mixer,
+ my_data->current_backend_cfg[idx].channels_mixer_ctl);
+ id_string = platform_get_mixer_control(ctl);
+ if (id_string) {
+ cfg_value = audio_extn_utils_get_channels_from_string(id_string);
+ if (cfg_value > 0)
+ my_data->current_backend_cfg[idx].channels = cfg_value;
+ }
+ }
+ }
+
ret = audio_extn_utils_get_codec_version(snd_card_name,
my_data->adev->snd_card,
my_data->codec_version);
@@ -7847,3 +7886,20 @@
return -1;
}
#endif
+
+static const char *platform_get_mixer_control(struct mixer_ctl *ctl)
+{
+ int id = -1;
+ const char *id_string = NULL;
+
+ if (!ctl) {
+ ALOGD("%s: mixer ctl not obtained", __func__);
+ } else {
+ id = mixer_ctl_get_value(ctl, 0);
+ if (id >= 0) {
+ id_string = mixer_ctl_get_enum_string(ctl, id);
+ }
+ }
+
+ return id_string;
+}