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)},