summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cras/src/server/cras_dsp_mod_builtin.c52
1 files changed, 52 insertions, 0 deletions
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
@@ -56,6 +56,56 @@ static void empty_init_module(struct dsp_module *module)
}
/*
+ * 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
*/
static int invert_lr_instantiate(struct dsp_module *module,
@@ -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);
}