diff options
author | Karthik Reddy Katta <a_katta@codeaurora.org> | 2016-04-12 14:29:27 +0530 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-05-27 02:52:20 -0700 |
commit | d796841aa1a98604729647f73d5495cf741038eb (patch) | |
tree | 093b926fb5533d8f73f643e73c66e37fd862de61 | |
parent | 20cd1025f165edc06fc3aa67658097f8c9916ea6 (diff) | |
download | android_hardware_qcom_audio-d796841aa1a98604729647f73d5495cf741038eb.tar.gz android_hardware_qcom_audio-d796841aa1a98604729647f73d5495cf741038eb.tar.bz2 android_hardware_qcom_audio-d796841aa1a98604729647f73d5495cf741038eb.zip |
hal: Add support to reload ACDB files
Define new key to allow dynamic reloading of
ACDB files.
CRs-Fixed: 1005434
Change-Id: I7ab60c3947a81c98758081708c96de6afe56f207
-rw-r--r-- | hal/msm8916/platform.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c index 54163878..3f34d412 100644 --- a/hal/msm8916/platform.c +++ b/hal/msm8916/platform.c @@ -103,6 +103,7 @@ #define MAX_SAD_BLOCKS 10 #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 @@ -129,6 +130,8 @@ #define AUDIO_PARAMETER_KEY_AUD_CALDATA "cal_data" #define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result" +/* 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" @@ -195,6 +198,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; @@ -239,6 +243,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; #ifdef RECORD_PLAY_CONCURRENCY bool rec_play_conc_set; #endif @@ -250,6 +255,9 @@ struct platform_data { char ec_ref_mixer_path[64]; 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 bool is_external_codec = false; @@ -1567,6 +1575,13 @@ int platform_acdb_init(void *platform) result = my_data->acdb_init(acdb_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, acdb_snd_card_name, + MAX_SND_CARD_STRING_SIZE); + my_data->metainfo_key = key; + if (cvd_version) free(cvd_version); if (!result) { @@ -1893,6 +1908,13 @@ void *platform_init(struct audio_device *adev) ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__, dlerror()); 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); } audio_extn_pm_vote(); @@ -3616,6 +3638,16 @@ int platform_set_parameters(void *platform, struct str_parms *parms) } } + err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB, + value, sizeof(value)); + 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); + + } + #ifdef RECORD_PLAY_CONCURRENCY err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC, value, sizeof(value)); if (err >= 0) { |