hal: use stream specific app type for MBDRC
- when multi app type is supported use stream specific app type
- enforce custome volume MBDRC level to start from > 0 level
- add speaker safe as valid mbdrc supported device
Bug: 64774822
Test: phone call, duo call and video playback over speaker and headset
Change-Id: I4cb484bbd1ff8a46432c82738d67164799928ff2
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index c27042e..2847666 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -443,6 +443,12 @@
return 0;
}
+// always call with adev lock held
+void send_gain_dep_calibration_l() {
+ if (last_known_cal_step >= 0)
+ platform_send_gain_dep_cal(adev->platform, last_known_cal_step);
+}
+
__attribute__ ((visibility ("default")))
bool audio_hw_send_gain_dep_calibration(int level) {
bool ret_val = false;
@@ -452,15 +458,9 @@
if (adev != NULL && adev->platform != NULL) {
pthread_mutex_lock(&adev->lock);
- ret_val = platform_send_gain_dep_cal(adev->platform, level);
+ last_known_cal_step = level;
+ send_gain_dep_calibration_l();
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");
}
@@ -2613,17 +2613,19 @@
out->standby = false;
pthread_mutex_lock(&adev->lock);
ret = start_output_stream(out);
- pthread_mutex_unlock(&adev->lock);
+
/* ToDo: If use case is compress offload should return 0 */
if (ret != 0) {
out->standby = true;
+ pthread_mutex_unlock(&adev->lock);
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);
- }
+ // after standby always force set last known cal step
+ // dont change level anywhere except at the audio_hw_send_gain_dep_calibration
+ ALOGD("%s: retry previous failed cal level set", __func__);
+ send_gain_dep_calibration_l();
+ pthread_mutex_unlock(&adev->lock);
}
if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index b324b66..3b1d4d5 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -748,7 +748,6 @@
if (!voice_is_in_call(adev)) {
ALOGV("%s: Not Voice call usecase, apply new cal for level %d",
__func__, level);
- app_type = DEFAULT_APP_TYPE_RX_PATH;
// find the current active sound device
list_for_each(node, &adev->usecase_list) {
@@ -760,18 +759,23 @@
if (valid_uc_type) {
audio_devices_t dev = usecase->stream.out->devices;
valid_dev = (dev == AUDIO_DEVICE_OUT_SPEAKER ||
+ dev == AUDIO_DEVICE_OUT_SPEAKER_SAFE ||
dev == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
dev == AUDIO_DEVICE_OUT_WIRED_HEADPHONE);
}
if (valid_dev) {
- ALOGV("%s: out device is %d", __func__, usecase->out_snd_device);
- if (audio_extn_spkr_prot_is_enabled()) {
- acdb_dev_id = audio_extn_spkr_prot_get_acdb_id(usecase->out_snd_device);
- } else {
- acdb_dev_id = acdb_device_table[usecase->out_snd_device];
- }
+ ALOGV("%s: out device is %d", __func__, usecase->out_snd_device);
+ if (platform_supports_app_type_cfg())
+ app_type = usecase->stream.out->app_type_cfg.app_type;
+ else
+ app_type = DEFAULT_APP_TYPE_RX_PATH;
- if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type,
+ if (audio_extn_spkr_prot_is_enabled())
+ acdb_dev_id = audio_extn_spkr_prot_get_acdb_id(usecase->out_snd_device);
+ else
+ 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;
diff --git a/hal/platform_info.c b/hal/platform_info.c
index 283936e..41b59c8 100644
--- a/hal/platform_info.c
+++ b/hal/platform_info.c
@@ -216,6 +216,9 @@
tbl_entry.amp = exp(tbl_entry.db * 0.115129f);
tbl_entry.level = atoi(attr[3]);
+ //custome level should be > 0. Level 0 is fixed for default
+ CHECK(tbl_entry.level > 0);
+
ALOGV("%s: amp [%f] db [%f] level [%d]", __func__,
tbl_entry.amp, tbl_entry.db, tbl_entry.level);
platform_add_gain_level_mapping(&tbl_entry);