diff --git a/hal/audio_hw.c b/hal/audio_hw.c index d62c4cf2..d97f2647 100644 --- a/hal/audio_hw.c +++ b/hal/audio_hw.c @@ -2909,6 +2909,8 @@ int start_input_stream(struct stream_in *in) 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 @@ static ssize_t in_read(struct audio_stream_in *stream, void *buffer, 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 df294131..c4a954da 100644 --- a/hal/audio_hw.h +++ b/hal/audio_hw.h @@ -472,6 +472,8 @@ struct stream_in { 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 fa3a8184..22c8685d 100644 --- a/hal/audio_hw_extn_api.c +++ b/hal/audio_hw_extn_api.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include "sound/compress_params.h" @@ -201,9 +202,13 @@ int qahwi_in_stop(struct audio_stream_in* stream) { 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);