hal: Fix MBDRC volume difference issue for combo use case
-change in MBDRC level based on volume is not getting applied on combo device
usecase (speaker is one of the device) due to speaker only check.
-Modify logic to recompute and apply MBDRC level if one of the device in combo
device is speaker
Change-Id: I1b37bc3d7c9e8e30cc344f2feffdd37fa4a0379b
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 88a2ef0..93eb2f8 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -6595,6 +6595,24 @@
return 0;
}
+static bool can_enable_mbdrc_on_device(snd_device_t snd_device)
+{
+ bool ret = false;
+
+ if (snd_device == SND_DEVICE_OUT_SPEAKER ||
+ snd_device == SND_DEVICE_OUT_SPEAKER_WSA ||
+ snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
+ ret = true;
+ }
+ return ret;
+}
+
bool platform_send_gain_dep_cal(void *platform,
int level )
{
@@ -6622,16 +6640,24 @@
if (usecase != NULL &&
usecase->type == PCM_PLAYBACK &&
- usecase->stream.out->devices == AUDIO_DEVICE_OUT_SPEAKER) {
+ usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER) {
+ int new_snd_device[2] = {0};
+ int i, num_devices = 1;
ALOGV("%s: out device is %d", __func__, usecase->out_snd_device);
app_type = usecase->stream.out->app_type_cfg.app_type;
- if (audio_extn_spkr_prot_is_enabled()) {
- acdb_dev_id = platform_get_spkr_prot_acdb_id(usecase->out_snd_device);
- } else {
- acdb_dev_id = acdb_device_table[usecase->out_snd_device];
- }
+ if (platform_split_snd_device(my_data, usecase->out_snd_device,
+ &num_devices, new_snd_device) < 0)
+ new_snd_device[0] = usecase->out_snd_device;
+
+ for (i = 0; i < num_devices; i++)
+ if (can_enable_mbdrc_on_device(new_snd_device[i])) {
+ if (audio_extn_spkr_prot_is_enabled())
+ acdb_dev_id = platform_get_spkr_prot_acdb_id(new_snd_device[i]);
+ else
+ acdb_dev_id = acdb_device_table[new_snd_device[i]];
+ }
if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type,
acdb_dev_type, mode, level)) {
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index c34e0f0..cc2438d 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -915,6 +915,24 @@
#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL)
#define ULL_PLATFORM_DELAY (6*1000LL)
+static bool can_enable_mbdrc_on_device(snd_device_t snd_device)
+{
+ bool ret = false;
+
+ if (snd_device == SND_DEVICE_OUT_SPEAKER ||
+ snd_device == SND_DEVICE_OUT_SPEAKER_WSA ||
+ snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
+ ret = true;
+ }
+ return ret;
+}
+
bool platform_send_gain_dep_cal(void *platform, int level) {
bool ret_val = false;
struct platform_data *my_data = (struct platform_data *)platform;
@@ -940,16 +958,24 @@
if (usecase != NULL &&
usecase->type == PCM_PLAYBACK &&
- usecase->stream.out->devices == AUDIO_DEVICE_OUT_SPEAKER) {
+ usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER) {
+ int new_snd_device[2] = {0};
+ int i, num_devices = 1;
ALOGV("%s: out device is %d", __func__, usecase->out_snd_device);
app_type = usecase->stream.out->app_type_cfg.app_type;
- if (audio_extn_spkr_prot_is_enabled()) {
- acdb_dev_id = platform_get_spkr_prot_acdb_id(usecase->out_snd_device);
- } else {
- acdb_dev_id = acdb_device_table[usecase->out_snd_device];
- }
+ if (platform_split_snd_device(my_data, usecase->out_snd_device,
+ &num_devices, new_snd_device) < 0)
+ new_snd_device[0] = usecase->out_snd_device;
+
+ for (i = 0; i < num_devices; i++)
+ if (can_enable_mbdrc_on_device(new_snd_device[i])) {
+ if (audio_extn_spkr_prot_is_enabled())
+ acdb_dev_id = platform_get_spkr_prot_acdb_id(new_snd_device[i]);
+ else
+ acdb_dev_id = acdb_device_table[new_snd_device[i]];
+ }
if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type,
acdb_dev_type, mode, level)) {