[pulseaudio-discuss] [PATCH v4 8/9] native: Add a proplist to the sink and source info.

David Henningsson david.henningsson at canonical.com
Thu Apr 12 06:42:33 PDT 2012


On 04/12/2012 01:59 PM, Tanu Kaskinen wrote:
> ---
>   PROTOCOL                        |   10 ++++--
>   configure.ac                    |    2 +-
>   src/modules/module-tunnel.c     |    5 +++
>   src/pulse/introspect.c          |   64 +++++++++++++++++++++++++++------------
>   src/pulse/introspect.h          |    2 ++
>   src/pulsecore/protocol-native.c |    4 +++
>   6 files changed, 64 insertions(+), 23 deletions(-)
>
> diff --git a/PROTOCOL b/PROTOCOL
> index acd53ba..eb35978 100644
> --- a/PROTOCOL
> +++ b/PROTOCOL
> @@ -287,8 +287,8 @@ New field in PA_COMMAND_UNDERFLOW:
>   ## v24, implemented by>= 2.0
>
>   New field in all commands that send/receive port introspection data
> -(PA_COMMAND_GET_(SOURCE|SINK)_OUTPUT_INFO,
> -PA_COMMAND_GET_(SOURCE|SINK)_OUTPUT_INFO_LIST):
> +(PA_COMMAND_GET_(SOURCE|SINK)_INFO,
> +PA_COMMAND_GET_(SOURCE|SINK)_INFO_LIST):
>
>       uint32_t available
>
> @@ -321,6 +321,12 @@ PA_COMMAND_GET_CARD_INFO_LIST), the following is added:
>
>   Profile names must match earlier sent profile names for the same card.
>
> +## v27, implemented by>= 3.0
> +
> +New field at the end of each port entry in sink and source info:
> +
> +    proplist
> +
>
>   #### If you just changed the protocol, read this
>   ## module-tunnel depends on the sink/source/sink-input/source-input protocol
> diff --git a/configure.ac b/configure.ac
> index def0d96..d6cec92 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -36,7 +36,7 @@ AC_SUBST(PA_MINOR, pa_minor)
>   AC_SUBST(PA_MAJORMINOR, pa_major.pa_minor)
>
>   AC_SUBST(PA_API_VERSION, 12)
> -AC_SUBST(PA_PROTOCOL_VERSION, 26)
> +AC_SUBST(PA_PROTOCOL_VERSION, 27)
>
>   # The stable ABI for client applications, for the version info x:y:z
>   # always will hold y=z
> diff --git a/src/modules/module-tunnel.c b/src/modules/module-tunnel.c
> index 4490d4e..be3aef1 100644
> --- a/src/modules/module-tunnel.c
> +++ b/src/modules/module-tunnel.c
> @@ -1021,6 +1021,11 @@ static int read_ports(struct userdata *u, pa_tagstruct *t)
>                   pa_log("Parse failure");
>                   return -PA_ERR_PROTOCOL;
>               }
> +
> +            if (u->version>= 27&&  pa_tagstruct_get_proplist(t, NULL)<  0) {
> +                pa_log("Protocol error: failed to read port proplist.");
> +                return -PA_ERR_PROTOCOL;
> +            }
>           }
>
>           if (pa_tagstruct_gets(t,&s)<  0) { /* active port */
> diff --git a/src/pulse/introspect.c b/src/pulse/introspect.c
> index 38a9d1c..be65fdd 100644
> --- a/src/pulse/introspect.c
> +++ b/src/pulse/introspect.c
> @@ -200,29 +200,33 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u
>
>               if (o->context->version>= 16) {
>                   if (i.n_ports>  0) {
> -                    i.ports = pa_xnew(pa_sink_port_info*, i.n_ports+1);
> -                    i.ports[0] = pa_xnew(pa_sink_port_info, i.n_ports);
> +                    i.ports = pa_xnew0(pa_sink_port_info*, i.n_ports+1);
> +                    i.ports[0] = pa_xnew0(pa_sink_port_info, i.n_ports);
>
>                       for (j = 0; j<  i.n_ports; j++) {
> -                        if (pa_tagstruct_gets(t,&i.ports[0][j].name)<  0 ||
> -                            pa_tagstruct_gets(t,&i.ports[0][j].description)<  0 ||
> -                            pa_tagstruct_getu32(t,&i.ports[0][j].priority)<  0) {
> +                        i.ports[j] =&i.ports[0][j];
> +
> +                        if (pa_tagstruct_gets(t,&i.ports[j]->name)<  0 ||
> +                            pa_tagstruct_gets(t,&i.ports[j]->description)<  0 ||
> +                            pa_tagstruct_getu32(t,&i.ports[j]->priority)<  0) {
>
>                               goto fail;
>                           }
>
> -                        i.ports[0][j].available = PA_PORT_AVAILABLE_UNKNOWN;
> +                        i.ports[j]->available = PA_PORT_AVAILABLE_UNKNOWN;
>                           if (o->context->version>= 24) {
>                               uint32_t av;
>                               if (pa_tagstruct_getu32(t,&av)<  0 || av>  PA_PORT_AVAILABLE_YES)
>                                   goto fail;
> -                            i.ports[0][j].available = av;
> +                            i.ports[j]->available = av;
>                           }
>
> -                        i.ports[j] =&i.ports[0][j];
> +                        i.ports[j]->proplist = pa_proplist_new();
> +                        if (o->context->version>= 27) {
> +                            if (pa_tagstruct_get_proplist(t, i.ports[j]->proplist)<  0)
> +                                goto fail;
> +                        }
>                       }
> -
> -                    i.ports[j] = NULL;
>                   }
>
>                   if (pa_tagstruct_gets(t,&ap)<  0)
> @@ -268,6 +272,9 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u
>                   pa_xfree(i.formats);
>               }
>               if (i.ports) {
> +                for (j = 0; i.ports[j]; j++)
> +                    pa_proplist_free(i.ports[j]->proplist);
> +
>                   pa_xfree(i.ports[0]);
>                   pa_xfree(i.ports);
>               }
> @@ -296,6 +303,11 @@ fail:
>           pa_xfree(i.formats);
>       }
>       if (i.ports) {
> +        for (j = 0; i.ports[j]; j++) {
> +            if (i.ports[j]->proplist)
> +                pa_proplist_free(i.ports[j]->proplist);

Just a random dive-in here: is it possible that the pa_proplist_new has 
not been called for the last port, therefore pa_proplist_free will raise 
an assertion failure?

> +        }
> +
>           pa_xfree(i.ports[0]);
>           pa_xfree(i.ports);
>       }
> @@ -473,29 +485,33 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
>
>               if (o->context->version>= 16) {
>                   if (i.n_ports>  0) {
> -                    i.ports = pa_xnew(pa_source_port_info*, i.n_ports+1);
> -                    i.ports[0] = pa_xnew(pa_source_port_info, i.n_ports);
> +                    i.ports = pa_xnew0(pa_source_port_info*, i.n_ports+1);
> +                    i.ports[0] = pa_xnew0(pa_source_port_info, i.n_ports);
>
>                       for (j = 0; j<  i.n_ports; j++) {
> -                        if (pa_tagstruct_gets(t,&i.ports[0][j].name)<  0 ||
> -                            pa_tagstruct_gets(t,&i.ports[0][j].description)<  0 ||
> -                            pa_tagstruct_getu32(t,&i.ports[0][j].priority)<  0) {
> +                        i.ports[j] =&i.ports[0][j];
> +
> +                        if (pa_tagstruct_gets(t,&i.ports[j]->name)<  0 ||
> +                            pa_tagstruct_gets(t,&i.ports[j]->description)<  0 ||
> +                            pa_tagstruct_getu32(t,&i.ports[j]->priority)<  0) {
>
>                               goto fail;
>                           }
>
> -                        i.ports[0][j].available = PA_PORT_AVAILABLE_UNKNOWN;
> +                        i.ports[j]->available = PA_PORT_AVAILABLE_UNKNOWN;
>                           if (o->context->version>= 24) {
>                               uint32_t av;
>                               if (pa_tagstruct_getu32(t,&av)<  0 || av>  PA_PORT_AVAILABLE_YES)
>                                   goto fail;
> -                            i.ports[0][j].available = av;
> +                            i.ports[j]->available = av;
>                           }
>
> -                        i.ports[j] =&i.ports[0][j];
> +                        i.ports[j]->proplist = pa_proplist_new();
> +                        if (o->context->version>= 27) {
> +                            if (pa_tagstruct_get_proplist(t, i.ports[j]->proplist)<  0 )
> +                                goto fail;
> +                        }
>                       }
> -
> -                    i.ports[j] = NULL;
>                   }
>
>                   if (pa_tagstruct_gets(t,&ap)<  0)
> @@ -541,6 +557,9 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
>                   pa_xfree(i.formats);
>               }
>               if (i.ports) {
> +                for (j = 0; i.ports[j]; j++)
> +                    pa_proplist_free(i.ports[j]->proplist);
> +
>                   pa_xfree(i.ports[0]);
>                   pa_xfree(i.ports);
>               }
> @@ -569,6 +588,11 @@ fail:
>           pa_xfree(i.formats);
>       }
>       if (i.ports) {
> +        for (j = 0; i.ports[j]; j++) {
> +            if (i.ports[j]->proplist)
> +                pa_proplist_free(i.ports[j]->proplist);
> +        }
> +
>           pa_xfree(i.ports[0]);
>           pa_xfree(i.ports);
>       }
> diff --git a/src/pulse/introspect.h b/src/pulse/introspect.h
> index 224432c..ad3f2c3 100644
> --- a/src/pulse/introspect.h
> +++ b/src/pulse/introspect.h
> @@ -203,6 +203,7 @@ typedef struct pa_sink_port_info {
>       const char *description;            /**<  Description of this port */
>       uint32_t priority;                  /**<  The higher this value is the more useful this port is as a default */
>       int available;                      /**<  A flags (see #pa_port_available),indicating availability status of this port. \since 2.0 */
> +    pa_proplist *proplist;              /**<  Port property list. \since 3.0 */
>   } pa_sink_port_info;
>
>   /** Stores information about sinks. Please note that this structure
> @@ -283,6 +284,7 @@ typedef struct pa_source_port_info {
>       const char *description;            /**<  Description of this port */
>       uint32_t priority;                  /**<  The higher this value is the more useful this port is as a default */
>       int available;                      /**<  A flags (see #pa_port_available) indicating availability status of this port. \since 2.0 */
> +    pa_proplist *proplist;              /**<  Port property list. \since 3.0 */
>   } pa_source_port_info;
>
>   /** Stores information about sources. Please note that this structure
> diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
> index 487eb7a..d5e7c9a 100644
> --- a/src/pulsecore/protocol-native.c
> +++ b/src/pulsecore/protocol-native.c
> @@ -3126,6 +3126,8 @@ static void sink_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_sin
>                   pa_tagstruct_putu32(t, p->priority);
>                   if (c->version>= 24)
>                       pa_tagstruct_putu32(t, p->available);
> +                if (c->version>= 27)
> +                    pa_tagstruct_put_proplist(t, p->proplist);
>               }
>           }
>
> @@ -3199,6 +3201,8 @@ static void source_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_s
>                   pa_tagstruct_putu32(t, p->priority);
>                   if (c->version>= 24)
>                       pa_tagstruct_putu32(t, p->available);
> +                if (c->version>= 27)
> +                    pa_tagstruct_put_proplist(t, p->proplist);
>               }
>           }
>



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


More information about the pulseaudio-discuss mailing list