hal: Check for multiple offload usecases

While checking if a usecase is compressed offload, consider
concurrent multiple offload usecases

Change-Id: If01424137d4d5640e97ead58f151300a168f0912
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index 8bd98a0..989eb52 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -495,7 +495,7 @@
     if ((usecase->id != USECASE_AUDIO_PLAYBACK_DEEP_BUFFER) &&
         (usecase->id != USECASE_AUDIO_PLAYBACK_LOW_LATENCY) &&
         (usecase->id != USECASE_AUDIO_PLAYBACK_MULTI_CH) &&
-        (usecase->id != USECASE_AUDIO_PLAYBACK_OFFLOAD)) {
+        (!is_offload_usecase(usecase->id))) {
         ALOGV("%s: a playback path where app type cfg is not required", __func__);
         rc = 0;
         goto exit_send_app_type_cfg;
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 9e841df..fef38c0 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1929,7 +1929,7 @@
             ALOGD(" %s: sound card is not active/SSR state", __func__);
             ret= -EIO;
             goto exit;
-        } else if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
+        } else if (is_offload_usecase(out->usecase)) {
             //during SSR for compress usecase we should return error to flinger
             ALOGD(" copl %s: sound card is not active/SSR state", __func__);
             pthread_mutex_unlock(&out->lock);
@@ -2838,6 +2838,28 @@
     ALOGV("%s: exit", __func__);
 }
 
+static void close_compress_sessions(struct audio_device *adev)
+{
+    struct stream_out *out = NULL;
+    struct listnode *node = NULL;
+    struct listnode *tmp = NULL;
+    struct audio_usecase *usecase = NULL;
+    pthread_mutex_lock(&adev->lock);
+    list_for_each_safe(node, tmp, &adev->usecase_list) {
+        usecase = node_to_item(node, struct audio_usecase, list);
+        if (is_offload_usecase(usecase->id)) {
+            if (usecase && usecase->stream.out) {
+                ALOGI(" %s closing compress session %d on OFFLINE state", __func__, usecase->id);
+                out = usecase->stream.out;
+                pthread_mutex_unlock(&adev->lock);
+                out_standby(&out->stream.common);
+                pthread_mutex_lock(&adev->lock);
+            }
+        }
+    }
+    pthread_mutex_unlock(&adev->lock);
+}
+
 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
 {
     struct audio_device *adev = (struct audio_device *)dev;
@@ -2859,22 +2881,10 @@
         if (strstr(snd_card_status, "OFFLINE")) {
             struct listnode *node;
             struct audio_usecase *usecase;
-
             ALOGD("Received sound card OFFLINE status");
             set_snd_card_state(adev,SND_CARD_STATE_OFFLINE);
-
-            pthread_mutex_lock(&adev->lock);
-            //close compress session on OFFLINE status
-            usecase = get_usecase_from_list(adev,USECASE_AUDIO_PLAYBACK_OFFLOAD);
-            if (usecase && usecase->stream.out) {
-                ALOGD(" %s closing compress session on OFFLINE state", __func__);
-
-                struct stream_out *out = usecase->stream.out;
-
-                pthread_mutex_unlock(&adev->lock);
-                out_standby(&out->stream.common);
-            } else
-                pthread_mutex_unlock(&adev->lock);
+            //close compress sessions on OFFLINE status
+            close_compress_sessions(adev);
         } else if (strstr(snd_card_status, "ONLINE")) {
             ALOGD("Received sound card ONLINE status");
             set_snd_card_state(adev,SND_CARD_STATE_ONLINE);
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index e0d8a39..6184e5e 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -509,6 +509,16 @@
     {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_LOW_LATENCY)},
     {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MULTI_CH)},
     {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD)},
+#ifdef MULTIPLE_OFFLOAD_ENABLED
+    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD2)},
+    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD3)},
+    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD4)},
+    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD5)},
+    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD6)},
+    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD7)},
+    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD8)},
+    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD9)},
+#endif
     {TO_NAME_INDEX(USECASE_AUDIO_RECORD)},
     {TO_NAME_INDEX(USECASE_AUDIO_RECORD_LOW_LATENCY)},
     {TO_NAME_INDEX(USECASE_VOICE_CALL)},