diff --git a/spa/plugins/bluez5/bluez5-dbus.c b/spa/plugins/bluez5/bluez5-dbus.c index db1d8272c..9839f3181 100644 --- a/spa/plugins/bluez5/bluez5-dbus.c +++ b/spa/plugins/bluez5/bluez5-dbus.c @@ -191,12 +191,15 @@ struct spa_bt_metadata { struct spa_bt_bis { struct spa_list link; char qos_preset[255]; + int retransmissions; + int retransmissions_set; int channel_allocation; struct spa_list metadata_list; }; -#define BROADCAST_CODE_LEN 16 -#define BD_ADDR_STR_LEN 17 +#define BROADCAST_CODE_LEN 16 +#define BD_ADDR_STR_LEN 17 +#define NUM_BCAST_RETRANSMISSIONS_MAX 254 struct spa_bt_big { struct spa_list link; @@ -6189,6 +6192,7 @@ static void configure_bis(struct spa_bt_monitor *monitor, uint8_t caps [CC_MAX_LEN]; uint8_t metadata [METADATA_MAX_LEN]; uint8_t caps_size, metadata_size = 0; + uint8_t retransmissions; struct bap_codec_qos qos; struct spa_bt_metadata *metadata_entry; struct spa_dict settings; @@ -6232,6 +6236,11 @@ static void configure_bis(struct spa_bt_monitor *monitor, return; } + if (bis->retransmissions_set) + retransmissions = (uint8_t) bis->retransmissions; + else + retransmissions = qos.retransmission; + msg = dbus_message_new_method_call(BLUEZ_SERVICE, object_path, interface_name, @@ -6275,7 +6284,7 @@ static void configure_bis(struct spa_bt_monitor *monitor, append_basic_variant_dict_entry(&qos_dict, "Framing", DBUS_TYPE_BYTE, "y", &qos.framing); append_basic_variant_dict_entry(&qos_dict, "PHY", DBUS_TYPE_BYTE, "y", &qos.phy); append_basic_variant_dict_entry(&qos_dict, "SDU", DBUS_TYPE_UINT16, "q", &qos.sdu); - append_basic_variant_dict_entry(&qos_dict, "Retransmissions", DBUS_TYPE_BYTE, "y", &qos.retransmission); + append_basic_variant_dict_entry(&qos_dict, "Retransmissions", DBUS_TYPE_BYTE, "y", &retransmissions); append_basic_variant_dict_entry(&qos_dict, "Latency", DBUS_TYPE_UINT16, "q", &qos.latency); append_basic_variant_dict_entry(&qos_dict, "PresentationDelay", DBUS_TYPE_UINT32, "u", &qos.delay); @@ -7126,6 +7135,15 @@ static void parse_broadcast_source_config(struct spa_bt_monitor *monitor, const if (spa_json_get_string(&it[1], bis_entry->qos_preset, sizeof(bis_entry->qos_preset)) <= 0) goto parse_failed; spa_log_debug(monitor->log, "bis_entry->qos_preset %s", bis_entry->qos_preset); + } else if (spa_streq(bis_key, "retransmissions")) { + if (spa_json_get_int(&it[2], &bis_entry->retransmissions) <= 0) + goto parse_failed; + if (bis_entry->retransmissions > NUM_BCAST_RETRANSMISSIONS_MAX) + goto parse_failed; + if (bis_entry->retransmissions < 0) + goto parse_failed; + bis_entry->retransmissions_set = 1; + spa_log_debug(monitor->log, "bis_entry->retransmissions %d", bis_entry->retransmissions); } else if (spa_streq(bis_key, "audio_channel_allocation")) { if (spa_json_get_int(&it[1], &bis_entry->channel_allocation) <= 0) goto parse_failed;