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

Commit 27d5ebe7 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "hal: Read hotword data from sound trigger hal"

parents 405f8c19 e3cce411
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -221,6 +221,7 @@ void audio_extn_listen_set_parameters(struct audio_device *adev,
#define audio_extn_sound_trigger_set_parameters(adev, parms)           (0)
#define audio_extn_sound_trigger_check_and_get_session(in)             (0)
#define audio_extn_sound_trigger_stop_lab(in)                          (0)
#define audio_extn_sound_trigger_read(in, buffer, bytes)               (0)
#else

enum st_event_type {
@@ -241,6 +242,8 @@ void audio_extn_sound_trigger_set_parameters(struct audio_device *adev,
                                             struct str_parms *parms);
void audio_extn_sound_trigger_check_and_get_session(struct stream_in *in);
void audio_extn_sound_trigger_stop_lab(struct stream_in *in);
int audio_extn_sound_trigger_read(struct stream_in *in, void *buffer,
                                  size_t bytes);
#endif

#ifndef AUXPCM_BT_ENABLED
+41 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
/* #define LOG_NDEBUG 0 */
#define LOG_NDDEBUG 0

#include <errno.h>
#include <stdbool.h>
#include <stdlib.h>
#include <dlfcn.h>
@@ -64,7 +65,7 @@ get_sound_trigger_info(int capture_handle)
{
    struct sound_trigger_info  *st_ses_info = NULL;
    struct listnode *node;
    ALOGD("%s: list %d capture_handle %d", __func__,
    ALOGV("%s: list empty %d capture_handle %d", __func__,
           list_empty(&st_dev->st_ses_list), capture_handle);
    list_for_each(node, &st_dev->st_ses_list) {
        st_ses_info = node_to_item(node, struct sound_trigger_info , list);
@@ -128,6 +129,45 @@ int audio_hw_call_back(sound_trigger_event_type_t event,
    return status;
}

int audio_extn_sound_trigger_read(struct stream_in *in, void *buffer,
                       size_t bytes)
{
    int ret = -1;
    struct sound_trigger_info  *st_info = NULL;
    audio_event_info_t event;

    if (!st_dev)
       return ret;

    if (!in->is_st_session_active) {
        ALOGE(" %s: Sound trigger is not active", __func__);
        goto exit;
    }
    if(in->standby)
        in->standby = false;

    pthread_mutex_lock(&st_dev->lock);
    st_info = get_sound_trigger_info(in->capture_handle);
    pthread_mutex_unlock(&st_dev->lock);
    if (st_info) {
        event.u.aud_info.ses_info = &st_info->st_ses;
        event.u.aud_info.buf = buffer;
        event.u.aud_info.num_bytes = bytes;
        ret = st_dev->st_callback(AUDIO_EVENT_READ_SAMPLES, &event);
    }

exit:
    if (ret) {
        if (-ENETRESET == ret)
            in->is_st_session_active = false;
        memset(buffer, 0, bytes);
        ALOGV("%s: read failed status %d - sleep", __func__, ret);
        usleep((bytes * 1000000) / (audio_stream_in_frame_size((struct audio_stream_in *)in) *
                                   in->config.rate));
    }
    return ret;
}

void audio_extn_sound_trigger_stop_lab(struct stream_in *in)
{
    int status = 0;
+24 −34
Original line number Diff line number Diff line
@@ -2602,22 +2602,21 @@ static ssize_t in_read(struct audio_stream_in *stream, void *buffer,

    pthread_mutex_lock(&in->lock);

    if (in->pcm) {
        if(SND_CARD_STATE_OFFLINE == snd_scard_state) {
    if (in->is_st_session) {
        ALOGVV(" %s: reading on st session bytes=%zu", __func__, bytes);
        /* Read from sound trigger HAL */
        audio_extn_sound_trigger_read(in, buffer, bytes);
        pthread_mutex_unlock(&in->lock);
        return bytes;
    }

    if (in->pcm && (SND_CARD_STATE_OFFLINE == snd_scard_state)) {
        ALOGD(" %s: sound card is not active/SSR state", __func__);
        ret= -EIO;;
        goto exit;
        } else {
            if (in->is_st_session &&  !in->is_st_session_active) {
                ALOGD(" %s: Sound trigger is not active/SSR", __func__);
                ret= -EIO;;
                goto exit;
            }
        }
    }

    if (in->standby) {
        if (!in->is_st_session) {
        pthread_mutex_lock(&adev->lock);
        if (in->usecase == USECASE_COMPRESS_VOIP_CALL)
            ret = voice_extn_compress_voip_start_input_stream(in);
@@ -2627,7 +2626,6 @@ static ssize_t in_read(struct audio_stream_in *stream, void *buffer,
        if (ret != 0) {
            goto exit;
        }
        }
        in->standby = 0;
    }

@@ -2656,17 +2654,9 @@ static ssize_t in_read(struct audio_stream_in *stream, void *buffer,
exit:
    /* ToDo: There may be a corner case when SSR happens back to back during
       start/stop. Need to post different error to handle that. */
    if (-ENETRESET == ret) {
        /* CPE SSR results in kernel returning ENETRESET for sound trigger
          session reading on LAB data. In this case do not set sound card state
          offline, instead mark this sound trigger session inactive to avoid
          further reading of LAB data from CPE driver. Marking the session
          inactive handles both CPE and ADSP SSR for sound trigger session */
        if (!in->is_st_session)
    if (-ENETRESET == ret)
        set_snd_card_state(adev,SND_CARD_STATE_OFFLINE);
        else
            in->is_st_session_active = false;
    }

    pthread_mutex_unlock(&in->lock);

    if (ret != 0) {
@@ -3385,7 +3375,7 @@ static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev __unu
}

static int adev_open_input_stream(struct audio_hw_device *dev,
                                  audio_io_handle_t handle __unused,
                                  audio_io_handle_t handle,
                                  audio_devices_t devices,
                                  struct audio_config *config,
                                  struct audio_stream_in **stream_in,