[pulseaudio-discuss] [PATCH 21/23] Introduce pa_router
Tanu Kaskinen
tanu.kaskinen at linux.intel.com
Wed Nov 20 01:26:13 PST 2013
Router modules will create a pa_router object, and extend its
functionality with callbacks. There can be only one router in the
system at a time. At this first stage, the only functionality the base
pa_router is to notify the router modules about new and removed nodes.
---
src/Makefile.am | 1 +
src/pulsecore/core.c | 18 ++++++++++
src/pulsecore/core.h | 6 ++++
src/pulsecore/router.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/pulsecore/router.h | 47 ++++++++++++++++++++++++++
5 files changed, 163 insertions(+)
create mode 100644 src/pulsecore/router.c
create mode 100644 src/pulsecore/router.h
diff --git a/src/Makefile.am b/src/Makefile.am
index 168415e..4e71af8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -890,6 +890,7 @@ libpulsecore_ at PA_MAJORMINOR@_la_SOURCES = \
pulsecore/remap.c pulsecore/remap.h \
pulsecore/remap_mmx.c pulsecore/remap_sse.c \
pulsecore/resampler.c pulsecore/resampler.h \
+ pulsecore/router.c pulsecore/router.h \
pulsecore/rtpoll.c pulsecore/rtpoll.h \
pulsecore/mix.c pulsecore/mix.h \
pulsecore/cpu.h \
diff --git a/src/pulsecore/core.c b/src/pulsecore/core.c
index cc8915c..40f754c 100644
--- a/src/pulsecore/core.c
+++ b/src/pulsecore/core.c
@@ -217,6 +217,24 @@ static void core_free(pa_object *o) {
pa_xfree(c);
}
+int pa_core_set_router(pa_core *c, pa_router *router) {
+ pa_assert(c);
+
+ if (c->router && router) {
+ pa_log("Tried to set the router when the router was already set.");
+ return -1;
+ }
+
+ c->router = router;
+
+ if (c->router)
+ pa_log_info("Router set.");
+ else
+ pa_log_info("Router unset.");
+
+ return 0;
+}
+
static void exit_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
pa_core *c = userdata;
pa_assert(c->exit_event == e);
diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h
index b2df5b5..b555608 100644
--- a/src/pulsecore/core.h
+++ b/src/pulsecore/core.h
@@ -53,6 +53,8 @@ typedef enum pa_suspend_cause {
#include <pulsecore/core-subscribe.h>
#include <pulsecore/msgobject.h>
+typedef struct pa_router pa_router;
+
typedef enum pa_server_type {
PA_SERVER_TYPE_UNSET,
PA_SERVER_TYPE_USER,
@@ -185,6 +187,8 @@ struct pa_core {
pa_server_type_t server_type;
pa_cpu_info cpu_info;
+ pa_router *router;
+
/* hooks */
pa_hook hooks[PA_CORE_HOOK_MAX];
};
@@ -199,6 +203,8 @@ enum {
pa_core* pa_core_new(pa_mainloop_api *m, bool shared, size_t shm_size);
+int pa_core_set_router(pa_core *c, pa_router *router);
+
/* Check whether no one is connected to this core */
void pa_core_check_idle(pa_core *c);
diff --git a/src/pulsecore/router.c b/src/pulsecore/router.c
new file mode 100644
index 0000000..5d51f66
--- /dev/null
+++ b/src/pulsecore/router.c
@@ -0,0 +1,91 @@
+/***
+ 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 "router.h"
+
+static void router_unlink(pa_router *router);
+
+pa_router *pa_router_new(pa_core *core) {
+ pa_router *router;
+
+ pa_assert(core);
+
+ router = pa_xnew0(pa_router, 1);
+ router->core = core;
+
+ return router;
+}
+
+int pa_router_put(pa_router *router) {
+ int r;
+
+ pa_assert(router);
+
+ r = pa_core_set_router(router->core, router);
+
+ if (r < 0)
+ goto fail;
+
+ router->registered = true;
+
+ return 0;
+
+fail:
+ router_unlink(router);
+
+ return -1;
+}
+
+static void router_unlink(pa_router *router) {
+ pa_assert(router);
+
+ if (router->registered)
+ pa_core_set_router(router->core, NULL);
+
+ router->registered = false;
+}
+
+void pa_router_free(pa_router *router) {
+ pa_assert(router);
+
+ router_unlink(router);
+ pa_xfree(router);
+}
+
+void pa_router_add_node(pa_router *router, pa_node *node) {
+ pa_assert(router);
+ pa_assert(node);
+
+ if (router->add_node)
+ router->add_node(router, node);
+}
+
+void pa_router_remove_node(pa_router *router, pa_node *node) {
+ pa_assert(router);
+ pa_assert(node);
+
+ if (router->remove_node)
+ router->remove_node(router, node);
+}
diff --git a/src/pulsecore/router.h b/src/pulsecore/router.h
new file mode 100644
index 0000000..e8e7546
--- /dev/null
+++ b/src/pulsecore/router.h
@@ -0,0 +1,47 @@
+#ifndef foorouterhfoo
+#define foorouterhfoo
+
+/***
+ 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.
+***/
+
+#include <pulsecore/core.h>
+
+typedef struct pa_router pa_router;
+
+struct pa_router {
+ pa_core *core;
+ bool registered;
+
+ /* Called when a new node appears. May be NULL. */
+ void (*add_node)(pa_router *router, pa_node *node);
+
+ /* Called when a node goes away. May be NULL. */
+ void (*remove_node)(pa_router *router, pa_node *node);
+};
+
+pa_router *pa_router_new(pa_core *core);
+int pa_router_put(pa_router *router);
+void pa_router_free(pa_router *router);
+
+void pa_router_add_node(pa_router *router, pa_node *node);
+void pa_router_remove_node(pa_router *router, pa_node *node);
+
+#endif
--
1.8.3.1
More information about the pulseaudio-discuss
mailing list