[pulseaudio-discuss] [PATCH v2 21/21] New module: module-experimental-router
Tanu Kaskinen
tanu.kaskinen at linux.intel.com
Thu Dec 5 06:19:21 PST 2013
The experimental router will be used as a tool for exercising new
routing functionality in the core. Another goal is to evolve the
module into a Murphy module - it's expected that the module will gain
features that are only used in the Murphy module. A rename to
module-murphy should happen at some point.
This first version just routes streams to the default sink/source when
the streams are created.
---
src/Makefile.am | 8 ++
src/modules/module-experimental-router.c | 122 +++++++++++++++++++++++++++++++
2 files changed, 130 insertions(+)
create mode 100644 src/modules/module-experimental-router.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 168415e..e09d48a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1074,6 +1074,7 @@ endif
modlibexec_LTLIBRARIES += \
module-cli.la \
module-cli-protocol-tcp.la \
+ module-experimental-router.la \
module-simple-protocol-tcp.la \
module-null-sink.la \
module-null-source.la \
@@ -1357,6 +1358,7 @@ SYMDEF_FILES = \
module-cli-symdef.h \
module-cli-protocol-tcp-symdef.h \
module-cli-protocol-unix-symdef.h \
+ module-experimental-router-symdef.h \
module-pipe-sink-symdef.h \
module-pipe-source-symdef.h \
module-simple-protocol-tcp-symdef.h \
@@ -1915,6 +1917,12 @@ module_intended_roles_la_LDFLAGS = $(MODULE_LDFLAGS)
module_intended_roles_la_LIBADD = $(MODULE_LIBADD)
module_intended_roles_la_CFLAGS = $(AM_CFLAGS)
+# An experimental router module
+module_experimental_router_la_SOURCES = modules/module-experimental-router.c
+module_experimental_router_la_LDFLAGS = $(MODULE_LDFLAGS)
+module_experimental_router_la_LIBADD = $(MODULE_LIBADD)
+module_experimental_router_la_CFLAGS = $(AM_CFLAGS)
+
# Suspend-on-idle module
module_suspend_on_idle_la_SOURCES = modules/module-suspend-on-idle.c
module_suspend_on_idle_la_LDFLAGS = $(MODULE_LDFLAGS)
diff --git a/src/modules/module-experimental-router.c b/src/modules/module-experimental-router.c
new file mode 100644
index 0000000..fe918bc
--- /dev/null
+++ b/src/modules/module-experimental-router.c
@@ -0,0 +1,122 @@
+/***
+ This file is part of PulseAudio.
+
+ Copyright 2013 Intel Corporation
+
+ PulseAudio is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2.1 of the License,
+ or (at your option) any later version.
+
+ PulseAudio is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with PulseAudio; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "module-experimental-router-symdef.h"
+
+#include <pulsecore/i18n.h>
+#include <pulsecore/module.h>
+#include <pulsecore/namereg.h>
+
+PA_MODULE_AUTHOR("Tanu Kaskinen");
+PA_MODULE_DESCRIPTION(_("An experimental router module"));
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(true);
+
+struct userdata {
+ pa_hook_slot *node_set_initial_routing_slot;
+};
+
+static pa_hook_result_t node_set_initial_routing_cb(void *hook_data, void *call_data, void *userdata) {
+ pa_core *core = hook_data;
+ pa_node *node = call_data;
+ int r;
+
+ pa_assert(core);
+ pa_assert(node);
+
+ if (node->type != PA_NODE_TYPE_SINK_INPUT && node->type != PA_NODE_TYPE_SOURCE_OUTPUT)
+ goto finish;
+
+ if (node->type == PA_NODE_TYPE_SINK_INPUT) {
+ pa_sink_input *sink_input = node->owner;
+ pa_sink *default_sink;
+
+ pa_assert(sink_input->state == PA_SINK_INPUT_INIT);
+
+ if (sink_input->sink)
+ goto finish;
+
+ default_sink = pa_namereg_get_default_sink(core);
+
+ if (!default_sink)
+ goto fail;
+
+ r = pa_sink_input_set_initial_sink(sink_input, default_sink);
+ } else {
+ pa_source_output *source_output = node->owner;
+ pa_source *default_source;
+
+ pa_assert(source_output->state == PA_SOURCE_OUTPUT_INIT);
+
+ if (source_output->source)
+ goto finish;
+
+ default_source = pa_namereg_get_default_source(core);
+
+ if (!default_source)
+ goto fail;
+
+ r = pa_source_output_set_initial_source(source_output, default_source);
+ }
+
+ if (r < 0)
+ goto fail;
+
+finish:
+ pa_log_debug("Successfully routed node %s.", node->name);
+
+ return PA_HOOK_OK;
+
+fail:
+ pa_log_debug("Failed to route node %s.", node->name);
+
+ return PA_HOOK_OK;
+}
+
+int pa__init(pa_module *module) {
+ struct userdata *u;
+
+ pa_assert(module);
+
+ module->userdata = u = pa_xnew0(struct userdata, 1);
+ u->node_set_initial_routing_slot = pa_hook_connect(&module->core->hooks[PA_CORE_HOOK_NODE_SET_INITIAL_ROUTING],
+ PA_HOOK_NORMAL, node_set_initial_routing_cb, u);
+
+ return 0;
+}
+
+void pa__done(pa_module *module) {
+ struct userdata *u;
+
+ pa_assert(module);
+
+ if (!(u = module->userdata))
+ return;
+
+ if (u->node_set_initial_routing_slot)
+ pa_hook_slot_free(u->node_set_initial_routing_slot);
+
+ pa_xfree(u);
+}
--
1.8.3.1
More information about the pulseaudio-discuss
mailing list