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