hal: Add support for force stopped capture session status
Add support for adding force stopped capture session
status. HAL will check whether the session is force
stopped before requesting for read(). ALSA sleeps for
~20s when the read() fails. In order to avoid this
before requesting read(), HAL check whether the stream
is closed, if yes then the read() request will be ignored
to avoid the ~20s delay.
Allow compress stop for all compress input usecases.
Currently stop is allowed only for IEC61937 format only.
Change-Id: I3616594f78ebffa83079fd0a734cdbe6f98ceab7
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index d62c4cf..d97f264 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 df29413..c4a954d 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -472,6 +472,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);