hal: Add support for voice speaker stereo
Add device entries and additional support to enable
voice speaker stereo and stereo-protected features.
Change-Id: Iad40d6a297824181ed380a5a3f37254f58144de5
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 4a7b85c..d65c389 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -256,6 +256,7 @@
bool is_vbat_speaker;
bool gsm_mode_enabled;
int mono_speaker;
+ bool voice_speaker_stereo;
/* Audio calibration related functions */
void *acdb_handle;
int voice_feature_set;
@@ -421,6 +422,7 @@
[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = "speaker-and-headphones-ext-2",
[SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
[SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO] = "voice-speaker-stereo",
[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = "wsa-voice-speaker",
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "vbat-voice-speaker",
[SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
@@ -453,10 +455,13 @@
[SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = "voice-anc-fb-headphones",
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = "voice-speaker-and-voice-headphones",
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = "voice-speaker-and-voice-anc-headphones",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = "voice-speaker-stereo-and-voice-headphones",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = "voice-speaker-stereo-and-voice-anc-headphones",
[SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones",
[SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = "voice-speaker-stereo-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
@@ -593,6 +598,7 @@
[SND_DEVICE_OUT_VOICE_HANDSET] = 7,
[SND_DEVICE_OUT_VOICE_LINE] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO] = 15,
[SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = 135,
[SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = 135,
@@ -601,6 +607,8 @@
[SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = 10,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = 10,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = 10,
[SND_DEVICE_OUT_HDMI] = 18,
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
[SND_DEVICE_OUT_DISPLAY_PORT] = 18,
@@ -632,6 +640,7 @@
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = 124,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = 134,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = 134,
#ifdef RECORD_PLAY_CONCURRENCY
@@ -783,6 +792,7 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
@@ -1557,6 +1567,8 @@
backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
@@ -1571,6 +1583,8 @@
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_LINE] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
@@ -1609,6 +1623,7 @@
hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = strdup("SLIMBUS_0_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
@@ -2259,6 +2274,7 @@
my_data->is_wsa_speaker = false;
my_data->hw_dep_fd = -1;
my_data->mono_speaker = SPKR_1;
+ my_data->voice_speaker_stereo = false;
be_dai_name_table = NULL;
@@ -2319,6 +2335,8 @@
hw_info_enable_wsa_combo_usecase_support(my_data->hw_info);
}
+ my_data->voice_speaker_stereo =
+ property_get_bool("persist.vendor.audio.voicecall.speaker.stereo", false);
property_get("persist.vendor.audio.FFSP.enable", ffspEnable, "");
if (!strncmp("true", ffspEnable, sizeof("true"))) {
@@ -3509,6 +3527,8 @@
if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA)
out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED;
else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA)
out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
@@ -3758,6 +3778,18 @@
new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES &&
+ !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO, SND_DEVICE_OUT_VOICE_HEADPHONES)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ new_snd_devices[1] = SND_DEVICE_OUT_VOICE_HEADPHONES;
+ ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET &&
+ !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO, SND_DEVICE_OUT_VOICE_ANC_HEADSET)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
+ ret = 0;
} else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI &&
!platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HDMI)) {
*num_devices = 2;
@@ -4029,10 +4061,14 @@
else
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA;
} else {
- if (my_data->mono_speaker == SPKR_1)
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
- else
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ if (my_data->voice_speaker_stereo)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ else {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ }
}
} else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
@@ -7511,6 +7547,9 @@
case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED);
+ break;
case SND_DEVICE_OUT_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
break;
@@ -7542,6 +7581,8 @@
case SND_DEVICE_OUT_VOICE_SPEAKER_2:
case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED;
case SND_DEVICE_OUT_SPEAKER_VBAT:
return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
@@ -7558,6 +7599,7 @@
switch(snd_device) {
case SND_DEVICE_OUT_SPEAKER_PROTECTED:
case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED:
return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
diff --git a/hal/msm8916/platform.h b/hal/msm8916/platform.h
index 1cf7a62..8d87a9f 100644
--- a/hal/msm8916/platform.h
+++ b/hal/msm8916/platform.h
@@ -99,6 +99,7 @@
SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2,
SND_DEVICE_OUT_VOICE_HANDSET,
SND_DEVICE_OUT_VOICE_SPEAKER,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO,
SND_DEVICE_OUT_VOICE_SPEAKER_WSA,
SND_DEVICE_OUT_VOICE_SPEAKER_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_2,
@@ -136,6 +137,7 @@
SND_DEVICE_OUT_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED,
SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT,
@@ -148,6 +150,8 @@
#endif
SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES,
SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET,
SND_DEVICE_OUT_END,
/*
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index a48d5b0..a5f36ba 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -235,6 +235,7 @@
bool is_slimbus_interface;
bool is_internal_codec;
int mono_speaker;
+ bool voice_speaker_stereo;
/* Audio calibration related functions */
void *acdb_handle;
int voice_feature_set;
@@ -402,6 +403,7 @@
[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = "speaker-and-headphones-ext-2",
[SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
[SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO] = "voice-speaker-stereo",
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "voice-speaker-vbat",
[SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = "voice-speaker-2-vbat",
@@ -435,11 +437,15 @@
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = "voice-speaker-and-voice-headphones",
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = "voice-speaker-and-voice-anc-headphones",
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = "voice-speaker-and-voice-anc-fb-headphones",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = "voice-speaker-stereo-and-voice-headphones",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = "voice-speaker-stereo-and-voice-anc-headphones",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = "voice-speaker-stereo-and-voice-anc-fb-headphones",
[SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones",
[SND_DEVICE_OUT_SPEAKER_AND_ANC_FB_HEADSET] = "speaker-and-anc-fb-headphones",
[SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = "voice-speaker-stereo-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
@@ -573,6 +579,7 @@
[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = 130,
[SND_DEVICE_OUT_VOICE_HANDSET] = 7,
[SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO] = 15,
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = 14,
[SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = 14,
@@ -581,6 +588,9 @@
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = 10,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = 10,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = 10,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = 10,
[SND_DEVICE_OUT_HDMI] = 18,
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
[SND_DEVICE_OUT_DISPLAY_PORT] = 18,
@@ -615,6 +625,7 @@
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = 124,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = 134,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = 134,
[SND_DEVICE_IN_HANDSET_MIC] = 4,
@@ -764,6 +775,7 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
@@ -1404,6 +1416,9 @@
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = strdup("speaker-and-headphones");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = strdup("speaker-and-headphones");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = strdup("speaker-and-headphones");
hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
@@ -1419,6 +1434,9 @@
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_LINE] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_1] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2] = strdup("SLIMBUS_0_RX-and-SLIMBUS_6_RX");
@@ -1460,6 +1478,7 @@
hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = strdup("SLIMBUS_0_RX");
+ hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = strdup("SLIMBUS_0_RX");
@@ -2072,6 +2091,7 @@
my_data->hw_dep_fd = -1;
my_data->mono_speaker = SPKR_1;
my_data->speaker_lr_swap = false;
+ my_data->voice_speaker_stereo = false;
be_dai_name_table = NULL;
@@ -2124,6 +2144,9 @@
}
}
+ my_data->voice_speaker_stereo =
+ property_get_bool("persist.vendor.audio.voicecall.speaker.stereo", false);
+
/* Check if Vbat speaker enabled property is set, this should be done before acdb init */
bool ret = false;
ret = audio_extn_can_use_vbat();
@@ -3308,6 +3331,8 @@
if (audio_extn_spkr_prot_is_enabled()) {
if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER)
out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED;
else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)
out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2)
@@ -3570,6 +3595,24 @@
new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER;
new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES &&
+ !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO, SND_DEVICE_OUT_VOICE_HEADPHONES)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ new_snd_devices[1] = SND_DEVICE_OUT_VOICE_HEADPHONES;
+ ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET &&
+ !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO, SND_DEVICE_OUT_VOICE_ANC_HEADSET)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
+ ret = 0;
+ } else if (snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET &&
+ !platform_check_backends_match(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO, SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ new_snd_devices[1] = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
+ ret = 0;
} else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI &&
!platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HDMI)) {
*num_devices = 2;
@@ -3839,10 +3882,14 @@
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
} else {
if (hw_info_is_stereo_spkr(my_data->hw_info)) {
- if (my_data->mono_speaker == SPKR_1)
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
- else
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ if (my_data->voice_speaker_stereo)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_STEREO;
+ else {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ }
} else
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
}
@@ -7317,6 +7364,9 @@
case SND_DEVICE_OUT_VOICE_SPEAKER_2:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED);
+ break;
case SND_DEVICE_OUT_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
break;
@@ -7345,6 +7395,8 @@
return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
case SND_DEVICE_OUT_VOICE_SPEAKER_2:
return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED;
case SND_DEVICE_OUT_SPEAKER_VBAT:
return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
@@ -7360,6 +7412,7 @@
switch(snd_device) {
case SND_DEVICE_OUT_SPEAKER_PROTECTED:
case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED:
return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index f4c8ab6..ccbc413 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -96,6 +96,7 @@
SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES_EXTERNAL_2,
SND_DEVICE_OUT_VOICE_HANDSET,
SND_DEVICE_OUT_VOICE_SPEAKER,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO,
SND_DEVICE_OUT_VOICE_SPEAKER_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_2,
SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT,
@@ -134,6 +135,7 @@
SND_DEVICE_OUT_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_PROTECTED,
SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT,
@@ -145,6 +147,9 @@
SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_HEADPHONES,
SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_HEADSET,
SND_DEVICE_OUT_VOICE_SPEAKER_AND_VOICE_ANC_FB_HEADSET,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_HEADPHONES,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET,
+ SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET,
SND_DEVICE_OUT_END,
/*