hal: Add support for 3-mic surround sound recording

Add support for stereo surround sound recording using 3 mics.

Change-Id: I741dd5507d72ac45dff8006d3875abe8dbdc2df2
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index a0f9206..5500ee3 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1057,6 +1057,10 @@
     /* 2. Disable the tx device */
     disable_snd_device(adev, uc_info->in_snd_device);
 
+    if (audio_extn_ssr_get_stream() == in) {
+        audio_extn_ssr_deinit();
+    }
+
     list_remove(&uc_info->list);
     free(uc_info);
 
@@ -2781,8 +2785,7 @@
         adev->adm_request_focus(adev->adm_data, in->capture_handle);
 
     if (in->pcm) {
-        if (audio_extn_ssr_get_enabled() &&
-                audio_channel_count_from_in_mask(in->channel_mask) == 6)
+        if (audio_extn_ssr_get_stream() == in)
             ret = audio_extn_ssr_read(stream, buffer, bytes);
         else if (audio_extn_compr_cap_usecase_supported(in->usecase))
             ret = audio_extn_compr_cap_read(in, buffer, bytes);
@@ -3650,15 +3653,27 @@
         in->config = pcm_config_afe_proxy_record;
         in->config.channels = channel_count;
         in->config.rate = config->sample_rate;
-    } else if (channel_count == 6) {
-        if(audio_extn_ssr_get_enabled()) {
-            if(audio_extn_ssr_init(in)) {
-                ALOGE("%s: audio_extn_ssr_init failed", __func__);
+    } else if (audio_extn_ssr_get_enabled() &&
+               ((channel_count == 2) || (channel_count == 6)) &&
+               ((AUDIO_SOURCE_MIC == source) || (AUDIO_SOURCE_CAMCORDER == source))) {
+        ALOGD("%s: Found SSR use case starting SSR lib with channel_count :%d",
+               __func__, channel_count);
+        if (audio_extn_ssr_init(in, channel_count)) {
+            ALOGE("%s: audio_extn_ssr_init failed", __func__);
+            if (channel_count == 2) {
+                ALOGD("%s: falling back to default record usecase", __func__);
+                in->config.channels = channel_count;
+                frame_size = audio_stream_in_frame_size(&in->stream);
+                buffer_size = get_input_buffer_size(config->sample_rate,
+                                        config->format,
+                                        channel_count,
+                                        is_low_latency);
+                in->config.period_size = buffer_size / frame_size;
+            } else {
+                ALOGD("%s: unable to start SSR record session for 6 channel input", __func__);
                 ret = -EINVAL;
                 goto err_open;
             }
-        } else {
-            ALOGW("%s: surround sound recording is not supported", __func__);
         }
     } else if (audio_extn_compr_cap_enabled() &&
             audio_extn_compr_cap_format_supported(config->format) &&
@@ -3717,8 +3732,7 @@
     } else
         in_standby(&stream->common);
 
-    if (audio_extn_ssr_get_enabled() &&
-            (audio_channel_count_from_in_mask(in->channel_mask) == 6)) {
+    if (audio_extn_ssr_get_stream() == in) {
         audio_extn_ssr_deinit();
     }