hal: add rear seat playback support for automotive

Add rear seat playback support for multi-zone
audio support on automotive platform.

Change-Id: Ia3d4c4a4f78950e99a8d4955e910cc8902b6bb17
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 4fa96da..2a7d70a 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -1286,6 +1286,9 @@
 #ifndef AUDIO_OUTPUT_FLAG_PHONE
 #define AUDIO_OUTPUT_FLAG_PHONE 0x800000
 #endif
+#ifndef AUDIO_OUTPUT_FLAG_REAR_SEAT
+#define AUDIO_OUTPUT_FLAG_REAR_SEAT 0x1000000
+#endif
 int audio_extn_auto_hal_init(struct audio_device *adev);
 void audio_extn_auto_hal_deinit(void);
 int audio_extn_auto_hal_create_audio_patch(struct audio_hw_device *dev,
diff --git a/hal/audio_extn/auto_hal.c b/hal/audio_extn/auto_hal.c
index 81ef46c..a295a4d 100644
--- a/hal/audio_extn/auto_hal.c
+++ b/hal/audio_extn/auto_hal.c
@@ -89,6 +89,7 @@
     USECASE_AUDIO_PLAYBACK_SYS_NOTIFICATION,
     USECASE_AUDIO_PLAYBACK_NAV_GUIDANCE,
     USECASE_AUDIO_PLAYBACK_PHONE,
+    USECASE_AUDIO_PLAYBACK_REAR_SEAT,
 };
 
 int auto_hal_release_audio_patch(struct audio_hw_device *dev,
@@ -505,6 +506,19 @@
         if (out->flags == AUDIO_OUTPUT_FLAG_NONE)
             out->flags |= AUDIO_OUTPUT_FLAG_PHONE;
         break;
+    case CAR_AUDIO_STREAM_REAR_SEAT:
+        out->usecase = USECASE_AUDIO_PLAYBACK_REAR_SEAT;
+        out->config = pcm_config_deep_buffer;
+        out->config.period_size = fp_get_output_period_size(out->sample_rate, out->format,
+                                        channels, DEEP_BUFFER_OUTPUT_PERIOD_DURATION);
+        if (out->config.period_size <= 0) {
+            ALOGE("Invalid configuration period size is not valid");
+            ret = -EINVAL;
+            goto error;
+        }
+        if (out->flags == AUDIO_OUTPUT_FLAG_NONE)
+            out->flags |= AUDIO_OUTPUT_FLAG_REAR_SEAT;
+        break;
     default:
         ALOGE("%s: Car audio stream %x not supported", __func__,
             out->car_audio_stream);
@@ -543,6 +557,9 @@
     case CAR_AUDIO_STREAM_PHONE:
         snd_device = SND_DEVICE_OUT_BUS_PHN;
         break;
+    case CAR_AUDIO_STREAM_REAR_SEAT:
+        snd_device = SND_DEVICE_OUT_BUS_RSE;
+        break;
     default:
         ALOGE("%s: Unknown car audio stream (%x)",
             __func__, out->car_audio_stream);
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index fe368e9..a29b6e5 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -150,6 +150,7 @@
     STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_SYS_NOTIFICATION),
     STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_NAV_GUIDANCE),
     STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_PHONE),
+    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_REAR_SEAT),
     STRING_TO_ENUM(AUDIO_INPUT_FLAG_NONE),
     STRING_TO_ENUM(AUDIO_INPUT_FLAG_FAST),
     STRING_TO_ENUM(AUDIO_INPUT_FLAG_HW_HOTWORD),
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index e541281..5840686 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -406,6 +406,7 @@
     [USECASE_AUDIO_PLAYBACK_SYS_NOTIFICATION] = "sys-notification-playback",
     [USECASE_AUDIO_PLAYBACK_NAV_GUIDANCE] = "nav-guidance-playback",
     [USECASE_AUDIO_PLAYBACK_PHONE] = "phone-playback",
+    [USECASE_AUDIO_PLAYBACK_REAR_SEAT] = "rear-seat-playback",
     [USECASE_AUDIO_FM_TUNER_EXT] = "fm-tuner-ext",
 };
 
@@ -5140,8 +5141,7 @@
             mixer_ctl_set_array(ctl, volume, sizeof(volume)/sizeof(volume[0]));
             return 0;
         } else if ((out->devices & AUDIO_DEVICE_OUT_BUS) &&
-                (audio_extn_auto_hal_get_snd_device_for_car_audio_stream(out) ==
-                    SND_DEVICE_OUT_BUS_MEDIA)) {
+                (out->car_audio_stream == CAR_AUDIO_STREAM_MEDIA)) {
             ALOGD("%s: Overriding offload set volume for media bus stream", __func__);
             struct listnode *node = NULL;
             list_for_each(node, &adev->active_outputs_list) {
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index e3e19c5..686d5a0 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -227,6 +227,7 @@
     USECASE_AUDIO_PLAYBACK_SYS_NOTIFICATION,
     USECASE_AUDIO_PLAYBACK_NAV_GUIDANCE,
     USECASE_AUDIO_PLAYBACK_PHONE,
+    USECASE_AUDIO_PLAYBACK_REAR_SEAT,
 
     /*Audio FM Tuner usecase*/
     USECASE_AUDIO_FM_TUNER_EXT,
@@ -300,15 +301,16 @@
 
 /* This defines the physical car streams supported in audio HAL,
  * limited by the available frontend PCM driver.
- * Max number of physical streams supported is currently 8 and is
- * represented by stream bit flag as indicated in vehicle HAL interface.
+ * Max number of physical streams supported is currently 16 and is
+ * represented by stream bit flag.
  */
-#define MAX_CAR_AUDIO_STREAMS    8
+#define MAX_CAR_AUDIO_STREAMS    16
 enum {
     CAR_AUDIO_STREAM_MEDIA            = 0x1,
     CAR_AUDIO_STREAM_SYS_NOTIFICATION = 0x2,
     CAR_AUDIO_STREAM_NAV_GUIDANCE     = 0x4,
     CAR_AUDIO_STREAM_PHONE            = 0x8,
+    CAR_AUDIO_STREAM_REAR_SEAT        = 0x100,
 };
 
 struct stream_app_type_cfg {
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 42c9256..4acdc6d 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -481,6 +481,8 @@
                                              NAV_GUIDANCE_PCM_DEVICE},
     [USECASE_AUDIO_PLAYBACK_PHONE] = {PHONE_PCM_DEVICE,
                                       PHONE_PCM_DEVICE},
+    [USECASE_AUDIO_PLAYBACK_REAR_SEAT] = {REAR_SEAT_PCM_DEVICE,
+                                          REAR_SEAT_PCM_DEVICE},
     [USECASE_AUDIO_FM_TUNER_EXT] = {-1, -1},
 };
 
@@ -584,6 +586,7 @@
     [SND_DEVICE_OUT_BUS_SYS] = "bus-speaker",
     [SND_DEVICE_OUT_BUS_NAV] = "bus-speaker",
     [SND_DEVICE_OUT_BUS_PHN] = "bus-speaker",
+    [SND_DEVICE_OUT_BUS_RSE] = "bus-speaker",
 
     /* Capture sound devices */
     [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
@@ -846,10 +849,11 @@
     [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_MEDIA] = 60,
+    [SND_DEVICE_OUT_BUS_SYS] = 60,
     [SND_DEVICE_OUT_BUS_NAV] = 14,
     [SND_DEVICE_OUT_BUS_PHN] = 94,
+    [SND_DEVICE_OUT_BUS_RSE] = 60,
     [SND_DEVICE_IN_HANDSET_MIC] = 4,
     [SND_DEVICE_IN_HANDSET_MIC_SB] = 163,
     [SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = 4,
@@ -1081,6 +1085,7 @@
     {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_OUT_BUS_RSE)},
     {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)},
@@ -1281,6 +1286,7 @@
     {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_SYS_NOTIFICATION)},
     {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_NAV_GUIDANCE)},
     {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_PHONE)},
+    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_REAR_SEAT)},
 };
 
 static const struct name_to_index usecase_type_index[USECASE_TYPE_MAX] = {
@@ -2224,6 +2230,7 @@
     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_OUT_BUS_RSE] = strdup("QUAT_TDM_RX_0");
     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");
@@ -7914,6 +7921,7 @@
         case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
         case USECASE_AUDIO_PLAYBACK_MEDIA:
         case USECASE_AUDIO_PLAYBACK_NAV_GUIDANCE:
+        case USECASE_AUDIO_PLAYBACK_REAR_SEAT:
             return DEEP_BUFFER_PLATFORM_DELAY;
         case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
         case USECASE_AUDIO_PLAYBACK_WITH_HAPTICS:
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index 3816f77..ad82f62 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -181,6 +181,7 @@
     SND_DEVICE_OUT_BUS_SYS,
     SND_DEVICE_OUT_BUS_NAV,
     SND_DEVICE_OUT_BUS_PHN,
+    SND_DEVICE_OUT_BUS_RSE,
     SND_DEVICE_OUT_END,
 
     /*
@@ -660,6 +661,7 @@
 #define SYS_NOTIFICATION_PCM_DEVICE 9
 #define NAV_GUIDANCE_PCM_DEVICE MULTIMEDIA2_PCM_DEVICE
 #define PHONE_PCM_DEVICE 12
+#define REAR_SEAT_PCM_DEVICE 54
 
 #ifdef PLATFORM_APQ8084
 #define FM_RX_VOLUME "Quat MI2S FM RX Volume"