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

Commit 3e94c911 authored by Chaithanya Krishna Bacharaju's avatar Chaithanya Krishna Bacharaju Committed by Gerrit - the friendly Code Review server
Browse files

hal: Add support to use compress path for ec ref loopback

Add support to use compress path for mic and ec reference data
capture in single stream.
Modify parsing logic of custom mtmx param tags to reflect changes
in platform xml.

Change-Id: Iebbd56de6ab95f35c695205cdd14bf928321eead
parent 11081b3d
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -474,7 +474,7 @@ void audio_extn_set_custom_mtmx_params_v2(struct audio_device *adev,
    int num_devices = 0, pcm_device_id = -1, i = 0, ret = 0;
    snd_device_t new_snd_devices[SND_DEVICE_OUT_END] = {0};
    struct audio_backend_cfg backend_cfg = {0};
    uint32_t feature_id = 0;
    uint32_t feature_id = 0, idx = 0;

    switch(usecase->type) {
    case PCM_PLAYBACK:
@@ -519,7 +519,7 @@ void audio_extn_set_custom_mtmx_params_v2(struct audio_device *adev,
     * if features like dual_mono is enabled and overrides the default(i.e. 0).
     */
    info.id = feature_id;
    info.usecase_id = usecase->id;
    info.usecase_id[0] = usecase->id;
    for (i = 0, ret = 0; i < num_devices; i++) {
        info.snd_device = new_snd_devices[i];
        platform_get_codec_backend_cfg(adev, info.snd_device, &backend_cfg);
@@ -532,7 +532,7 @@ void audio_extn_set_custom_mtmx_params_v2(struct audio_device *adev,
            info.op_channels = audio_channel_count_from_in_mask(
                                   usecase->stream.in->channel_mask);
        }
        params = platform_get_custom_mtmx_params(adev->platform, &info);
        params = platform_get_custom_mtmx_params(adev->platform, &info, &idx);
        if (params) {
            if (enable)
                ret = update_custom_mtmx_coefficients_v2(adev, params,
@@ -677,7 +677,8 @@ static int update_custom_mtmx_coefficients_v1(struct audio_device *adev,
                                           struct audio_custom_mtmx_in_params *in_params,
                                           int pcm_device_id,
                                           usecase_type_t type,
                                           bool enable)
                                           bool enable,
                                           uint32_t idx)
{
    struct mixer_ctl *ctl = NULL;
    char mixer_ctl_name[128] = {0};
@@ -691,13 +692,13 @@ static int update_custom_mtmx_coefficients_v1(struct audio_device *adev,
          __func__, pinfo->ip_channels, pinfo->op_channels, pcm_device_id,
          type, enable);

    if (!strcmp(pinfo->fe_name, "")) {
    if (pinfo->fe_id[idx] == 0) {
        ALOGE("%s: Error. no front end defined", __func__);
        return -EINVAL;
    }

    strlcpy(mixer_name_prefix, pinfo->fe_name, sizeof(mixer_name_prefix));

    snprintf(mixer_name_prefix, sizeof(mixer_name_prefix), "%s%d",
             "MultiMedia", pinfo->fe_id[idx]);
    /*
     * Enable/Disable channel mixer.
     * If enable, use params and in_params to configure mixer.
@@ -839,7 +840,7 @@ void audio_extn_set_custom_mtmx_params_v1(struct audio_device *adev,
    struct audio_custom_mtmx_in_params_info in_info = {0};
    struct audio_custom_mtmx_in_params *in_params = NULL;
    int pcm_device_id = -1, ret = 0;
    uint32_t feature_id = 0;
    uint32_t feature_id = 0, idx = 0;

    switch(usecase->type) {
    case PCM_CAPTURE:
@@ -861,26 +862,26 @@ void audio_extn_set_custom_mtmx_params_v1(struct audio_device *adev,

    ALOGD("%s: snd device %d", __func__, info.snd_device);
    info.id = feature_id;
    info.usecase_id = usecase->id;
    info.usecase_id[0] = usecase->id;
    info.op_channels = audio_channel_count_from_in_mask(
                                usecase->stream.in->channel_mask);

    in_info.usecase_id = info.usecase_id;
    in_info.usecase_id[0] = info.usecase_id[0];
    in_info.op_channels = info.op_channels;
    in_params = platform_get_custom_mtmx_in_params(adev->platform, &in_info);
    if (!in_params) {
        ALOGE("%s: Could not get in params for usecase %d, channels %d",
               __func__, in_info.usecase_id, in_info.op_channels);
               __func__, in_info.usecase_id[0], in_info.op_channels);
        return;
    }

    info.ip_channels = in_params->ip_channels;
    ALOGD("%s: ip channels %d, op channels %d", __func__, info.ip_channels, info.op_channels);

    params = platform_get_custom_mtmx_params(adev->platform, &info);
    params = platform_get_custom_mtmx_params(adev->platform, &info, &idx);
    if (params) {
        ret = update_custom_mtmx_coefficients_v1(adev, params, in_params,
                             pcm_device_id, usecase->type, enable);
                             pcm_device_id, usecase->type, enable, idx);
        if (ret < 0)
            ALOGE("%s: error updating mtmx coeffs err:%d", __func__, ret);
    }
@@ -899,12 +900,12 @@ snd_device_t audio_extn_get_loopback_snd_device(struct audio_device *adev,
        return snd_device;
    }

    in_info.usecase_id = usecase->id;
    in_info.usecase_id[0] = usecase->id;
    in_info.op_channels = channel_count;
    in_params = platform_get_custom_mtmx_in_params(adev->platform, &in_info);
    if (!in_params) {
        ALOGE("%s: Could not get in params for usecase %d, channels %d",
               __func__, in_info.usecase_id, in_info.op_channels);
               __func__, in_info.usecase_id[0], in_info.op_channels);
        return snd_device;
    }

+32 −9
Original line number Diff line number Diff line
@@ -2778,11 +2778,18 @@ acdb_init_fail:

struct audio_custom_mtmx_params *
    platform_get_custom_mtmx_params(void *platform,
                                    struct audio_custom_mtmx_params_info *info)
                                    struct audio_custom_mtmx_params_info *info,
                                    uint32_t *idx)
{
    struct platform_data *my_data = (struct platform_data *)platform;
    struct listnode *node = NULL;
    struct audio_custom_mtmx_params *params = NULL;
    int i = 0;

    if (!info || !idx) {
        ALOGE("%s: Invalid params", __func__);
        return NULL;
    }

    list_for_each(node, &my_data->custom_mtmx_params_list) {
        params = node_to_item(node, struct audio_custom_mtmx_params, list);
@@ -2790,17 +2797,22 @@ struct audio_custom_mtmx_params *
            params->info.id == info->id &&
            params->info.ip_channels == info->ip_channels &&
            params->info.op_channels == info->op_channels &&
            params->info.usecase_id == info->usecase_id &&
            params->info.snd_device == info->snd_device) {
            while (params->info.usecase_id[i] != 0) {
                if (params->info.usecase_id[i] == info->usecase_id[0]) {
                    ALOGV("%s: found params with ip_ch %d op_ch %d uc_id %d snd_dev %d",
                           __func__, info->ip_channels, info->op_channels,
                  info->usecase_id, info->snd_device);
                           info->usecase_id[0], info->snd_device);
                    *idx = i;
                    return params;
                }
                i++;
            }
        }
    }
    ALOGI("%s: no matching param with id %d ip_ch %d op_ch %d uc_id %d snd_dev %d",
          __func__, info->id, info->ip_channels, info->op_channels,
          info->usecase_id, info->snd_device);
          info->usecase_id[0], info->snd_device);
    return NULL;
}

@@ -2810,6 +2822,12 @@ int platform_add_custom_mtmx_params(void *platform,
    struct platform_data *my_data = (struct platform_data *)platform;
    struct audio_custom_mtmx_params *params = NULL;
    uint32_t size = sizeof(*params);
    int i = 0;

    if (!info) {
        ALOGE("%s: Invalid params", __func__);
        return NULL;
    }

    if (info->ip_channels > AUDIO_CHANNEL_COUNT_MAX ||
        info->op_channels > AUDIO_CHANNEL_COUNT_MAX) {
@@ -2825,9 +2843,14 @@ int platform_add_custom_mtmx_params(void *platform,
        return -ENOMEM;
    }

    ALOGI("%s: adding mtmx params with id %d ip_ch %d op_ch %d uc_id %d snd_dev %d",
    ALOGI("%s: adding mtmx params with id %d ip_ch %d op_ch %d snd_dev %d",
          __func__, info->id, info->ip_channels, info->op_channels,
          info->usecase_id, info->snd_device);
          info->snd_device);
    while (info->usecase_id[i] != 0) {
        ALOGI("%s: supported usecase ids for added mtmx params %d",
              __func__, info->usecase_id[i]);
        i++;
    }

    params->info = *info;
    list_add_tail(&my_data->custom_mtmx_params_list, &params->list);
+2 −1
Original line number Diff line number Diff line
@@ -357,7 +357,8 @@ struct audio_custom_mtmx_params *
    platform_get_custom_mtmx_params
    (
        void *platform __unused,
        struct audio_custom_mtmx_params_info *info __unused
        struct audio_custom_mtmx_params_info *info __unused,
        uint32_t *idx __unused
    )
{
    ALOGW("%s: not implemented!", __func__);
+64 −18
Original line number Diff line number Diff line
@@ -3680,11 +3680,18 @@ acdb_init_fail:

struct audio_custom_mtmx_params *
    platform_get_custom_mtmx_params(void *platform,
                                    struct audio_custom_mtmx_params_info *info)
                                    struct audio_custom_mtmx_params_info *info,
                                    uint32_t *idx)
{
    struct platform_data *my_data = (struct platform_data *)platform;
    struct listnode *node = NULL;
    struct audio_custom_mtmx_params *params = NULL;
    int i = 0;

    if (!info || !idx) {
        ALOGE("%s: Invalid params", __func__);
        return NULL;
    }

    list_for_each(node, &my_data->custom_mtmx_params_list) {
        params = node_to_item(node, struct audio_custom_mtmx_params, list);
@@ -3692,17 +3699,22 @@ struct audio_custom_mtmx_params *
            params->info.id == info->id &&
            params->info.ip_channels == info->ip_channels &&
            params->info.op_channels == info->op_channels &&
            params->info.usecase_id == info->usecase_id &&
            params->info.snd_device == info->snd_device) {
            while (params->info.usecase_id[i] != 0) {
                if (params->info.usecase_id[i] == info->usecase_id[0]) {
                    ALOGV("%s: found params with ip_ch %d op_ch %d uc_id %d snd_dev %d",
                           __func__, info->ip_channels, info->op_channels,
                  info->usecase_id, info->snd_device);
                           info->usecase_id[0], info->snd_device);
                    *idx = i;
                    return params;
                }
                i++;
            }
        }
    }
    ALOGI("%s: no matching param with id %d ip_ch %d op_ch %d uc_id %d snd_dev %d",
          __func__, info->id, info->ip_channels, info->op_channels,
          info->usecase_id, info->snd_device);
          info->usecase_id[0], info->snd_device);
    return NULL;
}

@@ -3712,6 +3724,12 @@ int platform_add_custom_mtmx_params(void *platform,
    struct platform_data *my_data = (struct platform_data *)platform;
    struct audio_custom_mtmx_params *params = NULL;
    uint32_t size = sizeof(*params);
    int i = 0;

    if (!info) {
        ALOGE("%s: Invalid params", __func__);
        return -EINVAL;
    }

    if (info->ip_channels > AUDIO_CHANNEL_COUNT_MAX ||
        info->op_channels > AUDIO_CHANNEL_COUNT_MAX) {
@@ -3727,9 +3745,14 @@ int platform_add_custom_mtmx_params(void *platform,
        return -ENOMEM;
    }

    ALOGI("%s: adding mtmx params with id %d ip_ch %d op_ch %d uc_id %d snd_dev %d",
    ALOGI("%s: adding mtmx params with id %d ip_ch %d op_ch %d snd_dev %d",
          __func__, info->id, info->ip_channels, info->op_channels,
          info->usecase_id, info->snd_device);
          info->snd_device);
    while (info->usecase_id[i] != 0) {
        ALOGI("%s: supported usecase ids for added mtmx params %d",
              __func__, info->usecase_id[i]);
        i++;
    }

    params->info = *info;
    list_add_tail(&my_data->custom_mtmx_params_list, &params->list);
@@ -3753,20 +3776,30 @@ struct audio_custom_mtmx_in_params *platform_get_custom_mtmx_in_params(void *pla
    struct platform_data *my_data = (struct platform_data *)platform;
    struct listnode *node = NULL;
    struct audio_custom_mtmx_in_params *params = NULL;
    int i = 0;

    if (!info) {
        ALOGE("%s: Invalid params", __func__);
        return NULL;
    }

    list_for_each(node, &my_data->custom_mtmx_in_params_list) {
        params = node_to_item(node, struct audio_custom_mtmx_in_params, list);
        if (params &&
            params->in_info.op_channels == info->op_channels &&
            params->in_info.usecase_id == info->usecase_id) {
            params->in_info.op_channels == info->op_channels) {
            while (params->in_info.usecase_id[i] != 0) {
                if (params->in_info.usecase_id[i] == info->usecase_id[0]) {
                    ALOGV("%s: found params with op_ch %d uc_id %d",
                  __func__, info->op_channels, info->usecase_id);
                          __func__, info->op_channels, info->usecase_id[0]);
                    return params;
                }
                i++;
            }
        }
    }

    ALOGI("%s: no matching param with op_ch %d uc_id %d",
           __func__, info->op_channels, info->usecase_id);
           __func__, info->op_channels, info->usecase_id[0]);
    return NULL;
}

@@ -3776,6 +3809,12 @@ int platform_add_custom_mtmx_in_params(void *platform,
    struct platform_data *my_data = (struct platform_data *)platform;
    struct audio_custom_mtmx_in_params *params = NULL;
    uint32_t size = sizeof(*params);
    int i = 0;

    if (!info) {
        ALOGE("%s: Invalid params", __func__);
        return -EINVAL;
    }

    if (info->op_channels > AUDIO_CHANNEL_COUNT_MAX) {
        ALOGE("%s: unusupported channels in %d", __func__, info->op_channels);
@@ -3788,8 +3827,14 @@ int platform_add_custom_mtmx_in_params(void *platform,
        return -ENOMEM;
    }

    ALOGI("%s: adding mtmx in params with op_ch %d uc_id %d",
          __func__, info->op_channels, info->usecase_id);
    ALOGI("%s: adding mtmx in params with op_ch %d",
          __func__, info->op_channels);

    while (info->usecase_id[i] != 0) {
        ALOGI("%s: supported usecase ids for added mtmx in params %d",
              __func__, info->usecase_id[i]);
        i++;
    }

    params->in_info = *info;
    list_add_tail(&my_data->custom_mtmx_in_params_list, &params->list);
@@ -6208,6 +6253,7 @@ snd_device_t platform_get_input_snd_device(void *platform,
    int str_bitwidth = (in == NULL) ? CODEC_BACKEND_DEFAULT_BIT_WIDTH : in->bit_width;
    int sample_rate = (in == NULL) ? 8000 : in->sample_rate;
    struct audio_usecase *usecase = NULL;
    audio_usecase_t uc_id = (in == NULL) ? USECASE_AUDIO_RECORD : in->usecase;

    ALOGV("%s: enter: out_device(%#x) in_device(%#x) channel_count (%d) channel_mask (0x%x)",
          __func__, out_device, in_device, channel_count, channel_mask);
@@ -6613,7 +6659,7 @@ snd_device_t platform_get_input_snd_device(void *platform,
            }
        } else if (in_device & AUDIO_DEVICE_IN_LOOPBACK) {
            if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
                usecase = get_usecase_from_list(adev, USECASE_AUDIO_RECORD);
                usecase = get_usecase_from_list(adev, uc_id);
                if (usecase == NULL) {
                    ALOGE("%s: Could not find the record usecase", __func__);
                    snd_device = SND_DEVICE_NONE;
+6 −4
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#define PRODUCT_FFV      "ffv"
#define PRODUCT_ALLPLAY  "allplay"
#define MAX_IN_CHANNELS 32
#define CUSTOM_MTRX_PARAMS_MAX_USECASE 8

typedef enum {
    PLATFORM,
@@ -103,9 +104,9 @@ struct audio_custom_mtmx_params_info {
    uint32_t id;
    uint32_t ip_channels;
    uint32_t op_channels;
    uint32_t usecase_id;
    uint32_t usecase_id[CUSTOM_MTRX_PARAMS_MAX_USECASE];
    uint32_t snd_device;
    char fe_name[128];
    uint32_t fe_id[CUSTOM_MTRX_PARAMS_MAX_USECASE];
};

struct audio_custom_mtmx_params {
@@ -116,7 +117,7 @@ struct audio_custom_mtmx_params {

struct audio_custom_mtmx_in_params_info {
    uint32_t op_channels;
    uint32_t usecase_id;
    uint32_t usecase_id[CUSTOM_MTRX_PARAMS_MAX_USECASE];
};

struct audio_custom_mtmx_params_in_ch_info {
@@ -377,7 +378,8 @@ int platform_set_qtime(void *platform, int audio_pcm_device_id,
int platform_get_delay(void *platform, int pcm_device_id);
struct audio_custom_mtmx_params *
    platform_get_custom_mtmx_params(void *platform,
                                    struct audio_custom_mtmx_params_info *info);
                                    struct audio_custom_mtmx_params_info *info,
                                    uint32_t *idx);
int platform_add_custom_mtmx_params(void *platform,
                                    struct audio_custom_mtmx_params_info *info);
/* callback functions from platform to common audio HAL */
Loading