Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Audio: DRC: Add processing enable switch control #8474

Merged
merged 2 commits into from
Dec 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 37 additions & 2 deletions src/audio/drc/drc.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,13 @@ static int drc_init(struct processing_module *mod)
}

drc_reset_state(&cd->state);

/* Initialize DRC to enabled. If defined by topology, a control may set
* enabled to false before prepare() or during streaming with the switch
* control from user space.
*/
cd->enabled = true;
cd->enable_switch = true;
btian1 marked this conversation as resolved.
Show resolved Hide resolved
return 0;

cd_fail:
Expand All @@ -203,15 +210,40 @@ static int drc_free(struct processing_module *mod)
return 0;
}

static int drc_set_config(struct processing_module *mod, uint32_t config_id,
static int drc_set_config(struct processing_module *mod, uint32_t param_id,
enum module_cfg_fragment_position pos, uint32_t data_offset_size,
const uint8_t *fragment, size_t fragment_size, uint8_t *response,
size_t response_size)
{
struct drc_comp_data *cd = module_get_private_data(mod);
struct comp_dev *dev = mod->dev;

comp_dbg(dev, "drc_set_config()");

comp_info(mod->dev, "drc_set_config()");
#if CONFIG_IPC_MAJOR_4
struct sof_ipc4_control_msg_payload *ctl = (struct sof_ipc4_control_msg_payload *)fragment;

switch (param_id) {
case SOF_IPC4_SWITCH_CONTROL_PARAM_ID:
if (ctl->id == SOF_DRC_CTRL_INDEX_ENABLE_SWITCH &&
ctl->num_elems == SOF_DRC_NUM_ELEMS_ENABLE_SWITCH) {
cd->enable_switch = ctl->chanv[0].value;
comp_info(dev, "drc_set_config(), enable_switch = %d", cd->enable_switch);
} else {
comp_err(dev, "Illegal switch control id = %d, num_elems = %d",
ctl->id, ctl->num_elems);
return -EINVAL;
}

return 0;

case SOF_IPC4_ENUM_CONTROL_PARAM_ID:
comp_err(dev, "drc_set_config(), illegal control.");
return -EINVAL;
}
#endif

comp_info(dev, "drc_set_config(), bytes control");
btian1 marked this conversation as resolved.
Show resolved Hide resolved
return comp_data_blob_set(cd->model_handler, pos, data_offset_size, fragment,
fragment_size);
}
Expand Down Expand Up @@ -262,6 +294,9 @@ static int drc_process(struct processing_module *mod,
}
}

/* Control pass-though in processing function with switch control */
cd->enabled = cd->config && cd->config->params.enabled && cd->enable_switch;

cd->drc_func(mod, source, sink, frames);

/* calc new free and available */
Expand Down
10 changes: 9 additions & 1 deletion src/audio/drc/drc.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ struct comp_dev;
#define DRC_DIVISION_FRAMES 32
#define DRC_DIVISION_FRAMES_MASK (DRC_DIVISION_FRAMES - 1)

/* First switch control instance is zero (SOF_IPC4_SWITCH_CONTROL_PARAM_ID), and the
* control is common for all channels.
*/
#define SOF_DRC_CTRL_INDEX_ENABLE_SWITCH 0
#define SOF_DRC_NUM_ELEMS_ENABLE_SWITCH 1

/* Stores the state of DRC */
struct drc_state {
/* The detector_average is the target gain obtained by looking at the
Expand Down Expand Up @@ -71,8 +77,10 @@ struct drc_comp_data {
struct comp_data_blob_handler *model_handler;
struct sof_drc_config *config; /**< pointer to setup blob */
bool config_ready; /**< set when fully received */
bool enabled; /**< control processing via blob and switch */
bool enable_switch; /**< enable switch state */
enum sof_ipc_frame source_format; /**< source frame format */
drc_func drc_func; /**< processing function */
drc_func drc_func; /**< processing function */
};

struct drc_proc_fnmap {
Expand Down
6 changes: 3 additions & 3 deletions src/audio/drc/drc_generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,7 @@ static void drc_s16_default(struct processing_module *mod,
int fragment_samples;
int fragment;

if (!p->enabled) {
if (!cd->enabled) {
/* Delay the input sample only and don't do other processing. This is used when the
* DRC is disabled. We want to do this to match the processing delay of other bands
* in multi-band DRC kernel case.
Expand Down Expand Up @@ -690,7 +690,7 @@ static void drc_s24_default(struct processing_module *mod,
int fragment_samples;
int fragment;

if (!p->enabled) {
if (!cd->enabled) {
/* Delay the input sample only and don't do other processing. This is used when the
* DRC is disabled. We want to do this to match the processing delay of other bands
* in multi-band DRC kernel case. Note: use 32 bit delay function.
Expand Down Expand Up @@ -738,7 +738,7 @@ static void drc_s32_default(struct processing_module *mod,
int fragment_samples;
int fragment;

if (!p->enabled) {
if (!cd->enabled) {
/* Delay the input sample only and don't do other processing. This is used when the
* DRC is disabled. We want to do this to match the processing delay of other bands
* in multi-band DRC kernel case.
Expand Down
9 changes: 7 additions & 2 deletions tools/topology/topology2/cavs-mixin-mixout-efx-hda.conf
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,13 @@ Object.Pipeline {
}
}
Object.Widget.drc.1 {
Object.Control.bytes."1" {
name 'Post Mixer $ANALOG_PLAYBACK_PCM DRC'
Object.Control {
bytes."1" {
name 'Post Mixer $ANALOG_PLAYBACK_PCM DRC bytes'
}
mixer."1" {
name 'Post Mixer $ANALOG_PLAYBACK_PCM DRC switch'
}
}
}
}
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Created initially with script "./bench_comp_generate.sh drc"
# may need edits to modify controls
Object.Control {
# Un-comment the supported controls in DRC
bytes."1" {
name '$ANALOG_CAPTURE_PCM DRC bytes'
IncludeByKey.BENCH_DRC_PARAMS {
"default" "include/components/drc/default.conf"
"enabled" "include/components/drc/enabled.conf"
"passthrough" "include/components/drc/passthrough.conf"
}
}
mixer."1" {
name '$ANALOG_CAPTURE_PCM DRC switch'
}
#enum."1" {
# name '$ANALOG_CAPTURE_PCM DRC enum'
#}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Created initially with script "./bench_comp_generate.sh drc"
# may need edits to modify controls
Object.Control {
# Un-comment the supported controls in DRC
bytes."1" {
name '$ANALOG_PLAYBACK_PCM DRC bytes'
IncludeByKey.BENCH_DRC_PARAMS {
"default" "include/components/drc/default.conf"
"enabled" "include/components/drc/enabled.conf"
"passthrough" "include/components/drc/passthrough.conf"
}
}
mixer."1" {
name '$ANALOG_PLAYBACK_PCM DRC switch'
}
#enum."1" {
# name '$ANALOG_PLAYBACK_PCM DRC enum'
#}
}
4 changes: 2 additions & 2 deletions tools/topology/topology2/include/bench/drc_s16.conf
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
Object.Widget.drc.1 {
index 1
<include/bench/one_input_output_format_s16.conf>
<include/bench/drc_control_bytes_playback.conf>
<include/bench/drc_controls_playback.conf>
}
Object.Widget.drc.2 {
index 3
<include/bench/one_input_output_format_s16.conf>
<include/bench/drc_control_bytes_capture.conf>
<include/bench/drc_controls_capture.conf>
}
<include/bench/host_io_gateway_pipelines_s16.conf>
<include/bench/drc_hda_route.conf>
4 changes: 2 additions & 2 deletions tools/topology/topology2/include/bench/drc_s24.conf
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
Object.Widget.drc.1 {
index 1
<include/bench/one_input_output_format_s24.conf>
<include/bench/drc_control_bytes_playback.conf>
<include/bench/drc_controls_playback.conf>
}
Object.Widget.drc.2 {
index 3
<include/bench/one_input_output_format_s24.conf>
<include/bench/drc_control_bytes_capture.conf>
<include/bench/drc_controls_capture.conf>
}
<include/bench/host_io_gateway_pipelines_s24.conf>
<include/bench/drc_hda_route.conf>
4 changes: 2 additions & 2 deletions tools/topology/topology2/include/bench/drc_s32.conf
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
Object.Widget.drc.1 {
index 1
<include/bench/one_input_output_format_s32.conf>
<include/bench/drc_control_bytes_playback.conf>
<include/bench/drc_controls_playback.conf>
}
Object.Widget.drc.2 {
index 3
<include/bench/one_input_output_format_s32.conf>
<include/bench/drc_control_bytes_capture.conf>
<include/bench/drc_controls_capture.conf>
}
<include/bench/host_io_gateway_pipelines_s32.conf>
<include/bench/drc_hda_route.conf>
20 changes: 20 additions & 0 deletions tools/topology/topology2/include/components/drc.conf
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,26 @@ Class.Widget."drc" {
unique "instance"
}

#
# drc widget switch control
#
Object.Control {
mixer."1" {
Object.Base.channel.1 {
name "fc"
shift 0
}
Object.Base.ops.1 {
name "ctl"
info "volsw"
#259 binds the mixer control to switch get/put handlers
get 259
put 259
}
max 1
}
}

#
# Default attributes for drc
#
Expand Down