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

Commit 580f1de0 authored by Trinath Thammishetty's avatar Trinath Thammishetty Committed by Gerrit - the friendly Code Review server
Browse files

hal: add support for configuring render window

Add support to set render window in transcode loopback usecase.
Render window is used by DSP to take rendering decision, i.e,
whether input frame should be rendered, dropped or repeated.

Change-Id: I87560a8e437b33dcd15094f30a532b3ed3d3749f
parent cb5b5789
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -306,4 +306,12 @@ typedef enum {
    AUDIO_EXTN_PARAM_LICENSE_PARAMS,
} audio_extn_param_id;

typedef union {
    struct audio_out_render_window_param render_window_params;
} audio_extn_loopback_param_payload;

typedef enum {
    AUDIO_EXTN_PARAM_LOOPBACK_RENDER_WINDOW /* PARAM to set render window */
} audio_extn_loopback_param_id;

#endif /* AUDIO_DEFS_H */
+27 −0
Original line number Diff line number Diff line
@@ -1522,6 +1522,33 @@ int audio_extn_out_set_param_data(struct stream_out *out,
    return ret;
}

#ifdef AUDIO_HW_LOOPBACK_ENABLED
int audio_extn_hw_loopback_set_param_data(audio_patch_handle_t handle,
                                          audio_extn_loopback_param_id param_id,
                                          audio_extn_loopback_param_payload *payload) {
    int ret = -EINVAL;

    if (!payload) {
        ALOGE("%s:: Invalid Param",__func__);
        return ret;
    }

    ALOGD("%d: %s: param id is %d\n", __LINE__, __func__, param_id);

    switch(param_id) {
        case AUDIO_EXTN_PARAM_LOOPBACK_RENDER_WINDOW:
            ret = audio_extn_hw_loopback_set_render_window(handle, payload);
            break;
        default:
            ALOGE("%s: unsupported param id %d", __func__, param_id);
            break;
    }

    return ret;
}
#endif


/* API to get playback stream specific config parameters */
int audio_extn_out_get_param_data(struct stream_out *out,
                             audio_extn_param_id param_id,
+20 −0
Original line number Diff line number Diff line
@@ -1037,6 +1037,14 @@ int audio_extn_hw_loopback_set_audio_port_config(struct audio_hw_device *dev,
                                    const struct audio_port_config *config);
int audio_extn_hw_loopback_get_audio_port(struct audio_hw_device *dev,
                                    struct audio_port *port_in);

int audio_extn_hw_loopback_set_param_data(audio_patch_handle_t handle,
                                          audio_extn_loopback_param_id param_id,
                                          audio_extn_loopback_param_payload *payload);

int audio_extn_hw_loopback_set_render_window(audio_patch_handle_t handle,
                                             struct audio_out_render_window_param *render_window);

int audio_extn_hw_loopback_init(struct audio_device *adev);
void audio_extn_hw_loopback_deinit(struct audio_device *adev);
#else
@@ -1064,6 +1072,18 @@ static int __unused audio_extn_hw_loopback_get_audio_port(struct audio_hw_device
{
    return -ENOSYS;
}
static int __unused audio_extn_hw_loopback_set_param_data(audio_patch_handle_t handle __unused,
                                               audio_extn_loopback_param_id param_id __unused,
                                               audio_extn_loopback_param_payload *payload __unused)
{
    return -ENOSYS;
}

static int __unused audio_extn_hw_loopback_set_render_window(audio_patch_handle_t handle __unused,
                                     struct audio_out_render_window_param *render_window __unused)
{
    return -ENOSYS;
}
static int __unused audio_extn_hw_loopback_init(struct audio_device *adev __unused)
{
    return -ENOSYS;
+72 −0
Original line number Diff line number Diff line
@@ -357,6 +357,78 @@ int loopback_stream_cb(stream_callback_event_t event, void *param, void *cookie)
    return 0;
}

#ifdef SNDRV_COMPRESS_RENDER_WINDOW
static loopback_patch_t *get_active_loopback_patch(audio_patch_handle_t handle)
{
    int n = 0;
    int patch_index = -1;
    loopback_patch_t *active_loopback_patch = NULL;

    for (n=0; n < MAX_NUM_PATCHES; n++) {
        if (audio_loopback_mod->patch_db.num_patches > 0) {
            if (audio_loopback_mod->patch_db.loopback_patch[n].patch_handle_id == handle) {
                patch_index = n;
                break;
            }
        } else {
            ALOGE("%s, No active audio loopback patch", __func__);
            return active_loopback_patch;
        }
    }

    if ((patch_index > -1) && (patch_index < MAX_NUM_PATCHES))
        active_loopback_patch = &(audio_loopback_mod->patch_db.loopback_patch[
                                patch_index]);
    else
        ALOGE("%s, Requested Patch handle does not exist", __func__);

    return active_loopback_patch;
}

int audio_extn_hw_loopback_set_render_window(audio_patch_handle_t handle,
                      struct audio_out_render_window_param *render_window)
{
    struct snd_compr_metadata metadata = {0};
    int ret = 0;
    loopback_patch_t *active_loopback_patch = get_active_loopback_patch(handle);

    if (active_loopback_patch == NULL) {
        ALOGE("%s: Invalid patch handle", __func__);
        ret = -EINVAL;
        goto exit;
    }

    if (render_window == NULL) {
        ALOGE("%s: Invalid render_window", __func__);
        ret = -EINVAL;
        goto exit;
    }

    metadata.key = SNDRV_COMPRESS_RENDER_WINDOW;
    /*render window start value */
    metadata.value[0] = 0xFFFFFFFF & render_window->render_ws; /* lsb */
    metadata.value[1] = \
            (0xFFFFFFFF00000000 & render_window->render_ws) >> 32; /* msb*/
    /*render window end value */
    metadata.value[2] = 0xFFFFFFFF & render_window->render_we; /* lsb */
    metadata.value[3] = \
            (0xFFFFFFFF00000000 & render_window->render_we) >> 32; /* msb*/

    ret = compress_set_metadata(active_loopback_patch->sink_stream, &metadata);

exit:
    return ret;
}
#else
int audio_extn_hw_loopback_set_render_window(struct audio_hw_device *dev,
                      audio_patch_handle_t handle __unused,
                      struct audio_out_render_window_param *render_window __unused)
{
    ALOGD("%s:: configuring render window not supported", __func__);
    return 0;
}
#endif

#if defined SNDRV_COMPRESS_LATENCY_MODE
static void transcode_loopback_util_set_latency_mode(
                             loopback_patch_t *active_loopback_patch,
+14 −1
Original line number Diff line number Diff line
/*
* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
* Copyright (c) 2016-2017, 2018, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -423,6 +423,19 @@ static int qahwi_open_output_stream(struct audio_hw_device *dev,
    return ret;
}

int qahwi_loopback_set_param_data(audio_patch_handle_t handle,
                                  audio_extn_loopback_param_id param_id,
                                  void *payload) {
    int ret = 0;

    ret = audio_extn_hw_loopback_set_param_data(
                                             handle,
                                             param_id,
                                             (audio_extn_loopback_param_payload *)payload);

    return ret;
}

void qahwi_init(hw_device_t *device)
{
    struct audio_device *adev = (struct audio_device *) device;
Loading