Merge "hal: Support for FLAC 24 bit format in offload path"
diff --git a/post_proc/bass_boost.c b/post_proc/bass_boost.c
index 1c96280..e2c6d9a 100644
--- a/post_proc/bass_boost.c
+++ b/post_proc/bass_boost.c
@@ -158,24 +158,27 @@
        (device == AUDIO_DEVICE_OUT_AUX_DIGITAL) ||
        (device == AUDIO_DEVICE_OUT_USB_ACCESSORY) ||
        (device == AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET)) {
-        if (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass))) {
-            offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), false);
+        if (!bass_ctxt->temp_disabled) {
+            if (effect_is_active(&bass_ctxt->common)) {
+                offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), false);
+                if (bass_ctxt->ctl)
+                    offload_bassboost_send_params(bass_ctxt->ctl,
+                                                  bass_ctxt->offload_bass,
+                                                  OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
+            }
             bass_ctxt->temp_disabled = true;
-            if (bass_ctxt->ctl)
-                offload_bassboost_send_params(bass_ctxt->ctl,
-                                              bass_ctxt->offload_bass,
-                                              OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
-            ALOGI("%s: ctxt %p, disabled based on device", __func__, bass_ctxt);
         }
+        ALOGI("%s: ctxt %p, disabled based on device", __func__, bass_ctxt);
     } else {
-        if (!offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass)) &&
-            bass_ctxt->temp_disabled) {
-            offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), true);
+        if (bass_ctxt->temp_disabled) {
+            if (effect_is_active(&bass_ctxt->common)) {
+                offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), true);
+                if (bass_ctxt->ctl)
+                    offload_bassboost_send_params(bass_ctxt->ctl,
+                                                  bass_ctxt->offload_bass,
+                                                  OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
+            }
             bass_ctxt->temp_disabled = false;
-            if (bass_ctxt->ctl)
-                offload_bassboost_send_params(bass_ctxt->ctl,
-                                              bass_ctxt->offload_bass,
-                                              OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
         }
     }
     offload_bassboost_set_device(&(bass_ctxt->offload_bass), device);
diff --git a/post_proc/bundle.c b/post_proc/bundle.c
index a0d9fcb..0db2e37 100644
--- a/post_proc/bundle.c
+++ b/post_proc/bundle.c
@@ -186,6 +186,7 @@
     int ret = 0;
     struct listnode *node;
     char mixer_string[128];
+    output_context_t * out_ctxt = NULL;
 
     ALOGV("%s output %d pcm_id %d", __func__, output, pcm_id);
 
@@ -199,7 +200,7 @@
         goto exit;
     }
 
-    output_context_t *out_ctxt = (output_context_t *)
+    out_ctxt = (output_context_t *)
                                  malloc(sizeof(output_context_t));
     if (!out_ctxt) {
         ALOGE("%s fail to allocate for output context", __func__);
@@ -217,6 +218,7 @@
         ALOGE("Failed to open mixer");
         out_ctxt->ctl = NULL;
         ret = -EINVAL;
+        free(out_ctxt);
         goto exit;
     } else {
         out_ctxt->ctl = mixer_get_ctl_by_name(out_ctxt->mixer, mixer_string);
@@ -225,6 +227,7 @@
             mixer_close(out_ctxt->mixer);
             out_ctxt->mixer = NULL;
             ret = -EINVAL;
+            free(out_ctxt);
             goto exit;
         }
     }
@@ -535,12 +538,12 @@
 
     pthread_mutex_lock(&lock);
     if (!effect_exists(context)) {
-        status = -EINVAL;
+        status = -ENOSYS;
         goto exit;
     }
 
     if (context->state != EFFECT_STATE_ACTIVE) {
-        status = -EINVAL;
+        status = -ENODATA;
         goto exit;
     }
 
@@ -560,13 +563,13 @@
     pthread_mutex_lock(&lock);
 
     if (!effect_exists(context)) {
-        status = -EINVAL;
+        status = -ENOSYS;
         goto exit;
     }
 
     ALOGV("%s: ctxt %p, cmd %d", __func__, context, cmdCode);
     if (context == NULL || context->state == EFFECT_STATE_UNINITIALIZED) {
-        status = -EINVAL;
+        status = -ENOSYS;
         goto exit;
     }
 
@@ -752,6 +755,9 @@
     return 0;
 }
 
+bool effect_is_active(effect_context_t * ctxt) {
+    return ctxt->state == EFFECT_STATE_ACTIVE;
+}
 
 /* effect_handle_t interface implementation for offload effects */
 const struct effect_interface_s effect_interface = {
diff --git a/post_proc/bundle.h b/post_proc/bundle.h
index 7ebea92..cbe7dba 100644
--- a/post_proc/bundle.h
+++ b/post_proc/bundle.h
@@ -87,4 +87,6 @@
 
 int set_config(effect_context_t *context, effect_config_t *config);
 
+bool effect_is_active(effect_context_t *context);
+
 #endif /* OFFLOAD_EFFECT_BUNDLE_H */
diff --git a/post_proc/reverb.c b/post_proc/reverb.c
index 81bcb97..77ae303 100644
--- a/post_proc/reverb.c
+++ b/post_proc/reverb.c
@@ -229,7 +229,7 @@
 
 void reverb_set_density(reverb_context_t *context, int16_t density)
 {
-    ALOGV("%s: ctxt %p, density: %d", __func__, density, density);
+    ALOGV("%s: ctxt %p, density: %d", __func__, context, density);
     context->reverb_settings.density = density;
     offload_reverb_set_density(&(context->offload_reverb), density);
     if (context->ctl)
diff --git a/post_proc/virtualizer.c b/post_proc/virtualizer.c
index 96828a0..9ed1ac5 100644
--- a/post_proc/virtualizer.c
+++ b/post_proc/virtualizer.c
@@ -157,24 +157,27 @@
        (device == AUDIO_DEVICE_OUT_AUX_DIGITAL) ||
        (device == AUDIO_DEVICE_OUT_USB_ACCESSORY) ||
        (device == AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET)) {
-        if (offload_virtualizer_get_enable_flag(&(virt_ctxt->offload_virt))) {
-            offload_virtualizer_set_enable_flag(&(virt_ctxt->offload_virt), false);
+        if (!virt_ctxt->temp_disabled) {
+            if (effect_is_active(&virt_ctxt->common)) {
+                offload_virtualizer_set_enable_flag(&(virt_ctxt->offload_virt), false);
+                if (virt_ctxt->ctl)
+                    offload_virtualizer_send_params(virt_ctxt->ctl,
+                                                    virt_ctxt->offload_virt,
+                                                    OFFLOAD_SEND_VIRTUALIZER_ENABLE_FLAG);
+            }
             virt_ctxt->temp_disabled = true;
-            if (virt_ctxt->ctl)
-                offload_virtualizer_send_params(virt_ctxt->ctl,
-                                              virt_ctxt->offload_virt,
-                                              OFFLOAD_SEND_VIRTUALIZER_ENABLE_FLAG);
             ALOGI("%s: ctxt %p, disabled based on device", __func__, virt_ctxt);
         }
     } else {
-        if (!offload_virtualizer_get_enable_flag(&(virt_ctxt->offload_virt)) &&
-            virt_ctxt->temp_disabled) {
-            offload_virtualizer_set_enable_flag(&(virt_ctxt->offload_virt), true);
+        if (virt_ctxt->temp_disabled) {
+            if (effect_is_active(&virt_ctxt->common)) {
+                offload_virtualizer_set_enable_flag(&(virt_ctxt->offload_virt), true);
+                if (virt_ctxt->ctl)
+                    offload_virtualizer_send_params(virt_ctxt->ctl,
+                                                    virt_ctxt->offload_virt,
+                                                    OFFLOAD_SEND_VIRTUALIZER_ENABLE_FLAG);
+            }
             virt_ctxt->temp_disabled = false;
-            if (virt_ctxt->ctl)
-                offload_virtualizer_send_params(virt_ctxt->ctl,
-                                              virt_ctxt->offload_virt,
-                                              OFFLOAD_SEND_VIRTUALIZER_ENABLE_FLAG);
         }
     }
     offload_virtualizer_set_device(&(virt_ctxt->offload_virt), device);
@@ -212,6 +215,7 @@
 
     set_config(context, &context->config);
 
+    virt_ctxt->temp_disabled = false;
     memset(&(virt_ctxt->offload_virt), 0, sizeof(struct virtualizer_params));
 
     return 0;