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)){