Merge "hal: Add SSR/PDR handling in voice call"
diff --git a/configs/kona/kona.mk b/configs/kona/kona.mk
index b06b395..b8f3bde 100644
--- a/configs/kona/kona.mk
+++ b/configs/kona/kona.mk
@@ -43,7 +43,6 @@
DOLBY_ENABLE := false
endif
-USE_XML_AUDIO_POLICY_CONF := 1
AUDIO_FEATURE_ENABLED_DLKM := true
BOARD_SUPPORTS_SOUND_TRIGGER := true
BOARD_SUPPORTS_GCS := false
@@ -245,6 +244,8 @@
persist.audio.fluence.voicecomm=true
endif
+USE_XML_AUDIO_POLICY_CONF := 1
+
# for HIDL related packages
PRODUCT_PACKAGES += \
android.hardware.audio@2.0-service \
diff --git a/hal/Android.mk b/hal/Android.mk
index e51df5e..b52f943 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -124,7 +124,6 @@
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DLKM)),true)
LOCAL_HEADER_LIBRARIES += audio_kernel_headers
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/vendor/qcom/opensource/audio-kernel/include
- LOCAL_ADDITIONAL_DEPENDENCIES += $(BOARD_VENDOR_KERNEL_MODULES)
endif
LOCAL_CFLAGS += -DUSE_VENDOR_EXTN
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index 028a96f..e1f902e 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -1623,7 +1623,6 @@
else {
a2dp.is_tws_mono_mode_on = true;
ALOGD("Update tws for mono_mode_on: %d",a2dp.is_tws_mono_mode_on);
- audio_a2dp_update_tws_channel_mode();
}
break;
}
@@ -2213,6 +2212,7 @@
if (a2dp.a2dp_source_started) {
a2dp.a2dp_source_total_active_session_requests++;
a2dp_check_and_set_scrambler();
+ audio_a2dp_update_tws_channel_mode();
a2dp_set_backend_cfg(SOURCE);
if (a2dp.abr_config.is_abr_enabled)
start_abr();
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 0c6bee5..158370a 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -432,6 +432,8 @@
#define audio_extn_sound_trigger_check_and_get_session(in) (0)
#define audio_extn_sound_trigger_stop_lab(in) (0)
#define audio_extn_sound_trigger_read(in, buffer, bytes) (0)
+#define audio_extn_sound_trigger_check_ec_ref_enable() (0)
+#define audio_extn_sound_trigger_update_ec_ref_status(on) (0)
#else
enum st_event_type {
@@ -457,6 +459,8 @@
size_t bytes);
void audio_extn_sound_trigger_get_parameters(const struct audio_device *adev,
struct str_parms *query, struct str_parms *reply);
+bool audio_extn_sound_trigger_check_ec_ref_enable();
+void audio_extn_sound_trigger_update_ec_ref_status(bool on);
#endif
#ifndef AUXPCM_BT_ENABLED
diff --git a/hal/audio_extn/soundtrigger.c b/hal/audio_extn/soundtrigger.c
index e01b23b..e0b7193 100644
--- a/hal/audio_extn/soundtrigger.c
+++ b/hal/audio_extn/soundtrigger.c
@@ -54,7 +54,8 @@
/* Proprietary interface version used for compatibility with STHAL */
#define STHAL_PROP_API_VERSION_1_0 MAKE_HAL_VERSION(1, 0)
-#define STHAL_PROP_API_CURRENT_VERSION STHAL_PROP_API_VERSION_1_0
+#define STHAL_PROP_API_VERSION_1_1 MAKE_HAL_VERSION(1, 1)
+#define STHAL_PROP_API_CURRENT_VERSION STHAL_PROP_API_VERSION_1_1
#define ST_EVENT_CONFIG_MAX_STR_VALUE 32
#define ST_DEVICE_HANDSET_MIC 1
@@ -64,6 +65,7 @@
ST_EVENT_SESSION_DEREGISTER,
ST_EVENT_START_KEEP_ALIVE,
ST_EVENT_STOP_KEEP_ALIVE,
+ ST_EVENT_UPDATE_ECHO_REF
} sound_trigger_event_type_t;
typedef enum {
@@ -82,7 +84,8 @@
AUDIO_EVENT_CAPTURE_STREAM_INACTIVE,
AUDIO_EVENT_CAPTURE_STREAM_ACTIVE,
AUDIO_EVENT_BATTERY_STATUS_CHANGED,
- AUDIO_EVENT_GET_PARAM
+ AUDIO_EVENT_GET_PARAM,
+ AUDIO_EVENT_UPDATE_ECHO_REF
} audio_event_type_t;
typedef enum {
@@ -120,6 +123,7 @@
struct sound_trigger_event_info {
struct sound_trigger_session_info st_ses;
+ bool st_ec_ref_enabled;
};
typedef struct sound_trigger_event_info sound_trigger_event_info_t;
@@ -141,6 +145,7 @@
struct audio_read_samples_info aud_info;
char str_value[ST_EVENT_CONFIG_MAX_STR_VALUE];
struct audio_hal_usecase usecase;
+ bool audio_ec_ref_enabled;
struct sound_trigger_get_param_data st_get_param_data;
} u;
struct sound_trigger_device_info device_info;
@@ -200,6 +205,7 @@
struct listnode st_ses_list;
pthread_mutex_t lock;
unsigned int sthal_prop_api_version;
+ bool st_ec_ref_enabled;
};
static struct sound_trigger_audio_device *st_dev;
@@ -335,6 +341,15 @@
pthread_mutex_unlock(&st_dev->adev->lock);
goto done;
+ case ST_EVENT_UPDATE_ECHO_REF:
+ if (!config) {
+ ALOGE("%s: NULL config", __func__);
+ status = -EINVAL;
+ break;
+ }
+ st_dev->st_ec_ref_enabled = config->st_ec_ref_enabled;
+ break;
+
default:
ALOGW("%s: Unknown event %d", __func__, event);
break;
@@ -443,6 +458,42 @@
return false;
}
+bool audio_extn_sound_trigger_check_ec_ref_enable()
+{
+ bool ret = false;
+
+ if (!st_dev) {
+ ALOGE("%s: st_dev NULL", __func__);
+ return ret;
+ }
+
+ pthread_mutex_lock(&st_dev->lock);
+ if (st_dev->st_ec_ref_enabled) {
+ ret = true;
+ ALOGD("%s: EC Reference is enabled", __func__);
+ } else {
+ ALOGD("%s: EC Reference is disabled", __func__);
+ }
+ pthread_mutex_unlock(&st_dev->lock);
+
+ return ret;
+}
+
+void audio_extn_sound_trigger_update_ec_ref_status(bool on)
+{
+ struct audio_event_info ev_info;
+
+ if (!st_dev) {
+ ALOGE("%s: st_dev NULL", __func__);
+ return;
+ }
+
+ ev_info.u.audio_ec_ref_enabled = on;
+ st_dev->st_callback(AUDIO_EVENT_UPDATE_ECHO_REF, &ev_info);
+ ALOGD("%s: update audio echo ref status %s",__func__,
+ ev_info.u.audio_ec_ref_enabled == true ? "true" : "false");
+}
+
void audio_extn_sound_trigger_update_device_status(snd_device_t snd_device,
st_event_type_t event)
{
@@ -753,6 +804,7 @@
}
st_dev->adev = adev;
+ st_dev->st_ec_ref_enabled = false;
list_init(&st_dev->st_ses_list);
audio_extn_snd_mon_register_listener(st_dev, stdev_snd_mon_cb);
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 948c8fe..2105b9f 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -7979,14 +7979,20 @@
ALOGD("%s: enter:stream_handle(%p)",__func__, in);
- // must deregister from sndmonitor first to prevent races
- // between the callback and close_stream
+ /* must deregister from sndmonitor first to prevent races
+ * between the callback and close_stream
+ */
audio_extn_snd_mon_unregister_listener(stream);
- // Disable echo reference if there are no active input and hfp call
- // while closing input stream
- if (!adev->active_input && !audio_extn_hfp_is_active(adev))
+ /* Disable echo reference if there are no active input, hfp call
+ * and sound trigger while closing input stream
+ */
+ if (!adev->active_input &&
+ !audio_extn_hfp_is_active(adev) &&
+ !audio_extn_sound_trigger_check_ec_ref_enable())
platform_set_echo_reference(adev, false, AUDIO_DEVICE_NONE);
+ else
+ audio_extn_sound_trigger_update_ec_ref_status(false);
error_log_destroy(in->error_log);
in->error_log = NULL;
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 9eb1dc2..613d7ba 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -1473,11 +1473,13 @@
}
void platform_set_echo_reference(struct audio_device *adev, bool enable,
- audio_devices_t out_device __unused)
+ audio_devices_t out_device)
{
struct platform_data *my_data = (struct platform_data *)adev->platform;
char ec_ref_mixer_path[MIXER_PATH_MAX_LENGTH] = "echo-reference";
+ audio_extn_sound_trigger_update_ec_ref_status(enable);
+
if (strcmp(my_data->ec_ref_mixer_path, "")) {
ALOGV("%s: disabling %s", __func__, my_data->ec_ref_mixer_path);
audio_route_reset_and_update_path(adev->audio_route,
@@ -1489,9 +1491,11 @@
if (adev->mode == AUDIO_MODE_IN_COMMUNICATION)
strlcat(ec_ref_mixer_path, "-voip", MIXER_PATH_MAX_LENGTH);
}
+ strlcpy(my_data->ec_ref_mixer_path, ec_ref_mixer_path,
+ MIXER_PATH_MAX_LENGTH);
/*
* If native audio device reference count > 0, then apply codec EC otherwise
- * fallback to Speakers with VBat if enabled or default
+ * apply EC based on output device.
*/
if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_HEADPHONES_44_1] > 0)
strlcat(ec_ref_mixer_path, " headphones-44.1",
@@ -1502,12 +1506,24 @@
else if (adev->snd_dev_ref_cnt[SND_DEVICE_OUT_DISPLAY_PORT] > 0)
strlcat(ec_ref_mixer_path, " display-port",
MIXER_PATH_MAX_LENGTH);
+ else if (out_device & AUDIO_DEVICE_OUT_EARPIECE)
+ strlcat(ec_ref_mixer_path, " handset",
+ MIXER_PATH_MAX_LENGTH);
+ else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE)
+ strlcat(ec_ref_mixer_path, " headphones",
+ MIXER_PATH_MAX_LENGTH);
+ else if (out_device & AUDIO_DEVICE_OUT_USB_HEADSET)
+ strlcat(ec_ref_mixer_path, " usb-headphones",
+ MIXER_PATH_MAX_LENGTH);
- strlcpy(my_data->ec_ref_mixer_path, ec_ref_mixer_path,
- MIXER_PATH_MAX_LENGTH);
+ if (audio_route_apply_and_update_path(adev->audio_route,
+ ec_ref_mixer_path) == 0)
+ strlcpy(my_data->ec_ref_mixer_path, ec_ref_mixer_path,
+ MIXER_PATH_MAX_LENGTH);
+ else
+ audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
ALOGD("%s: enabling %s", __func__, my_data->ec_ref_mixer_path);
- audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
}
}
diff --git a/mm-audio/aenc-aac/qdsp6/Android.mk b/mm-audio/aenc-aac/qdsp6/Android.mk
index cbc832d..5aa1f40 100644
--- a/mm-audio/aenc-aac/qdsp6/Android.mk
+++ b/mm-audio/aenc-aac/qdsp6/Android.mk
@@ -52,7 +52,6 @@
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DLKM)),true)
LOCAL_HEADER_LIBRARIES := audio_kernel_headers
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/vendor/qcom/opensource/audio-kernel/include
- LOCAL_ADDITIONAL_DEPENDENCIES += $(BOARD_VENDOR_KERNEL_MODULES)
endif
include $(BUILD_SHARED_LIBRARY)
diff --git a/mm-audio/aenc-amrnb/qdsp6/Android.mk b/mm-audio/aenc-amrnb/qdsp6/Android.mk
index 4a05742..7e0007f 100644
--- a/mm-audio/aenc-amrnb/qdsp6/Android.mk
+++ b/mm-audio/aenc-amrnb/qdsp6/Android.mk
@@ -54,7 +54,6 @@
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DLKM)),true)
LOCAL_HEADER_LIBRARIES := audio_kernel_headers
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/vendor/qcom/opensource/audio-kernel/include
- LOCAL_ADDITIONAL_DEPENDENCIES += $(BOARD_VENDOR_KERNEL_MODULES)
endif
include $(BUILD_SHARED_LIBRARY)
diff --git a/mm-audio/aenc-evrc/qdsp6/Android.mk b/mm-audio/aenc-evrc/qdsp6/Android.mk
index 76ed6be..346ef81 100644
--- a/mm-audio/aenc-evrc/qdsp6/Android.mk
+++ b/mm-audio/aenc-evrc/qdsp6/Android.mk
@@ -54,7 +54,6 @@
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DLKM)),true)
LOCAL_HEADER_LIBRARIES := audio_kernel_headers
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/vendor/qcom/opensource/audio-kernel/include
- LOCAL_ADDITIONAL_DEPENDENCIES += $(BOARD_VENDOR_KERNEL_MODULES)
endif
include $(BUILD_SHARED_LIBRARY)
diff --git a/mm-audio/aenc-g711/qdsp6/Android.mk b/mm-audio/aenc-g711/qdsp6/Android.mk
index d71f121..8e4d9e7 100644
--- a/mm-audio/aenc-g711/qdsp6/Android.mk
+++ b/mm-audio/aenc-g711/qdsp6/Android.mk
@@ -55,7 +55,6 @@
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DLKM)),true)
LOCAL_HEADER_LIBRARIES := audio_kernel_headers
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/vendor/qcom/opensource/audio-kernel/include
- LOCAL_ADDITIONAL_DEPENDENCIES += $(BOARD_VENDOR_KERNEL_MODULES)
endif
diff --git a/mm-audio/aenc-qcelp13/qdsp6/Android.mk b/mm-audio/aenc-qcelp13/qdsp6/Android.mk
index 1178b2f..739ee82 100644
--- a/mm-audio/aenc-qcelp13/qdsp6/Android.mk
+++ b/mm-audio/aenc-qcelp13/qdsp6/Android.mk
@@ -54,7 +54,6 @@
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DLKM)),true)
LOCAL_HEADER_LIBRARIES := audio_kernel_headers
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/vendor/qcom/opensource/audio-kernel/include
- LOCAL_ADDITIONAL_DEPENDENCIES += $(BOARD_VENDOR_KERNEL_MODULES)
endif
diff --git a/post_proc/Android.mk b/post_proc/Android.mk
index c68a861..bffcd38 100644
--- a/post_proc/Android.mk
+++ b/post_proc/Android.mk
@@ -88,7 +88,6 @@
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DLKM)),true)
LOCAL_HEADER_LIBRARIES += audio_kernel_headers
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/vendor/qcom/opensource/audio-kernel/include
- LOCAL_ADDITIONAL_DEPENDENCIES += $(BOARD_VENDOR_KERNEL_MODULES)
endif
ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true)
@@ -199,7 +198,6 @@
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DLKM)),true)
LOCAL_HEADER_LIBRARIES += audio_kernel_headers
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/vendor/qcom/opensource/audio-kernel/include
- LOCAL_ADDITIONAL_DEPENDENCIES += $(BOARD_VENDOR_KERNEL_MODULES)
endif
ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true)