* [PATCH BlueZ 2/5] transport: Implement QoS property
2023-09-21 23:47 [PATCH BlueZ 1/5] media-api: Update to reflect the last code changes Luiz Augusto von Dentz
@ 2023-09-21 23:47 ` Luiz Augusto von Dentz
2023-09-21 23:47 ` [PATCH BlueZ 3/5] client: Make transport.show to print " Luiz Augusto von Dentz
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2023-09-21 23:47 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This implements Transport.QoS as a dict instead of listing each field as
a individual property.
---
client/player.c | 6 +-
lib/bluetooth.h | 2 +-
profiles/audio/bap.c | 6 +-
profiles/audio/transport.c | 431 ++++++++-----------------------------
src/shared/bap.h | 2 +-
src/shared/bass.c | 2 +-
tools/iso-tester.c | 6 +-
tools/isotest.c | 2 +-
8 files changed, 98 insertions(+), 359 deletions(-)
diff --git a/client/player.c b/client/player.c
index b92f529c693a..ac8493d3cb0b 100644
--- a/client/player.c
+++ b/client/player.c
@@ -1873,7 +1873,7 @@ static struct bt_iso_qos bcast_qos = {
.bcast = {
.big = BT_ISO_QOS_BIG_UNSET,
.bis = BT_ISO_QOS_BIS_UNSET,
- .sync_interval = 24,
+ .sync_factor = 24,
.packing = 0x00,
.framing = 0x00,
.encryption = 0x00,
@@ -1991,10 +1991,10 @@ static void append_properties(DBusMessageIter *iter,
if (!cfg->ep->broadcast)
goto done;
- bt_shell_printf("SyncInterval %u\n", bcast_qos.bcast.sync_interval);
+ bt_shell_printf("SyncInterval %u\n", bcast_qos.bcast.sync_factor);
g_dbus_dict_append_entry(&dict, "SyncInterval", DBUS_TYPE_BYTE,
- &bcast_qos.bcast.sync_interval);
+ &bcast_qos.bcast.sync_factor);
bt_shell_printf("Encryption %u\n", bcast_qos.bcast.encryption);
diff --git a/lib/bluetooth.h b/lib/bluetooth.h
index 1286aa763208..ba08c70e61b8 100644
--- a/lib/bluetooth.h
+++ b/lib/bluetooth.h
@@ -174,7 +174,7 @@ struct bt_iso_ucast_qos {
struct bt_iso_bcast_qos {
uint8_t big;
uint8_t bis;
- uint8_t sync_interval;
+ uint8_t sync_factor;
uint8_t packing;
uint8_t framing;
struct bt_iso_io_qos in;
diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c
index d61b6f677660..c1fba6b1bff5 100644
--- a/profiles/audio/bap.c
+++ b/profiles/audio/bap.c
@@ -533,7 +533,7 @@ static int parse_properties(DBusMessageIter *props, struct iovec **caps,
goto fail;
dbus_message_iter_get_basic(&value,
- &qos->bcast.sync_interval);
+ &qos->bcast.sync_factor);
} else if (!strcasecmp(key, "MSE")) {
if (var != DBUS_TYPE_BYTE)
goto fail;
@@ -756,7 +756,7 @@ static void update_bcast_qos(struct bt_iso_qos *qos,
{
bap_qos->bcast.big = qos->bcast.big;
bap_qos->bcast.bis = qos->bcast.bis;
- bap_qos->bcast.sync_interval = qos->bcast.sync_interval;
+ bap_qos->bcast.sync_factor = qos->bcast.sync_factor;
bap_qos->bcast.packing = qos->bcast.packing;
bap_qos->bcast.framing = qos->bcast.framing;
bap_qos->bcast.encryption = qos->bcast.encryption;
@@ -1671,7 +1671,7 @@ static void bap_create_bcast_io(struct bap_data *data, struct bap_ep *ep,
iso_qos.bcast.big = ep->qos.bcast.big;
iso_qos.bcast.bis = ep->qos.bcast.bis;
- iso_qos.bcast.sync_interval = ep->qos.bcast.sync_interval;
+ iso_qos.bcast.sync_factor = ep->qos.bcast.sync_factor;
iso_qos.bcast.packing = ep->qos.bcast.packing;
iso_qos.bcast.framing = ep->qos.bcast.framing;
iso_qos.bcast.encryption = ep->qos.bcast.encryption;
diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index 2998d6bab00d..6c2cb598fe96 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
@@ -850,160 +850,41 @@ static const GDBusPropertyTable a2dp_properties[] = {
{ }
};
-static gboolean qos_exists(const GDBusPropertyTable *property, void *data)
+static void append_io_qos(DBusMessageIter *dict, struct bt_bap_io_qos *qos)
{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- if (media_endpoint_is_broadcast(transport->endpoint))
- return bap->qos.bcast.io_qos.sdu != 0x00;
-
- return bap->qos.ucast.io_qos.phy != 0x00;
+ dict_append_entry(dict, "Interval", DBUS_TYPE_UINT32, &qos->interval);
+ dict_append_entry(dict, "Latency", DBUS_TYPE_UINT16, &qos->latency);
+ dict_append_entry(dict, "SDU", DBUS_TYPE_UINT16, &qos->sdu);
+ dict_append_entry(dict, "PHY", DBUS_TYPE_BYTE, &qos->phy);
+ dict_append_entry(dict, "Retransmissions", DBUS_TYPE_BYTE, &qos->rtn);
}
-static gboolean get_cig(const GDBusPropertyTable *property,
+static gboolean get_ucast_qos(const GDBusPropertyTable *property,
DBusMessageIter *iter, void *data)
{
struct media_transport *transport = data;
struct bap_transport *bap = transport->data;
+ DBusMessageIter dict;
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.ucast.cig_id);
+ dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+ DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+ &dict);
- return TRUE;
-}
+ dict_append_entry(&dict, "CIG", DBUS_TYPE_BYTE,
+ &bap->qos.ucast.cig_id);
+ dict_append_entry(&dict, "CIS", DBUS_TYPE_BYTE,
+ &bap->qos.ucast.cis_id);
+ dict_append_entry(&dict, "Framing", DBUS_TYPE_BYTE,
+ &bap->qos.ucast.framing);
+ dict_append_entry(&dict, "PresentationDelay", DBUS_TYPE_UINT32,
+ &bap->qos.ucast.delay);
-static gboolean get_big(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
+ append_io_qos(&dict, &bap->qos.ucast.io_qos);
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.bcast.big);
-
- return TRUE;
-}
-
-static gboolean get_cis(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.ucast.cis_id);
-
- return TRUE;
-}
-
-static gboolean get_bis(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.bcast.bis);
-
- return TRUE;
-}
-
-static gboolean get_interval(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32,
- &bap->qos.ucast.io_qos.interval);
-
- return TRUE;
-}
-
-static gboolean get_framing(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
- dbus_bool_t val = bap->qos.ucast.framing;
-
- if (media_endpoint_is_broadcast(transport->endpoint))
- val = bap->qos.bcast.framing;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &val);
-
- return TRUE;
-}
-
-static gboolean get_phy(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- if (media_endpoint_is_broadcast(transport->endpoint)) {
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.bcast.io_qos.phy);
- return TRUE;
- }
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.ucast.io_qos.phy);
-
- return TRUE;
-}
-
-static gboolean get_sdu(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- if (media_endpoint_is_broadcast(transport->endpoint)) {
- dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16,
- &bap->qos.bcast.io_qos.sdu);
- return TRUE;
- }
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16,
- &bap->qos.ucast.io_qos.sdu);
-
- return TRUE;
-}
-
-static gboolean get_retransmissions(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.ucast.io_qos.rtn);
-
- return TRUE;
-}
-
-static gboolean get_latency(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16,
- &bap->qos.ucast.io_qos.latency);
-
- return TRUE;
-}
-
-static gboolean get_delay(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32,
- &bap->qos.ucast.delay);
+ dbus_message_iter_close_container(iter, &dict);
return TRUE;
}
@@ -1084,119 +965,12 @@ static gboolean get_links(const GDBusPropertyTable *property,
return TRUE;
}
-static gboolean get_sync_interval(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
+static gboolean qos_ucast_exists(const GDBusPropertyTable *property, void *data)
{
struct media_transport *transport = data;
struct bap_transport *bap = transport->data;
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.bcast.sync_interval);
-
- return TRUE;
-}
-
-static gboolean get_packing(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.bcast.packing);
-
- return TRUE;
-}
-
-static gboolean get_bcode(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
- DBusMessageIter array;
-
- dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
- DBUS_TYPE_BYTE_AS_STRING, &array);
-
- if (bap->qos.bcast.bcode && bap->qos.bcast.bcode->iov_len)
- dbus_message_iter_append_fixed_array(&array, DBUS_TYPE_BYTE,
- &bap->qos.bcast.bcode->iov_base,
- bap->qos.bcast.bcode->iov_len);
-
- dbus_message_iter_close_container(iter, &array);
- return TRUE;
-}
-
-static gboolean get_options(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.bcast.options);
-
- return TRUE;
-}
-
-static gboolean get_skip(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16,
- &bap->qos.bcast.skip);
-
- return TRUE;
-}
-
-static gboolean get_sync_timeout(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16,
- &bap->qos.bcast.sync_timeout);
-
- return TRUE;
-}
-
-static gboolean get_sync_cte_type(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.bcast.sync_cte_type);
-
- return TRUE;
-}
-
-static gboolean get_mse(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE,
- &bap->qos.bcast.mse);
-
- return TRUE;
-}
-
-static gboolean get_timeout(const GDBusPropertyTable *property,
- DBusMessageIter *iter, void *data)
-{
- struct media_transport *transport = data;
- struct bap_transport *bap = transport->data;
-
- dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16,
- &bap->qos.bcast.timeout);
-
- return TRUE;
+ return bap->qos.ucast.io_qos.phy != 0x00;
}
static const GDBusPropertyTable bap_ucast_properties[] = {
@@ -1205,15 +979,7 @@ static const GDBusPropertyTable bap_ucast_properties[] = {
{ "Codec", "y", get_codec },
{ "Configuration", "ay", get_configuration },
{ "State", "s", get_state },
- { "CIG", "y", get_cig, NULL, qos_exists },
- { "CIS", "y", get_cis, NULL, qos_exists },
- { "Interval", "u", get_interval, NULL, qos_exists },
- { "Framing", "b", get_framing, NULL, qos_exists },
- { "PHY", "y", get_phy, NULL, qos_exists },
- { "SDU", "q", get_sdu, NULL, qos_exists },
- { "Retransmissions", "y", get_retransmissions, NULL, qos_exists },
- { "Latency", "q", get_latency, NULL, qos_exists },
- { "Delay", "u", get_delay, NULL, qos_exists },
+ { "QoS", "a{sv}", get_ucast_qos, NULL, qos_ucast_exists },
{ "Endpoint", "o", get_endpoint, NULL, endpoint_exists },
{ "Location", "u", get_location },
{ "Metadata", "ay", get_metadata },
@@ -1221,6 +987,61 @@ static const GDBusPropertyTable bap_ucast_properties[] = {
{ }
};
+static gboolean get_bcast_qos(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct media_transport *transport = data;
+ struct bap_transport *bap = transport->data;
+ DBusMessageIter dict;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+ DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+ &dict);
+
+ dict_append_entry(&dict, "BIG", DBUS_TYPE_BYTE,
+ &bap->qos.bcast.big);
+ dict_append_entry(&dict, "BIS", DBUS_TYPE_BYTE,
+ &bap->qos.bcast.bis);
+ dict_append_entry(&dict, "SyncFactor", DBUS_TYPE_BYTE,
+ &bap->qos.bcast.sync_factor);
+ dict_append_entry(&dict, "Packing", DBUS_TYPE_BYTE,
+ &bap->qos.bcast.packing);
+ dict_append_entry(&dict, "Framing", DBUS_TYPE_BYTE,
+ &bap->qos.bcast.framing);
+ if (bap->qos.bcast.bcode)
+ dict_append_array(&dict, "BCode", DBUS_TYPE_BYTE,
+ &bap->qos.bcast.bcode->iov_base,
+ bap->qos.bcast.bcode->iov_len);
+ dict_append_entry(&dict, "Options", DBUS_TYPE_BYTE,
+ &bap->qos.bcast.options);
+ dict_append_entry(&dict, "Skip", DBUS_TYPE_UINT16,
+ &bap->qos.bcast.skip);
+ dict_append_entry(&dict, "SyncTimeout", DBUS_TYPE_UINT16,
+ &bap->qos.bcast.sync_timeout);
+ dict_append_entry(&dict, "SyncType", DBUS_TYPE_BYTE,
+ &bap->qos.bcast.sync_cte_type);
+ dict_append_entry(&dict, "MSE", DBUS_TYPE_BYTE,
+ &bap->qos.bcast.mse);
+ dict_append_entry(&dict, "Timeout", DBUS_TYPE_UINT16,
+ &bap->qos.bcast.timeout);
+
+ append_io_qos(&dict, &bap->qos.bcast.io_qos);
+
+ dbus_message_iter_close_container(iter, &dict);
+
+ return TRUE;
+}
+
+static gboolean qos_bcast_exists(const GDBusPropertyTable *property, void *data)
+{
+ struct media_transport *transport = data;
+ struct bap_transport *bap = transport->data;
+
+ return bap->qos.bcast.io_qos.phy != 0x00;
+}
static const GDBusPropertyTable bap_bcast_properties[] = {
{ "Device", "o", get_device },
@@ -1228,17 +1049,7 @@ static const GDBusPropertyTable bap_bcast_properties[] = {
{ "Codec", "y", get_codec },
{ "Configuration", "ay", get_configuration },
{ "State", "s", get_state },
- { "BIG", "y", get_big, NULL, qos_exists },
- { "BIS", "y", get_bis, NULL, qos_exists },
- { "SyncInterval", "y", get_sync_interval, NULL, qos_exists },
- { "Packing", "y", get_packing, NULL, qos_exists },
- { "BCode", "ay", get_bcode, NULL, qos_exists },
- { "Options", "y", get_options, NULL, qos_exists },
- { "Skip", "q", get_skip, NULL, qos_exists },
- { "SyncTimeout", "q", get_sync_timeout, NULL, qos_exists },
- { "SyncCteType", "y", get_sync_cte_type, NULL, qos_exists },
- { "MSE", "y", get_mse, NULL, qos_exists },
- { "Timeout", "q", get_timeout, NULL, qos_exists },
+ { "QoS", "a{sv}", get_bcast_qos, NULL, qos_bcast_exists },
{ "Endpoint", "o", get_endpoint, NULL, endpoint_exists },
{ "Location", "u", get_location },
{ "Metadata", "ay", get_metadata },
@@ -1466,31 +1277,7 @@ static void bap_update_qos(const struct media_transport *transport)
g_dbus_emit_property_changed(btd_get_dbus_connection(),
transport->path, MEDIA_TRANSPORT_INTERFACE,
- "CIG");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "CIS");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Interval");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Framing");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "PHY");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "SDU");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Retransmissions");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Latency");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Delay");
+ "QoS");
}
static gboolean bap_resume_complete_cb(void *data)
@@ -1533,55 +1320,7 @@ static void bap_update_bcast_qos(const struct media_transport *transport)
g_dbus_emit_property_changed(btd_get_dbus_connection(),
transport->path, MEDIA_TRANSPORT_INTERFACE,
- "BIG");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "BIS");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "SyncInterval");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Packing");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Framing");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "BCode");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Options");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Skip");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "SyncTimeout");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "SyncCteType");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "MSE");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Timeout");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Interval");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "Latency");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "PHY");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "SDU");
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- transport->path, MEDIA_TRANSPORT_INTERFACE,
- "RTN");
+ "QoS");
g_dbus_emit_property_changed(btd_get_dbus_connection(),
transport->path, MEDIA_TRANSPORT_INTERFACE,
"Codec");
diff --git a/src/shared/bap.h b/src/shared/bap.h
index edb5c1bed27e..e4eae86502f3 100644
--- a/src/shared/bap.h
+++ b/src/shared/bap.h
@@ -75,7 +75,7 @@ struct bt_bap_ucast_qos {
struct bt_bap_bcast_qos {
uint8_t big;
uint8_t bis;
- uint8_t sync_interval;
+ uint8_t sync_factor;
uint8_t packing;
uint8_t framing;
uint8_t encryption;
diff --git a/src/shared/bass.c b/src/shared/bass.c
index 86dab03e3993..37255aff64f3 100644
--- a/src/shared/bass.c
+++ b/src/shared/bass.c
@@ -102,7 +102,7 @@ static struct bt_iso_qos default_qos = {
.bcast = {
.big = BT_ISO_QOS_BIG_UNSET,
.bis = BT_ISO_QOS_BIS_UNSET,
- .sync_interval = 0x07,
+ .sync_factor = 0x07,
.packing = 0x00,
.framing = 0x00,
.in = DEFAULT_IO_QOS,
diff --git a/tools/iso-tester.c b/tools/iso-tester.c
index 80f72221e7f0..36879d9fc112 100644
--- a/tools/iso-tester.c
+++ b/tools/iso-tester.c
@@ -247,7 +247,7 @@
.bcast = { \
.big = _big, \
.bis = _bis, \
- .sync_interval = 0x07, \
+ .sync_factor = 0x07, \
.packing = 0x00, \
.framing = 0x00, \
.in = _in, \
@@ -1712,9 +1712,9 @@ static bool check_bcast_qos(const struct bt_iso_qos *qos1,
return false;
}
- if (qos1->bcast.sync_interval != qos2->bcast.sync_interval) {
+ if (qos1->bcast.sync_factor != qos2->bcast.sync_factor) {
tester_warn("Unexpected QoS sync interval: 0x%02x != 0x%02x",
- qos1->bcast.sync_interval, qos2->bcast.sync_interval);
+ qos1->bcast.sync_factor, qos2->bcast.sync_factor);
return false;
}
diff --git a/tools/isotest.c b/tools/isotest.c
index 9bbd861a92ca..4b64ea5bfa8c 100644
--- a/tools/isotest.c
+++ b/tools/isotest.c
@@ -1028,7 +1028,7 @@ static void multy_connect_mode(char *peer)
.bcast = { \
.big = BT_ISO_QOS_BIG_UNSET, \
.bis = BT_ISO_QOS_BIS_UNSET, \
- .sync_interval = 0x07, \
+ .sync_factor = 0x07, \
.packing = 0x00, \
.framing = 0x00, \
.out = QOS_IO(_interval, _latency, _sdu, _phy, _rtn), \
--
2.41.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH BlueZ 5/5] client: Make Endpoint.SelectProperties reply properly
2023-09-21 23:47 [PATCH BlueZ 1/5] media-api: Update to reflect the last code changes Luiz Augusto von Dentz
` (2 preceding siblings ...)
2023-09-21 23:47 ` [PATCH BlueZ 4/5] media: Implement " Luiz Augusto von Dentz
@ 2023-09-21 23:47 ` Luiz Augusto von Dentz
2023-09-22 3:23 ` [BlueZ,1/5] media-api: Update to reflect the last code changes bluez.test.bot
4 siblings, 0 replies; 7+ messages in thread
From: Luiz Augusto von Dentz @ 2023-09-21 23:47 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This makes Endpoint.SelectProperties reply with QoS property since it
is now a single property.
---
client/player.c | 316 +++++++++++++++++++++++++++---------------------
client/print.c | 16 ++-
2 files changed, 188 insertions(+), 144 deletions(-)
diff --git a/client/player.c b/client/player.c
index 77fdf9691733..62353f443085 100644
--- a/client/player.c
+++ b/client/player.c
@@ -1199,7 +1199,7 @@ static const struct capabilities {
struct codec_qos {
uint32_t interval;
uint8_t framing;
- char *phy;
+ uint8_t phy;
uint16_t sdu;
uint8_t rtn;
uint16_t latency;
@@ -1274,22 +1274,22 @@ static struct codec_preset sbc_presets[] = {
QOS_CONFIG(_interval, 0x01, _phy, _sdu, _rtn, _latency, _delay)
#define QOS_UNFRAMED_1M(_interval, _sdu, _rtn, _latency, _delay) \
- QOS_UNFRAMED(_interval, "1M", _sdu, _rtn, _latency, _delay) \
+ QOS_UNFRAMED(_interval, 0x01, _sdu, _rtn, _latency, _delay) \
#define QOS_FRAMED_1M(_interval, _sdu, _rtn, _latency, _delay) \
- QOS_FRAMED(_interval, "1M", _sdu, _rtn, _latency, _delay) \
+ QOS_FRAMED(_interval, 0x01, _sdu, _rtn, _latency, _delay) \
#define QOS_UNFRAMED_2M(_interval, _sdu, _rtn, _latency, _delay) \
- QOS_UNFRAMED(_interval, "2M", _sdu, _rtn, _latency, _delay) \
+ QOS_UNFRAMED(_interval, 0x02, _sdu, _rtn, _latency, _delay) \
#define QOS_FRAMED_2M(_interval, _sdu, _rtn, _latency, _delay) \
- QOS_FRAMED(_interval, "2M", _sdu, _rtn, _latency, _delay) \
+ QOS_FRAMED(_interval, 0x02, _sdu, _rtn, _latency, _delay) \
#define LC3_7_5_UNFRAMED(_sdu, _rtn, _latency, _delay) \
- QOS_UNFRAMED(7500u, "2M", _sdu, _rtn, _latency, _delay)
+ QOS_UNFRAMED(7500u, 0x02, _sdu, _rtn, _latency, _delay)
#define LC3_7_5_FRAMED(_sdu, _rtn, _latency, _delay) \
- QOS_FRAMED(7500u, "2M", _sdu, _rtn, _latency, _delay)
+ QOS_FRAMED(7500u, 0x02, _sdu, _rtn, _latency, _delay)
#define LC3_10_UNFRAMED(_sdu, _rtn, _latency, _delay) \
QOS_UNFRAMED_2M(10000u, _sdu, _rtn, _latency, _delay)
@@ -1887,14 +1887,174 @@ static struct bt_iso_qos bcast_qos = {
}
};
+static void append_io_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
+{
+ struct codec_qos *qos = (void *)cfg->qos;
+
+ bt_shell_printf("Interval %u\n", qos->interval);
+
+ g_dbus_dict_append_entry(iter, "Interval", DBUS_TYPE_UINT32,
+ &qos->interval);
+
+ bt_shell_printf("PHY 0x%02x\n", qos->phy);
+
+ g_dbus_dict_append_entry(iter, "PHY", DBUS_TYPE_BYTE, &qos->phy);
+
+ bt_shell_printf("SDU %u\n", cfg->qos->sdu);
+
+ g_dbus_dict_append_entry(iter, "SDU", DBUS_TYPE_UINT16, &qos->sdu);
+
+ bt_shell_printf("Retransmissions %u\n", qos->rtn);
+
+ g_dbus_dict_append_entry(iter, "Retransmissions",
+ DBUS_TYPE_BYTE, &qos->rtn);
+
+ bt_shell_printf("Latency %u\n", qos->latency);
+
+ g_dbus_dict_append_entry(iter, "Latency",
+ DBUS_TYPE_UINT16, &qos->latency);
+}
+
+static void append_ucast_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
+{
+ struct codec_qos *qos = (void *)cfg->qos;
+
+ if (cfg->ep->iso_group != BT_ISO_QOS_GROUP_UNSET) {
+ bt_shell_printf("CIG 0x%2.2x\n", cfg->ep->iso_group);
+ g_dbus_dict_append_entry(iter, "CIG", DBUS_TYPE_BYTE,
+ &cfg->ep->iso_group);
+ }
+
+ if (cfg->ep->iso_stream != BT_ISO_QOS_STREAM_UNSET) {
+ bt_shell_printf("CIS 0x%2.2x\n", cfg->ep->iso_stream);
+ g_dbus_dict_append_entry(iter, "CIS", DBUS_TYPE_BYTE,
+ &cfg->ep->iso_stream);
+ }
+
+ bt_shell_printf("Framing 0x%02x\n", qos->framing);
+
+ g_dbus_dict_append_entry(iter, "Framing", DBUS_TYPE_BYTE,
+ &qos->framing);
+
+ bt_shell_printf("PresentationDelay %u\n", qos->delay);
+
+ g_dbus_dict_append_entry(iter, "PresentationDelay",
+ DBUS_TYPE_UINT32, &qos->delay);
+
+ if (cfg->target_latency) {
+ bt_shell_printf("TargetLatency 0x%02x\n", cfg->target_latency);
+ g_dbus_dict_append_entry(iter, "TargetLatency",
+ DBUS_TYPE_BYTE, &cfg->target_latency);
+ }
+
+ append_io_qos(iter, cfg);
+}
+
+static void append_bcast_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
+{
+ if (bcast_qos.bcast.big != BT_ISO_QOS_BIG_UNSET) {
+ bt_shell_printf("BIG 0x%2.2x\n", bcast_qos.bcast.big);
+ g_dbus_dict_append_entry(iter, "BIG", DBUS_TYPE_BYTE,
+ &bcast_qos.bcast.big);
+ }
+
+ if (bcast_qos.bcast.bis != BT_ISO_QOS_BIS_UNSET) {
+ bt_shell_printf("BIS 0x%2.2x\n", bcast_qos.bcast.bis);
+ g_dbus_dict_append_entry(iter, "BIS", DBUS_TYPE_BYTE,
+ &bcast_qos.bcast.bis);
+ }
+
+ bt_shell_printf("Framing 0x%02x\n", bcast_qos.bcast.framing);
+
+ g_dbus_dict_append_entry(iter, "Framing", DBUS_TYPE_BYTE,
+ &bcast_qos.bcast.framing);
+
+ bt_shell_printf("SyncFactor %u\n", bcast_qos.bcast.sync_factor);
+
+ g_dbus_dict_append_entry(iter, "SyncFactor", DBUS_TYPE_BYTE,
+ &bcast_qos.bcast.sync_factor);
+
+ bt_shell_printf("Options %u\n", bcast_qos.bcast.options);
+
+ g_dbus_dict_append_entry(iter, "Options", DBUS_TYPE_BYTE,
+ &bcast_qos.bcast.options);
+
+ bt_shell_printf("Skip %u\n", bcast_qos.bcast.skip);
+
+ g_dbus_dict_append_entry(iter, "Skip", DBUS_TYPE_UINT16,
+ &bcast_qos.bcast.skip);
+
+ bt_shell_printf("SyncTimeout %u\n", bcast_qos.bcast.sync_timeout);
+
+ g_dbus_dict_append_entry(iter, "SyncTimeout", DBUS_TYPE_UINT16,
+ &bcast_qos.bcast.sync_timeout);
+
+ bt_shell_printf("SyncCteType %u\n", bcast_qos.bcast.sync_cte_type);
+
+ g_dbus_dict_append_entry(iter, "SyncType", DBUS_TYPE_BYTE,
+ &bcast_qos.bcast.sync_cte_type);
+
+ bt_shell_printf("MSE %u\n", bcast_qos.bcast.mse);
+
+ g_dbus_dict_append_entry(iter, "MSE", DBUS_TYPE_BYTE,
+ &bcast_qos.bcast.mse);
+
+ bt_shell_printf("Timeout %u\n", bcast_qos.bcast.timeout);
+
+ g_dbus_dict_append_entry(iter, "Timeout", DBUS_TYPE_UINT16,
+ &bcast_qos.bcast.timeout);
+
+ if (cfg->ep->bcode) {
+ const char *key = "BCode";
+
+ bt_shell_printf("BCode:\n");
+ bt_shell_hexdump(cfg->ep->bcode->iov_base,
+ cfg->ep->bcode->iov_len);
+
+ g_dbus_dict_append_basic_array(iter, DBUS_TYPE_STRING,
+ &key, DBUS_TYPE_BYTE,
+ &cfg->ep->bcode->iov_base,
+ cfg->ep->bcode->iov_len);
+ }
+
+ append_io_qos(iter, cfg);
+}
+
+static void append_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
+{
+ DBusMessageIter entry, var, dict;
+ struct codec_qos *qos = (void *)cfg->qos;
+ const char *key = "QoS";
+
+ if (!qos)
+ return;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY,
+ NULL, &entry);
+
+ dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+
+ dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
+ "a{sv}", &var);
+
+ dbus_message_iter_open_container(&var, DBUS_TYPE_ARRAY, "{sv}",
+ &dict);
+
+ if (cfg->ep->broadcast)
+ append_bcast_qos(&dict, cfg);
+ else
+ append_ucast_qos(&dict, cfg);
+
+ dbus_message_iter_close_container(&var, &dict);
+ dbus_message_iter_close_container(&entry, &var);
+ dbus_message_iter_close_container(iter, &entry);
+}
+
static void append_properties(DBusMessageIter *iter,
struct endpoint_config *cfg)
{
DBusMessageIter dict;
- struct codec_qos *qos = (void *)cfg->qos;
const char *key = "Capabilities";
- const char *meta = "Metadata";
- const char *keyBCode = "BroadcastCode";
dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "{sv}", &dict);
@@ -1906,6 +2066,8 @@ static void append_properties(DBusMessageIter *iter,
cfg->caps->iov_len);
if (cfg->meta && cfg->meta->iov_len) {
+ const char *meta = "Metadata";
+
g_dbus_dict_append_basic_array(&dict, DBUS_TYPE_STRING, &meta,
DBUS_TYPE_BYTE, &cfg->meta->iov_base,
cfg->meta->iov_len);
@@ -1914,132 +2076,8 @@ static void append_properties(DBusMessageIter *iter,
bt_shell_hexdump(cfg->meta->iov_base, cfg->meta->iov_len);
}
- if (!qos)
- goto done;
+ append_qos(&dict, cfg);
- if (cfg->target_latency) {
- bt_shell_printf("TargetLatency 0x%02x\n", qos->interval);
- g_dbus_dict_append_entry(&dict, "TargetLatency",
- DBUS_TYPE_BYTE, &cfg->target_latency);
- }
-
- if ((!cfg->ep->broadcast) &&
- (cfg->ep->iso_group != BT_ISO_QOS_GROUP_UNSET)) {
- bt_shell_printf("CIG 0x%2.2x\n", cfg->ep->iso_group);
- g_dbus_dict_append_entry(&dict, "CIG", DBUS_TYPE_BYTE,
- &cfg->ep->iso_group);
- } else {
- bt_shell_printf("BIG 0x%2.2x\n", bcast_qos.bcast.big);
- g_dbus_dict_append_entry(&dict, "BIG", DBUS_TYPE_BYTE,
- &bcast_qos.bcast.big);
- }
-
- if ((!cfg->ep->broadcast) &&
- (cfg->ep->iso_stream != BT_ISO_QOS_STREAM_UNSET)) {
- bt_shell_printf("CIS 0x%2.2x\n", cfg->ep->iso_stream);
- g_dbus_dict_append_entry(&dict, "CIS", DBUS_TYPE_BYTE,
- &cfg->ep->iso_stream);
-
- } else {
- bt_shell_printf("BIS 0x%2.2x\n", bcast_qos.bcast.bis);
- g_dbus_dict_append_entry(&dict, "BIS", DBUS_TYPE_BYTE,
- &bcast_qos.bcast.bis);
- }
-
- bt_shell_printf("Interval %u\n", qos->interval);
-
- g_dbus_dict_append_entry(&dict, "Interval", DBUS_TYPE_UINT32,
- &qos->interval);
-
- if (!cfg->ep->broadcast) {
- bt_shell_printf("Framing %s\n",
- qos->framing ? "true" : "false");
-
- g_dbus_dict_append_entry(&dict, "Framing", DBUS_TYPE_BOOLEAN,
- &qos->framing);
- } else {
- bt_shell_printf("Framing %s\n",
- bcast_qos.bcast.framing ? "true" : "false");
-
- g_dbus_dict_append_entry(&dict, "Framing", DBUS_TYPE_BOOLEAN,
- &bcast_qos.bcast.framing);
- }
-
- bt_shell_printf("PHY %s\n", qos->phy);
-
- g_dbus_dict_append_entry(&dict, "PHY", DBUS_TYPE_STRING, &qos->phy);
-
- bt_shell_printf("SDU %u\n", cfg->qos->sdu);
-
- g_dbus_dict_append_entry(&dict, "SDU", DBUS_TYPE_UINT16, &qos->sdu);
-
- bt_shell_printf("Retransmissions %u\n", qos->rtn);
-
- g_dbus_dict_append_entry(&dict, "Retransmissions", DBUS_TYPE_BYTE,
- &qos->rtn);
-
- bt_shell_printf("Latency %u\n", qos->latency);
-
- g_dbus_dict_append_entry(&dict, "Latency", DBUS_TYPE_UINT16,
- &qos->latency);
-
- bt_shell_printf("Delay %u\n", qos->delay);
-
- g_dbus_dict_append_entry(&dict, "Delay", DBUS_TYPE_UINT32,
- &qos->delay);
-
- if (!cfg->ep->broadcast)
- goto done;
-
- bt_shell_printf("SyncInterval %u\n", bcast_qos.bcast.sync_factor);
-
- g_dbus_dict_append_entry(&dict, "SyncInterval", DBUS_TYPE_BYTE,
- &bcast_qos.bcast.sync_factor);
-
- bt_shell_printf("Encryption %u\n", bcast_qos.bcast.encryption);
-
- g_dbus_dict_append_entry(&dict, "Encryption", DBUS_TYPE_BYTE,
- &bcast_qos.bcast.encryption);
-
- bt_shell_printf("Options %u\n", bcast_qos.bcast.options);
-
- g_dbus_dict_append_entry(&dict, "Options", DBUS_TYPE_BYTE,
- &bcast_qos.bcast.options);
-
- bt_shell_printf("Skip %u\n", bcast_qos.bcast.skip);
-
- g_dbus_dict_append_entry(&dict, "Skip", DBUS_TYPE_UINT16,
- &bcast_qos.bcast.skip);
-
- bt_shell_printf("SyncTimeout %u\n", bcast_qos.bcast.sync_timeout);
-
- g_dbus_dict_append_entry(&dict, "SyncTimeout", DBUS_TYPE_UINT16,
- &bcast_qos.bcast.sync_timeout);
-
- bt_shell_printf("SyncCteType %u\n", bcast_qos.bcast.sync_cte_type);
-
- g_dbus_dict_append_entry(&dict, "SyncCteType", DBUS_TYPE_BYTE,
- &bcast_qos.bcast.sync_cte_type);
-
- bt_shell_printf("MSE %u\n", bcast_qos.bcast.mse);
-
- g_dbus_dict_append_entry(&dict, "MSE", DBUS_TYPE_BYTE,
- &bcast_qos.bcast.mse);
-
- bt_shell_printf("Timeout %u\n", bcast_qos.bcast.timeout);
-
- g_dbus_dict_append_entry(&dict, "Timeout", DBUS_TYPE_UINT16,
- &bcast_qos.bcast.timeout);
-
- bt_shell_printf("BroadcastCode:\n");
- bt_shell_hexdump(cfg->ep->bcode->iov_base, cfg->ep->bcode->iov_len);
-
- g_dbus_dict_append_basic_array(&dict, DBUS_TYPE_STRING, &keyBCode,
- DBUS_TYPE_BYTE,
- &cfg->ep->bcode->iov_base,
- cfg->ep->bcode->iov_len);
-
-done:
dbus_message_iter_close_container(iter, &dict);
}
@@ -3009,9 +3047,9 @@ static void custom_phy(const char *input, void *user_data)
struct codec_qos *qos = (void *)&p->qos;
if (!strcmp(input, "1M"))
- qos->phy = "1M";
+ qos->phy = 0x01;
else if (!strcmp(input, "2M"))
- qos->phy = "2M";
+ qos->phy = 0x02;
else {
char *endptr = NULL;
uint8_t phy = strtol(input, &endptr, 0);
@@ -3023,10 +3061,8 @@ static void custom_phy(const char *input, void *user_data)
switch (phy) {
case 0x01:
- qos->phy = "1M";
- break;
case 0x02:
- qos->phy = "2M";
+ qos->phy = phy;
break;
default:
bt_shell_printf("Invalid argument: %s\n", input);
diff --git a/client/print.c b/client/print.c
index 66439e541307..8d721e21df4b 100644
--- a/client/print.c
+++ b/client/print.c
@@ -165,11 +165,19 @@ void print_iter(const char *label, const char *name, DBusMessageIter *iter)
break;
case DBUS_TYPE_DICT_ENTRY:
dbus_message_iter_recurse(iter, &subiter);
- entry = g_strconcat(name, " Key", NULL);
- print_iter(label, entry, &subiter);
- g_free(entry);
- entry = g_strconcat(name, " Value", NULL);
+ if (dbus_message_iter_get_arg_type(&subiter) ==
+ DBUS_TYPE_STRING) {
+ dbus_message_iter_get_basic(&subiter, &valstr);
+ entry = g_strconcat(name, ".", valstr, NULL);
+ } else {
+ entry = g_strconcat(name, ".Key", NULL);
+ print_iter(label, entry, &subiter);
+ g_free(entry);
+
+ entry = g_strconcat(name, ".Value", NULL);
+ }
+
dbus_message_iter_next(&subiter);
print_iter(label, entry, &subiter);
g_free(entry);
--
2.41.0
^ permalink raw reply related [flat|nested] 7+ messages in thread