[pulseaudio-discuss] [RFC v0 10/15] bluetooth: Parse media transport's properties

Mikel Astiz mikel.astiz.oss at gmail.com
Mon Jan 7 07:37:15 PST 2013


Hi Tanu,

On Mon, Dec 31, 2012 at 12:47 PM, Tanu Kaskinen <tanuk at iki.fi> wrote:
> On Wed, 2012-12-19 at 13:58 +0100, Mikel Astiz wrote:
>> From: Mikel Astiz <mikel.astiz at bmw-carit.de>
>>
>> Consider the media transport when a PropertiesChanged signal is
>> received.
>>
>> Note that the transport might have an owner other than BlueZ, and thus
>> the property changes would be emitted from arbitrary senders. For
>> performance reasons, the installed match considers the interface name
>> where the property has changed.
>>
>> It could be possible to install and remove the D-Bus matches dynamically
>> when a new owner is registered/unregistered, but filtering based on the
>> interface name seems good enough already.
>> ---
>>  src/modules/bluetooth/bluetooth-util.c | 29 +++++++++++++++++++++++++++++
>>  1 file changed, 29 insertions(+)
>>
>> diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
>> index 3c0fcf7..f8ecb15 100644
>> --- a/src/modules/bluetooth/bluetooth-util.c
>> +++ b/src/modules/bluetooth/bluetooth-util.c
>> @@ -1087,6 +1087,25 @@ static int transport_parse_property(pa_bluetooth_transport *t, DBusMessageIter *
>>      return 0;
>>  }
>>
>> +static int parse_transport_properties(pa_bluetooth_transport *t, DBusMessageIter *i) {
>> +    DBusMessageIter element_i;
>> +
>> +    dbus_message_iter_recurse(i, &element_i);
>> +
>> +    while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) {
>> +        DBusMessageIter dict_i;
>> +
>> +        dbus_message_iter_recurse(&element_i, &dict_i);
>> +
>> +        if (transport_parse_property(t, &dict_i) < 0)
>> +            return -1;
>
> It would be better to not return here. Just store the fact that parsing
> some property failed in some boolean and continue parsing the next
> property, so that any valid property changes aren't missed (the same
> applies to parse_device_properties()).

I'd actually avoid this, see the answer below to the proposed guidelines.

>
> I think parse_transport_properties() could also be used in
> endpoint_set_configuration().

The idea was to keep the constant properties in
endpoint_set_configuration() and move the variables ones to
parse_transport_properties(). Note that many of these properties need
to be fixed ("UUID") or even just part of SetConfiguration
("Configuration").

Perhaps you're proposing to call parse_transport_properties() instead
of having duplicated code for "NREC"? There might be some other
properties of the same kind in the future.

>
> A suggestion for a general policy for property parse error handling:
>
>  * Whenever parsing a property fails, print an error message to the log
> (already done, I think).
>
>  * When parsing the initial properties of a new object, fail hard (i.e.
> don't create the object) if all non-optional properties (that we're
> interested in) are not received, or if parsing any such property fails.

Agreed, but left pending, as replied to the patch affecting device_info_valid.

>
>  * When parsing a PropertiesChanged signal, never fail if there are
> parse errors, just pretend that the problematic properties didn't
> change.

I'm fine with that too.

>
>  * When parsing any optional property, never fail on parse errors, just
> pretend that the property isn't set (when parsing the initial
> properties) or that the property value didn't change (when parsing a
> PropertiesChanged signal).

If a parsing of a property fails, regardless of whether it's optional
or not, it means BlueZ is misbehaving. I see no reason to be more
relaxed with optional properties.

Cheers,
Mikel


More information about the pulseaudio-discuss mailing list