[pulseaudio-discuss] [PATCH v2 6/9] device-port: Add "linked" flag
Tanu Kaskinen
tanuk at iki.fi
Wed Feb 20 10:24:01 PST 2013
The flag will be used in the upcoming pa_device_port_update_proplist()
function.
---
src/pulsecore/card.c | 25 ++++++++++++++++++++-----
src/pulsecore/device-port.c | 12 ++++++++++++
src/pulsecore/device-port.h | 6 ++++++
3 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c
index ae81fcb..8ae3567 100644
--- a/src/pulsecore/card.c
+++ b/src/pulsecore/card.c
@@ -229,12 +229,17 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
pa_device_init_icon(c->proplist, TRUE);
pa_device_init_intended_roles(c->proplist);
+ /* The rest could be separated into pa_card_put(), if a need arises. */
+
pa_assert_se(pa_idxset_put(core->cards, c, &c->index) >= 0);
+ pa_log_info("Created card %u \"%s\"", c->index, c->name);
- pa_log_info("Created %u \"%s\"", c->index, c->name);
- pa_subscription_post(core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_NEW, c->index);
+ PA_HASHMAP_FOREACH(port, c->ports, state)
+ pa_device_port_put(port);
+ pa_subscription_post(core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_NEW, c->index);
pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_PUT], c);
+
return c;
}
@@ -247,14 +252,24 @@ void pa_card_free(pa_card *c) {
core = c->core;
pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_UNLINK], c);
+ pa_subscription_post(c->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_REMOVE, c->index);
- pa_namereg_unregister(core, c->name);
+ if (c->ports) {
+ pa_device_port *port;
+ void *state;
+
+ PA_HASHMAP_FOREACH(port, c->ports, state)
+ pa_device_port_unlink(port);
+ }
pa_idxset_remove_by_data(c->core->cards, c, NULL);
- pa_log_info("Freed %u \"%s\"", c->index, c->name);
+ /* Everything above could be separated into pa_card_unlink(), if a need
+ * arises. */
- pa_subscription_post(c->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_REMOVE, c->index);
+ pa_namereg_unregister(core, c->name);
+
+ pa_log_info("Freeing card %u \"%s\"", c->index, c->name);
pa_assert(pa_idxset_isempty(c->sinks));
pa_idxset_free(c->sinks, NULL);
diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c
index 3934c9c..ad885d3 100644
--- a/src/pulsecore/device-port.c
+++ b/src/pulsecore/device-port.c
@@ -75,6 +75,18 @@ pa_device_port *pa_device_port_new(pa_core *c, const char *name, const char *des
return p;
}
+void pa_device_port_put(pa_device_port *port) {
+ pa_assert(port);
+
+ port->linked = true;
+}
+
+void pa_device_port_unlink(pa_device_port *port) {
+ pa_assert(port);
+
+ port->linked = false;
+}
+
void pa_device_port_set_latency_offset(pa_device_port *p, int64_t offset) {
uint32_t state;
pa_core *core;
diff --git a/src/pulsecore/device-port.h b/src/pulsecore/device-port.h
index 673f67f..be7dd4c 100644
--- a/src/pulsecore/device-port.h
+++ b/src/pulsecore/device-port.h
@@ -54,6 +54,8 @@ struct pa_device_port {
pa_bool_t is_output:1;
int64_t latency_offset;
+ bool linked;
+
/* .. followed by some implementation specific data */
};
@@ -62,6 +64,10 @@ struct pa_device_port {
pa_device_port *pa_device_port_new(pa_core *c, const char *name, const char *description, size_t extra);
void pa_device_port_free(pa_device_port *p);
+/* Called from card.c, nobody else should call these. */
+void pa_device_port_put(pa_device_port *port);
+void pa_device_port_unlink(pa_device_port *port);
+
/* The port's available status has changed */
void pa_device_port_set_available(pa_device_port *p, pa_available_t available);
--
1.7.10.4
More information about the pulseaudio-discuss
mailing list