Merge "hal: Add support for force stopped capture session status"
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 220e6d1..edc09cc 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2909,6 +2909,8 @@
     if (audio_extn_ext_hw_plugin_usecase_start(adev->ext_hw_plugin, uc_info))
         ALOGE("%s: failed to start ext hw plugin", __func__);
 
+    android_atomic_acquire_cas(true, false, &(in->capture_stopped));
+
     if (audio_extn_cin_attached_usecase(in->usecase)) {
        ret = audio_extn_cin_open_input_stream(in);
        if (ret)
@@ -6532,6 +6534,13 @@
         in->standby = 0;
     }
 
+    /* Avoid read if capture_stopped is set */
+    if (android_atomic_acquire_load(&(in->capture_stopped)) > 0) {
+        ALOGD("%s: force stopped catpure session, ignoring read request", __func__);
+        ret = -EINVAL;
+        goto exit;
+    }
+
     // what's the duration requested by the client?
     long ns = 0;
 
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index d84a8f7..4810896 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -473,6 +473,8 @@
     float zoom;
     audio_microphone_direction_t direction;
 
+    volatile int32_t capture_stopped;
+
     /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */
     audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1];
     audio_format_t supported_formats[MAX_SUPPORTED_FORMATS + 1];
diff --git a/hal/audio_hw_extn_api.c b/hal/audio_hw_extn_api.c
index fa3a818..22c8685 100644
--- a/hal/audio_hw_extn_api.c
+++ b/hal/audio_hw_extn_api.c
@@ -34,6 +34,7 @@
 #include <inttypes.h>
 #include <errno.h>
 #include <log/log.h>
+#include <cutils/atomic.h>
 
 #include <hardware/audio.h>
 #include "sound/compress_params.h"
@@ -201,9 +202,13 @@
     if (!in->standby) {
         if (in->pcm != NULL ) {
             pcm_stop(in->pcm);
-        } else if (audio_extn_cin_format_supported(in->format)) {
+        } else if (audio_extn_cin_attached_usecase(in->usecase)) {
             audio_extn_cin_stop_input_stream(in);
         }
+
+        /* Set the atomic variable when the session is stopped */
+        if (android_atomic_acquire_cas(false, true, &(in->capture_stopped)) == 0)
+            ALOGI("%s: capture_stopped bit set", __func__);
     }
 
     pthread_mutex_unlock(&adev->lock);