Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30cc7ae6 authored by Deeraj Soman's avatar Deeraj Soman Committed by Gerrit - the friendly Code Review server
Browse files

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
parent fa377bff
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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;

+2 −0
Original line number Diff line number Diff line
@@ -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];
+6 −1
Original line number Diff line number Diff line
@@ -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);