From d796841aa1a98604729647f73d5495cf741038eb Mon Sep 17 00:00:00 2001 From: Karthik Reddy Katta Date: Tue, 12 Apr 2016 14:29:27 +0530 Subject: hal: Add support to reload ACDB files Define new key to allow dynamic reloading of ACDB files. CRs-Fixed: 1005434 Change-Id: I7ab60c3947a81c98758081708c96de6afe56f207 --- hal/msm8916/platform.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) 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) { -- cgit v1.2.3 From 77bb1dbf1a13d87afe3c29e5f036e260e17d5e50 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Thu, 3 Dec 2015 18:52:10 -0800 Subject: post proc : volume listener : fix effect release crash Fix access to deleted effect context in vol_prc_lib_release() Bug: 25753245. Change-Id: I64ca99e4d5d09667be4c8c605f66700b9ae67949 (cherry picked from commit 93ab6fdda7b7557ccb34372670c30fa6178f8426) (cherry picked from commit ebbb82365172337c6c250c6cac4e326970a9e351) --- post_proc/volume_listener.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/post_proc/volume_listener.c b/post_proc/volume_listener.c index e1dd0261..7b602488 100644 --- a/post_proc/volume_listener.c +++ b/post_proc/volume_listener.c @@ -697,24 +697,31 @@ static int vol_prc_lib_release(effect_handle_t handle) struct listnode *node = NULL; vol_listener_context_t *context = NULL; vol_listener_context_t *recv_contex = (vol_listener_context_t *)handle; - int status = -1; + int status = -EINVAL; bool recompute_flag = false; int active_stream_count = 0; + uint32_t session_id; + uint32_t stream_type; + effect_uuid_t uuid; + ALOGV("%s context %p", __func__, handle); - if (recv_contex == NULL || recv_contex->desc == NULL) { - ALOGE("%s: Got invalid handle while release, DO NOTHING ", __func__); + + if (recv_contex == NULL) { return status; } - pthread_mutex_lock(&vol_listner_init_lock); + session_id = recv_contex->session_id; + stream_type = recv_contex->stream_type; + uuid = recv_contex->desc->uuid; // check if the handle/context provided is valid list_for_each(node, &vol_effect_list) { context = node_to_item(node, struct vol_listener_context_s, effect_list_node); - if ((memcmp(&(context->desc->uuid), &(recv_contex->desc->uuid), sizeof(effect_uuid_t)) == 0) - && (context->session_id == recv_contex->session_id) - && (context->stream_type == recv_contex->stream_type)) { + if ((memcmp(&(context->desc->uuid), &uuid, sizeof(effect_uuid_t)) == 0) + && (context->session_id == session_id) + && (context->stream_type == stream_type)) { ALOGV("--- Found something to remove ---"); + list_remove(node); PRINT_STREAM_TYPE(context->stream_type); if (context->dev_id == AUDIO_DEVICE_OUT_SPEAKER) { recompute_flag = true; @@ -730,6 +737,8 @@ static int vol_prc_lib_release(effect_handle_t handle) if (status != 0) { ALOGE("something wrong ... <<<--- Found NOTHING to remove ... ???? --->>>>>"); + pthread_mutex_unlock(&vol_listner_init_lock); + return status; } // if there are no active streams, reset cal and volume level -- cgit v1.2.3