hal: fix DTS HPX fade during pause and resume

During pause/resume, don't send DTS HPX fade-out and fade-in
to all active streams, we should only send to the one that is
pausing or resuming.

Change-Id: Ib527e0be29e81a38f702152b1263a140de773145
CRs-fixed: 780001
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 643c593..71f2285 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -275,7 +275,7 @@
 #ifndef DTS_EAGLE
 #define audio_extn_dts_eagle_set_parameters(adev, parms)     (0)
 #define audio_extn_dts_eagle_get_parameters(adev, query, reply) (0)
-#define audio_extn_dts_eagle_fade(adev, fade_in) (0)
+#define audio_extn_dts_eagle_fade(adev, fade_in, out) (0)
 #define audio_extn_dts_create_state_notifier_node(stream_out) (0)
 #define audio_extn_dts_notify_playback_state(stream_out, has_video, sample_rate, \
                                     channels, is_playing) (0)
@@ -286,7 +286,7 @@
                                          struct str_parms *parms);
 int audio_extn_dts_eagle_get_parameters(const struct audio_device *adev,
                   struct str_parms *query, struct str_parms *reply);
-int audio_extn_dts_eagle_fade(const struct audio_device *adev, bool fade_in);
+int audio_extn_dts_eagle_fade(const struct audio_device *adev, bool fade_in, const struct stream_out *out);
 void audio_extn_dts_create_state_notifier_node(int stream_out);
 void audio_extn_dts_notify_playback_state(int stream_out, int has_video, int sample_rate,
                                   int channels, int is_playing);
diff --git a/hal/audio_extn/dts_eagle.c b/hal/audio_extn/dts_eagle.c
index 7fa2c9b..88c255d 100644
--- a/hal/audio_extn/dts_eagle.c
+++ b/hal/audio_extn/dts_eagle.c
@@ -88,22 +88,31 @@
     return -EINVAL;
 }
 
-static int do_DTS_Eagle_params(const struct audio_device *adev, struct dts_eagle_param_desc_alsa *t, bool get) {
+static int do_DTS_Eagle_params(const struct audio_device *adev, struct dts_eagle_param_desc_alsa *t, bool get, const struct stream_out *out) {
     struct listnode *node;
     struct audio_usecase *usecase;
-    int ret = 0, sent = 0;
+    int ret = 0, sent = 0, tret = 0;
 
     ALOGV("DTS_EAGLE_HAL (%s): enter", __func__);
 
-    list_for_each(node, &adev->usecase_list) {
-        usecase = node_to_item(node, struct audio_usecase, list);
-        /* set/get eagle params for offload usecases only */
-        if ((usecase->type == PCM_PLAYBACK) && is_offload_usecase(usecase->id)) {
-            int tret = do_DTS_Eagle_params_stream(usecase->stream.out, t, get);
-            if (tret < 0)
-                ret = tret;
-            else
-                sent = 1;
+    if (out) {
+        /* if valid out stream is given, then send params to this stream only */
+        tret = do_DTS_Eagle_params_stream(out, t, get);
+        if (tret < 0)
+            ret = tret;
+        else
+            sent = 1;
+    } else {
+        list_for_each(node, &adev->usecase_list) {
+            usecase = node_to_item(node, struct audio_usecase, list);
+            /* set/get eagle params for offload usecases only */
+            if ((usecase->type == PCM_PLAYBACK) && is_offload_usecase(usecase->id)) {
+                tret = do_DTS_Eagle_params_stream(usecase->stream.out, t, get);
+                if (tret < 0)
+                    ret = tret;
+                else
+                    sent = 1;
+            }
         }
     }
 
@@ -163,7 +172,7 @@
         ALOGE("DTS_EAGLE_HAL (%s): error writing to fade notifier node", __func__);
 }
 
-int audio_extn_dts_eagle_fade(const struct audio_device *adev, bool fade_in) {
+int audio_extn_dts_eagle_fade(const struct audio_device *adev, bool fade_in, const struct stream_out *out) {
     char prop[PROPERTY_VALUE_MAX];
 
     ALOGV("DTS_EAGLE_HAL (%s): enter with fade %s requested", __func__, fade_in ? "in" : "out");
@@ -177,10 +186,10 @@
 
     if (fade_in) {
         if (fade_in_data)
-            return do_DTS_Eagle_params(adev, fade_in_data, false);
+            return do_DTS_Eagle_params(adev, fade_in_data, false, out);
     } else {
         if (fade_out_data)
-            return do_DTS_Eagle_params(adev, fade_out_data, false);
+            return do_DTS_Eagle_params(adev, fade_out_data, false, out);
     }
     return 0;
 }
@@ -297,7 +306,7 @@
                 ALOGD("DTS_EAGLE_HAL (%s): id: 0x%X, size: %d, offset: %d, device: %d", __func__,
                        (*t)->d.id, (*t)->d.size, (*t)->d.offset, (*t)->d.device);
                 if (!fade_in) {
-                    ret = do_DTS_Eagle_params(adev, *t, false);
+                    ret = do_DTS_Eagle_params(adev, *t, false, NULL);
                     if (ret < 0)
                         ALOGE("DTS_EAGLE_HAL (%s): failed setting params in kernel with error %i", __func__, ret);
                 }
@@ -378,7 +387,7 @@
                     ALOGE("%s: requested data too large", __func__);
                     return -1;
                 }
-                ret = do_DTS_Eagle_params(adev, t, true);
+                ret = do_DTS_Eagle_params(adev, t, true, NULL);
                 if (ret >= 0) {
                     data = (int*)(params + sizeof(struct dts_eagle_param_desc_alsa));
                     for (i = 0; i < count; i++)
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 53c9cf4..c2d3400 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2322,7 +2322,7 @@
 
             out->offload_state = OFFLOAD_STATE_PAUSED;
 
-            audio_extn_dts_eagle_fade(adev, false);
+            audio_extn_dts_eagle_fade(adev, false, out);
             audio_extn_dts_notify_playback_state(out->usecase, 0,
                                                  out->sample_rate, popcount(out->channel_mask),
                                                  0);
@@ -2350,7 +2350,7 @@
 
             out->offload_state = OFFLOAD_STATE_PLAYING;
 
-            audio_extn_dts_eagle_fade(adev, true);
+            audio_extn_dts_eagle_fade(adev, true, out);
             audio_extn_dts_notify_playback_state(out->usecase, 0, out->sample_rate,
                                                      popcount(out->channel_mask), 1);
         }