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
This commit is contained in:
Deeraj Soman 2019-03-18 16:26:55 +05:30 committed by Gerrit - the friendly Code Review server
parent fa377bff15
commit 30cc7ae69b
3 changed files with 17 additions and 1 deletions

View File

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

View File

@ -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];

View File

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