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);