Signed-off-by: David Henningsson <david.henningsson at canonical.com> --- src/Makefile.am | 1 + src/pulsecore/device-port.c | 53 +++++++++++++++++++++++++++++++++++++++ src/pulsecore/device-port.h | 58 +++++++++++++++++++++++++++++++++++++++++++ src/pulsecore/sink.c | 25 +----------------- src/pulsecore/sink.h | 17 +------------ src/pulsecore/source.c | 4 +- 6 files changed, 117 insertions(+), 41 deletions(-) create mode 100644 src/pulsecore/device-port.c create mode 100644 src/pulsecore/device-port.h diff --git a/src/Makefile.am b/src/Makefile.am index 9117004..93ebe8d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -809,6 +809,7 @@ libpulsecore_ at PA_MAJORMINOR@_la_SOURCES = \ pulsecore/shm.c pulsecore/shm.h \ pulsecore/sink-input.c pulsecore/sink-input.h \ pulsecore/sink.c pulsecore/sink.h \ + pulsecore/device-port.c pulsecore/device-port.h \ pulsecore/sioman.c pulsecore/sioman.h \ pulsecore/sound-file-stream.c pulsecore/sound-file-stream.h \ pulsecore/sound-file.c pulsecore/sound-file.h \ diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c new file mode 100644 index 0000000..d80b144 --- /dev/null +++ b/src/pulsecore/device-port.c @@ -0,0 +1,53 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman <ossman at cendio.se> for Cendio AB + + 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 "device-port.h" + +PA_DEFINE_PUBLIC_CLASS(pa_device_port, pa_object); + +static void device_port_free(pa_object *o) { + pa_device_port *p = PA_DEVICE_PORT(o); + pa_assert(p); + pa_assert(pa_device_port_refcnt(p) == 0); + + pa_xfree(p->name); + pa_xfree(p->description); + pa_xfree(p); +} + + +pa_device_port *pa_device_port_new(const char *name, const char *description, size_t extra) { + pa_device_port *p; + + pa_assert(name); + + p = PA_DEVICE_PORT(pa_object_new_internal(PA_ALIGN(sizeof(pa_device_port)) + extra, pa_device_port_type_id, pa_device_port_check_type)); + p->parent.free = device_port_free; + + p->name = pa_xstrdup(name); + p->description = pa_xstrdup(description); + p->priority = 0; + p->available = PA_PORT_AVAILABLE_UNKNOWN; + + return p; +} diff --git a/src/pulsecore/device-port.h b/src/pulsecore/device-port.h new file mode 100644 index 0000000..fa866a1 --- /dev/null +++ b/src/pulsecore/device-port.h @@ -0,0 +1,58 @@ +#ifndef foopulsedeviceporthfoo +#define foopulsedeviceporthfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman <ossman at cendio.se> for Cendio AB + + 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 <inttypes.h> + +#include <pulse/def.h> +#include <pulsecore/object.h> + +typedef struct pa_device_port pa_device_port; + +struct pa_device_port { + pa_object parent; /* Needed for reference counting */ + + char *name; + char *description; + + unsigned priority; + pa_port_available_t available; /**< PA_PORT_AVAILABLE_UNKNOWN, PA_PORT_AVAILABLE_NO or PA_PORT_AVAILABLE_YES \since MERGE_OF_JACK_DETECTION */ + + /* .. followed by some implementation specific data */ +}; + +PA_DECLARE_PUBLIC_CLASS(pa_device_port); +#define PA_DEVICE_PORT(s) (pa_device_port_cast(s)) + +#define PA_DEVICE_PORT_DATA(d) ((void*) ((uint8_t*) d + PA_ALIGN(sizeof(pa_device_port)))) + +pa_device_port *pa_device_port_new(const char *name, const char *description, size_t extra); +/*void pa_device_port_free(pa_device_port *p); */ + +#endif diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index 45761a6..7dd0868 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -135,7 +135,7 @@ void pa_sink_new_data_done(pa_sink_new_data *data) { pa_device_port *p; while ((p = pa_hashmap_steal_first(data->ports))) - pa_device_port_free(p); + pa_device_port_unref(p); pa_hashmap_free(data->ports, NULL, NULL); } @@ -144,27 +144,6 @@ void pa_sink_new_data_done(pa_sink_new_data *data) { pa_xfree(data->active_port); } -pa_device_port *pa_device_port_new(const char *name, const char *description, size_t extra) { - pa_device_port *p; - - pa_assert(name); - - p = pa_xmalloc(PA_ALIGN(sizeof(pa_device_port)) + extra); - p->name = pa_xstrdup(name); - p->description = pa_xstrdup(description); - - p->priority = 0; - - return p; -} - -void pa_device_port_free(pa_device_port *p) { - pa_assert(p); - - pa_xfree(p->name); - pa_xfree(p->description); - pa_xfree(p); -} /* Called from main context */ static void reset_callbacks(pa_sink *s) { @@ -612,7 +591,7 @@ static void sink_free(pa_object *o) { pa_device_port *p; while ((p = pa_hashmap_steal_first(s->ports))) - pa_device_port_free(p); + pa_device_port_unref(p); pa_hashmap_free(s->ports, NULL, NULL); } diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index a01f4b0..a2d9ea5 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -24,7 +24,6 @@ ***/ typedef struct pa_sink pa_sink; -typedef struct pa_device_port pa_device_port; typedef struct pa_sink_volume_change pa_sink_volume_change; #include <inttypes.h> @@ -42,6 +41,7 @@ typedef struct pa_sink_volume_change pa_sink_volume_change; #include <pulsecore/asyncmsgq.h> #include <pulsecore/msgobject.h> #include <pulsecore/rtpoll.h> +#include <pulsecore/device-port.h> #include <pulsecore/card.h> #include <pulsecore/queue.h> #include <pulsecore/thread-mq.h> @@ -54,18 +54,6 @@ static inline pa_bool_t PA_SINK_IS_LINKED(pa_sink_state_t x) { return x == PA_SINK_RUNNING || x == PA_SINK_IDLE || x == PA_SINK_SUSPENDED; } -struct pa_device_port { - char *name; - char *description; - - unsigned priority; - pa_port_available_t available; /**< PA_PORT_AVAILABLE_UNKNOWN, PA_PORT_AVAILABLE_NO or PA_PORT_AVAILABLE_YES \since MERGE_OF_JACK_DETECTION */ - - /* .. followed by some implementation specific data */ -}; - -#define PA_DEVICE_PORT_DATA(d) ((void*) ((uint8_t*) d + PA_ALIGN(sizeof(pa_device_port)))) - struct pa_sink { pa_msgobject parent; @@ -446,9 +434,6 @@ void pa_sink_invalidate_requested_latency(pa_sink *s, pa_bool_t dynamic); pa_usec_t pa_sink_get_latency_within_thread(pa_sink *s); -pa_device_port *pa_device_port_new(const char *name, const char *description, size_t extra); -void pa_device_port_free(pa_device_port *p); - /* Verify that we called in IO context (aka 'thread context), or that * the sink is not yet set up, i.e. the thread not set up yet. See * pa_assert_io_context() in thread-mq.h for more information. */ diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c index 7024802..eaedd4e 100644 --- a/src/pulsecore/source.c +++ b/src/pulsecore/source.c @@ -127,7 +127,7 @@ void pa_source_new_data_done(pa_source_new_data *data) { pa_device_port *p; while ((p = pa_hashmap_steal_first(data->ports))) - pa_device_port_free(p); + pa_device_port_unref(p); pa_hashmap_free(data->ports, NULL, NULL); } @@ -523,7 +523,7 @@ static void source_free(pa_object *o) { pa_device_port *p; while ((p = pa_hashmap_steal_first(s->ports))) - pa_device_port_free(p); + pa_device_port_unref(p); pa_hashmap_free(s->ports, NULL, NULL); } -- 1.7.4.1