Merge "hal: add support for configuring render window"

This commit is contained in:
Linux Build Service Account 2018-10-22 20:27:57 -07:00 committed by Gerrit - the friendly Code Review server
commit 32d50419a1
11 changed files with 232 additions and 4 deletions

View File

@ -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 */

View File

@ -1478,6 +1478,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,

View File

@ -999,6 +999,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
@ -1026,6 +1034,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;

View File

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

View File

@ -1,5 +1,5 @@
/*
* 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;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright (C) 2011 The Android Open Source Project *
@ -463,6 +463,13 @@ int qahw_create_audio_patch_l(qahw_module_handle_t *hw_module,
/* Release an audio patch */
int qahw_release_audio_patch_l(qahw_module_handle_t *hw_module,
audio_patch_handle_t handle);
/* API to set loopback stream specific config parameters. */
int qahw_loopback_set_param_data_l(qahw_module_handle_t *hw_module,
audio_patch_handle_t handle,
qahw_loopback_param_id param_id,
qahw_loopback_param_payload *payload);
/* Fills the list of supported attributes for a given audio port.
* As input, "port" contains the information (type, role, address etc...)
* needed by the HAL to identify the port.

View File

@ -417,6 +417,14 @@ typedef enum {
QAHW_PARAM_LICENSE_PARAMS,
} qahw_param_id;
typedef union {
struct qahw_out_render_window_param render_window_params;
} qahw_loopback_param_payload;
typedef enum {
QAHW_PARAM_LOOPBACK_RENDER_WINDOW /* PARAM to set render window */
} qahw_loopback_param_id;
__END_DECLS
#endif // QTI_AUDIO_HAL_DEFS_H

View File

@ -69,6 +69,10 @@ typedef int (*qahwi_out_get_param_data_t)(struct audio_stream_out *out,
qahw_param_id param_id,
qahw_param_payload *payload);
typedef int (*qahwi_loopback_set_param_data_t)(audio_patch_handle_t patch_handle,
qahw_param_id param_id,
qahw_param_payload *payload);
typedef struct {
audio_hw_device_t *audio_device;
char module_name[MAX_MODULE_NAME_LENGTH];
@ -80,6 +84,7 @@ typedef struct {
const hw_module_t* module;
qahwi_get_param_data_t qahwi_get_param_data;
qahwi_set_param_data_t qahwi_set_param_data;
qahwi_loopback_set_param_data_t qahwi_loopback_set_param_data;
} qahw_module_t;
typedef struct {
@ -1438,6 +1443,34 @@ exit:
return ret;
}
int qahw_loopback_set_param_data_l(qahw_module_handle_t *hw_module,
audio_patch_handle_t handle,
qahw_loopback_param_id param_id,
qahw_loopback_param_payload *payload)
{
int ret = -EINVAL;
qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
if (!payload) {
ALOGE("%s:: invalid param", __func__);
goto exit;
}
if (qahw_module->qahwi_loopback_set_param_data) {
ret = qahw_module->qahwi_loopback_set_param_data(handle,
param_id,
(void *)payload);
} else {
ret = -ENOSYS;
ALOGE("%s not supported\n", __func__);
}
exit:
return ret;
}
/* Fills the list of supported attributes for a given audio port.
* As input, "port" contains the information (type, role, address etc...)
* needed by the HAL to identify the port.
@ -1889,6 +1922,12 @@ qahw_module_handle_t *qahw_load_module_l(const char *hw_module_id)
if (!qahw_module->qahwi_set_param_data)
ALOGD("%s::qahwi_set_param_data api is not defined\n",__func__);
qahw_module->qahwi_loopback_set_param_data = (qahwi_loopback_set_param_data_t)
dlsym(module->dso,
"qahwi_loopback_set_param_data");
if (!qahw_module->qahwi_loopback_set_param_data)
ALOGD("%s::qahwi_loopback_set_param_data api is not defined\n", __func__);
if (!qahw_list_count)
list_init(&qahw_module_list);
qahw_list_count++;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright (C) 2011 The Android Open Source Project *
@ -459,6 +459,13 @@ int qahw_create_audio_patch(qahw_module_handle_t *hw_module,
/* Release an audio patch */
int qahw_release_audio_patch(qahw_module_handle_t *hw_module,
audio_patch_handle_t handle);
/* API to set loopback stream specific config parameters */
int qahw_loopback_set_param_data(qahw_module_handle_t *hw_module,
audio_patch_handle_t handle,
qahw_loopback_param_id param_id,
qahw_loopback_param_payload *payload);
/* Fills the list of supported attributes for a given audio port.
* As input, "port" contains the information (type, role, address etc...)
* needed by the HAL to identify the port.

View File

@ -399,6 +399,15 @@ typedef enum {
QAHW_PARAM_LICENSE_PARAMS,
} qahw_param_id;
typedef union {
struct qahw_out_render_window_param render_window_params;
} qahw_loopback_param_payload;
typedef enum {
QAHW_PARAM_LOOPBACK_RENDER_WINDOW /* PARAM to set render window */
} qahw_loopback_param_id;
__END_DECLS
#endif // QTI_AUDIO_HAL_DEFS_H

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
* Copyright (c) 2016-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
@ -915,6 +915,15 @@ int qahw_release_audio_patch(qahw_module_handle_t *hw_module,
}
}
int qahw_loopback_set_param_data(qahw_module_handle_t *hw_module __unused,
audio_patch_handle_t handle __unused,
qahw_loopback_param_id param_id __unused,
qahw_loopback_param_payload *payload __unused)
{
ALOGD("%d:%s", __LINE__, __func__);
return -ENOSYS;
}
int qahw_get_audio_port(qahw_module_handle_t *hw_module,
struct audio_port *port)
{
@ -1699,6 +1708,15 @@ int qahw_release_audio_patch(qahw_module_handle_t *hw_module,
return qahw_release_audio_patch_l(hw_module, handle);
}
int qahw_loopback_set_param_data(qahw_module_handle_t *hw_module,
audio_patch_handle_t handle,
qahw_loopback_param_id param_id,
qahw_loopback_param_payload *payload)
{
ALOGV("%d:%s\n", __LINE__, __func__);
return qahw_loopback_set_param_data_l(hw_module, handle, param_id, payload);
}
int qahw_get_audio_port(qahw_module_handle_t *hw_module,
struct audio_port *port)
{