On 11/20/2013 10:26 AM, Tanu Kaskinen wrote: > 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. Then there is another concept we can take away to keep it simple atm - there is no need to have a "base pa_router", you can just notify the router implementation through hooks instead. > --- > 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 > -- David Henningsson, Canonical Ltd. https://launchpad.net/~diwic