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

Commit 32f04f53 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "hal: support calibration for hfp with dual asm loopback"

parents c7f5fc63 f7092791
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -476,6 +476,10 @@ ifneq ($(filter sdm845 sdm710 sdmshrike msmnile kona lito bengal atoll sdm660 ms
  MULTIPLE_HW_VARIANTS_ENABLED := true
endif

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

LOCAL_SRC_FILES:= \
        hfp.c

+38 −1
Original line number Diff line number Diff line
@@ -4511,6 +4511,10 @@ int hfp_feature_init(bool is_feature_enabled)
        init_config.fp_disable_audio_route = disable_audio_route;
        init_config.fp_disable_snd_device = disable_snd_device;
        init_config.fp_voice_get_mic_mute = voice_get_mic_mute;
        init_config.fp_audio_extn_auto_hal_start_hfp_downlink =
                                        audio_extn_auto_hal_start_hfp_downlink;
        init_config.fp_audio_extn_auto_hal_stop_hfp_downlink =
                                        audio_extn_auto_hal_stop_hfp_downlink;

        hfp_init(init_config);
        ALOGD("%s:: ---- Feature HFP is Enabled ----", __func__);
@@ -5479,6 +5483,14 @@ typedef void (*auto_hal_set_parameters_t)(struct audio_device*,
                                struct str_parms*);
static auto_hal_set_parameters_t auto_hal_set_parameters;

typedef int (*auto_hal_start_hfp_downlink_t)(struct audio_device*,
                                struct audio_usecase*);
static auto_hal_start_hfp_downlink_t auto_hal_start_hfp_downlink;

typedef int (*auto_hal_stop_hfp_downlink_t)(struct audio_device*,
                                struct audio_usecase*);
static auto_hal_stop_hfp_downlink_t auto_hal_stop_hfp_downlink;

int auto_hal_feature_init(bool is_feature_enabled)
{
    ALOGD("%s: Called with feature %s", __func__,
@@ -5522,7 +5534,13 @@ int auto_hal_feature_init(bool is_feature_enabled)
                            auto_hal_lib_handle, "auto_hal_set_audio_port_config")) ||
            !(auto_hal_set_parameters =
                 (auto_hal_set_parameters_t)dlsym(
                            auto_hal_lib_handle, "auto_hal_set_parameters"))) {
                            auto_hal_lib_handle, "auto_hal_set_parameters")) ||
            !(auto_hal_start_hfp_downlink =
                 (auto_hal_start_hfp_downlink_t)dlsym(
                            auto_hal_lib_handle, "auto_hal_start_hfp_downlink")) ||
            !(auto_hal_stop_hfp_downlink =
                 (auto_hal_stop_hfp_downlink_t)dlsym(
                            auto_hal_lib_handle, "auto_hal_stop_hfp_downlink"))) {
            ALOGE("%s: dlsym failed", __func__);
            goto feature_disabled;
        }
@@ -5547,6 +5565,8 @@ feature_disabled:
    auto_hal_get_audio_port = NULL;
    auto_hal_set_audio_port_config = NULL;
    auto_hal_set_parameters = NULL;
    auto_hal_start_hfp_downlink = NULL;
    auto_hal_stop_hfp_downlink = NULL;

    ALOGW(":: %s: ---- Feature AUTO_HAL is disabled ----", __func__);
    return -ENOSYS;
@@ -5563,6 +5583,9 @@ int audio_extn_auto_hal_init(struct audio_device *adev)
        auto_hal_init_config.fp_get_usecase_from_list = get_usecase_from_list;
        auto_hal_init_config.fp_get_output_period_size = get_output_period_size;
        auto_hal_init_config.fp_audio_extn_ext_hw_plugin_set_audio_gain = audio_extn_ext_hw_plugin_set_audio_gain;
        auto_hal_init_config.fp_select_devices = select_devices;
        auto_hal_init_config.fp_disable_audio_route = disable_audio_route;
        auto_hal_init_config.fp_disable_snd_device = disable_snd_device;
        return auto_hal_init(adev, auto_hal_init_config);
    }
    else
@@ -5642,6 +5665,20 @@ void audio_extn_auto_hal_set_parameters(struct audio_device *adev,
    if (auto_hal_set_parameters)
        auto_hal_set_parameters(adev, parms);
}

int audio_extn_auto_hal_start_hfp_downlink(struct audio_device *adev,
                                struct audio_usecase *uc_info)
{
    return ((auto_hal_start_hfp_downlink) ?
                            auto_hal_start_hfp_downlink(adev, uc_info): 0);
}

int audio_extn_auto_hal_stop_hfp_downlink(struct audio_device *adev,
                                struct audio_usecase *uc_info)
{
    return ((auto_hal_stop_hfp_downlink) ?
                            auto_hal_stop_hfp_downlink(adev, uc_info): 0);
}
// END: AUTO_HAL ===================================================================

void audio_extn_feature_init()
+13 −0
Original line number Diff line number Diff line
@@ -682,6 +682,10 @@ typedef int (*fp_disable_audio_route_t)(struct audio_device *,
                                                struct audio_usecase *);
typedef int (*fp_disable_snd_device_t)(struct audio_device *, snd_device_t);
typedef bool (*fp_voice_get_mic_mute_t)(struct audio_device *);
typedef int (*fp_audio_extn_auto_hal_start_hfp_downlink_t)(struct audio_device *,
                                                        struct audio_usecase *);
typedef int (*fp_audio_extn_auto_hal_stop_hfp_downlink_t)(struct audio_device *,
                                                        struct audio_usecase *);

typedef struct hfp_init_config {
    fp_platform_set_mic_mute_t                   fp_platform_set_mic_mute;
@@ -694,6 +698,8 @@ typedef struct hfp_init_config {
    fp_disable_audio_route_t                     fp_disable_audio_route;
    fp_disable_snd_device_t                      fp_disable_snd_device;
    fp_voice_get_mic_mute_t                      fp_voice_get_mic_mute;
    fp_audio_extn_auto_hal_start_hfp_downlink_t  fp_audio_extn_auto_hal_start_hfp_downlink;
    fp_audio_extn_auto_hal_stop_hfp_downlink_t   fp_audio_extn_auto_hal_stop_hfp_downlink;
} hfp_init_config_t;


@@ -1316,6 +1322,10 @@ int audio_extn_auto_hal_set_audio_port_config(struct audio_hw_device *dev,
                                const struct audio_port_config *config);
void audio_extn_auto_hal_set_parameters(struct audio_device *adev,
                                struct str_parms *parms);
int audio_extn_auto_hal_start_hfp_downlink(struct audio_device *adev,
                                struct audio_usecase *uc_info);
int audio_extn_auto_hal_stop_hfp_downlink(struct audio_device *adev,
                                struct audio_usecase *uc_info);

typedef streams_input_ctxt_t* (*fp_in_get_stream_t)(struct audio_device*, audio_io_handle_t);
typedef streams_output_ctxt_t* (*fp_out_get_stream_t)(struct audio_device*, audio_io_handle_t);
@@ -1330,6 +1340,9 @@ typedef struct auto_hal_init_config {
    fp_get_usecase_from_list_t                   fp_get_usecase_from_list;
    fp_get_output_period_size_t                  fp_get_output_period_size;
    fp_audio_extn_ext_hw_plugin_set_audio_gain_t fp_audio_extn_ext_hw_plugin_set_audio_gain;
    fp_select_devices_t                          fp_select_devices;
    fp_disable_audio_route_t                     fp_disable_audio_route;
    fp_disable_snd_device_t                      fp_disable_snd_device;
} auto_hal_init_config_t;
// END: AUTO_HAL FEATURE ==================================================

+99 −0
Original line number Diff line number Diff line
@@ -54,12 +54,17 @@ static fp_audio_extn_ext_hw_plugin_usecase_stop_t fp_audio_extn_ext_hw_plugin_
static fp_get_usecase_from_list_t                   fp_get_usecase_from_list;
static fp_get_output_period_size_t                  fp_get_output_period_size;
static fp_audio_extn_ext_hw_plugin_set_audio_gain_t fp_audio_extn_ext_hw_plugin_set_audio_gain;
static fp_select_devices_t                          fp_select_devices;
static fp_disable_audio_route_t                     fp_disable_audio_route;
static fp_disable_snd_device_t                      fp_disable_snd_device;

/* Auto hal module struct */
static struct auto_hal_module *auto_hal = NULL;

int auto_hal_release_audio_patch(struct audio_hw_device *dev,
                                audio_patch_handle_t handle);
int auto_hal_stop_hfp_downlink(struct audio_device *adev,
                               struct audio_usecase *uc_info);

static struct audio_patch_record *get_patch_from_list(struct audio_device *adev,
                                                    audio_patch_handle_t patch_id)
@@ -687,6 +692,97 @@ void auto_hal_set_parameters(struct audio_device *adev __unused,
    ALOGV("%s: exit", __func__);
}

int auto_hal_start_hfp_downlink(struct audio_device *adev,
                                struct audio_usecase *uc_info)
{
    int32_t ret = 0;
    struct audio_usecase *uc_downlink_info;

    ALOGD("%s: enter", __func__);

    uc_downlink_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));

    if (!uc_downlink_info)
        return -ENOMEM;

    uc_downlink_info->type = PCM_HFP_CALL;
    uc_downlink_info->stream.out = adev->primary_output;
    uc_downlink_info->devices = adev->primary_output->devices;
    uc_downlink_info->in_snd_device = SND_DEVICE_NONE;
    uc_downlink_info->out_snd_device = SND_DEVICE_NONE;

    switch (uc_info->id) {
    case USECASE_AUDIO_HFP_SCO:
        uc_downlink_info->id = USECASE_AUDIO_HFP_SCO_DOWNLINK;
        break;
    case USECASE_AUDIO_HFP_SCO_WB:
        uc_downlink_info->id = USECASE_AUDIO_HFP_SCO_WB_DOWNLINK;
        break;
    default:
        ALOGE("%s: Invalid usecase %d", __func__, uc_info->id);
        free(uc_downlink_info);
        return -EINVAL;
    }

    list_add_tail(&adev->usecase_list, &uc_downlink_info->list);

    ret = fp_select_devices(adev, uc_downlink_info->id);
    if (ret) {
        ALOGE("%s: Select devices failed %d", __func__, ret);
        goto exit;
    }

    ALOGD("%s: exit: status(%d)", __func__, ret);
    return 0;

exit:
    auto_hal_stop_hfp_downlink(adev, uc_info);
    ALOGE("%s: Problem in start hfp downlink: status(%d)", __func__, ret);
    return ret;
}

int auto_hal_stop_hfp_downlink(struct audio_device *adev,
                               struct audio_usecase *uc_info)
{
    int32_t ret = 0;
    struct audio_usecase *uc_downlink_info;
    audio_usecase_t ucid;

    ALOGD("%s: enter", __func__);

    switch (uc_info->id) {
    case USECASE_AUDIO_HFP_SCO:
        ucid = USECASE_AUDIO_HFP_SCO_DOWNLINK;
        break;
    case USECASE_AUDIO_HFP_SCO_WB:
        ucid = USECASE_AUDIO_HFP_SCO_WB_DOWNLINK;
        break;
    default:
        ALOGE("%s: Invalid usecase %d", __func__, uc_info->id);
        return -EINVAL;
    }

    uc_downlink_info = fp_get_usecase_from_list(adev, ucid);
    if (uc_downlink_info == NULL) {
        ALOGE("%s: Could not find the usecase (%d) in the list",
              __func__, ucid);
        return -EINVAL;
    }

    /* Get and set stream specific mixer controls */
    fp_disable_audio_route(adev, uc_downlink_info);

    /* Disable the rx and tx devices */
    fp_disable_snd_device(adev, uc_downlink_info->out_snd_device);
    fp_disable_snd_device(adev, uc_downlink_info->in_snd_device);

    list_remove(&uc_downlink_info->list);
    free(uc_downlink_info);

    ALOGD("%s: exit: status(%d)", __func__, ret);
    return ret;
}

int auto_hal_init(struct audio_device *adev, auto_hal_init_config_t init_config)
{
    int ret = 0;
@@ -714,6 +810,9 @@ int auto_hal_init(struct audio_device *adev, auto_hal_init_config_t init_config)
    fp_get_usecase_from_list = init_config.fp_get_usecase_from_list;
    fp_get_output_period_size = init_config.fp_get_output_period_size;
    fp_audio_extn_ext_hw_plugin_set_audio_gain = init_config.fp_audio_extn_ext_hw_plugin_set_audio_gain;
    fp_select_devices = init_config.fp_select_devices;
    fp_disable_audio_route = init_config.fp_disable_audio_route;
    fp_disable_snd_device = init_config.fp_disable_snd_device;

    return ret;
}
+2 −0
Original line number Diff line number Diff line
@@ -182,6 +182,8 @@ static int32_t ext_hw_plugin_check_plugin_usecase(audio_usecase_t hal_usecase,
        break;
    case USECASE_AUDIO_HFP_SCO:
    case USECASE_AUDIO_HFP_SCO_WB:
    case USECASE_AUDIO_HFP_SCO_DOWNLINK:
    case USECASE_AUDIO_HFP_SCO_WB_DOWNLINK:
        *plugin_usecase = AUDIO_HAL_PLUGIN_USECASE_HFP_VOICE_CALL;
        break;
    case USECASE_VOICE_CALL:
Loading