[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