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;