hal: Add support for speaker safe and BT A2DP usecases
Add backend configuration in audio HAL for speaker safe and
BT A2DP usecases.
Bug: 79873626
Test: play ringtone with BT A2DP headset connected
Change-Id: I2a14098a1f1d812e48dda48c4e46c4663362e7fe
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 8a2562f..56bd220 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -907,7 +907,8 @@
* with new AFE encoder format based on a2dp state
*/
if ((SND_DEVICE_OUT_BT_A2DP == snd_device ||
- SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP == snd_device) &&
+ SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP == snd_device ||
+ SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP == snd_device) &&
audio_extn_a2dp_is_force_device_switch()) {
force_routing = true;
}
@@ -1361,7 +1362,8 @@
return 0;
}
- if ((out_snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP) &&
+ if ((out_snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP ||
+ out_snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP) &&
(!audio_extn_a2dp_is_ready())) {
ALOGW("%s: A2DP profile is not ready, routing to speaker only", __func__);
out_snd_device = SND_DEVICE_OUT_SPEAKER;
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 5c528d7..d5d78e2 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -213,6 +213,7 @@
[SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
[SND_DEVICE_OUT_BT_A2DP] = "bt-a2dp",
[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = "speaker-and-bt-a2dp",
+ [SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP] = "speaker-safe-and-bt-a2dp",
[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
@@ -306,6 +307,7 @@
[SND_DEVICE_OUT_BT_SCO_WB] = 39,
[SND_DEVICE_OUT_BT_A2DP] = 20,
[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = 14,
+ [SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP] = 14,
[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
@@ -406,6 +408,7 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO_WB)},
{TO_NAME_INDEX(SND_DEVICE_OUT_BT_A2DP)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)},
@@ -680,6 +683,8 @@
backend_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("bt-sco-wb");
backend_table[SND_DEVICE_OUT_BT_A2DP] = strdup("bt-a2dp");
backend_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
+ backend_table[SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP] =
+ strdup("speaker-safe-and-bt-a2dp");
backend_table[SND_DEVICE_OUT_HDMI] = strdup("hdmi");
backend_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("speaker-and-hdmi");
backend_table[SND_DEVICE_OUT_VOICE_TX] = strdup("afe-proxy");
@@ -1634,6 +1639,9 @@
} else if ((devices & AUDIO_DEVICE_OUT_SPEAKER) &&
(devices & AUDIO_DEVICE_OUT_ALL_A2DP)) {
snd_device = SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP;
+ } else if ((devices & AUDIO_DEVICE_OUT_SPEAKER_SAFE) &&
+ (devices & AUDIO_DEVICE_OUT_ALL_A2DP)) {
+ snd_device = SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP;
} else {
ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
goto exit;
diff --git a/hal/msm8916/platform.h b/hal/msm8916/platform.h
index d828f6b..b69b6c9 100644
--- a/hal/msm8916/platform.h
+++ b/hal/msm8916/platform.h
@@ -73,6 +73,7 @@
SND_DEVICE_OUT_BT_SCO_WB,
SND_DEVICE_OUT_BT_A2DP,
SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP,
+ SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP,
SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES,
SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES,
SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET,
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 450e31c..d4b8170 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -263,6 +263,7 @@
[SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
[SND_DEVICE_OUT_BT_A2DP] = "bt-a2dp",
[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = "speaker-and-bt-a2dp",
+ [SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP] = "speaker-safe-and-bt-a2dp",
[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = "voice-handset-tmus",
[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
@@ -380,6 +381,7 @@
[SND_DEVICE_OUT_BT_SCO_WB] = 39,
[SND_DEVICE_OUT_BT_A2DP] = 20,
[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = 14,
+ [SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP] = 14,
[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = ACDB_ID_VOICE_HANDSET_TMUS,
[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
@@ -503,6 +505,7 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO_WB)},
{TO_NAME_INDEX(SND_DEVICE_OUT_BT_A2DP)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET_TMUS)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HAC_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)},
@@ -1210,6 +1213,7 @@
backend_tag_table[SND_DEVICE_IN_USB_HEADSET_MIC_AEC] = strdup("usb-headset-mic");
backend_tag_table[SND_DEVICE_OUT_BT_A2DP] = strdup("bt-a2dp");
backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
+ backend_tag_table[SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP] = strdup("speaker-safe-and-bt-a2dp");
backend_tag_table[SND_DEVICE_OUT_USB_HEADSET_SPEC] = strdup("usb-headset");
hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
@@ -1234,6 +1238,8 @@
hw_interface_table[SND_DEVICE_OUT_BT_A2DP] = strdup("SLIMBUS_7_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] =
strdup("SLIMBUS_0_RX-and-SLIMBUS_7_RX");
+ hw_interface_table[SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP] =
+ strdup("SLIMBUS_0_RX-and-SLIMBUS_7_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = strdup("SLIMBUS_0_RX");
@@ -2557,6 +2563,13 @@
new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
new_snd_devices[1] = SND_DEVICE_OUT_BT_A2DP;
ret = 0;
+ } else if (SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP == snd_device &&
+ !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER_SAFE,
+ SND_DEVICE_OUT_BT_A2DP)) {
+ *num_devices = 2;
+ new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_SAFE;
+ new_snd_devices[1] = SND_DEVICE_OUT_BT_A2DP;
+ ret = 0;
}
return ret;
@@ -2614,6 +2627,9 @@
} else if ((devices & AUDIO_DEVICE_OUT_SPEAKER) &&
(devices & AUDIO_DEVICE_OUT_ALL_A2DP)) {
snd_device = SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP;
+ } else if ((devices & AUDIO_DEVICE_OUT_SPEAKER_SAFE) &&
+ (devices & AUDIO_DEVICE_OUT_ALL_A2DP)) {
+ snd_device = SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP;
} else {
ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
goto exit;
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index f512de3..cc5187d 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -80,6 +80,7 @@
SND_DEVICE_OUT_BT_SCO_WB,
SND_DEVICE_OUT_BT_A2DP,
SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP,
+ SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP,
SND_DEVICE_OUT_VOICE_HANDSET_TMUS,
SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES,
SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES,