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