From 30cc7ae69bd831a7385061a6c23ba5c2e53563e0 Mon Sep 17 00:00:00 2001 From: Deeraj Soman Date: Mon, 18 Mar 2019 16:26:55 +0530 Subject: [PATCH] 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 --- hal/audio_hw.c | 9 +++++++++ hal/audio_hw.h | 2 ++ hal/audio_hw_extn_api.c | 7 ++++++- 3 files changed, 17 insertions(+), 1 deletion(-) 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);