hal: support car audio stream for bus devices
Add support for car audio streams and usecases
including media, system notification, navigation
guidance and phone.
The car audio streams are routed to bus devices
with assigned address, which is defined in audio
policy configuration. This enables dynamic mixing
and routing done by Android car framework from
application to AudioFlinger and audio HAL.
Change-Id: I583fc7b5f2e8850b064a3cde5f93693b16c47841
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 7fd2019..01d75e4 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -469,6 +469,15 @@
[USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM8] =
{PLAYBACK_INTERACTIVE_STRM_DEVICE8, PLAYBACK_INTERACTIVE_STRM_DEVICE8},
[USECASE_AUDIO_EC_REF_LOOPBACK] = {-1, -1}, /* pcm id updated from platform info file */
+ [USECASE_AUDIO_PLAYBACK_MEDIA] = {MEDIA_PCM_DEVICE,
+ MEDIA_PCM_DEVICE},
+ [USECASE_AUDIO_PLAYBACK_SYS_NOTIFICATION] = {SYS_NOTIFICATION_PCM_DEVICE,
+ SYS_NOTIFICATION_PCM_DEVICE},
+ [USECASE_AUDIO_PLAYBACK_NAV_GUIDANCE] = {NAV_GUIDANCE_PCM_DEVICE,
+ NAV_GUIDANCE_PCM_DEVICE},
+ [USECASE_AUDIO_PLAYBACK_PHONE] = {PHONE_PCM_DEVICE,
+ PHONE_PCM_DEVICE},
+
};
/* Array to store sound devices */
@@ -565,6 +574,10 @@
[SND_DEVICE_OUT_SPEAKER_WSA_AND_BT_SCO_WB] = "wsa-speaker-and-bt-sco-wb",
[SND_DEVICE_OUT_SPEAKER_WSA_AND_BT_SCO_SWB] = "wsa-speaker-and-bt-sco-wb",
[SND_DEVICE_OUT_VOICE_HEARING_AID] = "hearing-aid",
+ [SND_DEVICE_OUT_BUS_MEDIA] = "bus-speaker",
+ [SND_DEVICE_OUT_BUS_SYS] = "bus-speaker",
+ [SND_DEVICE_OUT_BUS_NAV] = "bus-speaker",
+ [SND_DEVICE_OUT_BUS_PHN] = "bus-speaker",
/* Capture sound devices */
[SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
@@ -697,6 +710,7 @@
[SND_DEVICE_OUT_VOIP_SPEAKER] = "voip-speaker",
[SND_DEVICE_OUT_VOIP_HEADPHONES] = "voip-headphones",
[SND_DEVICE_IN_VOICE_HEARING_AID] = "hearing-aid-mic",
+ [SND_DEVICE_IN_BUS] = "bus-mic",
};
// Platform specific backend bit width table
@@ -819,6 +833,10 @@
[SND_DEVICE_OUT_SPEAKER_PROTECTED_RAS] = 134,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT_RAS] = 134,
[SND_DEVICE_OUT_VOICE_HEARING_AID] = 45,
+ [SND_DEVICE_OUT_BUS_MEDIA] = 78,
+ [SND_DEVICE_OUT_BUS_SYS] = 78,
+ [SND_DEVICE_OUT_BUS_NAV] = 14,
+ [SND_DEVICE_OUT_BUS_PHN] = 94,
[SND_DEVICE_IN_HANDSET_MIC] = 4,
[SND_DEVICE_IN_HANDSET_MIC_SB] = 163,
[SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = 4,
@@ -946,6 +964,7 @@
[SND_DEVICE_IN_CAMCORDER_SELFIE_INVERT_LANDSCAPE] = 4,
[SND_DEVICE_IN_CAMCORDER_SELFIE_PORTRAIT] = 4,
[SND_DEVICE_IN_VOICE_HEARING_AID] = 44,
+ [SND_DEVICE_IN_BUS] = 11,
};
struct name_to_index {
@@ -1042,6 +1061,10 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_SPEAKER)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEARING_AID)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_BUS_MEDIA)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_BUS_SYS)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_BUS_NAV)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_BUS_PHN)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_SB)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_EXTERNAL)},
@@ -1171,6 +1194,7 @@
{TO_NAME_INDEX(SND_DEVICE_IN_CAMCORDER_SELFIE_PORTRAIT)},
/* For legacy xml file parsing */
{TO_NAME_INDEX(SND_DEVICE_IN_CAMCORDER_MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_BUS)},
};
static char * backend_tag_table[SND_DEVICE_MAX] = {0};
@@ -1232,7 +1256,10 @@
{TO_NAME_INDEX(USECASE_AUDIO_RECORD_VOIP)},
{TO_NAME_INDEX(USECASE_AUDIO_TRANSCODE_LOOPBACK_RX)},
{TO_NAME_INDEX(USECASE_AUDIO_TRANSCODE_LOOPBACK_TX)},
-
+ {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MEDIA)},
+ {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_SYS_NOTIFICATION)},
+ {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_NAV_GUIDANCE)},
+ {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_PHONE)},
};
static const struct name_to_index usecase_type_index[USECASE_TYPE_MAX] = {
@@ -2151,6 +2178,10 @@
Need snd_device to route voice call and use specific acdb tuning.
Also, BT_RX is a virtual port to indicate bluetooth hearing aid. */
hw_interface_table[SND_DEVICE_OUT_VOICE_HEARING_AID] = strdup("BT_RX"),
+ hw_interface_table[SND_DEVICE_OUT_BUS_MEDIA] = strdup("TERT_TDM_RX_0");
+ hw_interface_table[SND_DEVICE_OUT_BUS_SYS] = strdup("TERT_TDM_RX_0");
+ hw_interface_table[SND_DEVICE_OUT_BUS_NAV] = strdup("TERT_TDM_RX_1");
+ hw_interface_table[SND_DEVICE_OUT_BUS_PHN] = strdup("TERT_TDM_RX_2");
hw_interface_table[SND_DEVICE_IN_HANDSET_MIC] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_SB] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = strdup("SLIMBUS_0_TX");
@@ -2277,6 +2308,7 @@
hw_interface_table[SND_DEVICE_IN_CAMCORDER_SELFIE_INVERT_LANDSCAPE] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_CAMCORDER_SELFIE_PORTRAIT] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_HEARING_AID] = strdup("SLIMBUS_0_TX");
+ hw_interface_table[SND_DEVICE_IN_BUS] = strdup("TERT_TDM_TX_0");
my_data->max_mic_count = PLATFORM_DEFAULT_MIC_COUNT;
/*remove ALAC & APE from DSP decoder list based on software decoder availability*/
@@ -5797,6 +5829,8 @@
ALOGD("%s: setting sink capability(%d) for Proxy", __func__, channel_count);
snd_device = SND_DEVICE_OUT_AFE_PROXY;
audio_extn_set_afe_proxy_channel_mixer(adev, channel_count, snd_device);
+ } else if (devices & AUDIO_DEVICE_OUT_BUS) {
+ snd_device = audio_extn_auto_hal_get_snd_device_for_car_audio_stream(out);
} else {
ALOGE("%s: Unknown device(s) %#x", __func__, devices);
}
@@ -7633,9 +7667,13 @@
{
switch (usecase) {
case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
+ case USECASE_AUDIO_PLAYBACK_MEDIA:
+ case USECASE_AUDIO_PLAYBACK_NAV_GUIDANCE:
return DEEP_BUFFER_PLATFORM_DELAY;
case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
case USECASE_AUDIO_PLAYBACK_WITH_HAPTICS:
+ case USECASE_AUDIO_PLAYBACK_SYS_NOTIFICATION:
+ case USECASE_AUDIO_PLAYBACK_PHONE:
return LOW_LATENCY_PLATFORM_DELAY;
case USECASE_AUDIO_PLAYBACK_OFFLOAD:
case USECASE_AUDIO_PLAYBACK_OFFLOAD2:
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index fba1077..7da728c 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -175,6 +175,10 @@
SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET,
SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET,
SND_DEVICE_OUT_VOICE_HEARING_AID,
+ SND_DEVICE_OUT_BUS_MEDIA,
+ SND_DEVICE_OUT_BUS_SYS,
+ SND_DEVICE_OUT_BUS_NAV,
+ SND_DEVICE_OUT_BUS_PHN,
SND_DEVICE_OUT_END,
/*
@@ -311,6 +315,7 @@
SND_DEVICE_IN_CAMCORDER_SELFIE_INVERT_LANDSCAPE,
SND_DEVICE_IN_CAMCORDER_SELFIE_PORTRAIT,
SND_DEVICE_IN_VOICE_HEARING_AID,
+ SND_DEVICE_IN_BUS,
SND_DEVICE_IN_END,
SND_DEVICE_MAX = SND_DEVICE_IN_END,
@@ -625,6 +630,11 @@
#define PLAYBACK_INTERACTIVE_STRM_DEVICE7 48
#define PLAYBACK_INTERACTIVE_STRM_DEVICE8 49
+#define MEDIA_PCM_DEVICE DEEP_BUFFER_PCM_DEVICE
+#define SYS_NOTIFICATION_PCM_DEVICE 9
+#define NAV_GUIDANCE_PCM_DEVICE MULTIMEDIA2_PCM_DEVICE
+#define PHONE_PCM_DEVICE 12
+
#ifdef PLATFORM_APQ8084
#define FM_RX_VOLUME "Quat MI2S FM RX Volume"
#elif PLATFORM_MSM8994