hal: update all local cached backend info once BE updates
There's scenario where the same backend shared by multiple devices.
We need to update local cached backed info for all devices if there's
any backend update.
Change-Id: Ib20c041d9c1fa8d4bfd9d879b7d2902ec6343be7
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index f8f0d69..b9442f9 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -9203,6 +9203,8 @@
struct audio_device_config_param *adev_device_cfg_ptr = adev->device_cfg_params;
int controller = -1;
int stream = -1;
+ const char *id_string = NULL;
+ int cfg_value = -1;
if (usecase != NULL && usecase->stream.out &&
usecase->type == PCM_PLAYBACK) {
@@ -9254,13 +9256,24 @@
} else {
ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
}
- if ( ret < 0) {
+ if (ret < 0) {
ALOGE("%s:becf: afe: fail for %s mixer set to %d bit for %x format", __func__,
my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
} else {
- my_data->current_backend_cfg[backend_idx].bit_width = bit_width;
ALOGD("%s:becf: afe: %s mixer set to %d bit for %x format", __func__,
my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
+ for (int 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;
+ }
+ }
+ }
}
/* set the ret as 0 and not pass back to upper layer */
ret = 0;
@@ -9268,90 +9281,106 @@
if ((my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl) &&
(passthrough_enabled || (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate))) {
- char *rate_str = NULL;
- struct mixer_ctl *ctl = NULL;
+ char *rate_str = NULL;
+ struct mixer_ctl *ctl = NULL;
- if (backend_idx == USB_AUDIO_RX_BACKEND ||
- backend_idx == USB_AUDIO_TX_BACKEND) {
- switch (sample_rate) {
- case 32000:
- rate_str = "KHZ_32";
- break;
- case 8000:
- rate_str = "KHZ_8";
- break;
- case 11025:
- rate_str = "KHZ_11P025";
- break;
- case 16000:
- rate_str = "KHZ_16";
- break;
- case 22050:
- rate_str = "KHZ_22P05";
- break;
- }
+ if (backend_idx == USB_AUDIO_RX_BACKEND ||
+ backend_idx == USB_AUDIO_TX_BACKEND) {
+ switch (sample_rate) {
+ case 32000:
+ rate_str = "KHZ_32";
+ break;
+ case 8000:
+ rate_str = "KHZ_8";
+ break;
+ case 11025:
+ rate_str = "KHZ_11P025";
+ break;
+ case 16000:
+ rate_str = "KHZ_16";
+ break;
+ case 22050:
+ rate_str = "KHZ_22P05";
+ break;
}
+ }
- if (rate_str == NULL) {
- switch (sample_rate) {
- case 32000:
- if (passthrough_enabled || (backend_idx == SPDIF_TX_BACKEND) ||
- (backend_idx == HDMI_TX_BACKEND) ||
- (backend_idx == HDMI_ARC_TX_BACKEND) ||
- (backend_idx == DISP_PORT_RX_BACKEND)) {
- rate_str = "KHZ_32";
- break;
- }
- case 48000:
- rate_str = "KHZ_48";
- break;
- case 44100:
- rate_str = "KHZ_44P1";
- break;
- case 64000:
- case 96000:
- rate_str = "KHZ_96";
- break;
- case 88200:
- rate_str = "KHZ_88P2";
- break;
- case 176400:
- rate_str = "KHZ_176P4";
- break;
- case 192000:
- rate_str = "KHZ_192";
- break;
- case 352800:
- rate_str = "KHZ_352P8";
- break;
- case 384000:
- rate_str = "KHZ_384";
- break;
- case 144000:
- if (passthrough_enabled) {
- rate_str = "KHZ_144";
- break;
- }
- default:
- rate_str = "KHZ_48";
+ if (rate_str == NULL) {
+ switch (sample_rate) {
+ case 32000:
+ if (passthrough_enabled || (backend_idx == SPDIF_TX_BACKEND) ||
+ (backend_idx == HDMI_TX_BACKEND) ||
+ (backend_idx == HDMI_ARC_TX_BACKEND) ||
+ (backend_idx == DISP_PORT_RX_BACKEND)) {
+ rate_str = "KHZ_32";
break;
}
+ case 48000:
+ rate_str = "KHZ_48";
+ break;
+ case 44100:
+ rate_str = "KHZ_44P1";
+ break;
+ case 64000:
+ case 96000:
+ rate_str = "KHZ_96";
+ break;
+ case 88200:
+ rate_str = "KHZ_88P2";
+ break;
+ case 176400:
+ rate_str = "KHZ_176P4";
+ break;
+ case 192000:
+ rate_str = "KHZ_192";
+ break;
+ case 352800:
+ rate_str = "KHZ_352P8";
+ break;
+ case 384000:
+ rate_str = "KHZ_384";
+ break;
+ case 144000:
+ if (passthrough_enabled) {
+ rate_str = "KHZ_144";
+ break;
+ }
+ default:
+ rate_str = "KHZ_48";
+ break;
}
+ }
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
- if(!ctl) {
- ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
- __func__,
- my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
+ ctl = mixer_get_ctl_by_name(adev->mixer,
+ my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
+ if(!ctl) {
+ ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
+ __func__,
+ my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
+ return -EINVAL;
+ }
+ ret = mixer_ctl_set_enum_by_string(ctl, rate_str);
+ if (ret < 0) {
+ ALOGE("%s:becf: afe: fail for %s mixer set to %s", __func__,
+ my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl, rate_str);
+ } else {
ALOGD("%s:becf: afe: %s set to %s", __func__,
my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl, rate_str);
- mixer_ctl_set_enum_by_string(ctl, rate_str);
- my_data->current_backend_cfg[backend_idx].sample_rate = sample_rate;
- ret = 0;
+ for (int idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
+ 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;
+ }
+ }
+ }
+ }
+ ret = 0;
}
if ((my_data->current_backend_cfg[backend_idx].channels_mixer_ctl) &&
(channels != my_data->current_backend_cfg[backend_idx].channels)) {
@@ -9386,8 +9415,27 @@
my_data->current_backend_cfg[backend_idx].channels_mixer_ctl);
return -EINVAL;
}
- mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
- my_data->current_backend_cfg[backend_idx].channels = channels;
+ ret = mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
+ if (ret < 0) {
+ ALOGE("%s:becf: afe: fail for %s mixer set to %s", __func__,
+ my_data->current_backend_cfg[backend_idx].channels_mixer_ctl, channel_cnt_str);
+ } else {
+ ALOGD("%s:becf: afe: %s set to %s", __func__,
+ my_data->current_backend_cfg[backend_idx].channels_mixer_ctl, channel_cnt_str);
+ for (int idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
+ 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 = 0;
if ((backend_idx == HDMI_RX_BACKEND) ||
(backend_idx == DISP_PORT_RX_BACKEND) ||
@@ -9395,11 +9443,6 @@
platform_set_edid_channels_configuration_v2(adev->platform, channels,
backend_idx, snd_device,
controller, stream);
-
- ALOGD("%s:becf: afe: %s set to %s ", __func__,
- my_data->current_backend_cfg[backend_idx].channels_mixer_ctl,
- channel_cnt_str);
- ret = 0;
}
bool set_ext_disp_format = false, set_mi2s_tx_data_format = false;