From 9e6d58368b2f2d1a3a9d9281433470a6319e9847 Mon Sep 17 00:00:00 2001 From: Cheng-Yi Chiang Date: Sun, 18 Sep 2016 03:01:53 +0800 Subject: CRAS: dps_mod_builtin - Add a swap_lr built-in module This module swaps data on left and right channels. BUG=chromium:645051 TEST=Insert one swap_lr section in dsp.ini and check left and right channels are swapped. [swap_lr] library=builtin label=swap_lr input_0={swap_lr:0} input_1={swap_lr:1} output_2={dst:1} output_3={dst:0} Change-Id: I687e69bcc13375436f9535db97514b3a60580376 Reviewed-on: https://chromium-review.googlesource.com/386701 Commit-Ready: Cheng-Yi Chiang Tested-by: Cheng-Yi Chiang Reviewed-by: Chinyue Chen Reviewed-by: Dylan Reid --- cras/src/server/cras_dsp_mod_builtin.c | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'cras') diff --git a/cras/src/server/cras_dsp_mod_builtin.c b/cras/src/server/cras_dsp_mod_builtin.c index de93cb08..c6948795 100644 --- a/cras/src/server/cras_dsp_mod_builtin.c +++ b/cras/src/server/cras_dsp_mod_builtin.c @@ -55,6 +55,56 @@ static void empty_init_module(struct dsp_module *module) module->dump = &empty_dump; } +/* + * swap_lr module functions + */ +static int swap_lr_instantiate(struct dsp_module *module, + unsigned long sample_rate) +{ + module->data = calloc(4, sizeof(float*)); + return 0; +} + +static void swap_lr_connect_port(struct dsp_module *module, + unsigned long port, float *data_location) +{ + float **ports; + ports = (float **)module->data; + ports[port] = data_location; +} + +static void swap_lr_run(struct dsp_module *module, + unsigned long sample_count) +{ + size_t i; + float **ports = (float **)module->data; + + /* This module runs dsp in-place, so ports[0] == ports[2], + * ports[1] == ports[3]. Here we swap data on two channels. + */ + for (i = 0; i < sample_count; i++) { + float temp = ports[0][i]; + ports[2][i] = ports[1][i]; + ports[3][i] = temp; + } +} + +static void swap_lr_deinstantiate(struct dsp_module *module) +{ + free(module->data); +} + +static void swap_lr_init_module(struct dsp_module *module) +{ + module->instantiate = &swap_lr_instantiate; + module->connect_port = &swap_lr_connect_port; + module->get_delay = &empty_get_delay; + module->run = &swap_lr_run; + module->deinstantiate = &swap_lr_deinstantiate; + module->free_module = &empty_free_module; + module->get_properties = &empty_get_properties; +} + /* * invert_lr module functions */ @@ -424,6 +474,8 @@ struct dsp_module *cras_dsp_module_load_builtin(struct plugin *plugin) eq2_init_module(module); } else if (strcmp(plugin->label, "drc") == 0) { drc_init_module(module); + } else if (strcmp(plugin->label, "swap_lr") == 0) { + swap_lr_init_module(module); } else { empty_init_module(module); } -- cgit v1.2.3