Merge "hal: retry all of un-detected sound card"
diff --git a/configs/sdm660/sdm660.mk b/configs/sdm660/sdm660.mk
index aef78b1..4863d2d 100644
--- a/configs/sdm660/sdm660.mk
+++ b/configs/sdm660/sdm660.mk
@@ -236,6 +236,18 @@
PRODUCT_PROPERTY_OVERRIDES += \
ro.af.client_heap_size_kbyte=7168
+#Set HAL buffer size to samples equal to 3 ms
+PRODUCT_PROPERTY_OVERRIDES += \
+vendor.audio_hal.in_period_size=144
+
+#Set HAL buffer size to 3 ms
+PRODUCT_PROPERTY_OVERRIDES += \
+vendor.audio_hal.period_multiplier=3
+
+#ADM Buffering size in ms
+PRODUCT_PROPERTY_OVERRIDES += \
+vendor.audio.adm.buffering.ms=2
+
PRODUCT_PROPERTY_OVERRIDES += \
persist.vendor.audio.hw.binder.size_kbyte=1024
diff --git a/hal/audio_extn/spkr_protection.c b/hal/audio_extn/spkr_protection.c
index 54c1e5a..93b2210 100644
--- a/hal/audio_extn/spkr_protection.c
+++ b/hal/audio_extn/spkr_protection.c
@@ -898,6 +898,10 @@
total_time = (handle.v_vali_wait_time + handle.v_vali_vali_time);
ts.tv_sec += (total_time/1000);
ts.tv_nsec += ((total_time%1000) * 1000000);
+ if (ts.tv_nsec >= 1000000000) {
+ ts.tv_nsec -= 1000000000;
+ ts.tv_sec += 1;
+ }
}
pthread_mutex_lock(&handle.mutex_spkr_prot);
pthread_mutex_unlock(&adev->lock);
@@ -1681,6 +1685,7 @@
static void* spkr_v_vali_thread()
{
int ret = 0;
+ struct audio_device *adev = handle.adev_handle;
handle.v_vali_threadid = pthread_self();
if (!handle.v_vali_wait_time)
@@ -1688,12 +1693,14 @@
if (!handle.v_vali_vali_time)
handle.v_vali_vali_time = SPKR_V_VALI_DEFAULT_VALI_TIME;/*set default if not setparam */
set_spkr_prot_v_vali_cfg(handle.v_vali_wait_time, handle.v_vali_vali_time);
+ pthread_mutex_lock(&adev->lock);
ret = spkr_calibrate(SPKR_V_VALI_TEMP_MASK,
SPKR_V_VALI_TEMP_MASK);/*use 0xfffe as temp to initiate v_vali*/
+ pthread_mutex_unlock(&adev->lock);
if (ret)
ALOGE("%s: failed, retry again\n", __func__);
- pthread_exit(0);
handle.trigger_v_vali = false;
+ pthread_exit(0);
return NULL;
}
diff --git a/hal/audio_extn/usb.c b/hal/audio_extn/usb.c
index 16b3e10..a807f03 100644
--- a/hal/audio_extn/usb.c
+++ b/hal/audio_extn/usb.c
@@ -1137,6 +1137,14 @@
usb_card_info->usb_card = card;
usb_card_info->usb_device_type = device;
usb_get_sidetone_mixer(usb_card_info);
+ struct usb_card_config *usb_card_info_temp = NULL;
+ usb_card_info_temp = calloc(1, sizeof(struct usb_card_config));
+ if (usb_card_info_temp != NULL) {
+ list_init(&usb_card_info_temp->usb_device_conf_list);
+ if (!usb_get_capability(USB_CAPTURE, usb_card_info_temp, card))
+ usbmod->is_capture_supported = true;
+ free(usb_card_info_temp);
+ }
list_add_tail(&usbmod->usb_card_conf_list, &usb_card_info->list);
goto exit;
}
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index ba25969..967afdc 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1059,34 +1059,37 @@
return -EINVAL;
}
- adev->snd_dev_ref_cnt[snd_device]++;
-
- if(platform_get_snd_device_name_extn(adev->platform, snd_device, device_name) < 0 ) {
+ if (platform_get_snd_device_name_extn(adev->platform, snd_device, device_name) < 0 ) {
ALOGE("%s: Invalid sound device returned", __func__);
return -EINVAL;
}
- if (adev->snd_dev_ref_cnt[snd_device] > 1) {
+
+ adev->snd_dev_ref_cnt[snd_device]++;
+
+ if ((adev->snd_dev_ref_cnt[snd_device] > 1) &&
+ (platform_split_snd_device(adev->platform,
+ snd_device,
+ &num_devices,
+ new_snd_devices) != 0)) {
ALOGV("%s: snd_device(%d: %s) is already active",
__func__, snd_device, device_name);
return 0;
}
-
if (audio_extn_spkr_prot_is_enabled())
audio_extn_spkr_prot_calib_cancel(adev);
if (platform_can_enable_spkr_prot_on_device(snd_device) &&
audio_extn_spkr_prot_is_enabled()) {
- if (platform_get_spkr_prot_acdb_id(snd_device) < 0) {
- adev->snd_dev_ref_cnt[snd_device]--;
- return -EINVAL;
- }
- audio_extn_dev_arbi_acquire(snd_device);
- if (audio_extn_spkr_prot_start_processing(snd_device)) {
+ if (platform_get_spkr_prot_acdb_id(snd_device) < 0) {
+ goto err;
+ }
+ audio_extn_dev_arbi_acquire(snd_device);
+ if (audio_extn_spkr_prot_start_processing(snd_device)) {
ALOGE("%s: spkr_start_processing failed", __func__);
audio_extn_dev_arbi_release(snd_device);
- return -EINVAL;
- }
+ goto err;
+ }
} else if (platform_split_snd_device(adev->platform,
snd_device,
&num_devices,
@@ -1098,11 +1101,11 @@
ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name);
- if ((SND_DEVICE_OUT_BT_A2DP == snd_device) &&
- (audio_extn_a2dp_start_playback() < 0)) {
- ALOGE(" fail to configure A2dp control path ");
- return -EINVAL;
- }
+ if ((SND_DEVICE_OUT_BT_A2DP == snd_device) &&
+ (audio_extn_a2dp_start_playback() < 0)) {
+ ALOGE(" fail to configure A2dp control path ");
+ goto err;
+ }
/* due to the possibility of calibration overwrite between listen
and audio, notify listen hal before audio calibration is sent */
@@ -1111,12 +1114,11 @@
audio_extn_listen_update_device_status(snd_device,
LISTEN_EVENT_SND_DEVICE_BUSY);
if (platform_get_snd_device_acdb_id(snd_device) < 0) {
- adev->snd_dev_ref_cnt[snd_device]--;
audio_extn_sound_trigger_update_device_status(snd_device,
ST_EVENT_SND_DEVICE_FREE);
audio_extn_listen_update_device_status(snd_device,
LISTEN_EVENT_SND_DEVICE_FREE);
- return -EINVAL;
+ goto err;
}
audio_extn_dev_arbi_acquire(snd_device);
audio_route_apply_and_update_path(adev->audio_route, device_name);
@@ -1138,6 +1140,9 @@
}
}
return 0;
+err:
+ adev->snd_dev_ref_cnt[snd_device]--;
+ return -EINVAL;
}
int disable_snd_device(struct audio_device *adev,
@@ -1152,6 +1157,12 @@
ALOGE("%s: Invalid sound device %d", __func__, snd_device);
return -EINVAL;
}
+
+ if (platform_get_snd_device_name_extn(adev->platform, snd_device, device_name) < 0) {
+ ALOGE("%s: Invalid sound device returned", __func__);
+ return -EINVAL;
+ }
+
if (adev->snd_dev_ref_cnt[snd_device] <= 0) {
ALOGE("%s: device ref cnt is already 0", __func__);
return -EINVAL;
@@ -1159,11 +1170,6 @@
adev->snd_dev_ref_cnt[snd_device]--;
- if(platform_get_snd_device_name_extn(adev->platform, snd_device, device_name) < 0) {
- ALOGE("%s: Invalid sound device returned", __func__);
- return -EINVAL;
- }
-
if (adev->snd_dev_ref_cnt[snd_device] == 0) {
ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name);
@@ -1187,28 +1193,38 @@
if (SND_DEVICE_OUT_BT_A2DP == snd_device)
audio_extn_a2dp_stop_playback();
-
- if (snd_device == SND_DEVICE_OUT_HDMI || snd_device == SND_DEVICE_OUT_DISPLAY_PORT)
+ else if (snd_device == SND_DEVICE_OUT_HDMI ||
+ snd_device == SND_DEVICE_OUT_DISPLAY_PORT)
adev->is_channel_status_set = false;
else if (SND_DEVICE_OUT_HEADPHONES == snd_device &&
- adev->native_playback_enabled) {
+ adev->native_playback_enabled) {
ALOGD("%s: %d: napb: disabling native mode in hardware",
__func__, __LINE__);
audio_route_reset_and_update_path(adev->audio_route,
"true-native-mode");
adev->native_playback_enabled = false;
} else if (SND_DEVICE_OUT_HEADPHONES == snd_device &&
- adev->asrc_mode_enabled) {
+ adev->asrc_mode_enabled) {
ALOGD("%s: %d: disabling asrc mode in hardware", __func__, __LINE__);
disable_asrc_mode(adev);
audio_route_apply_and_update_path(adev->audio_route, "hph-lowpower-mode");
- }
- if ((snd_device == SND_DEVICE_IN_HANDSET_6MIC) &&
- (audio_extn_ffv_get_stream() == adev->active_input)) {
+ } else if (((snd_device == SND_DEVICE_IN_HANDSET_6MIC) ||
+ (snd_device == SND_DEVICE_IN_HANDSET_QMIC)) &&
+ (audio_extn_ffv_get_stream() == adev->active_input)) {
ALOGD("%s: deinit ec ref loopback", __func__);
audio_extn_ffv_deinit_ec_ref_loopback(adev, snd_device);
}
+
audio_extn_utils_release_snd_device(snd_device);
+ } else {
+ if (platform_split_snd_device(adev->platform,
+ snd_device,
+ &num_devices,
+ new_snd_devices) == 0) {
+ for (i = 0; i < num_devices; i++) {
+ adev->snd_dev_ref_cnt[new_snd_devices[i]]--;
+ }
+ }
}
return 0;
@@ -1440,14 +1456,10 @@
if (platform_split_snd_device(adev->platform, usecase->out_snd_device,
&num_devices, split_snd_devices) == 0) {
adev->snd_dev_ref_cnt[usecase->out_snd_device]--;
- if (adev->snd_dev_ref_cnt[usecase->out_snd_device] == 0) {
- ALOGD("%s: disabling snd_device(%d)", __func__, usecase->out_snd_device);
- for (i = 0; i < num_devices; i++) {
- /* Disable devices that do not match with derived sound device */
- if (split_snd_devices[i] != derive_snd_device[usecase->id])
- disable_snd_device(adev, split_snd_devices[i]);
- }
- audio_extn_utils_release_snd_device(usecase->out_snd_device);
+ for (i = 0; i < num_devices; i++) {
+ /* Disable devices that do not match with derived sound device */
+ if (split_snd_devices[i] != derive_snd_device[usecase->id])
+ disable_snd_device(adev, split_snd_devices[i]);
}
} else {
disable_snd_device(adev, usecase->out_snd_device);
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index d8deae8..3bf7628 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -3545,11 +3545,15 @@
int snd_device = SND_DEVICE_OUT_SPEAKER;
int new_snd_device[SND_DEVICE_OUT_END] = {0};
int i, num_devices = 1;
+ bool is_incall_rec_usecase = false;
+ snd_device_t incall_rec_device;
+
+ if (voice_is_in_call(my_data->adev))
+ is_incall_rec_usecase = voice_is_in_call_rec_stream(usecase->stream.in);
if (usecase->type == PCM_PLAYBACK)
snd_device = usecase->out_snd_device;
- else if ((usecase->type == PCM_CAPTURE) &&
- voice_is_in_call_rec_stream(usecase->stream.in))
+ else if ((usecase->type == PCM_CAPTURE) && is_incall_rec_usecase)
snd_device = voice_get_incall_rec_snd_device(usecase->in_snd_device);
else if ((usecase->type == PCM_HFP_CALL) || (usecase->type == PCM_CAPTURE))
snd_device = usecase->in_snd_device;
@@ -3558,13 +3562,25 @@
acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(snd_device)];
- if (platform_split_snd_device(platform, snd_device, &num_devices,
- new_snd_device) < 0) {
- new_snd_device[0] = snd_device;
+ if (!is_incall_rec_usecase) {
+ if (platform_split_snd_device(my_data, snd_device,
+ &num_devices, new_snd_device) < 0) {
+ new_snd_device[0] = snd_device;
+ }
+ } else {
+ incall_rec_device = voice_get_incall_rec_backend_device(usecase->stream.in);
+ if (platform_split_snd_device(my_data, incall_rec_device,
+ &num_devices, new_snd_device) < 0) {
+ new_snd_device[0] = snd_device;
+ }
}
for (i = 0; i < num_devices; i++) {
- acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(new_snd_device[i])];
+ if (!is_incall_rec_usecase)
+ acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(new_snd_device[i])];
+ else
+ // Use in_call_rec snd_device to extract the ACDB device ID instead of split snd devices
+ acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(snd_device)];
// Do not use Rx path default app type for TX path
if ((usecase->type == PCM_CAPTURE) && (app_type == DEFAULT_APP_TYPE_RX_PATH)) {
@@ -3702,6 +3718,7 @@
if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
@@ -5792,7 +5809,10 @@
if (voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
list_for_each(node, &adev->usecase_list) {
uc = node_to_item(node, struct audio_usecase, list);
- if (uc && (uc->type == VOICE_CALL || uc->type == VOIP_CALL) && uc->stream.out) {
+ if (uc && uc->stream.out &&
+ (uc->type == VOICE_CALL ||
+ uc->type == VOIP_CALL ||
+ uc->id == USECASE_AUDIO_PLAYBACK_VOIP)) {
out_snd_device = platform_get_output_snd_device(adev->platform, uc->stream.out);
backend_idx = platform_get_backend_index(out_snd_device);
break;
@@ -6336,7 +6356,7 @@
* Handset and speaker may have diffrent backend. Check if the device is speaker or handset,
* and these devices are restricited to 48kHz.
*/
- if ((platform_get_backend_index(snd_device) == DEFAULT_CODEC_BACKEND) &&
+ if (!codec_device_supports_native_playback(usecase->devices) &&
(platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, snd_device) ||
platform_check_backends_match(SND_DEVICE_OUT_HANDSET, snd_device))) {
sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
@@ -7617,6 +7637,7 @@
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
ret = true;
@@ -7699,6 +7720,7 @@
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
ret = true;
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index a31b048..41ff789 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -1141,6 +1141,7 @@
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
ret = true;
@@ -3503,11 +3504,15 @@
int snd_device = SND_DEVICE_OUT_SPEAKER;
int new_snd_device[SND_DEVICE_OUT_END] = {0};
int i, num_devices = 1;
+ bool is_incall_rec_usecase = false;
+ snd_device_t incall_rec_device;
+
+ if (voice_is_in_call(my_data->adev))
+ is_incall_rec_usecase = voice_is_in_call_rec_stream(usecase->stream.in);
if (usecase->type == PCM_PLAYBACK)
snd_device = usecase->out_snd_device;
- else if ((usecase->type == PCM_CAPTURE) &&
- voice_is_in_call_rec_stream(usecase->stream.in))
+ else if ((usecase->type == PCM_CAPTURE) && is_incall_rec_usecase)
snd_device = voice_get_incall_rec_snd_device(usecase->in_snd_device);
else if ((usecase->type == PCM_HFP_CALL) || (usecase->type == PCM_CAPTURE))
snd_device = usecase->in_snd_device;
@@ -3521,13 +3526,25 @@
return -EINVAL;
}
- if (platform_split_snd_device(my_data, snd_device,
- &num_devices, new_snd_device) < 0) {
- new_snd_device[0] = snd_device;
+ if (!is_incall_rec_usecase) {
+ if (platform_split_snd_device(my_data, snd_device,
+ &num_devices, new_snd_device) < 0) {
+ new_snd_device[0] = snd_device;
+ }
+ } else {
+ incall_rec_device = voice_get_incall_rec_backend_device(usecase->stream.in);
+ if (platform_split_snd_device(my_data, incall_rec_device,
+ &num_devices, new_snd_device) < 0) {
+ new_snd_device[0] = snd_device;
+ }
}
for (i = 0; i < num_devices; i++) {
- acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(new_snd_device[i])];
+ if (!is_incall_rec_usecase)
+ acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(new_snd_device[i])];
+ else
+ // Use in_call_rec snd_device to extract the ACDB device ID instead of split snd devices
+ acdb_dev_id = acdb_device_table[platform_get_spkr_prot_snd_device(snd_device)];
// Do not use Rx path default app type for TX path
if ((usecase->type == PCM_CAPTURE) && (app_type == DEFAULT_APP_TYPE_RX_PATH)) {
@@ -3665,6 +3682,7 @@
if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
@@ -5971,7 +5989,10 @@
if (voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
list_for_each(node, &adev->usecase_list) {
uc = node_to_item(node, struct audio_usecase, list);
- if (uc && (uc->type == VOICE_CALL || uc->type == VOIP_CALL) && uc->stream.out) {
+ if (uc && uc->stream.out &&
+ (uc->type == VOICE_CALL ||
+ uc->type == VOIP_CALL ||
+ uc->id == USECASE_AUDIO_PLAYBACK_VOIP)) {
out_snd_device = platform_get_output_snd_device(adev->platform, uc->stream.out);
backend_idx = platform_get_backend_index(out_snd_device);
break;
@@ -6508,7 +6529,7 @@
* Handset and speaker may have diffrent backend. Check if the device is speaker or handset,
* and these devices are restricited to 48kHz.
*/
- if ((platform_get_backend_index(snd_device) == DEFAULT_CODEC_BACKEND) &&
+ if (!codec_device_supports_native_playback(usecase->devices) &&
(platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, snd_device) ||
platform_check_backends_match(SND_DEVICE_OUT_HANDSET, snd_device))) {
if (bit_width >= 24) {
@@ -7721,6 +7742,7 @@
snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_STEREO ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2) {
ret = true;
diff --git a/hal/voice.c b/hal/voice.c
index 7b93cfd..ff6da5a 100644
--- a/hal/voice.c
+++ b/hal/voice.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
* Not a contribution.
*
* Copyright (C) 2013 The Android Open Source Project
@@ -444,6 +444,11 @@
{
snd_device_t incall_record_device = {0};
+ if (!in) {
+ ALOGE("%s: input stream is NULL", __func__);
+ return 0;
+ }
+
switch(in->source) {
case AUDIO_SOURCE_VOICE_UPLINK:
incall_record_device = SND_DEVICE_IN_INCALL_REC_TX;
diff --git a/post_proc/volume_listener.c b/post_proc/volume_listener.c
index d4c3753..9fc8377 100644
--- a/post_proc/volume_listener.c
+++ b/post_proc/volume_listener.c
@@ -779,9 +779,6 @@
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);
@@ -789,18 +786,12 @@
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), &uuid, sizeof(effect_uuid_t)) == 0)
- && (context->session_id == session_id)
- && (context->stream_type == stream_type)) {
+ if (context == recv_contex) {
ALOGV("--- Found something to remove ---");
- list_remove(node);
PRINT_STREAM_TYPE(context->stream_type);
if (verify_context(context)) {
recompute_flag = true;