Loading hal/audio_hw.c +21 −1 Original line number Diff line number Diff line Loading @@ -252,6 +252,26 @@ static unsigned int audio_device_ref_count; static int set_voice_volume_l(struct audio_device *adev, float volume); __attribute__ ((visibility ("default"))) bool audio_hw_send_gain_dep_calibration(int level) { bool ret_val = false; ALOGV("%s: called ... ", __func__); pthread_mutex_lock(&adev_init_lock); if (adev != NULL && adev->platform != NULL) { pthread_mutex_lock(&adev->lock); ret_val = platform_send_gain_dep_cal(adev->platform, level); pthread_mutex_unlock(&adev->lock); } else { ALOGE("%s: %s is NULL", __func__, adev == NULL ? "adev" : "adev->platform"); } pthread_mutex_unlock(&adev_init_lock); return ret_val; } static int check_and_set_gapless_mode(struct audio_device *adev) { Loading Loading @@ -2182,7 +2202,7 @@ exit: if (ret != 0) { if (out->pcm) ALOGE("%s: error %ld - %s", __func__, ret, pcm_get_error(out->pcm)); ALOGE("%s: error %zu - %s", __func__, ret, pcm_get_error(out->pcm)); if (out->usecase == USECASE_COMPRESS_VOIP_CALL) { pthread_mutex_lock(&adev->lock); voice_extn_compress_voip_close_output_stream(&out->stream.common); Loading hal/msm8960/platform.c +6 −0 Original line number Diff line number Diff line Loading @@ -1171,3 +1171,9 @@ int platform_set_spkr_device_tz_names(snd_device_t index, { return -ENOSYS; } bool platform_send_gain_dep_cal(void *platform __unused, int level __unused) { return 0; } hal/msm8974/platform.c +64 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ #define PLATFORM_INFO_XML_PATH "/system/etc/audio_platform_info.xml" #define PLATFORM_INFO_XML_PATH_I2S "/system/etc/audio_platform_info_i2s.xml" #include <linux/msm_audio.h> #define LIB_ACDB_LOADER "libacdbloader.so" #define AUDIO_DATA_BLOCK_MIXER_CTL "HDMI EDID" Loading Loading @@ -156,6 +157,12 @@ typedef struct acdb_audio_cal_cfg { uint32_t param_id; } acdb_audio_cal_cfg_t; enum { CAL_MODE_SEND = 0x1, CAL_MODE_PERSIST = 0x2, CAL_MODE_RTAC = 0x4 }; /* Audio calibration related functions */ typedef void (*acdb_deallocate_t)(); typedef int (*acdb_init_t)(const char *, char *, int); Loading @@ -180,6 +187,7 @@ typedef struct { bool ui_na_prop_enabled; } native_audio_prop; static native_audio_prop na_props = {0, 0}; typedef int (*acdb_send_gain_dep_cal_t)(int, int, int, int, int); struct platform_data { struct audio_device *adev; Loading Loading @@ -210,6 +218,7 @@ struct platform_data { acdb_get_default_app_type_t acdb_get_default_app_type; void *hw_info; acdb_send_gain_dep_cal_t acdb_send_gain_dep_cal; struct csd_data *csd; void *edid_info; bool edid_valid; Loading Loading @@ -705,6 +714,55 @@ struct speaker_device_to_tz_names speaker_device_tz_names = { #define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL) #define LOW_LATENCY_PLATFORM_DELAY (13*1000LL) bool platform_send_gain_dep_cal(void *platform, int level) { bool ret_val = false; struct platform_data *my_data = (struct platform_data *)platform; struct audio_device *adev = my_data->adev; int acdb_dev_id, app_type; int acdb_dev_type = MSM_SNDDEV_CAP_RX; int mode = CAL_MODE_RTAC; struct listnode *node; struct audio_usecase *usecase; if (my_data->acdb_send_gain_dep_cal == NULL) { ALOGE("%s: dlsym error for acdb_send_gain_dep_cal", __func__); return ret_val; } if (!voice_is_in_call(adev)) { ALOGV("%s: Not Voice call usecase, apply new cal for level %d", __func__, level); // find the current active sound device list_for_each(node, &adev->usecase_list) { usecase = node_to_item(node, struct audio_usecase, list); if (usecase != NULL && usecase->type == PCM_PLAYBACK && (usecase->stream.out->devices == AUDIO_DEVICE_OUT_SPEAKER || usecase->stream.out->devices == AUDIO_DEVICE_OUT_SPEAKER_SAFE)) { ALOGV("%s: out device is %d", __func__, usecase->out_snd_device); app_type = usecase->stream.out->app_type_cfg.app_type; acdb_dev_id = acdb_device_table[usecase->out_snd_device]; if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type, acdb_dev_type, mode, level)) { // set ret_val true if at least one calibration is set successfully ret_val = true; } else { ALOGE("%s: my_data->acdb_send_gain_dep_cal failed ", __func__); } } else { ALOGW("%s: Usecase list is empty", __func__); } } } else { ALOGW("%s: Voice call in progress .. ignore setting new cal", __func__); } return ret_val; } void platform_set_echo_reference(void *platform, bool enable) { struct platform_data *my_data = (struct platform_data *)platform; Loading Loading @@ -1257,6 +1315,12 @@ void *platform_init(struct audio_device *adev) ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s", __func__, LIB_ACDB_LOADER); my_data->acdb_send_gain_dep_cal = (acdb_send_gain_dep_cal_t)dlsym(my_data->acdb_handle, "acdb_loader_send_gain_dep_cal"); if (!my_data->acdb_send_gain_dep_cal) ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s", __func__, LIB_ACDB_LOADER); my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle, "acdb_loader_init_v2"); if (my_data->acdb_init == NULL) { Loading hal/platform_api.h +1 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ const char *platform_get_snd_device_name(snd_device_t snd_device); int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device, char *device_name); void platform_add_backend_name(char *mixer_path, snd_device_t snd_device); bool platform_send_gain_dep_cal(void *platform, int level); int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type); int platform_get_snd_device_index(char *snd_device_index_name); int platform_set_fluence_type(void *platform, char *value); Loading Loading
hal/audio_hw.c +21 −1 Original line number Diff line number Diff line Loading @@ -252,6 +252,26 @@ static unsigned int audio_device_ref_count; static int set_voice_volume_l(struct audio_device *adev, float volume); __attribute__ ((visibility ("default"))) bool audio_hw_send_gain_dep_calibration(int level) { bool ret_val = false; ALOGV("%s: called ... ", __func__); pthread_mutex_lock(&adev_init_lock); if (adev != NULL && adev->platform != NULL) { pthread_mutex_lock(&adev->lock); ret_val = platform_send_gain_dep_cal(adev->platform, level); pthread_mutex_unlock(&adev->lock); } else { ALOGE("%s: %s is NULL", __func__, adev == NULL ? "adev" : "adev->platform"); } pthread_mutex_unlock(&adev_init_lock); return ret_val; } static int check_and_set_gapless_mode(struct audio_device *adev) { Loading Loading @@ -2182,7 +2202,7 @@ exit: if (ret != 0) { if (out->pcm) ALOGE("%s: error %ld - %s", __func__, ret, pcm_get_error(out->pcm)); ALOGE("%s: error %zu - %s", __func__, ret, pcm_get_error(out->pcm)); if (out->usecase == USECASE_COMPRESS_VOIP_CALL) { pthread_mutex_lock(&adev->lock); voice_extn_compress_voip_close_output_stream(&out->stream.common); Loading
hal/msm8960/platform.c +6 −0 Original line number Diff line number Diff line Loading @@ -1171,3 +1171,9 @@ int platform_set_spkr_device_tz_names(snd_device_t index, { return -ENOSYS; } bool platform_send_gain_dep_cal(void *platform __unused, int level __unused) { return 0; }
hal/msm8974/platform.c +64 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ #define PLATFORM_INFO_XML_PATH "/system/etc/audio_platform_info.xml" #define PLATFORM_INFO_XML_PATH_I2S "/system/etc/audio_platform_info_i2s.xml" #include <linux/msm_audio.h> #define LIB_ACDB_LOADER "libacdbloader.so" #define AUDIO_DATA_BLOCK_MIXER_CTL "HDMI EDID" Loading Loading @@ -156,6 +157,12 @@ typedef struct acdb_audio_cal_cfg { uint32_t param_id; } acdb_audio_cal_cfg_t; enum { CAL_MODE_SEND = 0x1, CAL_MODE_PERSIST = 0x2, CAL_MODE_RTAC = 0x4 }; /* Audio calibration related functions */ typedef void (*acdb_deallocate_t)(); typedef int (*acdb_init_t)(const char *, char *, int); Loading @@ -180,6 +187,7 @@ typedef struct { bool ui_na_prop_enabled; } native_audio_prop; static native_audio_prop na_props = {0, 0}; typedef int (*acdb_send_gain_dep_cal_t)(int, int, int, int, int); struct platform_data { struct audio_device *adev; Loading Loading @@ -210,6 +218,7 @@ struct platform_data { acdb_get_default_app_type_t acdb_get_default_app_type; void *hw_info; acdb_send_gain_dep_cal_t acdb_send_gain_dep_cal; struct csd_data *csd; void *edid_info; bool edid_valid; Loading Loading @@ -705,6 +714,55 @@ struct speaker_device_to_tz_names speaker_device_tz_names = { #define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL) #define LOW_LATENCY_PLATFORM_DELAY (13*1000LL) bool platform_send_gain_dep_cal(void *platform, int level) { bool ret_val = false; struct platform_data *my_data = (struct platform_data *)platform; struct audio_device *adev = my_data->adev; int acdb_dev_id, app_type; int acdb_dev_type = MSM_SNDDEV_CAP_RX; int mode = CAL_MODE_RTAC; struct listnode *node; struct audio_usecase *usecase; if (my_data->acdb_send_gain_dep_cal == NULL) { ALOGE("%s: dlsym error for acdb_send_gain_dep_cal", __func__); return ret_val; } if (!voice_is_in_call(adev)) { ALOGV("%s: Not Voice call usecase, apply new cal for level %d", __func__, level); // find the current active sound device list_for_each(node, &adev->usecase_list) { usecase = node_to_item(node, struct audio_usecase, list); if (usecase != NULL && usecase->type == PCM_PLAYBACK && (usecase->stream.out->devices == AUDIO_DEVICE_OUT_SPEAKER || usecase->stream.out->devices == AUDIO_DEVICE_OUT_SPEAKER_SAFE)) { ALOGV("%s: out device is %d", __func__, usecase->out_snd_device); app_type = usecase->stream.out->app_type_cfg.app_type; acdb_dev_id = acdb_device_table[usecase->out_snd_device]; if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type, acdb_dev_type, mode, level)) { // set ret_val true if at least one calibration is set successfully ret_val = true; } else { ALOGE("%s: my_data->acdb_send_gain_dep_cal failed ", __func__); } } else { ALOGW("%s: Usecase list is empty", __func__); } } } else { ALOGW("%s: Voice call in progress .. ignore setting new cal", __func__); } return ret_val; } void platform_set_echo_reference(void *platform, bool enable) { struct platform_data *my_data = (struct platform_data *)platform; Loading Loading @@ -1257,6 +1315,12 @@ void *platform_init(struct audio_device *adev) ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s", __func__, LIB_ACDB_LOADER); my_data->acdb_send_gain_dep_cal = (acdb_send_gain_dep_cal_t)dlsym(my_data->acdb_handle, "acdb_loader_send_gain_dep_cal"); if (!my_data->acdb_send_gain_dep_cal) ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s", __func__, LIB_ACDB_LOADER); my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle, "acdb_loader_init_v2"); if (my_data->acdb_init == NULL) { Loading
hal/platform_api.h +1 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ const char *platform_get_snd_device_name(snd_device_t snd_device); int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device, char *device_name); void platform_add_backend_name(char *mixer_path, snd_device_t snd_device); bool platform_send_gain_dep_cal(void *platform, int level); int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type); int platform_get_snd_device_index(char *snd_device_index_name); int platform_set_fluence_type(void *platform, char *value); Loading