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

Commit eda85aa1 authored by Karthik Reddy Katta's avatar Karthik Reddy Katta Committed by Gerrit - the friendly Code Review server
Browse files

hal: msm8974: Add support to reload ACDB files

Define new key to allow dynamic reloading of
ACDB files.

Change-Id: I9801c8e5e66c5be35ecf21e07301d97475aba0a5
CRs-Fixed: 1005434
parent 5670ca40
Loading
Loading
Loading
Loading
+33 −1
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@
#define SAD_BLOCK_SIZE      3

#define MAX_CVD_VERSION_STRING_SIZE    100
#define MAX_SND_CARD_STRING_SIZE    100

/* EDID format ID for LPCM audio */
#define EDID_FORMAT_LPCM    1
@@ -121,6 +122,9 @@

#define AUDIO_PARAMETER_KEY_PERF_LOCK_OPTS "perf_lock_opts"

/* Reload ACDB files from specified path */
#define AUDIO_PARAMETER_KEY_RELOAD_ACDB "reload_acdb"

/* Query external audio device connection status */
#define AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE "ext_audio_device"

@@ -191,6 +195,7 @@ typedef int (*acdb_set_audio_cal_t) (void *, void *, uint32_t);
typedef int (*acdb_get_audio_cal_t) (void *, void *, uint32_t*);
typedef int (*acdb_send_common_top_t) (void);
typedef int (*acdb_set_codec_data_t) (void *, char *);
typedef int (*acdb_reload_t) (char *, char *, char *, int);

typedef struct codec_backend_cfg {
    uint32_t sample_rate;
@@ -235,7 +240,7 @@ struct platform_data {
    acdb_get_default_app_type_t acdb_get_default_app_type;
    acdb_send_common_top_t     acdb_send_common_top;
    acdb_set_codec_data_t      acdb_set_codec_data;

    acdb_reload_t              acdb_reload;
    void *hw_info;
    acdb_send_gain_dep_cal_t   acdb_send_gain_dep_cal;
    struct csd_data *csd;
@@ -246,6 +251,9 @@ struct platform_data {
    codec_backend_cfg_t current_tx_backend_cfg[MAX_CODEC_TX_BACKENDS];
    char codec_version[CODEC_VERSION_MAX_LENGTH];
    int hw_dep_fd;
    char cvd_version[MAX_CVD_VERSION_STRING_SIZE];
    char snd_card_name[MAX_SND_CARD_STRING_SIZE];
    int metainfo_key;
};

static int pcm_device_table[AUDIO_USECASE_MAX][2] = {
@@ -1290,6 +1298,14 @@ static int platform_acdb_init(void *platform)
    key = atoi(value);
    snd_card_name = mixer_get_name(my_data->adev->mixer);
    result = my_data->acdb_init(snd_card_name, cvd_version, key);

    /* Save these variables in platform_data. These will be used
       while reloading ACDB files during run time. */
    strlcpy(my_data->cvd_version, cvd_version, MAX_CVD_VERSION_STRING_SIZE);
    strlcpy(my_data->snd_card_name, snd_card_name,
                                               MAX_SND_CARD_STRING_SIZE);
    my_data->metainfo_key = key;

    if (cvd_version)
        free(cvd_version);
    if (!result) {
@@ -1572,6 +1588,12 @@ void *platform_init(struct audio_device *adev)
            goto acdb_init_fail;
        }

        my_data->acdb_reload = (acdb_reload_t)dlsym(my_data->acdb_handle,
                                                    "acdb_loader_reload_acdb_files");
        if (my_data->acdb_reload == NULL) {
            ALOGE("%s: dlsym error %s for acdb_loader_reload_acdb_files", __func__, dlerror());
            goto acdb_init_fail;
        }
        platform_acdb_init(my_data);
    }

@@ -3372,6 +3394,16 @@ int platform_set_parameters(void *platform, struct str_parms *parms)
        }
    }

    err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB,
                            value, len);
    if (err >= 0) {
        str_parms_del(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB);

        my_data->acdb_reload(value, my_data->snd_card_name,
                              my_data->cvd_version, my_data->metainfo_key);

    }

    err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE,
                            value, len);
    if (err >= 0) {