Merge "hal: add support for configuring render window"
This commit is contained in:
commit
32d50419a1
|
@ -306,4 +306,12 @@ typedef enum {
|
||||||
AUDIO_EXTN_PARAM_LICENSE_PARAMS,
|
AUDIO_EXTN_PARAM_LICENSE_PARAMS,
|
||||||
} audio_extn_param_id;
|
} 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 */
|
#endif /* AUDIO_DEFS_H */
|
||||||
|
|
|
@ -1478,6 +1478,33 @@ int audio_extn_out_set_param_data(struct stream_out *out,
|
||||||
return ret;
|
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 */
|
/* API to get playback stream specific config parameters */
|
||||||
int audio_extn_out_get_param_data(struct stream_out *out,
|
int audio_extn_out_get_param_data(struct stream_out *out,
|
||||||
audio_extn_param_id param_id,
|
audio_extn_param_id param_id,
|
||||||
|
|
|
@ -999,6 +999,14 @@ int audio_extn_hw_loopback_set_audio_port_config(struct audio_hw_device *dev,
|
||||||
const struct audio_port_config *config);
|
const struct audio_port_config *config);
|
||||||
int audio_extn_hw_loopback_get_audio_port(struct audio_hw_device *dev,
|
int audio_extn_hw_loopback_get_audio_port(struct audio_hw_device *dev,
|
||||||
struct audio_port *port_in);
|
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);
|
int audio_extn_hw_loopback_init(struct audio_device *adev);
|
||||||
void audio_extn_hw_loopback_deinit(struct audio_device *adev);
|
void audio_extn_hw_loopback_deinit(struct audio_device *adev);
|
||||||
#else
|
#else
|
||||||
|
@ -1026,6 +1034,18 @@ static int __unused audio_extn_hw_loopback_get_audio_port(struct audio_hw_device
|
||||||
{
|
{
|
||||||
return -ENOSYS;
|
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)
|
static int __unused audio_extn_hw_loopback_init(struct audio_device *adev __unused)
|
||||||
{
|
{
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
|
|
|
@ -357,6 +357,78 @@ int loopback_stream_cb(stream_callback_event_t event, void *param, void *cookie)
|
||||||
return 0;
|
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
|
#if defined SNDRV_COMPRESS_LATENCY_MODE
|
||||||
static void transcode_loopback_util_set_latency_mode(
|
static void transcode_loopback_util_set_latency_mode(
|
||||||
loopback_patch_t *active_loopback_patch,
|
loopback_patch_t *active_loopback_patch,
|
||||||
|
|
|
@ -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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* 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;
|
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)
|
void qahwi_init(hw_device_t *device)
|
||||||
{
|
{
|
||||||
struct audio_device *adev = (struct audio_device *) device;
|
struct audio_device *adev = (struct audio_device *) device;
|
||||||
|
|
|
@ -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.
|
* Not a Contribution.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 The Android Open Source Project *
|
* 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 */
|
/* Release an audio patch */
|
||||||
int qahw_release_audio_patch_l(qahw_module_handle_t *hw_module,
|
int qahw_release_audio_patch_l(qahw_module_handle_t *hw_module,
|
||||||
audio_patch_handle_t handle);
|
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.
|
/* Fills the list of supported attributes for a given audio port.
|
||||||
* As input, "port" contains the information (type, role, address etc...)
|
* As input, "port" contains the information (type, role, address etc...)
|
||||||
* needed by the HAL to identify the port.
|
* needed by the HAL to identify the port.
|
||||||
|
|
|
@ -417,6 +417,14 @@ typedef enum {
|
||||||
QAHW_PARAM_LICENSE_PARAMS,
|
QAHW_PARAM_LICENSE_PARAMS,
|
||||||
} qahw_param_id;
|
} 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
|
__END_DECLS
|
||||||
|
|
||||||
#endif // QTI_AUDIO_HAL_DEFS_H
|
#endif // QTI_AUDIO_HAL_DEFS_H
|
||||||
|
|
|
@ -69,6 +69,10 @@ typedef int (*qahwi_out_get_param_data_t)(struct audio_stream_out *out,
|
||||||
qahw_param_id param_id,
|
qahw_param_id param_id,
|
||||||
qahw_param_payload *payload);
|
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 {
|
typedef struct {
|
||||||
audio_hw_device_t *audio_device;
|
audio_hw_device_t *audio_device;
|
||||||
char module_name[MAX_MODULE_NAME_LENGTH];
|
char module_name[MAX_MODULE_NAME_LENGTH];
|
||||||
|
@ -80,6 +84,7 @@ typedef struct {
|
||||||
const hw_module_t* module;
|
const hw_module_t* module;
|
||||||
qahwi_get_param_data_t qahwi_get_param_data;
|
qahwi_get_param_data_t qahwi_get_param_data;
|
||||||
qahwi_set_param_data_t qahwi_set_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;
|
} qahw_module_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -1438,6 +1443,34 @@ exit:
|
||||||
return ret;
|
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.
|
/* Fills the list of supported attributes for a given audio port.
|
||||||
* As input, "port" contains the information (type, role, address etc...)
|
* As input, "port" contains the information (type, role, address etc...)
|
||||||
* needed by the HAL to identify the port.
|
* 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)
|
if (!qahw_module->qahwi_set_param_data)
|
||||||
ALOGD("%s::qahwi_set_param_data api is not defined\n",__func__);
|
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)
|
if (!qahw_list_count)
|
||||||
list_init(&qahw_module_list);
|
list_init(&qahw_module_list);
|
||||||
qahw_list_count++;
|
qahw_list_count++;
|
||||||
|
|
|
@ -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.
|
* Not a Contribution.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2011 The Android Open Source Project *
|
* 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 */
|
/* Release an audio patch */
|
||||||
int qahw_release_audio_patch(qahw_module_handle_t *hw_module,
|
int qahw_release_audio_patch(qahw_module_handle_t *hw_module,
|
||||||
audio_patch_handle_t handle);
|
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.
|
/* Fills the list of supported attributes for a given audio port.
|
||||||
* As input, "port" contains the information (type, role, address etc...)
|
* As input, "port" contains the information (type, role, address etc...)
|
||||||
* needed by the HAL to identify the port.
|
* needed by the HAL to identify the port.
|
||||||
|
|
|
@ -399,6 +399,15 @@ typedef enum {
|
||||||
QAHW_PARAM_LICENSE_PARAMS,
|
QAHW_PARAM_LICENSE_PARAMS,
|
||||||
} qahw_param_id;
|
} 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
|
__END_DECLS
|
||||||
|
|
||||||
#endif // QTI_AUDIO_HAL_DEFS_H
|
#endif // QTI_AUDIO_HAL_DEFS_H
|
||||||
|
|
|
@ -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
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are
|
* 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,
|
int qahw_get_audio_port(qahw_module_handle_t *hw_module,
|
||||||
struct audio_port *port)
|
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);
|
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,
|
int qahw_get_audio_port(qahw_module_handle_t *hw_module,
|
||||||
struct audio_port *port)
|
struct audio_port *port)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue