hal: Use usecase stream when audio source is Echo Ref

- Ensure that when the usecase stream's audio
  source is AUDIO_SOURCE_ECHO_REFERENCE, do not
  use the priority_in stream
- Ensures that the correct snd_device is used for
  echo ref usecases when recording concurrently
- Prevent mobile targets from having the priority
  input stream from being overwritten

Change-Id: I228fa116b6edb83fb6d7ec63504e635a41b8cdd0
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index c9dac71..e5be439 100755
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -6134,6 +6134,9 @@
                                 car_audio_stream);
 static auto_hal_get_snd_device_for_car_audio_stream_t auto_hal_get_snd_device_for_car_audio_stream;
 
+typedef bool (*auto_hal_overwrite_priority_for_auto_t)(struct stream_in*);
+static auto_hal_overwrite_priority_for_auto_t auto_hal_overwrite_priority_for_auto;
+
 int auto_hal_feature_init(bool is_feature_enabled)
 {
     ALOGD("%s: Called with feature %s", __func__,
@@ -6195,7 +6198,10 @@
                             auto_hal_lib_handle, "auto_hal_get_output_snd_device")) ||
             !(auto_hal_get_snd_device_for_car_audio_stream =
                  (auto_hal_get_snd_device_for_car_audio_stream_t)dlsym(
-                            auto_hal_lib_handle, "auto_hal_get_snd_device_for_car_audio_stream"))) {
+                            auto_hal_lib_handle, "auto_hal_get_snd_device_for_car_audio_stream")) ||
+            !(auto_hal_overwrite_priority_for_auto =
+                 (auto_hal_overwrite_priority_for_auto_t)dlsym(
+                            auto_hal_lib_handle, "auto_hal_overwrite_priority_for_auto"))) {
             ALOGE("%s: dlsym failed", __func__);
             goto feature_disabled;
         }
@@ -6226,6 +6232,7 @@
     auto_hal_get_input_snd_device = NULL;
     auto_hal_get_output_snd_device = NULL;
     auto_hal_get_snd_device_for_car_audio_stream = NULL;
+    auto_hal_overwrite_priority_for_auto = NULL;
 
     ALOGW(":: %s: ---- Feature AUTO_HAL is disabled ----", __func__);
     return -ENOSYS;
@@ -6366,6 +6373,13 @@
     return ((auto_hal_get_snd_device_for_car_audio_stream) ?
                             auto_hal_get_snd_device_for_car_audio_stream(car_audio_stream): SND_DEVICE_NONE);
 }
+
+bool audio_extn_auto_hal_overwrite_priority_for_auto(struct stream_in *in)
+{
+    return ((auto_hal_overwrite_priority_for_auto) ?
+                            auto_hal_overwrite_priority_for_auto(in): false);
+}
+
 // END: AUTO_HAL ===================================================================
 
 // START: Synth ======================================================================
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index d4c8fe6..efba4bb 100755
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -1374,6 +1374,7 @@
 int audio_extn_auto_hal_open_output_stream(struct stream_out *out);
 int audio_extn_auto_hal_open_input_stream(struct stream_in *in);
 int audio_extn_auto_hal_open_echo_reference_stream(struct stream_in *in);
+bool audio_extn_auto_hal_overwrite_priority_for_auto(struct stream_in *in);
 bool audio_extn_auto_hal_is_bus_device_usecase(audio_usecase_t uc_id);
 int audio_extn_auto_hal_get_audio_port(struct audio_hw_device *dev,
                                 struct audio_port *config);
diff --git a/hal/audio_extn/auto_hal.c b/hal/audio_extn/auto_hal.c
index f51bf49..977147c 100755
--- a/hal/audio_extn/auto_hal.c
+++ b/hal/audio_extn/auto_hal.c
@@ -486,6 +486,17 @@
     return snd_device;
 }
 
+bool auto_hal_overwrite_priority_for_auto(struct stream_in *in)
+{
+    /* Don't use the priority_in stream when the source is
+     * AUDIO_SOURCE_ECHO_REFERENCE because the platform_get_input_snd_device
+     * call (below) needs to set the snd_device based the echo ref stream and
+     * NOT based on higher priority streams (such as concurrent recording
+     * streams from the mic) */
+
+    return (in->source == AUDIO_SOURCE_ECHO_REFERENCE);
+}
+
 int auto_hal_get_audio_port(struct audio_hw_device *dev __unused,
                         struct audio_port *config __unused)
 {
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 5556c34..242bded 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2885,7 +2885,8 @@
                     /* get the input with the highest priority source*/
                     priority_in = get_priority_input(adev);
 
-                    if (!priority_in)
+                    if (!priority_in ||
+                            audio_extn_auto_hal_overwrite_priority_for_auto(usecase->stream.in))
                         priority_in = usecase->stream.in;
                 }
                 if (compare_device_type(&usecase->device_list, AUDIO_DEVICE_IN_BUS)){