hal: retry failed MBDRC cal level am: fb4d7bd389 am: 1e36603d2d
am: 08f0520a93
Change-Id: I8252e33621e5a28f881d91673993a7f849099d76
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index a96a509..35b726e 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -233,6 +233,8 @@
static struct audio_device *adev = NULL;
static pthread_mutex_t adev_init_lock;
static unsigned int audio_device_ref_count;
+//cache last MBDRC cal step level
+static int last_known_cal_step = -1 ;
static bool may_use_noirq_mode(struct audio_device *adev, audio_usecase_t uc_id,
int flags __unused)
@@ -380,6 +382,13 @@
pthread_mutex_lock(&adev->lock);
ret_val = platform_send_gain_dep_cal(adev->platform, level);
pthread_mutex_unlock(&adev->lock);
+
+ // if cal set fails, cache level info
+ // if cal set succeds, reset known last cal set
+ if (!ret_val)
+ last_known_cal_step = level;
+ else if (last_known_cal_step != -1)
+ last_known_cal_step = -1;
} else {
ALOGE("%s: %s is NULL", __func__, adev == NULL ? "adev" : "adev->platform");
}
@@ -1995,6 +2004,11 @@
out->standby = true;
goto exit;
}
+
+ if (last_known_cal_step != -1) {
+ ALOGD("%s: retry previous failed cal level set", __func__);
+ audio_hw_send_gain_dep_calibration(last_known_cal_step);
+ }
}
if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 9630b7a..a5a2c9b 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -599,7 +599,7 @@
bool platform_send_gain_dep_cal(void *platform __unused, int level __unused)
{
- return 0;
+ return true;
}
void platform_set_echo_reference(struct audio_device *adev, bool enable,
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c
index e11db63..d7fc84c 100644
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -1072,7 +1072,7 @@
bool platform_send_gain_dep_cal(void *platform __unused,
int level __unused)
{
- return 0;
+ return true;
}
bool platform_can_split_snd_device(snd_device_t in_snd_device __unused,
diff --git a/post_proc/volume_listener.c b/post_proc/volume_listener.c
index 897dd8f..3367b76 100644
--- a/post_proc/volume_listener.c
+++ b/post_proc/volume_listener.c
@@ -46,6 +46,7 @@
#define AHAL_GAIN_DEPENDENT_INTERFACE_FUNCTION "audio_hw_send_gain_dep_calibration"
#define AHAL_GAIN_GET_MAPPING_TABLE "audio_hw_get_gain_level_mapping"
+#define DEFAULT_CAL_STEP 0
enum {
VOL_LISTENER_STATE_UNINITIALIZED,
@@ -232,7 +233,7 @@
// 4. if new value is different than the current value then load new calibration
struct listnode *node = NULL;
- float new_vol = 0.0;
+ float new_vol = -1.0;
int max_level = 0;
vol_listener_context_t *context = NULL;
if (dumping_enabled) {
@@ -261,7 +262,9 @@
if (new_vol >= 1 && total_volume_cal_step > 0) { // max amplitude, use highest DRC level
gain_dep_cal_level = volume_curve_gain_mapping_table[total_volume_cal_step - 1].level;
- } else if (new_vol <= 0) {
+ } else if (new_vol == -1) {
+ gain_dep_cal_level = DEFAULT_CAL_STEP;
+ } else if (new_vol == 0) {
gain_dep_cal_level = volume_curve_gain_mapping_table[0].level;
} else {
for (max_level = 0; max_level + 1 < total_volume_cal_step; max_level++) {