On Saturday 06 April 2019 11:16:06 Pali Rohár wrote:
> --- a/src/modules/bluetooth/bluez5-util.c
> +++ b/src/modules/bluetooth/bluez5-util.c
> @@ -812,6 +901,149 @@ static void parse_device_properties(pa_bluetooth_device
> *d, DBusMessageIter *i)
> }
> }
>
> +static void parse_remote_endpoint_properties(pa_bluetooth_discovery *y,
> const char *endpoint, DBusMessageIter *i) {
> + DBusMessageIter element_i;
> + pa_bluetooth_device *device;
> + pa_hashmap *codec_endpoints;
> + pa_hashmap *endpoints;
> + pa_a2dp_codec_id *a2dp_codec_id;
> + pa_a2dp_codec_capabilities *a2dp_codec_capabilities;
> + const char *uuid = NULL;
> + const char *device_path = NULL;
> + uint8_t codec_id = 0;
> + bool have_codec_id = false;
> + const uint8_t *capabilities = NULL;
> + int capabilities_size = 0;
> +
> + pa_log_debug("Parsing remote endpoint %s", endpoint);
> +
> + dbus_message_iter_recurse(i, &element_i);
> +
> + while (dbus_message_iter_get_arg_type(&element_i) ==
> DBUS_TYPE_DICT_ENTRY) {
> + DBusMessageIter dict_i, variant_i;
> + const char *key;
> +
> + dbus_message_iter_recurse(&element_i, &dict_i);
> +
> + key = check_variant_property(&dict_i);
> + if (key == NULL) {
> + pa_log_error("Received invalid property for remote endpoint %s",
> endpoint);
> + return;
> + }
> +
> + dbus_message_iter_recurse(&dict_i, &variant_i);
> +
> + if (pa_streq(key, "UUID")) {
> + if (dbus_message_iter_get_arg_type(&variant_i) !=
> DBUS_TYPE_STRING) {
> + pa_log_warn("Remote endpoint %s property 'UUID' is not
> string, ignoring", endpoint);
> + return;
> + }
> +
> + dbus_message_iter_get_basic(&variant_i, &uuid);
> + } else if (pa_streq(key, "Codec")) {
> + if (dbus_message_iter_get_arg_type(&variant_i) !=
> DBUS_TYPE_BYTE) {
> + pa_log_warn("Remote endpoint %s property 'Codec' is not
> byte, ignoring", endpoint);
> + return;
> + }
> +
> + dbus_message_iter_get_basic(&variant_i, &codec_id);
> + have_codec_id = true;
> + } else if (pa_streq(key, "Capabilities")) {
> + DBusMessageIter array;
> +
> + if (dbus_message_iter_get_arg_type(&variant_i) !=
> DBUS_TYPE_ARRAY) {
> + pa_log_warn("Remote endpoint %s property 'Capabilities' is
> not array, ignoring", endpoint);
> + return;
> + }
> +
> + dbus_message_iter_recurse(&variant_i, &array);
> + if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_BYTE) {
> + pa_log_warn("Remote endpoint %s property 'Capabilities' is
> not array of bytes, ignoring", endpoint);
> + return;
> + }
> +
> + dbus_message_iter_get_fixed_array(&array, &capabilities,
> &capabilities_size);
> + } else if (pa_streq(key, "Device")) {
> + if (dbus_message_iter_get_arg_type(&variant_i) !=
> DBUS_TYPE_OBJECT_PATH) {
> + pa_log_warn("Remote endpoint %s property 'Device' is not
> path, ignoring", endpoint);
> + return;
> + }
> +
> + dbus_message_iter_get_basic(&variant_i, &device_path);
> + }
> +
> + dbus_message_iter_next(&element_i);
> + }
> +
> + if (!uuid) {
> + pa_log_warn("Remote endpoint %s does not have property 'UUID',
> ignoring", endpoint);
> + return;
> + }
> +
> + if (!have_codec_id) {
> + pa_log_warn("Remote endpoint %s does not have property 'Codec',
> ignoring", endpoint);
> + return;
> + }
> +
> + if (!capabilities || !capabilities_size) {
> + pa_log_warn("Remote endpoint %s does not have property
> 'Capabilities', ignoring", endpoint);
> + return;
> + }
> +
> + if (!device_path) {
> + pa_log_warn("Remote endpoint %s does not have property 'Device',
> ignoring", endpoint);
> + return;
> + }
> +
> + device = pa_hashmap_get(y->devices, device_path);
> + if (!device) {
> + pa_log_warn("Device for remote endpoint %s was not found", endpoint);
> + return;
> + }
> +
> + if (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SINK)) {
> + codec_endpoints = device->a2dp_source_endpoints;
> + } else if (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SOURCE)) {
> + codec_endpoints = device->a2dp_sink_endpoints;
This is incorrect and was caused by bug in bluez git code. Now it is
fixed in bluez git master. So I fix it in next patch version. Correctly
for PA_BLUETOOTH_UUID_A2DP_SINK should be used a2dp_sink_endpoints, not
source endpoints. And vice-versa for A2DP_SOURCE.
> + } else {
> + pa_log_warn("Remote endpoint %s does not have valid property 'UUID',
> ignoring", endpoint);
> + return;
> + }
--
Pali Rohár
[email protected]
_______________________________________________
pulseaudio-discuss mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss