Merge "audio: Add support for quad EC capture"
diff --git a/configs/sdm710/audio_platform_info.xml b/configs/sdm710/audio_platform_info.xml
index 90f3684..744eb48 100644
--- a/configs/sdm710/audio_platform_info.xml
+++ b/configs/sdm710/audio_platform_info.xml
@@ -47,8 +47,11 @@
         <device name="SND_DEVICE_IN_UNPROCESSED_QUAD_MIC" acdb_id="146"/>
         <device name="SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC" acdb_id="147"/>
         <device name="SND_DEVICE_IN_HANDSET_QMIC" acdb_id="140"/>
+        <device name="SND_DEVICE_IN_HANDSET_6MIC" acdb_id="140"/>
+        <device name="SND_DEVICE_IN_HANDSET_8MIC" acdb_id="140"/>
         <device name="SND_DEVICE_IN_EC_REF_LOOPBACK_MONO" acdb_id="140"/>
         <device name="SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO" acdb_id="140"/>
+        <device name="SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD" acdb_id="140"/>
     </acdb_ids>
     <module_ids>
         <aec>
@@ -103,6 +106,7 @@
         <usecase name="USECASE_AUDIO_PLAYBACK_VOIP" type="out" id="16" />
         <usecase name="USECASE_AUDIO_RECORD_VOIP" type="in" id="16" />
         <usecase name="USECASE_AUDIO_A2DP_ABR_FEEDBACK" type="in" id="35" />
+        <usecase name="USECASE_AUDIO_EC_REF_LOOPBACK" type="in" id="27"/>
     </pcm_ids>
     <config_params>
         <param key="spkr_1_tz_name" value="wsatz.13"/>
@@ -119,6 +123,9 @@
         <!-- In the below value string, the value indicates sidetone gain in dB -->
         <param key="usb_sidetone_gain" value="35"/>
         <param key="hfp_pcm_dev_id" value="36"/>
+        <param key="ffv_split_ec_ref_data" value="false"/>
+        <param key="ffv_ec_ref_channel_count" value="4"/>
+        <param key="ffv_channel_count" value="4"/>
     </config_params>
     <gain_db_to_level_mapping>
         <gain_level_map db="-59" level="5"/>
diff --git a/hal/audio_extn/ffv.c b/hal/audio_extn/ffv.c
index e86f434..2e99c40 100644
--- a/hal/audio_extn/ffv.c
+++ b/hal/audio_extn/ffv.c
@@ -59,6 +59,7 @@
 #define AUDIO_PARAMETER_FFV_EC_REF_CHANNEL_COUNT "ffv_ec_ref_channel_count"
 #define AUDIO_PARAMETER_FFV_EC_REF_DEVICE "ffv_ec_ref_dev"
 #define AUDIO_PARAMETER_FFV_CHANNEL_INDEX "ffv_channel_index"
+#define AUDIO_PARAMETER_FFV_CHANNEL_COUNT "ffv_channel_count"
 
 #if LINUX_ENABLED
 #define FFV_CONFIG_FILE_PATH "/etc/BF_1out.cfg"
@@ -158,6 +159,7 @@
     pthread_mutex_t init_lock;
     bool capture_started;
     int target_ch_idx;
+    int ch_count;
 
 #ifdef FFV_PCM_DUMP
     FILE *fp_input;
@@ -188,6 +190,7 @@
     .handle = NULL,
     .capture_started = false,
     .target_ch_idx = -1,
+    .ch_count = 6,
 };
 
 static struct pcm_config ffv_pcm_config = {
@@ -458,9 +461,9 @@
     ffvmod.capture_config = ffv_pcm_config;
     ffvmod.ec_ref_config = ffv_pcm_config;
     ffvmod.out_config = ffv_pcm_config;
-    /* configure capture session with 6/8 channels */
+    /* configure capture session with 6/8/4 channels */
     ffvmod.capture_config.channels = ffvmod.split_ec_ref_data ?
-        FFV_CHANNEL_MODE_OCT : FFV_CHANNEL_MODE_HEX;
+                   FFV_CHANNEL_MODE_OCT : ffvmod.ch_count;
     ffvmod.capture_config.period_size =
                    CALCULATE_PERIOD_SIZE(FFV_PCM_BUFFER_DURATION_MS,
                                          ffvmod.capture_config.rate,
@@ -889,6 +892,9 @@
             } else if (val == 2) {
                 ALOGD("%s: stereo ec ref", __func__);
                 ffvmod.ec_ref_ch_cnt = FFV_CHANNEL_MODE_STEREO;
+            } else if (val == 4) {
+                ALOGD("%s: quad ec ref", __func__);
+                ffvmod.ec_ref_ch_cnt = FFV_CHANNEL_MODE_QUAD;
             } else {
                 ALOGE("%s: Invalid ec ref", __func__);
             }
@@ -928,5 +934,12 @@
             ALOGD("%s: set target chan index %d", __func__, val);
             ffvmod.target_ch_idx = val;
         }
+
+        ret = str_parms_get_int(parms, AUDIO_PARAMETER_FFV_CHANNEL_COUNT, &val);
+        if (ret >= 0) {
+            str_parms_del(parms, AUDIO_PARAMETER_FFV_CHANNEL_COUNT);
+            ALOGD("%s: set ffv channel count %d", __func__, val);
+            ffvmod.ch_count = val;
+        }
     }
 }
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 49ff3db..d8deae8 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -572,6 +572,7 @@
     [SND_DEVICE_IN_INCALL_REC_RX] = "incall-rec-rx",
     [SND_DEVICE_IN_INCALL_REC_TX] = "incall-rec-tx",
     [SND_DEVICE_IN_INCALL_REC_RX_TX] = "incall-rec-rx-tx",
+    [SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD] = "ec-ref-loopback-quad",
 };
 
 // Platform specific backend bit width table
@@ -746,7 +747,8 @@
     [SND_DEVICE_IN_HANDSET_8MIC] = 4,
     [SND_DEVICE_IN_EC_REF_LOOPBACK_MONO] = 4,
     [SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO] = 4,
-    [SND_DEVICE_IN_HANDSET_GENERIC_QMIC] = 150
+    [SND_DEVICE_IN_HANDSET_GENERIC_QMIC] = 150,
+    [SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD] = 4,
 };
 
 struct name_to_index {
@@ -907,6 +909,7 @@
     {TO_NAME_INDEX(SND_DEVICE_IN_INCALL_REC_RX)},
     {TO_NAME_INDEX(SND_DEVICE_IN_INCALL_REC_TX)},
     {TO_NAME_INDEX(SND_DEVICE_IN_INCALL_REC_RX_TX)},
+    {TO_NAME_INDEX(SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD)},
 };
 
 static char * backend_tag_table[SND_DEVICE_MAX] = {0};
@@ -2964,7 +2967,8 @@
         hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
 
         if ((snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_MONO) ||
-            (snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO))
+            (snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO) ||
+            (snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD))
             audio_extn_ffv_append_ec_ref_dev_name(device_name);
     } else {
         strlcpy(device_name, "", DEVICE_NAME_MAX_SIZE);
@@ -7796,6 +7800,9 @@
         case 2:
             snd_device = SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO;
             break;
+        case 4:
+            snd_device = SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD;
+            break;
         default:
             snd_device = SND_DEVICE_NONE;
             break;
diff --git a/hal/msm8916/platform.h b/hal/msm8916/platform.h
index 6236746..f37819d 100644
--- a/hal/msm8916/platform.h
+++ b/hal/msm8916/platform.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
  * Not a Contribution.
  *
  * Copyright (C) 2013 The Android Open Source Project
@@ -244,6 +244,7 @@
     SND_DEVICE_IN_INCALL_REC_RX,
     SND_DEVICE_IN_INCALL_REC_TX,
     SND_DEVICE_IN_INCALL_REC_RX_TX,
+    SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD,
     SND_DEVICE_IN_END,
 
     SND_DEVICE_MAX = SND_DEVICE_IN_END,
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index a2f7db2..ae76923 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -568,6 +568,7 @@
     [SND_DEVICE_IN_INCALL_REC_RX] = "incall-rec-rx",
     [SND_DEVICE_IN_INCALL_REC_TX] = "incall-rec-tx",
     [SND_DEVICE_IN_INCALL_REC_RX_TX] = "incall-rec-rx-tx",
+    [SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD] = "ec-ref-loopback-quad",
 };
 
 // Platform specific backend bit width table
@@ -752,6 +753,7 @@
     [SND_DEVICE_IN_EC_REF_LOOPBACK_MONO] = 4,
     [SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO] = 4,
     [SND_DEVICE_IN_HANDSET_GENERIC_QMIC] = 150,
+    [SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD] = 4,
 };
 
 struct name_to_index {
@@ -915,6 +917,7 @@
     {TO_NAME_INDEX(SND_DEVICE_IN_INCALL_REC_RX)},
     {TO_NAME_INDEX(SND_DEVICE_IN_INCALL_REC_TX)},
     {TO_NAME_INDEX(SND_DEVICE_IN_INCALL_REC_RX_TX)},
+    {TO_NAME_INDEX(SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD)},
 };
 
 static char * backend_tag_table[SND_DEVICE_MAX] = {0};
@@ -2903,7 +2906,8 @@
         hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
 
         if ((snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_MONO) ||
-            (snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO))
+            (snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO) ||
+            (snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD))
             audio_extn_ffv_append_ec_ref_dev_name(device_name);
     } else {
         strlcpy(device_name, "", DEVICE_NAME_MAX_SIZE);
@@ -7845,6 +7849,9 @@
         case 2:
             snd_device = SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO;
             break;
+        case 4:
+            snd_device = SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD;
+            break;
         default:
             snd_device = SND_DEVICE_NONE;
             break;
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index 06b6b27..d15f6eb 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -250,6 +250,7 @@
     SND_DEVICE_IN_INCALL_REC_RX,
     SND_DEVICE_IN_INCALL_REC_TX,
     SND_DEVICE_IN_INCALL_REC_RX_TX,
+    SND_DEVICE_IN_EC_REF_LOOPBACK_QUAD,
     SND_DEVICE_IN_END,
 
     SND_DEVICE_MAX = SND_DEVICE_IN_END,