[pulseaudio-discuss] [PATCH v2 6/9] device-port: Add "linked" flag

David Henningsson david.henningsson at canonical.com
Thu Mar 14 07:02:24 PDT 2013


On 02/20/2013 07:24 PM, Tanu Kaskinen wrote:
> The flag will be used in the upcoming pa_device_port_update_proplist()
> function.

If the flag's function is to protect against an initial change 
notification, does it really work? init_eld_ctls is called after 
pa_card_new in module-alsa-card.c.

If we need a flag at all, I'd prefer to keep it in the card struct 
rather than the port. That seems cleaner to me.

> ---
>   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);
>
>



-- 
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic


More information about the pulseaudio-discuss mailing list