post_proc: fix inconsistency in virtualizer state from set_strength call
- Virtualizer is getting applied just by setting strength even though
it was kept disabled by client.
- Enable/disable from strength context is not able to track state set by
client, since internal state may not be same as one set by client.
- Add a separate variable to track state set by client which would help
avoid going into any such inconsistent state.
Change-Id: I4985b2d12dc0ee3f62089423e3a71d530f66027c
diff --git a/post_proc/virtualizer.c b/post_proc/virtualizer.c
index 3874f0b..71c219d 100644
--- a/post_proc/virtualizer.c
+++ b/post_proc/virtualizer.c
@@ -62,7 +62,8 @@
* For better user experience, explicitly disable virtualizer module
* when strength is 0.
*/
- offload_virtualizer_set_enable_flag(&(context->offload_virt),
+ if (context->enabled_by_client)
+ offload_virtualizer_set_enable_flag(&(context->offload_virt),
((strength > 0) && !(context->temp_disabled)) ?
true : false);
offload_virtualizer_set_strength(&(context->offload_virt), strength);
@@ -139,8 +140,7 @@
virtualizer_context_t *virt_ctxt = (virtualizer_context_t *)context;
int status = 0;
bool use_virt = false;
- int is_virt_enabled =
- offload_virtualizer_get_enable_flag(&(virt_ctxt->offload_virt));
+ int is_virt_enabled = virt_ctxt->enabled_by_client;
ALOGV("%s: ctxt %p, forcedDev=0x%x enabled=%d tmpDisabled=%d", __func__, virt_ctxt,
forced_device, is_virt_enabled, virt_ctxt->temp_disabled);
@@ -400,7 +400,7 @@
// default case unless configuration is forced
if (virtualizer_is_device_supported(device) == false) {
if (!virt_ctxt->temp_disabled) {
- if (effect_is_active(&virt_ctxt->common)) {
+ if (effect_is_active(&virt_ctxt->common) && virt_ctxt->enabled_by_client) {
offload_virtualizer_set_enable_flag(&(virt_ctxt->offload_virt), false);
if (virt_ctxt->ctl)
offload_virtualizer_send_params(virt_ctxt->ctl,
@@ -416,7 +416,7 @@
}
} else {
if (virt_ctxt->temp_disabled) {
- if (effect_is_active(&virt_ctxt->common)) {
+ if (effect_is_active(&virt_ctxt->common) && virt_ctxt->enabled_by_client) {
offload_virtualizer_set_enable_flag(&(virt_ctxt->offload_virt), true);
if (virt_ctxt->ctl)
offload_virtualizer_send_params(virt_ctxt->ctl,
@@ -468,6 +468,7 @@
set_config(context, &context->config);
+ virt_ctxt->enabled_by_client = false;
virt_ctxt->temp_disabled = false;
virt_ctxt->hw_acc_fd = -1;
virt_ctxt->forced_device = AUDIO_DEVICE_NONE;
@@ -483,6 +484,7 @@
ALOGV("%s: ctxt %p, strength %d", __func__, virt_ctxt, virt_ctxt->strength);
+ virt_ctxt->enabled_by_client = true;
if (!offload_virtualizer_get_enable_flag(&(virt_ctxt->offload_virt)) &&
!(virt_ctxt->temp_disabled)) {
offload_virtualizer_set_enable_flag(&(virt_ctxt->offload_virt), true);
@@ -505,6 +507,8 @@
virtualizer_context_t *virt_ctxt = (virtualizer_context_t *)context;
ALOGV("%s: ctxt %p", __func__, virt_ctxt);
+
+ virt_ctxt->enabled_by_client = false;
if (offload_virtualizer_get_enable_flag(&(virt_ctxt->offload_virt))) {
offload_virtualizer_set_enable_flag(&(virt_ctxt->offload_virt), false);
if (virt_ctxt->ctl)
diff --git a/post_proc/virtualizer.h b/post_proc/virtualizer.h
index b5293fb..904a0c6 100644
--- a/post_proc/virtualizer.h
+++ b/post_proc/virtualizer.h
@@ -32,6 +32,7 @@
// Offload vars
struct mixer_ctl *ctl;
int hw_acc_fd;
+ bool enabled_by_client;
bool temp_disabled;
audio_devices_t forced_device;
audio_devices_t device;