Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a30a5f4e authored by Derek Chen's avatar Derek Chen Committed by Susan Wang
Browse files

hal: Add support for In-Car Communication usecase



* Add ICC library functionality in icc.c
* Add support in audio_extn to open and initialize icc library
* Add platform changes for device selection in ICC usecase
* Add support for sending ICC audio calibration/app type cfg

Suggested-by: default avatarTahir Dawson <dawson@qti.qualcomm.com>
Change-Id: I26937da282fcdd31d59a54b180dca5d7740fbfb0
parent 4e47521a
Loading
Loading
Loading
Loading
+68 −0
Original line number Diff line number Diff line
@@ -604,6 +604,74 @@ LOCAL_SANITIZE := integer_overflow
endif
include $(BUILD_SHARED_LIBRARY)

#-------------------------------------------
#            Build ICC LIB
#-------------------------------------------
include $(CLEAR_VARS)

LOCAL_MODULE := libicc
LOCAL_VENDOR_MODULE := true

PRIMARY_HAL_PATH := vendor/qcom/opensource/audio-hal/primary-hal/hal
AUDIO_PLATFORM := $(TARGET_BOARD_PLATFORM)

ifneq ($(filter sdm845 sdm710 sdmshrike msmnile kona lito bengal atoll sdm660 msm8937 msm8998 $(MSMSTEPPE) $(TRINKET),$(TARGET_BOARD_PLATFORM)),)
  # B-family platform uses msm8974 code base
  AUDIO_PLATFORM := msm8974
  MULTIPLE_HW_VARIANTS_ENABLED := true
endif

ifeq ($(TARGET_BOARD_AUTO),true)
  LOCAL_CFLAGS += -DPLATFORM_AUTO
endif

LOCAL_SRC_FILES:= \
        icc.c \
        device_utils.c

LOCAL_CFLAGS += \
    -Wall \
    -Werror \
    -Wno-unused-function \
    -Wno-unused-variable

LOCAL_SHARED_LIBRARIES := \
    libaudioroute \
    libaudioutils \
    libcutils \
    libdl \
    libexpat \
    liblog \
    libtinyalsa \
    libtinycompress

LOCAL_C_INCLUDES := \
    $(PRIMARY_HAL_PATH) \
    $(PRIMARY_HAL_PATH)/$(AUDIO_PLATFORM) \
    external/tinyalsa/include \
    external/tinycompress/include \
    external/expat/lib \
    system/media/audio_utils/include \
    $(call include-path-for, audio-route) \

LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include/audio
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/techpack/audio/include
LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr

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_HEADER_LIBRARIES += libhardware_headers
LOCAL_HEADER_LIBRARIES += libsystem_headers
ifneq ($(filter kona,$(TARGET_BOARD_PLATFORM)),)
LOCAL_SANITIZE := integer_overflow
endif
include $(BUILD_SHARED_LIBRARY)

#-------------------------------------------
#            Build HDMI PASSTHROUGH
#-------------------------------------------
+105 −0
Original line number Diff line number Diff line
@@ -4989,6 +4989,107 @@ int audio_extn_hfp_set_mic_mute2(struct audio_device *adev, bool state)
}
// END: HFP ========================================================================

// START: ICC ======================================================================
#ifdef __LP64__
#define ICC_LIB_PATH "/vendor/lib64/libicc.so"
#else
#define ICC_LIB_PATH "/vendor/lib/libicc.so"
#endif

static void *icc_lib_handle = NULL;

typedef void (*icc_init_t)(icc_init_config_t);
static icc_init_t icc_init;

typedef bool (*icc_is_active_t)(struct audio_device *adev);
static icc_is_active_t icc_is_active;

typedef audio_usecase_t (*icc_get_usecase_t)();
static icc_get_usecase_t icc_get_usecase;

typedef void (*icc_set_parameters_t)(struct audio_device *adev,
                                           struct str_parms *parms);
static icc_set_parameters_t icc_set_parameters;

int icc_feature_init(bool is_feature_enabled)
{
    ALOGD("%s: Called with feature %s", __func__,
                  is_feature_enabled ? "Enabled" : "NOT Enabled");
    if (is_feature_enabled) {
        // dlopen lib
        icc_lib_handle = dlopen(ICC_LIB_PATH, RTLD_NOW);

        if (!icc_lib_handle) {
            ALOGE("%s: dlopen failed", __func__);
            goto feature_disabled;
        }
        if (!(icc_init = (icc_init_t)dlsym(
                            icc_lib_handle, "icc_init")) ||
            !(icc_is_active =
                 (icc_is_active_t)dlsym(
                            icc_lib_handle, "icc_is_active")) ||
            !(icc_get_usecase =
                 (icc_get_usecase_t)dlsym(
                            icc_lib_handle, "icc_get_usecase")) ||
            !(icc_set_parameters =
                 (icc_set_parameters_t)dlsym(
                            icc_lib_handle, "icc_set_parameters"))) {
            ALOGE("%s: dlsym failed", __func__);
            goto feature_disabled;
        }
        icc_init_config_t init_config;
        init_config.fp_platform_get_pcm_device_id = platform_get_pcm_device_id;
        init_config.fp_platform_set_echo_reference = platform_set_echo_reference;
        init_config.fp_select_devices = select_devices;
        init_config.fp_audio_extn_ext_hw_plugin_usecase_start =
                                        audio_extn_ext_hw_plugin_usecase_start;
        init_config.fp_audio_extn_ext_hw_plugin_usecase_stop =
                                        audio_extn_ext_hw_plugin_usecase_stop;
        init_config.fp_get_usecase_from_list = get_usecase_from_list;
        init_config.fp_disable_audio_route = disable_audio_route;
        init_config.fp_disable_snd_device = disable_snd_device;

        icc_init(init_config);
        ALOGD("%s:: ---- Feature ICC is Enabled ----", __func__);
        return 0;
    }

feature_disabled:
    if (icc_lib_handle) {
        dlclose(icc_lib_handle);
        icc_lib_handle = NULL;
    }

    icc_init = NULL;
    icc_is_active = NULL;
    icc_get_usecase = NULL;
    icc_set_parameters = NULL;

    ALOGW(":: %s: ---- Feature ICC is disabled ----", __func__);
    return -ENOSYS;
}

bool audio_extn_icc_is_active(struct audio_device *adev)
{
    return ((icc_is_active) ?
                    icc_is_active(adev): false);
}

audio_usecase_t audio_extn_icc_get_usecase()
{
    return ((icc_get_usecase) ?
                    icc_get_usecase(): -1);
}

void audio_extn_icc_set_parameters(struct audio_device *adev,
                                           struct str_parms *parms)
{
    ((icc_set_parameters) ?
                    icc_set_parameters(adev, parms): NULL);
}

// END: ICC ========================================================================

// START: EXT_HW_PLUGIN ===================================================================
#ifdef __LP64__
#define EXT_HW_PLUGIN_LIB_PATH "/vendor/lib64/libexthwplugin.so"
@@ -6313,6 +6414,9 @@ void audio_extn_feature_init()
    hfp_feature_init(
        property_get_bool("vendor.audio.feature.hfp.enable",
                           false));
    icc_feature_init(
        property_get_bool("vendor.audio.feature.icc.enable",
                           false));
    ext_hw_plugin_feature_init(
        property_get_bool("vendor.audio.feature.ext_hw_plugin.enable",
                           false));
@@ -6372,6 +6476,7 @@ void audio_extn_set_parameters(struct audio_device *adev,
   audio_extn_set_aptx_dec_bt_addr(adev, parms);
   audio_extn_ffv_set_parameters(adev, parms);
   audio_extn_ext_hw_plugin_set_parameters(adev->ext_hw_plugin, parms);
   audio_extn_icc_set_parameters(adev, parms);
}

void audio_extn_get_parameters(const struct audio_device *adev,
+19 −0
Original line number Diff line number Diff line
@@ -722,6 +722,25 @@ typedef struct hfp_init_config {

// END: HFP FEATURE ==================================================

// START: ICC FEATURE ====================================================
bool audio_extn_icc_is_active(struct audio_device *adev);
audio_usecase_t audio_extn_icc_get_usecase();
void audio_extn_icc_set_parameters(struct audio_device *adev,
                                          struct str_parms *parms);

typedef struct icc_init_config {
    fp_platform_get_pcm_device_id_t              fp_platform_get_pcm_device_id;
    fp_platform_set_echo_reference_t             fp_platform_set_echo_reference;
    fp_select_devices_t                          fp_select_devices;
    fp_audio_extn_ext_hw_plugin_usecase_start_t  fp_audio_extn_ext_hw_plugin_usecase_start;
    fp_audio_extn_ext_hw_plugin_usecase_stop_t   fp_audio_extn_ext_hw_plugin_usecase_stop;
    fp_get_usecase_from_list_t                   fp_get_usecase_from_list;
    fp_disable_audio_route_t                     fp_disable_audio_route;
    fp_disable_snd_device_t                      fp_disable_snd_device;
} icc_init_config_t;

//END: ICC FEAUTRE =======================================================

// START: EXT_HW_PLUGIN FEATURE ==================================================
void* audio_extn_ext_hw_plugin_init(struct audio_device *adev);
int audio_extn_ext_hw_plugin_deinit(void *plugin);
+6 −0
Original line number Diff line number Diff line
@@ -734,6 +734,9 @@ snd_device_t auto_hal_get_input_snd_device(struct audio_device *adev,
        case USECASE_VOICE_CALL:
            snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
            break;
        case USECASE_ICC_CALL:
            snd_device = SND_DEVICE_IN_ICC;
            break;
        default:
            ALOGE("%s: Usecase (%d) not supported", __func__, uc_id);
            return -EINVAL;
@@ -826,6 +829,9 @@ snd_device_t auto_hal_get_output_snd_device(struct audio_device *adev,
        case USECASE_AUDIO_PLAYBACK_REAR_SEAT:
            snd_device = SND_DEVICE_OUT_BUS_RSE;
            break;
        case USECASE_ICC_CALL:
            snd_device = SND_DEVICE_OUT_ICC;
            break;
        default:
            ALOGE("%s: Usecase (%d) not supported", __func__, uc_id);
            return -EINVAL;
+8 −6
Original line number Diff line number Diff line
@@ -199,6 +199,8 @@ static int32_t ext_hw_plugin_check_plugin_usecase(audio_usecase_t hal_usecase,
    case USECASE_AUDIO_FM_TUNER_EXT:
       *plugin_usecase = AUDIO_HAL_PLUGIN_USECASE_FM_TUNER;
        break;
    case USECASE_ICC_CALL:
        *plugin_usecase = AUDIO_HAL_PLUGIN_USECASE_ICC;
    default:
        ret = -EINVAL;
    }
@@ -242,7 +244,7 @@ int32_t ext_hw_plugin_usecase_start(void *plugin, struct audio_usecase *usecase)

        if (((usecase->type == PCM_CAPTURE) || (usecase->type == VOICE_CALL) ||
              (usecase->type == VOIP_CALL) || (usecase->type == PCM_HFP_CALL) ||
              (usecase->type == PCM_PASSTHROUGH)) &&
              (usecase->type == ICC_CALL) || (usecase->type == PCM_PASSTHROUGH)) &&
            (usecase->in_snd_device != SND_DEVICE_NONE)) {
            codec_enable.snd_dev = usecase->in_snd_device;
            /* TODO - below should be related with in_snd_dev */
@@ -316,8 +318,8 @@ int32_t ext_hw_plugin_usecase_start(void *plugin, struct audio_usecase *usecase)
        }

        if (((usecase->type == PCM_PLAYBACK) || (usecase->type == VOICE_CALL) ||
                (usecase->type == VOIP_CALL) || (usecase->type == PCM_HFP_CALL)) &&
            (usecase->out_snd_device != SND_DEVICE_NONE)) {
                (usecase->type == VOIP_CALL) || (usecase->type == PCM_HFP_CALL) ||
                (usecase->type == ICC_CALL)) && (usecase->out_snd_device != SND_DEVICE_NONE)) {
            codec_enable.snd_dev = usecase->out_snd_device;
            /* TODO - below should be related with out_snd_dev */
            codec_enable.sample_rate = 48000;
@@ -384,8 +386,8 @@ int32_t ext_hw_plugin_usecase_stop(void *plugin, struct audio_usecase *usecase)
        }

        if (((usecase->type == PCM_PLAYBACK) || (usecase->type == VOICE_CALL) ||
                (usecase->type == VOIP_CALL) || (usecase->type == PCM_HFP_CALL)) &&
            (usecase->out_snd_device != SND_DEVICE_NONE)) {
                (usecase->type == VOIP_CALL) || (usecase->type == PCM_HFP_CALL) ||
                (usecase->type == ICC_CALL)) && (usecase->out_snd_device != SND_DEVICE_NONE)) {
            codec_disable.snd_dev = usecase->out_snd_device;

            ALOGD("%s: disable audio hal plugin output, %d, %d",
@@ -401,7 +403,7 @@ int32_t ext_hw_plugin_usecase_stop(void *plugin, struct audio_usecase *usecase)
        }
        if (((usecase->type == PCM_CAPTURE) || (usecase->type == VOICE_CALL) ||
             (usecase->type == VOIP_CALL) || (usecase->type == PCM_HFP_CALL) ||
             (usecase->type == PCM_PASSTHROUGH)) &&
             (usecase->type == PCM_PASSTHROUGH) || (usecase->type == ICC_CALL)) &&
            (usecase->in_snd_device != SND_DEVICE_NONE)) {
            codec_disable.snd_dev = usecase->in_snd_device;

Loading