2023-09-27 22:13:48

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH v4 01/12] media-api: Update to reflect the last code changes

From: Luiz Augusto von Dentz <[email protected]>

This reflect the last code changes adding the missing Broadcast
properties.
---
doc/media-api.rst | 179 +++++++++++++++++++++++++++++++++++-----------
1 file changed, 138 insertions(+), 41 deletions(-)

diff --git a/doc/media-api.rst b/doc/media-api.rst
index 34bf44e8ffbb..b37ae8f01630 100644
--- a/doc/media-api.rst
+++ b/doc/media-api.rst
@@ -710,28 +710,45 @@ void SetConfiguration(object transport, dict properties)
properties:

:array{byte} Capabilities [Mandatory]:
+
+ See Endpoint.Capabilities property.
+
:array{byte} Metadata [ISO only]:
- :byte CIG [ISO only]:
- :byte CIS [ISO only]:
- :uint32 Interval [ISO only]:
- :bool Framing [ISO only]:
- :string PHY [ISO only]:
- :uint16 SDU [ISO only]:
- :byte Retransmissions [ISO only]:
- :uint16 Latency [ISO only]:
- :uint32 Delay [ISO only]:
- :uint8 TargetLatency [ISO Latency]:
- :byte BIG [ISO broadcast only]:
- :byte BIS [ISO broadcast only]:
- :byte SyncInterval [ISO broadcast only]:
- :byte Encryption [ISO broadcast only]:
- :byte Options [ISO broadcast only]:
- :uint16 Skip [ISO broadcast only]:
- :uint16 SyncTimeout [ISO broadcast only]:
- :byte SyncCteType [ISO broadcast only]:
- :byte MSE [ISO broadcast only]:
- :uint16 Timeout [ISO broadcast only]:
- :array{byte} BroadcastCode [ISO broadcast only]:
+
+ See Endpoint.Metadata property.
+
+ :uint32 Location [ISO only]:
+
+ See Endpoint.Location property.
+
+ :byte Framing [ISO only]:
+
+ See Endpoint.Framing property.
+
+ :byte PHY [ISO only]:
+
+ See Endpoint.PHY property.
+
+ :uint16 MaximumLatency [ISO only]:
+
+ See Endpoint.MaximumLatency property.
+
+ :uint32 MinimumDelay [ISO only]:
+
+ See Endpoint.MinimumDelay property.
+
+ :uint32 MaximumDelay [ISO only]:
+
+ See Endpoint.MaximumDelay property.
+
+ :uint32 PreferredMinimumDelay [ISO only]:
+
+ See Endpoint.PreferredMinimumDelay property.
+
+ :uint32 PreferredMaximumDelay [ISO only]:
+
+ See Endpoint.PreferredMaximumDelay property.
+

array{byte} SelectConfiguration(array{byte} capabilities)
`````````````````````````````````````````````````````````
@@ -984,33 +1001,65 @@ dict QoS [readonly, optional, ISO only, experimental]

Indicates configured CIG.

+ Possible values:
+
+ :0x00 - 0xef:
+
+ Valid ID range.
+
+ :0xff:
+
+ Auto allocate.
+
:byte CIS:

Indicates configured CIS.

- :uint32 Interval:
+ Possible values:

- Indicates configured ISO interval.
+ :0x00 - 0xef:

- :boolean Framing:
+ Valid ID range.
+
+ :0xff:
+
+ Auto allocate.
+
+ :byte Framing:

Indicates configured framing.

- :byte PHY:
+ Possible values:

- Indicates configured PHY.
+ :0x00:

- :uint16 SDU:
+ Unframed.

- Indicates configured SDU.
+ :0x01:

- :byte Retransmissions:
+ Framed.

- Indicates configured retransmissions.
+ :uint32 PresentationDelay:

- :uint16 Latency:
+ Indicates configured transport presentation delay (us).

- Indicates configured transport latency.
+ :byte TargetLatency:
+
+ Indicates the requested target latency.
+
+ Possible values:
+
+ :0x01:
+
+ Low Latency.
+
+ :0x02:
+
+ Balanced Latency/Reliability.
+
+ :0x03:
+
+ High Reliability.

Possible values for Broadcast:

@@ -1022,26 +1071,74 @@ dict QoS [readonly, optional, ISO only, experimental]

Indicates configured BIS.

- :uint32 SyncFactor:
+ :byte SyncFactor:

- Indicates configured sync factor.
+ Indicates configured broadcast sync factor.

- :uint32 Interval:
+ :byte Packing:

- Indicates configured ISO interval.
+ Indicates configured packing.

- :byte PHY:
+ :byte Framing:

- Indicates configured PHY.
+ Indicates configured framing.

- :uint16 SDU:
+ :byte Options:

- Indicates configured maximum SDU.
+ Indicates configured broadcast options.
+
+ :uint16 Skip:
+
+ Indicates configured broadcast skip.

:byte SyncTimeout:

Indicates configured broadcast sync timeout.

+ :byte SyncType:
+
+ Indicates configured broadcast sync CTE type.
+
+ :byte MSE:
+
+ Indicates configured broadcast MSE.
+
+ :uint16 Timeout:
+
+ Indicates configured broadcast timeout.
+
+ Possible values for both Unicast and Broadcast:
+
+ :uint32 Interval:
+
+ Indicates configured ISO interval (us).
+
:uint16 Latency:

- Indicates configured transport latency.
+ Indicates configured transport latency (ms).
+
+ :uint16 SDU:
+
+ Indicates configured maximum SDU.
+
+ :byte PHY:
+
+ Indicates configured PHY.
+
+ Possible values:
+
+ :bit 0:
+
+ LE 1M
+
+ :bit 1:
+
+ LE 2M
+
+ :bit 2:
+
+ LE Coded
+
+ :byte Retransmissions:
+
+ Indicates configured retransmissions.
--
2.41.0


2023-09-27 23:24:24

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH v4 05/12] client: Make Endpoint.SelectProperties reply properly

From: Luiz Augusto von Dentz <[email protected]>

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 d72ad6a5da01..6953eff28543 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)
@@ -1770,14 +1770,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);

@@ -1789,6 +1949,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);
@@ -1797,132 +1959,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);
}

@@ -2892,9 +2930,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);
@@ -2906,10 +2944,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

2023-09-27 23:46:12

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH v4 07/12] shared/bap: Add support content and contexts to bt_bap_pac_qos

From: Luiz Augusto von Dentz <[email protected]>

This adds support for setting supported content and contexts on a per
PAC record basis which then is carried over to their respective PACS
attribute and notified properly when changed (added/removed).
---
src/shared/bap.c | 168 ++++++++++++++++++++++++++++++++++++++++++++++-
src/shared/bap.h | 3 +
2 files changed, 170 insertions(+), 1 deletion(-)

diff --git a/src/shared/bap.c b/src/shared/bap.c
index 1c43680c2457..6400d1d69221 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -2468,6 +2468,80 @@ static void bap_pac_free(void *data)
free(pac);
}

+static void pacs_sink_location_changed(struct bt_pacs *pacs)
+{
+ uint32_t location = cpu_to_le32(pacs->sink_loc_value);
+
+ gatt_db_attribute_notify(pacs->sink_loc, (void *)&location,
+ sizeof(location), NULL);
+}
+
+static void pacs_add_sink_location(struct bt_pacs *pacs, uint32_t location)
+{
+ location |= pacs->sink_loc_value;
+
+ /* Check if location value needs updating */
+ if (location == pacs->sink_loc_value)
+ return;
+
+ pacs->sink_loc_value = location;
+
+ pacs_sink_location_changed(pacs);
+}
+
+static void pacs_supported_context_changed(struct bt_pacs *pacs)
+{
+ struct bt_pacs_context ctx;
+
+ memset(&ctx, 0, sizeof(ctx));
+
+ ctx.snk = cpu_to_le16(pacs->supported_sink_context_value);
+ ctx.src = cpu_to_le16(pacs->supported_source_context_value);
+
+ gatt_db_attribute_notify(pacs->supported_context, (void *)&ctx,
+ sizeof(ctx), NULL);
+}
+
+static void pacs_add_sink_supported_context(struct bt_pacs *pacs,
+ uint16_t context)
+{
+ context |= pacs->supported_sink_context_value;
+
+ /* Check if context value needs updating */
+ if (context == pacs->supported_sink_context_value)
+ return;
+
+ pacs->supported_sink_context_value = context;
+
+ pacs_supported_context_changed(pacs);
+}
+
+static void pacs_context_changed(struct bt_pacs *pacs)
+{
+ struct bt_pacs_context ctx;
+
+ memset(&ctx, 0, sizeof(ctx));
+
+ ctx.snk = cpu_to_le16(pacs->sink_context_value);
+ ctx.src = cpu_to_le16(pacs->source_context_value);
+
+ gatt_db_attribute_notify(pacs->context, (void *)&ctx, sizeof(ctx),
+ NULL);
+}
+
+static void pacs_add_sink_context(struct bt_pacs *pacs, uint16_t context)
+{
+ context |= pacs->supported_sink_context_value;
+
+ /* Check if context value needs updating */
+ if (context == pacs->sink_context_value)
+ return;
+
+ pacs->sink_context_value = context;
+
+ pacs_context_changed(pacs);
+}
+
static void bap_add_sink(struct bt_bap_pac *pac)
{
struct iovec iov;
@@ -2482,10 +2556,62 @@ static void bap_add_sink(struct bt_bap_pac *pac)

queue_foreach(pac->bdb->sinks, pac_foreach, &iov);

+ pacs_add_sink_location(pac->bdb->pacs, pac->qos.location);
+ pacs_add_sink_supported_context(pac->bdb->pacs,
+ pac->qos.supported_context);
+ pacs_add_sink_context(pac->bdb->pacs, pac->qos.context);
gatt_db_attribute_notify(pac->bdb->pacs->sink, iov.iov_base,
iov.iov_len, NULL);
}

+static void pacs_source_location_changed(struct bt_pacs *pacs)
+{
+ uint32_t location = cpu_to_le32(pacs->source_loc_value);
+
+ gatt_db_attribute_notify(pacs->source_loc, (void *)&location,
+ sizeof(location), NULL);
+}
+
+static void pacs_add_source_location(struct bt_pacs *pacs, uint32_t location)
+{
+ location |= pacs->source_loc_value;
+
+ /* Check if location value needs updating */
+ if (location == pacs->source_loc_value)
+ return;
+
+ pacs->source_loc_value = location;
+
+ pacs_source_location_changed(pacs);
+}
+
+static void pacs_add_source_supported_context(struct bt_pacs *pacs,
+ uint16_t context)
+{
+ context |= pacs->supported_source_context_value;
+
+ /* Check if context value needs updating */
+ if (context == pacs->supported_source_context_value)
+ return;
+
+ pacs->supported_source_context_value = context;
+
+ pacs_supported_context_changed(pacs);
+}
+
+static void pacs_add_source_context(struct bt_pacs *pacs, uint16_t context)
+{
+ context |= pacs->supported_sink_context_value;
+
+ /* Check if context value needs updating */
+ if (context == pacs->sink_context_value)
+ return;
+
+ pacs->sink_context_value = context;
+
+ pacs_context_changed(pacs);
+}
+
static void bap_add_source(struct bt_bap_pac *pac)
{
struct iovec iov;
@@ -2500,6 +2626,11 @@ static void bap_add_source(struct bt_bap_pac *pac)

queue_foreach(pac->bdb->sinks, pac_foreach, &iov);

+ pacs_add_source_location(pac->bdb->pacs, pac->qos.location);
+ pacs_add_source_supported_context(pac->bdb->pacs,
+ pac->qos.supported_context);
+ pacs_add_source_context(pac->bdb->pacs, pac->qos.context);
+
gatt_db_attribute_notify(pac->bdb->pacs->source, iov.iov_base,
iov.iov_len, NULL);
}
@@ -2685,13 +2816,48 @@ static void remove_streams(void *data, void *user_data)
bt_bap_stream_release(stream, NULL, NULL);
}

+static void bap_pac_sink_removed(void *data, void *user_data)
+{
+ struct bt_bap_pac *pac = data;
+ struct bt_bap_pac_qos *qos = user_data;
+
+ qos->location |= pac->qos.location;
+ qos->supported_context |= pac->qos.supported_context;
+ qos->context |= pac->qos.context;
+}
+
bool bt_bap_remove_pac(struct bt_bap_pac *pac)
{
if (!pac)
return false;

- if (queue_remove_if(pac->bdb->sinks, NULL, pac))
+ if (queue_remove_if(pac->bdb->sinks, NULL, pac)) {
+ struct bt_pacs *pacs = pac->bdb->pacs;
+ struct bt_bap_pac_qos qos;
+
+ memset(&qos, 0, sizeof(qos));
+ queue_foreach(pac->bdb->sinks, bap_pac_sink_removed, &qos);
+
+ if (pacs->sink_loc_value != qos.location) {
+ pacs->sink_loc_value = qos.location;
+ pacs_sink_location_changed(pacs);
+ }
+
+ if (pacs->supported_sink_context_value !=
+ qos.supported_context) {
+ pacs->supported_sink_context_value =
+ qos.supported_context;
+ pacs_supported_context_changed(pacs);
+ }
+
+ if (pacs->sink_context_value != qos.context) {
+ pacs->sink_context_value = qos.context;
+ pacs_context_changed(pacs);
+ }
+
+
goto found;
+ }

if (queue_remove_if(pac->bdb->sources, NULL, pac))
goto found;
diff --git a/src/shared/bap.h b/src/shared/bap.h
index e4eae86502f3..72d6022a32ec 100644
--- a/src/shared/bap.h
+++ b/src/shared/bap.h
@@ -131,6 +131,9 @@ struct bt_bap_pac_qos {
uint32_t pd_max;
uint32_t ppd_min;
uint32_t ppd_max;
+ uint32_t location;
+ uint16_t supported_context;
+ uint16_t context;
};

struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
--
2.41.0

2023-09-27 23:46:58

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH v4 03/12] client: Make transport.show to print QoS configuration

From: Luiz Augusto von Dentz <[email protected]>

This makes transport.show to print QoS configuration since it is now a
single property:

transport.show <transport>
Transport /org/bluez/hci0/dev_00_AA_01_01_00_03/pac_sink0/fd1
UUID: 00002bcb-0000-1000-8000-00805f9b34fb
Codec: 0x06 (6)
Configuration:
02 01 03 02 02 01 03 04 28 00 ........(.
Device: /org/bluez/hci0/dev_00_AA_01_01_00_03
State: idle
Endpoint: /org/bluez/hci0/dev_00_AA_01_01_00_03/pac_sink0
QoS Key: CIG
QoS Value: 0x00 (0)
QoS Key: CIS
QoS Value: 0x00 (0)
QoS Key: Framing
QoS Value: 0x00 (0)
QoS Key: PresentationDelay
QoS Value: 0x00009c40 (40000)
QoS Key: Interval
QoS Value: 0x00002710 (10000)
QoS Key: Latency
QoS Value: 0x000a (10)
QoS Key: SDU
QoS Value: 0x0028 (40)
QoS Key: PHY
QoS Value: 0x02 (2)
QoS Key: Retransmissions
QoS Value: 0x02 (2)
Location: 0x00000003 (3)
Links: /org/bluez/hci0/dev_00_AA_01_01_00_03/pac_source0/fd0
---
client/player.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/client/player.c b/client/player.c
index fdc27c281ed8..d72ad6a5da01 100644
--- a/client/player.c
+++ b/client/player.c
@@ -3799,11 +3799,7 @@ static void cmd_show_transport(int argc, char *argv[])
print_property(proxy, "Volume");
print_property(proxy, "Endpoint");

- print_property(proxy, "Interval");
- print_property(proxy, "Framing");
- print_property(proxy, "SDU");
- print_property(proxy, "Retransmissions");
- print_property(proxy, "Latency");
+ print_property(proxy, "QoS");
print_property(proxy, "Location");
print_property(proxy, "Metadata");
print_property(proxy, "Links");
--
2.41.0

2023-09-27 23:54:38

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH v4 12/12] bap: Fix freeing value of dbus_message_iter_get_fixed_array

From: Luiz Augusto von Dentz <[email protected]>

The value returned by dbus_message_iter_get_fixed_array is a reference
and shall not be freed:

'The returned value is by reference and should not be freed.'
---
profiles/audio/bap.c | 31 ++++++++++++++++++++++---------
1 file changed, 22 insertions(+), 9 deletions(-)

diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c
index 18872329d4ac..48a1a4f86f8d 100644
--- a/profiles/audio/bap.c
+++ b/profiles/audio/bap.c
@@ -365,19 +365,17 @@ static const GDBusPropertyTable ep_properties[] = {
{ }
};

-static int parse_array(DBusMessageIter *iter, struct iovec **iov)
+static int parse_array(DBusMessageIter *iter, struct iovec *iov)
{
DBusMessageIter array;

if (!iov)
return 0;

- if (!(*iov))
- *iov = new0(struct iovec, 1);
-
dbus_message_iter_recurse(iter, &array);
- dbus_message_iter_get_fixed_array(&array, &(*iov)->iov_base,
- (int *)&(*iov)->iov_len);
+ dbus_message_iter_get_fixed_array(&array, &iov->iov_base,
+ (int *)&iov->iov_len);
+
return 0;
}

@@ -594,10 +592,15 @@ static int parse_bcast_qos(const char *key, int var, DBusMessageIter *iter,

dbus_message_iter_get_basic(iter, &qos->bcast.timeout);
} else if (!strcasecmp(key, "BCode")) {
+ struct iovec iov;
+
if (var != DBUS_TYPE_ARRAY)
return -EINVAL;

- parse_array(iter, &qos->bcast.bcode);
+ parse_array(iter, &iov);
+
+ util_iov_free(qos->bcast.bcode, 1);
+ qos->bcast.bcode = util_iov_dup(&iov, 1);
} else {
int err;

@@ -653,6 +656,9 @@ static int parse_configuration(DBusMessageIter *props, struct iovec **caps,
struct bt_bap_qos *qos)
{
const char *key;
+ struct iovec iov;
+
+ memset(&iov, 0, sizeof(iov));

while (dbus_message_iter_get_arg_type(props) == DBUS_TYPE_DICT_ENTRY) {
DBusMessageIter value, entry;
@@ -670,14 +676,20 @@ static int parse_configuration(DBusMessageIter *props, struct iovec **caps,
if (var != DBUS_TYPE_ARRAY)
goto fail;

- if (parse_array(&value, caps))
+ if (parse_array(&value, &iov))
goto fail;
+
+ util_iov_free(*caps, 1);
+ *caps = util_iov_dup(&iov, 1);
} else if (!strcasecmp(key, "Metadata")) {
if (var != DBUS_TYPE_ARRAY)
goto fail;

- if (parse_array(&value, metadata))
+ if (parse_array(&value, &iov))
goto fail;
+
+ util_iov_free(*metadata, 1);
+ *metadata = util_iov_dup(&iov, 1);
} else if (!strcasecmp(key, "QoS")) {
if (var != DBUS_TYPE_ARRAY)
goto fail;
@@ -1202,6 +1214,7 @@ static void select_cb(struct bt_bap_pac *pac, int err, struct iovec *caps,
goto done;
}

+ util_iov_free(ep->caps, 1);
ep->caps = util_iov_dup(caps, 1);

if (metadata && metadata->iov_base && metadata->iov_len) {
--
2.41.0

2023-09-28 00:42:12

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH v4 08/12] doc/MediaEndpoint: Move QoS capabilities to its own dict property

From: Luiz Augusto von Dentz <[email protected]>

This moves QoS capabilities to its own dict property just as it was done
for MediaTransport QoS configuration.
---
doc/org.bluez.MediaEndpoint.rst | 172 ++++++++++++++------------------
1 file changed, 77 insertions(+), 95 deletions(-)

diff --git a/doc/org.bluez.MediaEndpoint.rst b/doc/org.bluez.MediaEndpoint.rst
index cba8cb3edc6e..0e201ff9dc6a 100644
--- a/doc/org.bluez.MediaEndpoint.rst
+++ b/doc/org.bluez.MediaEndpoint.rst
@@ -41,57 +41,31 @@ void SetConfiguration(object transport, dict properties)

See Metadata property.

- :uint32 Location [ISO only]:
+ :dict QoS [ISO only]:

- See Location property.
-
- :byte Framing [ISO only]:
-
- See Framing property.
-
- :byte PHY [ISO only]:
-
- See PHY property.
-
- :uint16 MaximumLatency [ISO only]:
-
- See MaximumLatency property.
-
- :uint32 MinimumDelay [ISO only]:
-
- See MinimumDelay property.
-
- :uint32 MaximumDelay [ISO only]:
-
- See MaximumDelay property.
-
- :uint32 PreferredMinimumDelay [ISO only]:
-
- See PreferredMinimumDelay property.
-
- :uint32 PreferredMaximumDelay [ISO only]:
-
- See PreferredMaximumDelay property.
+ See **org.bluez.MediaTransport(5)** QoS property.

array{byte} SelectConfiguration(array{byte} capabilities)
`````````````````````````````````````````````````````````

Select preferable configuration from the supported capabilities.

- Returns a configuration which can be used to setup a transport.
+ Returns a configuration which can be used to setup a transport, see
+ **org.bluez.MediaTransport(5)** for possible values.

Note: There is no need to cache the selected configuration since on
success the configuration is send back as parameter of SetConfiguration.

-dict SelectProperties(dict properties)
-``````````````````````````````````````
+dict SelectProperties(dict capabilities)
+````````````````````````````````````````

- Select preferable properties from the supported properties:
+ Select configuration from the supported capabilities:

:object Endpoint [ISO only]:
:Refer to SetConfiguration for the list of other possible properties.:

- Returns propeties which can be used to setup a transport.
+ Returns a configuration which can be used to setup a transport, see
+ **org.bluez.MediaTransport(5)** for possible values.

Note: There is no need to cache the selected properties since on
success the configuration is send back as parameter of SetConfiguration.
@@ -154,71 +128,79 @@ bool DelayReporting [readonly, optional]

Indicates if endpoint supports Delay Reporting.

-byte Framing [ISO only]
-```````````````````````
-
- Indicates endpoint support framing.
-
-byte PHY [ISO only]
-```````````````````
-
- Indicates endpoint supported PHY.
-
- Possible values:
-
- :bit 0:
-
- LE 1M
-
- :bit 1:
-
- LE 2M
-
- :bit 2:
-
- LE Coded
-
-byte Retransmissions [ISO only]
-```````````````````````````````
-
- Indicates endpoint preferred number of retransmissions.
-
-uint16_t MaximumLatency [ISO only]
-``````````````````````````````````
-
- Indicates endpoint maximum latency.
-
-uint32_t MinimumDelay [ISO only]
-````````````````````````````````
-
- Indicates endpoint minimum presentation delay.
-
-uint32_t MaximumDelay [ISO only]
-````````````````````````````````
-
- Indicates endpoint maximum presentation delay.
-
-uint32_t PreferredMinimumDelay [ISO only]
-`````````````````````````````````````````
-
- Indicates endpoint preferred minimum presentation delay.
-
-uint32_t PreferredMaximumDelay [ISO only]
-`````````````````````````````````````````
-
- Indicates endpoint preferred maximum presentation delay.
-
-uint32 Location [ISO only]
-``````````````````````````
+uint32 Locations [readonly, optional, ISO only, experimental]
+`````````````````````````````````````````````````````````````

Indicates endpoint supported locations.

-uint16 SupportedContext [ISO only]
-``````````````````````````````````
+uint16 SupportedContext [readonly, optional, ISO only, experimental]
+````````````````````````````````````````````````````````````````````

Indicates endpoint supported audio context.

-uint16 Context [ISO only]
-`````````````````````````
+uint16 Context [readonly, optional, ISO only, experimental]
+```````````````````````````````````````````````````````````

Indicates endpoint available audio context.
+
+dict QoS [readonly, optional, ISO only, experimental]
+`````````````````````````````````````````````````````
+
+ Indicates QoS capabilities.
+
+ :byte Framing:
+
+ Indicates endpoint support framing.
+
+
+ Possible Values:
+
+ :0x00:
+
+ Unframed PDUs supported.
+
+ :0x01:
+
+ Unframed PDUs not supported.
+
+ :byte PHY:
+
+ Indicates endpoint preferred PHY.
+
+ Possible values:
+
+ :bit 0:
+
+ LE 1M preferred.
+
+ :bit 1:
+
+ LE 2M preferred.
+
+ :bit 2:
+
+ LE Coded preferred.
+
+ :byte Retransmissions:
+
+ Indicates endpoint preferred number of retransmissions.
+
+ :uint16 MaximumLatency:
+
+ Indicates endpoint maximum latency.
+
+ :uint32 MinimumDelay:
+
+ Indicates endpoint minimum presentation delay.
+
+ :uint32 MaximumDelay:
+
+ Indicates endpoint maximum presentation delay.
+
+ :uint32 PreferredMinimumDelay:
+
+ Indicates endpoint preferred minimum presentation delay.
+
+ :uint32 PreferredMaximumDelay:
+
+ Indicates endpoint preferred maximum presentation delay.
--
2.41.0

2023-09-28 02:06:13

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH v4 09/12] shared/bap: Add support for location and contexts to bt_bap_pac_qos

From: Luiz Augusto von Dentz <[email protected]>

This adds support for location and contexts to bt_bap_pac_qos and
function to read them.
---
src/shared/bap.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++-
src/shared/bap.h | 6 ++++++
2 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/src/shared/bap.c b/src/shared/bap.c
index 6400d1d69221..9e9ea1472029 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -2740,7 +2740,12 @@ uint8_t bt_bap_pac_get_type(struct bt_bap_pac *pac)

uint32_t bt_bap_pac_get_locations(struct bt_bap_pac *pac)
{
- struct bt_pacs *pacs = pac->bdb->pacs;
+ struct bt_pacs *pacs;
+
+ if (!pac)
+ return 0;
+
+ pacs = pac->bdb->pacs;

switch (pac->type) {
case BT_BAP_SOURCE:
@@ -2752,6 +2757,52 @@ uint32_t bt_bap_pac_get_locations(struct bt_bap_pac *pac)
}
}

+uint16_t bt_bap_pac_get_supported_context(struct bt_bap_pac *pac)
+{
+ struct bt_pacs *pacs;
+
+ if (!pac)
+ return 0;
+
+ pacs = pac->bdb->pacs;
+
+ switch (pac->type) {
+ case BT_BAP_SOURCE:
+ return pacs->supported_source_context_value;
+ case BT_BAP_SINK:
+ return pacs->supported_sink_context_value;
+ default:
+ return 0;
+ }
+}
+
+uint16_t bt_bap_pac_get_context(struct bt_bap_pac *pac)
+{
+ struct bt_pacs *pacs;
+
+ if (!pac)
+ return 0;
+
+ pacs = pac->bdb->pacs;
+
+ switch (pac->type) {
+ case BT_BAP_SOURCE:
+ return pacs->source_context_value;
+ case BT_BAP_SINK:
+ return pacs->sink_context_value;
+ default:
+ return 0;
+ }
+}
+
+struct bt_bap_pac_qos *bt_bap_pac_get_qos(struct bt_bap_pac *pac)
+{
+ if (!pac || !pac->qos.phy)
+ return NULL;
+
+ return &pac->qos;
+}
+
uint8_t bt_bap_stream_get_type(struct bt_bap_stream *stream)
{
if (!stream)
diff --git a/src/shared/bap.h b/src/shared/bap.h
index 72d6022a32ec..ebe4dbf7d858 100644
--- a/src/shared/bap.h
+++ b/src/shared/bap.h
@@ -168,6 +168,12 @@ uint8_t bt_bap_pac_get_type(struct bt_bap_pac *pac);

uint32_t bt_bap_pac_get_locations(struct bt_bap_pac *pac);

+uint16_t bt_bap_pac_get_supported_context(struct bt_bap_pac *pac);
+
+uint16_t bt_bap_pac_get_context(struct bt_bap_pac *pac);
+
+struct bt_bap_pac_qos *bt_bap_pac_get_qos(struct bt_bap_pac *pac);
+
uint8_t bt_bap_stream_get_type(struct bt_bap_stream *stream);

struct bt_bap_stream *bt_bap_pac_get_stream(struct bt_bap_pac *pac);
--
2.41.0

2023-09-28 02:22:01

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH v4 02/12] transport: Implement QoS property

From: Luiz Augusto von Dentz <[email protected]>

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 42721c21062b..fdc27c281ed8 100644
--- a/client/player.c
+++ b/client/player.c
@@ -1756,7 +1756,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,
@@ -1874,10 +1874,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 d70ad872eb87..b05d7a2d9675 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;
@@ -744,7 +744,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;
@@ -1659,7 +1659,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 dd923b03ed9d..1e03b7b51475 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 },
@@ -1471,31 +1282,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)
@@ -1538,55 +1325,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 410da2c930ac..a392a06ebcb3 100644
--- a/tools/iso-tester.c
+++ b/tools/iso-tester.c
@@ -241,7 +241,7 @@
.bcast = { \
.big = _big, \
.bis = _bis, \
- .sync_interval = 0x07, \
+ .sync_factor = 0x07, \
.packing = 0x00, \
.framing = 0x00, \
.in = _in, \
@@ -1676,9 +1676,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 68729d97730e..234e4f1b0453 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

2023-09-28 14:57:03

by bluez.test.bot

[permalink] [raw]
Subject: RE: [v4,01/12] media-api: Update to reflect the last code changes

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=788267

---Test result---

Test Summary:
CheckPatch FAIL 8.55 seconds
GitLint FAIL 4.65 seconds
BuildEll PASS 31.88 seconds
BluezMake PASS 1162.52 seconds
MakeCheck PASS 13.58 seconds
MakeDistcheck PASS 206.98 seconds
CheckValgrind PASS 325.92 seconds
CheckSmatch PASS 439.84 seconds
bluezmakeextell PASS 129.00 seconds
IncrementalBuild PASS 10914.56 seconds
ScanBuild PASS 1216.72 seconds

Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script
Output:
[v4,10/12] bap: Add support for missing MediaEndpoint properties
ERROR:SPACING: space prohibited before that close parenthesis ')'
#561: FILE: profiles/audio/bap.c:991:
+ { "Configuration", "a{sv}" } ),

/github/workspace/src/src/13401723.patch total: 1 errors, 0 warnings, 476 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.

/github/workspace/src/src/13401723.patch has style problems, please review.

NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO

NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.


##############################
Test: GitLint - FAIL
Desc: Run gitlint
Output:
[v4,03/12] client: Make transport.show to print QoS configuration

WARNING: I3 - ignore-body-lines: gitlint will be switching from using Python regex 'match' (match beginning) to 'search' (match anywhere) semantics. Please review your ignore-body-lines.regex option accordingly. To remove this warning, set general.regex-style-search=True. More details: https://jorisroovers.github.io/gitlint/configuration/#regex-style-search
10: B3 Line contains hard tab characters (\t): " UUID: 00002bcb-0000-1000-8000-00805f9b34fb"
11: B3 Line contains hard tab characters (\t): " Codec: 0x06 (6)"
12: B3 Line contains hard tab characters (\t): " Configuration:"
14: B3 Line contains hard tab characters (\t): " Device: /org/bluez/hci0/dev_00_AA_01_01_00_03"
15: B3 Line contains hard tab characters (\t): " State: idle"
16: B3 Line contains hard tab characters (\t): " Endpoint: /org/bluez/hci0/dev_00_AA_01_01_00_03/pac_sink0"
17: B3 Line contains hard tab characters (\t): " QoS Key: CIG"
18: B3 Line contains hard tab characters (\t): " QoS Value: 0x00 (0)"
19: B3 Line contains hard tab characters (\t): " QoS Key: CIS"
20: B3 Line contains hard tab characters (\t): " QoS Value: 0x00 (0)"
21: B3 Line contains hard tab characters (\t): " QoS Key: Framing"
22: B3 Line contains hard tab characters (\t): " QoS Value: 0x00 (0)"
23: B3 Line contains hard tab characters (\t): " QoS Key: PresentationDelay"
24: B3 Line contains hard tab characters (\t): " QoS Value: 0x00009c40 (40000)"
25: B3 Line contains hard tab characters (\t): " QoS Key: Interval"
26: B3 Line contains hard tab characters (\t): " QoS Value: 0x00002710 (10000)"
27: B3 Line contains hard tab characters (\t): " QoS Key: Latency"
28: B3 Line contains hard tab characters (\t): " QoS Value: 0x000a (10)"
29: B3 Line contains hard tab characters (\t): " QoS Key: SDU"
30: B3 Line contains hard tab characters (\t): " QoS Value: 0x0028 (40)"
31: B3 Line contains hard tab characters (\t): " QoS Key: PHY"
32: B3 Line contains hard tab characters (\t): " QoS Value: 0x02 (2)"
33: B3 Line contains hard tab characters (\t): " QoS Key: Retransmissions"
34: B3 Line contains hard tab characters (\t): " QoS Value: 0x02 (2)"
35: B3 Line contains hard tab characters (\t): " Location: 0x00000003 (3)"
36: B3 Line contains hard tab characters (\t): " Links: /org/bluez/hci0/dev_00_AA_01_01_00_03/pac_source0/fd0"


---
Regards,
Linux Bluetooth

2023-09-28 16:14:19

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH v4 06/12] doc/media: Convert media-api.rst into manpages

From: Luiz Augusto von Dentz <[email protected]>

This splits media-api.rst into org.bluez.Media<interface>.rst and
generate manpages for them.
---
Makefile.am | 21 +-
doc/media-api.rst | 1144 ------------------------------
doc/org.bluez.Media.rst | 133 ++++
doc/org.bluez.MediaControl.rst | 80 +++
doc/org.bluez.MediaEndpoint.rst | 224 ++++++
doc/org.bluez.MediaFolder.rst | 117 +++
doc/org.bluez.MediaItem.rst | 131 ++++
doc/org.bluez.MediaPlayer.rst | 315 ++++++++
doc/org.bluez.MediaTransport.rst | 274 +++++++
9 files changed, 1292 insertions(+), 1147 deletions(-)
delete mode 100644 doc/media-api.rst
create mode 100644 doc/org.bluez.Media.rst
create mode 100644 doc/org.bluez.MediaControl.rst
create mode 100644 doc/org.bluez.MediaEndpoint.rst
create mode 100644 doc/org.bluez.MediaFolder.rst
create mode 100644 doc/org.bluez.MediaItem.rst
create mode 100644 doc/org.bluez.MediaPlayer.rst
create mode 100644 doc/org.bluez.MediaTransport.rst

diff --git a/Makefile.am b/Makefile.am
index 30db74a0c441..a17841b0668d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -357,8 +357,16 @@ CLEANFILES += $(builtin_files) src/bluetooth.service

if MANPAGES
man_MANS += src/bluetoothd.8
+man_MANS += doc/org.bluez.Media.5 doc/org.bluez.MediaControl.5 \
+ doc/org.bluez.MediaPlayer.5 doc/org.bluez.MediaFolder.5 \
+ doc/org.bluez.MediaItem.5 doc/org.bluez.MediaEndpoint.5 \
+ doc/org.bluez.MediaTransport.5
endif
manual_pages += src/bluetoothd.8
+manual_pages += doc/org.bluez.Media.5 doc/org.bluez.MediaControl.5 \
+ doc/org.bluez.MediaPlayer.5 doc/org.bluez.MediaFolder.5 \
+ doc/org.bluez.MediaItem.5 doc/org.bluez.MediaEndpoint.5 \
+ doc/org.bluez.MediaTransport.5

EXTRA_DIST += src/genbuiltin src/bluetooth.conf \
src/main.conf profiles/network/network.conf \
@@ -397,9 +405,13 @@ EXTRA_DIST += doc/assigned-numbers.txt doc/supported-features.txt \
EXTRA_DIST += doc/mgmt-api.txt \
doc/adapter-api.txt doc/device-api.txt \
doc/agent-api.txt doc/profile-api.txt \
- doc/network-api.txt doc/media-api.rst \
- doc/health-api.txt doc/sap-api.txt \
- doc/input-api.txt
+ doc/network-api.txt doc/health-api.txt \
+ doc/sap-api.txt doc/input-api.txt
+
+EXTRA_DIST += doc/org.bluez.Media.rst doc/org.bluez.MediaControl.rst \
+ doc/org.bluez.MediaPlayer.rst doc/org.bluez.MediaFolder.rst \
+ doc/org.bluez.MediaItem.rst doc/org.bluez.MediaEndpoint.rst \
+ doc/org.bluez.MediaTransport.rst

EXTRA_DIST += doc/gatt-api.txt doc/advertising-api.txt

@@ -667,6 +679,9 @@ endif
%.1: %.rst Makefile
$(RST2MAN_PROCESS)

+%.5: %.rst Makefile
+ $(RST2MAN_PROCESS)
+
%.8: %.rst Makefile
$(RST2MAN_PROCESS)

diff --git a/doc/media-api.rst b/doc/media-api.rst
deleted file mode 100644
index b37ae8f01630..000000000000
--- a/doc/media-api.rst
+++ /dev/null
@@ -1,1144 +0,0 @@
-===================================
-BlueZ D-Bus Media API documentation
-===================================
-
-
-Media interface
-===============
-
-:Service: org.bluez
-:Interface: org.bluez.Media1
-:Object path: [variable prefix]/{hci0,hci1,...}
-
-Methods
--------
-
-void RegisterEndpoint(object endpoint, dict properties)
-```````````````````````````````````````````````````````
-
- Register a local end point to sender, the sender can register as many
- end points as it likes.
-
- Note: If the sender disconnects the end points are automatically
- unregistered.
-
- possible properties:
-
- :string UUID:
-
- UUID of the profile which the endpoint is for.
-
- UUID must be in the list of SupportedUUIDS.
-
- :byte Codec:
-
- Assigned number of codec that the endpoint implements. The
- values should match the profile specification which is
- indicated by the UUID.
-
- :uint32_t Vendor [Optional]:
-
- Vendor-specific Company ID, Codec ID tuple that the endpoint
- implements.
-
- It shall be set to appropriate value when Vendor Specific Codec
- (0xff) is used.
-
- :array{byte} Capabilities:
-
- Capabilities blob, it is used as it is so the size and byte
- order must match.
-
- :array{byte} Metadata [Optional]:
-
- Metadata blob, it is used as it is so the size and byte order
- must match.
-
- Possible Errors:
-
- :org.bluez.Error.InvalidArguments:
- :org.bluez.Error.NotSupported:
-
- emitted when interface for the end-point is disabled
-
-void UnregisterEndpoint(object endpoint)
-````````````````````````````````````````
- Unregister sender end point.
-
-void RegisterPlayer(object player, dict properties)
-```````````````````````````````````````````````````
-
- Register a media player object to sender, the sender can register as
- many objects as it likes.
-
- Object must implement at least org.mpris.MediaPlayer2.Player as defined
- in MPRIS 2.2 spec:
-
- http://specifications.freedesktop.org/mpris-spec/latest/
-
- Note: If the sender disconnects its objects are automatically
- unregistered.
-
- Possible Errors:
-
- :org.bluez.Error.InvalidArguments:
- :org.bluez.Error.NotSupported:
-
-void UnregisterPlayer(object player)
-````````````````````````````````````
-
- Unregister sender media player.
-
-void RegisterApplication(object root, dict options)
-```````````````````````````````````````````````````
-
- Register endpoints an player objects within root object which must
- implement ObjectManager.
-
- The application object path together with the D-Bus system bus
- connection ID define the identification of the application.
-
- Possible errors:
-
- :org.bluez.Error.InvalidArguments:
- :org.bluez.Error.AlreadyExists:
-
-void UnregisterApplication(object application)
-``````````````````````````````````````````````
-
- This unregisters the services that has been previously registered. The
- object path parameter must match the same value that has been used on
- registration.
-
- Possible errors:
-
- :org.bluez.Error.InvalidArguments:
- :org.bluez.Error.DoesNotExist:
-
-Properties
-----------
-
-array{string} SupportedUUIDs [readonly]
-```````````````````````````````````````
-
- List of 128-bit UUIDs that represents the supported Endpoint
- registration.
-
-MediaControl interface
-======================
-
-:Service: org.bluez
-:Interface: org.bluez.MediaControl1
-:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX
-
-Methods
--------
-
-void Play() [Deprecated]
-````````````````````````
-
- Resume playback.
-
-void Pause() [Deprecated]
-`````````````````````````
-
- Pause playback.
-
-void Stop() [Deprecated]
-````````````````````````
-
- Stop playback.
-
-void Next() [Deprecated]
-````````````````````````
-
- Next item.
-
-void Previous() [Deprecated]
-````````````````````````````
-
- Previous item.
-
-void VolumeUp() [Deprecated]
-````````````````````````````
-
- Adjust remote volume one step up
-
-void VolumeDown() [Deprecated]
-``````````````````````````````
-
- Adjust remote volume one step down
-
-void FastForward() [Deprecated]
-```````````````````````````````
-
- Fast forward playback, this action is only stopped when another method
- in this interface is called.
-
-void Rewind() [Deprecated]
-``````````````````````````
-
- Rewind playback, this action is only stopped when another method in
- this interface is called.
-
-Properties
-----------
-
-boolean Connected [readonly]
-````````````````````````````
-
-object Player [readonly, optional]
-``````````````````````````````````
-
- Addressed Player object path.
-
-MediaPlayer interface
-=====================
-
-:Service: org.bluez (Controller role)
-:Interface: org.bluez.MediaPlayer1
-:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX
-
-Methods
--------
-
-void Play()
-```````````
-
- Resume playback.
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void Pause()
-````````````
-
- Pause playback.
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void Stop()
-```````````
-
- Stop playback.
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void Next()
-```````````
-
- Next item.
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void Previous()
-```````````````
-
- Previous item.
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void FastForward()
-``````````````````
-
- Fast forward playback, this action is only stopped when another method
- in this interface is called.
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void Rewind()
-`````````````
-
- Rewind playback, this action is only stopped when another method in
- this interface is called.
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void Press(byte avc_key)
-````````````````````````
-
- Press a specific key to send as passthrough command. The key will be
- released automatically. Use Hold() instead if the intention is to hold
- down the key.
-
- Possible Errors:
-
- :org.bluez.Error.InvalidArguments:
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void Hold(byte avc_key)
-```````````````````````
-
- Press and hold a specific key to send as passthrough command. It is
- your responsibility to make sure that Release() is called after calling
- this method. The held key will also be released when any other method
- in this interface is called.
-
- Possible Errors:
-
- :org.bluez.Error.InvalidArguments:
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void Release()
-``````````````
-
- Release the previously held key invoked using Hold().
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-Properties
-----------
-
-string Equalizer [readwrite]
-````````````````````````````
-
- Possible values: "off" or "on"
-
-string Repeat [readwrite]
-`````````````````````````
-
- Possible values: "off", "singletrack", "alltracks" or "group"
-
-string Shuffle [readwrite]
-``````````````````````````
-
- Possible values: "off", "alltracks" or "group"
-
-string Scan [readwrite]
-```````````````````````
-
- Possible values: "off", "alltracks" or "group"
-
-string Status [readonly]
-````````````````````````
-
- Possible status: "playing", "stopped", "paused", "forward-seek",
- "reverse-seek" or "error"
-
-uint32 Position [readonly]
-``````````````````````````
-
- Playback position in milliseconds. Changing the position may generate
- additional events that will be sent to the remote device. When position
- is 0 it means the track is starting and when it's greater than or equal
- to track's duration the track has ended.
-
- Note that even if duration is not available in metadata it's possible
- to signal its end by setting position to the maximum uint32 value.
-
-dict Track [readonly]
-`````````````````````
-
- Track metadata.
-
- Possible values:
-
- :string Title:
-
- Track title name
-
- :string Artist:
-
- Track artist name
-
- :string Album:
-
- Track album name
-
- :string Genre:
-
- Track genre name
-
- :uint32 NumberOfTracks:
-
- Number of tracks in total
-
- :uint32 TrackNumber:
-
- Track number
-
- :uint32 Duration:
-
- Track duration in milliseconds
-
-object Device [readonly]
-````````````````````````
-
- Device object path.
-
-string Name [readonly]
-``````````````````````
-
- Player name
-
-string Type [readonly]
-``````````````````````
-
- Player type
-
- Possible values:
-
- "Audio"
- "Video"
- "Audio Broadcasting"
- "Video Broadcasting"
-
-string Subtype [readonly]
-`````````````````````````
-
- Player subtype
-
- Possible values:
-
- "Audio Book"
- "Podcast"
-
-boolean Browsable [readonly]
-````````````````````````````
-
- If present indicates the player can be browsed using MediaFolder
- interface.
-
- Possible values:
-
- :True:
-
- Supported and active
-
- :False:
-
- Supported but inactive
-
- Note: If supported but inactive clients can enable it by using
- MediaFolder interface but it might interfere in the playback of other
- players.
-
-boolean Searchable [readonly]
-`````````````````````````````
-
- If present indicates the player can be searched using MediaFolder
- interface.
-
- Possible values:
-
- :True:
-
- Supported and active
-
- :False:
-
- Supported but inactive
-
- Note: If supported but inactive clients can enable it by using
- MediaFolder interface but it might interfere in the playback of other
- players.
-
-object Playlist
-```````````````
-
- Playlist object path.
-
-MediaFolder interface
-=====================
-
-:Service: unique name (Target role)
- org.bluez (Controller role)
-:Interface: org.bluez.MediaFolder1
-:Object path: freely definable (Target role)
- [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX
- (Controller role)
-
-Methods
--------
-
-object Search(string value, dict filter)
-````````````````````````````````````````
-
- Return a folder object containing the search result.
-
- To list the items found use the folder object returned and pass to
- ChangeFolder.
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-array{objects, properties} ListItems(dict filter)
-`````````````````````````````````````````````````
-
- Return a list of items found
-
- Possible Errors:
-
- :org.bluez.Error.InvalidArguments:
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void ChangeFolder(object folder)
-````````````````````````````````
-
- Change current folder.
-
- Note: By changing folder the items of previous folder might be destroyed
- and have to be listed again, the exception is NowPlaying folder which
- should be always present while the player is active.
-
- Possible Errors:
-
- :org.bluez.Error.InvalidArguments:
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-Properties
-----------
-
-uint32 NumberOfItems [readonly]
-```````````````````````````````
-
- Number of items in the folder
-
-string Name [readonly]
-``````````````````````
-
- Folder name:
-
- Possible values:
-
- :"/Filesystem/...":
-
- Filesystem scope
-
- :"/NowPlaying/...":
-
- NowPlaying scope
-
- Note: /NowPlaying folder might not be listed if player is stopped,
- folders created by Search are virtual so once another Search is perform
- or the folder is changed using ChangeFolder it will no longer be listed.
-
-Filters
--------
-
-:uint32 Start:
-
- Offset of the first item.
-
- Default value: 0
-
-:uint32 End:
-
- Offset of the last item.
-
- Default value: NumbeOfItems
-
-:array{string} Attributes:
-
- Item properties that should be included in the list.
-
- Possible Values:
-
- "title", "artist", "album", "genre", "number-of-tracks",
- "number", "duration"
-
- Default Value: All
-
-MediaItem interface
-===================
-
-:Service: unique name (Target role)
- org.bluez (Controller role)
-:Interface: org.bluez.MediaItem1
-:Object path: freely definable (Target role)
- [variable
- prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX/itemX
- (Controller role)
-
-Methods
--------
-
-void Play()
-```````````
-
- Play item
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-void AddtoNowPlaying()
-``````````````````````
-
- Add item to now playing list
-
- Possible Errors:
-
- :org.bluez.Error.NotSupported:
- :org.bluez.Error.Failed:
-
-Properties
-----------
-
-object Player [readonly]
-````````````````````````
-
- Player object path the item belongs to
-
-string Name [readonly]
-``````````````````````
-
- Item displayable name
-
-string Type [readonly]
-``````````````````````
-
- Item type
-
- Possible values: "video", "audio", "folder"
-
-string FolderType [readonly, optional]
-``````````````````````````````````````
-
- Folder type.
-
- Possible values: "mixed", "titles", "albums", "artists"
-
- Available if property Type is "Folder"
-
-boolean Playable [readonly, optional]
-`````````````````````````````````````
-
- Indicates if the item can be played
-
- Available if property Type is "folder"
-
-dict Metadata [readonly]
-````````````````````````
-
- Item metadata.
-
- Possible values:
-
- :string Title:
-
- Item title name
-
- Available if property Type is "audio" or "video"
-
- :string Artist:
-
- Item artist name
-
- Available if property Type is "audio" or "video"
-
- :string Album:
-
- Item album name
-
- Available if property Type is "audio" or "video"
-
- :string Genre:
-
- Item genre name
-
- Available if property Type is "audio" or "video"
-
- :uint32 NumberOfTracks:
-
- Item album number of tracks in total
-
- Available if property Type is "audio" or "video"
-
- :uint32 Number:
-
- Item album number
-
- Available if property Type is "audio" or "video"
-
- :uint32 Duration:
-
- Item duration in milliseconds
-
- Available if property Type is "audio" or "video"
-
-MediaEndpoint interface
-=======================
-
-:Service: unique name (Server role)
- org.bluez (Client role)
-:Interface: org.bluez.MediaEndpoint1
-:Object path: freely definable (Server role)
- [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/sepX
- (Client role)
-
-Methods
--------
-
-void SetConfiguration(object transport, dict properties)
-````````````````````````````````````````````````````````
-
- Set configuration for the transport.
-
- For client role transport must be set with a server endpoint oject which
- will be configured and the properties must contain the following
- properties:
-
- :array{byte} Capabilities [Mandatory]:
-
- See Endpoint.Capabilities property.
-
- :array{byte} Metadata [ISO only]:
-
- See Endpoint.Metadata property.
-
- :uint32 Location [ISO only]:
-
- See Endpoint.Location property.
-
- :byte Framing [ISO only]:
-
- See Endpoint.Framing property.
-
- :byte PHY [ISO only]:
-
- See Endpoint.PHY property.
-
- :uint16 MaximumLatency [ISO only]:
-
- See Endpoint.MaximumLatency property.
-
- :uint32 MinimumDelay [ISO only]:
-
- See Endpoint.MinimumDelay property.
-
- :uint32 MaximumDelay [ISO only]:
-
- See Endpoint.MaximumDelay property.
-
- :uint32 PreferredMinimumDelay [ISO only]:
-
- See Endpoint.PreferredMinimumDelay property.
-
- :uint32 PreferredMaximumDelay [ISO only]:
-
- See Endpoint.PreferredMaximumDelay property.
-
-
-array{byte} SelectConfiguration(array{byte} capabilities)
-`````````````````````````````````````````````````````````
-
- Select preferable configuration from the supported capabilities.
-
- Returns a configuration which can be used to setup a transport.
-
- Note: There is no need to cache the selected configuration since on
- success the configuration is send back as parameter of SetConfiguration.
-
-dict SelectProperties(dict properties)
-``````````````````````````````````````
-
- Select preferable properties from the supported properties:
-
- :object Endpoint [ISO only]:
- :Refer to SetConfiguration for the list of other possible properties.:
-
- Returns propeties which can be used to setup a transport.
-
- Note: There is no need to cache the selected properties since on
- success the configuration is send back as parameter of SetConfiguration.
-
-void ClearConfiguration(object transport)
-`````````````````````````````````````````
-
- Clear transport configuration.
-
-void Release()
-``````````````
-
- This method gets called when the service daemon unregisters the
- endpoint. An endpoint can use it to do cleanup tasks. There is no need
- to unregister the endpoint, because when this method gets called it has
- already been unregistered.
-
-Properties
-----------
-
-string UUID [readonly, optional]
-````````````````````````````````
-
- UUID of the profile which the endpoint is for.
-
-byte Codec [readonly, optional]
-```````````````````````````````
-
- Assigned number of codec that the endpoint implements.
- The values should match the profile specification which is indicated by
- the UUID.
-
-uint32_t Vendor [readonly, Optional]
-````````````````````````````````````
-
- Vendor-specific Company ID, Codec ID tuple that the endpoint implements.
-
- It shall be set to appropriate value when Vendor Specific Codec (0xff)
- is used.
-
-array{byte} Capabilities [readonly, optional]
-`````````````````````````````````````````````
-
- Capabilities blob, it is used as it is so the size and byte order must
- match.
-
-array{byte} Metadata [readonly, Optional]
-`````````````````````````````````````````
-
- Metadata blob, it is used as it is so the size and byte order must
- match.
-
-object Device [readonly, optional]
-``````````````````````````````````
-
- Device object which the endpoint is belongs to.
-
-bool DelayReporting [readonly, optional]
-````````````````````````````````````````
-
- Indicates if endpoint supports Delay Reporting.
-
-byte Framing [ISO only]
-```````````````````````
-
- Indicates endpoint support framing.
-
-byte PHY [ISO only]
-```````````````````
-
- Indicates endpoint supported PHY.
-
-uint16_t MaximumLatency [ISO only]
-``````````````````````````````````
-
- Indicates endpoint maximum latency.
-
-uint32_t MinimumDelay [ISO only]
-````````````````````````````````
-
- Indicates endpoint minimum presentation delay.
-
-uint32_t MaximumDelay [ISO only]
-````````````````````````````````
-
- Indicates endpoint maximum presentation delay.
-
-uint32_t PreferredMinimumDelay [ISO only]
-`````````````````````````````````````````
-
- Indicates endpoint preferred minimum presentation delay.
-
-uint32_t PreferredMinimumDelay [ISO only]
-`````````````````````````````````````````
-
- Indicates endpoint preferred minimum presentation delay.
-
-uint32 Location [ISO only]
-``````````````````````````
-
- Indicates endpoint supported locations.
-
-uint16 SupportedContext [ISO only]
-``````````````````````````````````
-
- Indicates endpoint supported audio context.
-
-uint16 Context [ISO only]
-`````````````````````````
-
- Indicates endpoint available audio context.
-
-MediaTransport interface
-========================
-
-:Service: org.bluez
-:Interface: org.bluez.MediaTransport1
-:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/fdX
-
-Methods
--------
-
-fd, uint16, uint16 Acquire()
-````````````````````````````
-
- Acquire transport file descriptor and the MTU for read and write
- respectively.
-
- Possible Errors:
-
- :org.bluez.Error.NotAuthorized:
- :org.bluez.Error.Failed:
-
-fd, uint16, uint16 TryAcquire()
-```````````````````````````````
-
- Acquire transport file descriptor only if the transport is in "pending"
- state at the time the message is received by BlueZ. Otherwise no request
- will be sent to the remote device and the function will just fail with
- org.bluez.Error.NotAvailable.
-
- Possible Errors:
-
- :org.bluez.Error.NotAuthorized:
- :org.bluez.Error.Failed:
- :org.bluez.Error.NotAvailable:
-
-void Release()
-``````````````
-
- Releases file descriptor.
-
-Properties
-----------
-
-object Device [readonly]
-````````````````````````
-
- Device object which the transport is connected to.
-
-string UUID [readonly]
-``````````````````````
-
- UUID of the profile which the transport is for.
-
-byte Codec [readonly]
-`````````````````````
-
- Assigned number of codec that the transport support.
- The values should match the profile specification which is indicated by
- the UUID.
-
-array{byte} Configuration [readonly]
-````````````````````````````````````
-
- Configuration blob, it is used as it is so the size and byte order must
- match.
-
-string State [readonly]
-```````````````````````
-
- Indicates the state of the transport. Possible values are:
-
- :"idle": not streaming
- :"pending": streaming but not acquired
- :"active": streaming and acquired
-
-uint16 Delay [readwrite, optional]
-``````````````````````````````````
-
- Transport delay in 1/10 of millisecond, this property is only writeable
- when the transport was acquired by the sender.
-
-uint16 Volume [readwrite, optional]
-```````````````````````````````````
-
- Indicates volume level of the transport, this property is only writeable
- when the transport was acquired by the sender.
-
- Possible Values: 0-127
-
-object Endpoint [readonly, optional, experimental]
-``````````````````````````````````````````````````
-
- Endpoint object which the transport is associated with.
-
-uint32 Location [readonly, ISO only, experimental]
-``````````````````````````````````````````````````
-
- Indicates transport Audio Location.
-
-array{byte} Metadata [readwrite, ISO Only, experimental]
-````````````````````````````````````````````````````````
-
- Indicates transport Metadata.
-
-array{object} Links [readonly, optional, ISO only, experimental]
-````````````````````````````````````````````````````````````````
-
- Linked transport objects which the transport is associated with.
-
-dict QoS [readonly, optional, ISO only, experimental]
-`````````````````````````````````````````````````````
-
- Only present when QoS is configured.
-
- Possible values for Unicast:
-
- :byte CIG:
-
- Indicates configured CIG.
-
- Possible values:
-
- :0x00 - 0xef:
-
- Valid ID range.
-
- :0xff:
-
- Auto allocate.
-
- :byte CIS:
-
- Indicates configured CIS.
-
- Possible values:
-
- :0x00 - 0xef:
-
- Valid ID range.
-
- :0xff:
-
- Auto allocate.
-
- :byte Framing:
-
- Indicates configured framing.
-
- Possible values:
-
- :0x00:
-
- Unframed.
-
- :0x01:
-
- Framed.
-
- :uint32 PresentationDelay:
-
- Indicates configured transport presentation delay (us).
-
- :byte TargetLatency:
-
- Indicates the requested target latency.
-
- Possible values:
-
- :0x01:
-
- Low Latency.
-
- :0x02:
-
- Balanced Latency/Reliability.
-
- :0x03:
-
- High Reliability.
-
- Possible values for Broadcast:
-
- :byte BIG:
-
- Indicates configured QoS BIG.
-
- :byte BIS:
-
- Indicates configured BIS.
-
- :byte SyncFactor:
-
- Indicates configured broadcast sync factor.
-
- :byte Packing:
-
- Indicates configured packing.
-
- :byte Framing:
-
- Indicates configured framing.
-
- :byte Options:
-
- Indicates configured broadcast options.
-
- :uint16 Skip:
-
- Indicates configured broadcast skip.
-
- :byte SyncTimeout:
-
- Indicates configured broadcast sync timeout.
-
- :byte SyncType:
-
- Indicates configured broadcast sync CTE type.
-
- :byte MSE:
-
- Indicates configured broadcast MSE.
-
- :uint16 Timeout:
-
- Indicates configured broadcast timeout.
-
- Possible values for both Unicast and Broadcast:
-
- :uint32 Interval:
-
- Indicates configured ISO interval (us).
-
- :uint16 Latency:
-
- Indicates configured transport latency (ms).
-
- :uint16 SDU:
-
- Indicates configured maximum SDU.
-
- :byte PHY:
-
- Indicates configured PHY.
-
- Possible values:
-
- :bit 0:
-
- LE 1M
-
- :bit 1:
-
- LE 2M
-
- :bit 2:
-
- LE Coded
-
- :byte Retransmissions:
-
- Indicates configured retransmissions.
diff --git a/doc/org.bluez.Media.rst b/doc/org.bluez.Media.rst
new file mode 100644
index 000000000000..678e6090c6e1
--- /dev/null
+++ b/doc/org.bluez.Media.rst
@@ -0,0 +1,133 @@
+===============
+org.bluez.Media
+===============
+
+-----------------------------------
+BlueZ D-Bus Media API documentation
+-----------------------------------
+
+:Version: BlueZ
+:Date: September 2023
+:Manual section: 5
+:Manual group: Linux System Administration
+
+Interface
+=========
+
+:Service: org.bluez
+:Interface: org.bluez.Media1
+:Object path: [variable prefix]/{hci0,hci1,...}
+
+Methods
+-------
+
+void RegisterEndpoint(object endpoint, dict properties)
+```````````````````````````````````````````````````````
+
+ Register a local end point to sender, the sender can register as many
+ end points as it likes.
+
+ Note: If the sender disconnects the end points are automatically
+ unregistered.
+
+ possible properties:
+
+ :string UUID:
+
+ UUID of the profile which the endpoint is for.
+
+ UUID must be in the list of SupportedUUIDS.
+
+ :byte Codec:
+
+ Assigned number of codec that the endpoint implements. The
+ values should match the profile specification which is
+ indicated by the UUID.
+
+ :uint32_t Vendor [Optional]:
+
+ Vendor-specific Company ID, Codec ID tuple that the endpoint
+ implements.
+
+ It shall be set to appropriate value when Vendor Specific Codec
+ (0xff) is used.
+
+ :array{byte} Capabilities:
+
+ Capabilities blob, it is used as it is so the size and byte
+ order must match.
+
+ :array{byte} Metadata [Optional]:
+
+ Metadata blob, it is used as it is so the size and byte order
+ must match.
+
+ Possible Errors:
+
+ :org.bluez.Error.InvalidArguments:
+ :org.bluez.Error.NotSupported:
+
+ emitted when interface for the end-point is disabled
+
+void UnregisterEndpoint(object endpoint)
+````````````````````````````````````````
+ Unregister sender end point.
+
+void RegisterPlayer(object player, dict properties)
+```````````````````````````````````````````````````
+
+ Register a media player object to sender, the sender can register as
+ many objects as it likes.
+
+ Object must implement at least org.mpris.MediaPlayer2.Player as defined
+ in MPRIS 2.2 spec:
+
+ http://specifications.freedesktop.org/mpris-spec/latest/
+
+ Note: If the sender disconnects its objects are automatically
+ unregistered.
+
+ Possible Errors:
+
+ :org.bluez.Error.InvalidArguments:
+ :org.bluez.Error.NotSupported:
+
+void UnregisterPlayer(object player)
+````````````````````````````````````
+
+ Unregister sender media player.
+
+void RegisterApplication(object root, dict options)
+```````````````````````````````````````````````````
+
+ Register endpoints an player objects within root object which must
+ implement ObjectManager.
+
+ The application object path together with the D-Bus system bus
+ connection ID define the identification of the application.
+
+ Possible errors:
+
+ :org.bluez.Error.InvalidArguments:
+ :org.bluez.Error.AlreadyExists:
+
+void UnregisterApplication(object application)
+``````````````````````````````````````````````
+
+ This unregisters the services that has been previously registered. The
+ object path parameter must match the same value that has been used on
+ registration.
+
+ Possible errors:
+
+ :org.bluez.Error.InvalidArguments:
+ :org.bluez.Error.DoesNotExist:
+
+Properties
+----------
+
+array{string} SupportedUUIDs [readonly]
+```````````````````````````````````````
+
+ List of 128-bit UUIDs that represents the supported Endpoint
+ registration.
diff --git a/doc/org.bluez.MediaControl.rst b/doc/org.bluez.MediaControl.rst
new file mode 100644
index 000000000000..54e84e8c62eb
--- /dev/null
+++ b/doc/org.bluez.MediaControl.rst
@@ -0,0 +1,80 @@
+======================
+org.bluez.MediaControl
+======================
+
+------------------------------------------
+BlueZ D-Bus MediaControl API documentation
+------------------------------------------
+
+:Version: BlueZ
+:Date: September 2023
+:Manual section: 5
+:Manual group: Linux System Administration
+
+Interface
+=========
+
+:Service: org.bluez
+:Interface: org.bluez.MediaControl1
+:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX
+
+Methods
+-------
+
+void Play() [Deprecated]
+````````````````````````
+
+ Resume playback.
+
+void Pause() [Deprecated]
+`````````````````````````
+
+ Pause playback.
+
+void Stop() [Deprecated]
+````````````````````````
+
+ Stop playback.
+
+void Next() [Deprecated]
+````````````````````````
+
+ Next item.
+
+void Previous() [Deprecated]
+````````````````````````````
+
+ Previous item.
+
+void VolumeUp() [Deprecated]
+````````````````````````````
+
+ Adjust remote volume one step up
+
+void VolumeDown() [Deprecated]
+``````````````````````````````
+
+ Adjust remote volume one step down
+
+void FastForward() [Deprecated]
+```````````````````````````````
+
+ Fast forward playback, this action is only stopped when another method
+ in this interface is called.
+
+void Rewind() [Deprecated]
+``````````````````````````
+
+ Rewind playback, this action is only stopped when another method in
+ this interface is called.
+
+Properties
+----------
+
+boolean Connected [readonly]
+````````````````````````````
+
+object Player [readonly, optional]
+``````````````````````````````````
+
+ Addressed Player object path.
diff --git a/doc/org.bluez.MediaEndpoint.rst b/doc/org.bluez.MediaEndpoint.rst
new file mode 100644
index 000000000000..cba8cb3edc6e
--- /dev/null
+++ b/doc/org.bluez.MediaEndpoint.rst
@@ -0,0 +1,224 @@
+=======================
+org.bluez.MediaEndpoint
+=======================
+
+-------------------------------------------
+BlueZ D-Bus MediaEndpoint API documentation
+-------------------------------------------
+
+:Version: BlueZ
+:Date: September 2023
+:Manual section: 5
+:Manual group: Linux System Administration
+
+Interface
+=========
+
+:Service: unique name (Server role)
+ org.bluez (Client role)
+:Interface: org.bluez.MediaEndpoint1
+:Object path: freely definable (Server role)
+ [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/sepX
+ (Client role)
+
+Methods
+-------
+
+void SetConfiguration(object transport, dict properties)
+````````````````````````````````````````````````````````
+
+ Set configuration for the transport.
+
+ For client role transport must be set with a server endpoint oject which
+ will be configured and the properties must contain the following
+ properties:
+
+ :array{byte} Capabilities [Mandatory]:
+
+ See Capabilities property.
+
+ :array{byte} Metadata [ISO only]:
+
+ See Metadata property.
+
+ :uint32 Location [ISO only]:
+
+ See Location property.
+
+ :byte Framing [ISO only]:
+
+ See Framing property.
+
+ :byte PHY [ISO only]:
+
+ See PHY property.
+
+ :uint16 MaximumLatency [ISO only]:
+
+ See MaximumLatency property.
+
+ :uint32 MinimumDelay [ISO only]:
+
+ See MinimumDelay property.
+
+ :uint32 MaximumDelay [ISO only]:
+
+ See MaximumDelay property.
+
+ :uint32 PreferredMinimumDelay [ISO only]:
+
+ See PreferredMinimumDelay property.
+
+ :uint32 PreferredMaximumDelay [ISO only]:
+
+ See PreferredMaximumDelay property.
+
+array{byte} SelectConfiguration(array{byte} capabilities)
+`````````````````````````````````````````````````````````
+
+ Select preferable configuration from the supported capabilities.
+
+ Returns a configuration which can be used to setup a transport.
+
+ Note: There is no need to cache the selected configuration since on
+ success the configuration is send back as parameter of SetConfiguration.
+
+dict SelectProperties(dict properties)
+``````````````````````````````````````
+
+ Select preferable properties from the supported properties:
+
+ :object Endpoint [ISO only]:
+ :Refer to SetConfiguration for the list of other possible properties.:
+
+ Returns propeties which can be used to setup a transport.
+
+ Note: There is no need to cache the selected properties since on
+ success the configuration is send back as parameter of SetConfiguration.
+
+void ClearConfiguration(object transport)
+`````````````````````````````````````````
+
+ Clear transport configuration.
+
+void Release()
+``````````````
+
+ This method gets called when the service daemon unregisters the
+ endpoint. An endpoint can use it to do cleanup tasks. There is no need
+ to unregister the endpoint, because when this method gets called it has
+ already been unregistered.
+
+MediaEndpoint Properties
+------------------------
+
+string UUID [readonly, optional]
+````````````````````````````````
+
+ UUID of the profile which the endpoint is for.
+
+byte Codec [readonly, optional]
+```````````````````````````````
+
+ Assigned number of codec that the endpoint implements.
+ The values should match the profile specification which is indicated by
+ the UUID.
+
+uint32_t Vendor [readonly, Optional]
+````````````````````````````````````
+
+ Vendor-specific Company ID, Codec ID tuple that the endpoint implements.
+
+ It shall be set to appropriate value when Vendor Specific Codec (0xff)
+ is used.
+
+array{byte} Capabilities [readonly, optional]
+`````````````````````````````````````````````
+
+ Capabilities blob, it is used as it is so the size and byte order must
+ match.
+
+array{byte} Metadata [readonly, Optional]
+`````````````````````````````````````````
+
+ Metadata blob, it is used as it is so the size and byte order must
+ match.
+
+object Device [readonly, optional]
+``````````````````````````````````
+
+ Device object which the endpoint is belongs to.
+
+bool DelayReporting [readonly, optional]
+````````````````````````````````````````
+
+ Indicates if endpoint supports Delay Reporting.
+
+byte Framing [ISO only]
+```````````````````````
+
+ Indicates endpoint support framing.
+
+byte PHY [ISO only]
+```````````````````
+
+ Indicates endpoint supported PHY.
+
+ Possible values:
+
+ :bit 0:
+
+ LE 1M
+
+ :bit 1:
+
+ LE 2M
+
+ :bit 2:
+
+ LE Coded
+
+byte Retransmissions [ISO only]
+```````````````````````````````
+
+ Indicates endpoint preferred number of retransmissions.
+
+uint16_t MaximumLatency [ISO only]
+``````````````````````````````````
+
+ Indicates endpoint maximum latency.
+
+uint32_t MinimumDelay [ISO only]
+````````````````````````````````
+
+ Indicates endpoint minimum presentation delay.
+
+uint32_t MaximumDelay [ISO only]
+````````````````````````````````
+
+ Indicates endpoint maximum presentation delay.
+
+uint32_t PreferredMinimumDelay [ISO only]
+`````````````````````````````````````````
+
+ Indicates endpoint preferred minimum presentation delay.
+
+uint32_t PreferredMaximumDelay [ISO only]
+`````````````````````````````````````````
+
+ Indicates endpoint preferred maximum presentation delay.
+
+uint32 Location [ISO only]
+``````````````````````````
+
+ Indicates endpoint supported locations.
+
+uint16 SupportedContext [ISO only]
+``````````````````````````````````
+
+ Indicates endpoint supported audio context.
+
+uint16 Context [ISO only]
+`````````````````````````
+
+ Indicates endpoint available audio context.
diff --git a/doc/org.bluez.MediaFolder.rst b/doc/org.bluez.MediaFolder.rst
new file mode 100644
index 000000000000..dd56f06b41e4
--- /dev/null
+++ b/doc/org.bluez.MediaFolder.rst
@@ -0,0 +1,117 @@
+=====================
+org.bluez.MediaFolder
+=====================
+
+-----------------------------------------
+BlueZ D-Bus MediaFolder API documentation
+-----------------------------------------
+
+:Version: BlueZ
+:Date: September 2023
+:Manual section: 5
+:Manual group: Linux System Administration
+
+Interface
+=========
+
+:Service: unique name (Target role)
+ org.bluez (Controller role)
+:Interface: org.bluez.MediaFolder1
+:Object path: freely definable (Target role)
+ [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX
+ (Controller role)
+
+Methods
+-------
+
+object Search(string value, dict filter)
+````````````````````````````````````````
+
+ Return a folder object containing the search result.
+
+ To list the items found use the folder object returned and pass to
+ ChangeFolder.
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+array{objects, properties} ListItems(dict filter)
+`````````````````````````````````````````````````
+
+ Return a list of items found
+
+ Possible Errors:
+
+ :org.bluez.Error.InvalidArguments:
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void ChangeFolder(object folder)
+````````````````````````````````
+
+ Change current folder.
+
+ Note: By changing folder the items of previous folder might be destroyed
+ and have to be listed again, the exception is NowPlaying folder which
+ should be always present while the player is active.
+
+ Possible Errors:
+
+ :org.bluez.Error.InvalidArguments:
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+Properties
+----------
+
+uint32 NumberOfItems [readonly]
+```````````````````````````````
+
+ Number of items in the folder
+
+string Name [readonly]
+``````````````````````
+
+ Folder name:
+
+ Possible values:
+
+ :"/Filesystem/...":
+
+ Filesystem scope
+
+ :"/NowPlaying/...":
+
+ NowPlaying scope
+
+ Note: /NowPlaying folder might not be listed if player is stopped,
+ folders created by Search are virtual so once another Search is perform
+ or the folder is changed using ChangeFolder it will no longer be listed.
+
+Filters
+-------
+
+:uint32 Start:
+
+ Offset of the first item.
+
+ Default value: 0
+
+:uint32 End:
+
+ Offset of the last item.
+
+ Default value: NumbeOfItems
+
+:array{string} Attributes:
+
+ Item properties that should be included in the list.
+
+ Possible Values:
+
+ "title", "artist", "album", "genre", "number-of-tracks",
+ "number", "duration"
+
+ Default Value: All
diff --git a/doc/org.bluez.MediaItem.rst b/doc/org.bluez.MediaItem.rst
new file mode 100644
index 000000000000..855e8a6395b7
--- /dev/null
+++ b/doc/org.bluez.MediaItem.rst
@@ -0,0 +1,131 @@
+===================
+org.bluez.MediaItem
+===================
+
+---------------------------------------
+BlueZ D-Bus MediaItem API documentation
+---------------------------------------
+
+:Version: BlueZ
+:Date: September 2023
+:Manual section: 5
+:Manual group: Linux System Administration
+
+Interface
+=========
+
+:Service: unique name (Target role)
+ org.bluez (Controller role)
+:Interface: org.bluez.MediaItem1
+:Object path: freely definable (Target role)
+ [variable
+ prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX/itemX
+ (Controller role)
+
+Methods
+-------
+
+void Play()
+```````````
+
+ Play item
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void AddtoNowPlaying()
+``````````````````````
+
+ Add item to now playing list
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+Properties
+----------
+
+object Player [readonly]
+````````````````````````
+
+ Player object path the item belongs to
+
+string Name [readonly]
+``````````````````````
+
+ Item displayable name
+
+string Type [readonly]
+``````````````````````
+
+ Item type
+
+ Possible values: "video", "audio", "folder"
+
+string FolderType [readonly, optional]
+``````````````````````````````````````
+
+ Folder type.
+
+ Possible values: "mixed", "titles", "albums", "artists"
+
+ Available if property Type is "Folder"
+
+boolean Playable [readonly, optional]
+`````````````````````````````````````
+
+ Indicates if the item can be played
+
+ Available if property Type is "folder"
+
+dict Metadata [readonly]
+````````````````````````
+
+ Item metadata.
+
+ Possible values:
+
+ :string Title:
+
+ Item title name
+
+ Available if property Type is "audio" or "video"
+
+ :string Artist:
+
+ Item artist name
+
+ Available if property Type is "audio" or "video"
+
+ :string Album:
+
+ Item album name
+
+ Available if property Type is "audio" or "video"
+
+ :string Genre:
+
+ Item genre name
+
+ Available if property Type is "audio" or "video"
+
+ :uint32 NumberOfTracks:
+
+ Item album number of tracks in total
+
+ Available if property Type is "audio" or "video"
+
+ :uint32 Number:
+
+ Item album number
+
+ Available if property Type is "audio" or "video"
+
+ :uint32 Duration:
+
+ Item duration in milliseconds
+
+ Available if property Type is "audio" or "video"
diff --git a/doc/org.bluez.MediaPlayer.rst b/doc/org.bluez.MediaPlayer.rst
new file mode 100644
index 000000000000..60bd679bb7c0
--- /dev/null
+++ b/doc/org.bluez.MediaPlayer.rst
@@ -0,0 +1,315 @@
+=====================
+org.bluez.MediaPlayer
+=====================
+
+-----------------------------------------
+BlueZ D-Bus MediaPlayer API documentation
+-----------------------------------------
+
+:Version: BlueZ
+:Date: September 2023
+:Manual section: 5
+:Manual group: Linux System Administration
+
+Interface
+=========
+
+:Service: org.bluez (Controller role)
+:Interface: org.bluez.MediaPlayer1
+:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX
+
+Methods
+-------
+
+void Play()
+```````````
+
+ Resume playback.
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void Pause()
+````````````
+
+ Pause playback.
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void Stop()
+```````````
+
+ Stop playback.
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void Next()
+```````````
+
+ Next item.
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void Previous()
+```````````````
+
+ Previous item.
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void FastForward()
+``````````````````
+
+ Fast forward playback, this action is only stopped when another method
+ in this interface is called.
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void Rewind()
+`````````````
+
+ Rewind playback, this action is only stopped when another method in
+ this interface is called.
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void Press(byte avc_key)
+````````````````````````
+
+ Press a specific key to send as passthrough command. The key will be
+ released automatically. Use Hold() instead if the intention is to hold
+ down the key.
+
+ Possible Errors:
+
+ :org.bluez.Error.InvalidArguments:
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void Hold(byte avc_key)
+```````````````````````
+
+ Press and hold a specific key to send as passthrough command. It is
+ your responsibility to make sure that Release() is called after calling
+ this method. The held key will also be released when any other method
+ in this interface is called.
+
+ Possible Errors:
+
+ :org.bluez.Error.InvalidArguments:
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+void Release()
+``````````````
+
+ Release the previously held key invoked using Hold().
+
+ Possible Errors:
+
+ :org.bluez.Error.NotSupported:
+ :org.bluez.Error.Failed:
+
+Properties
+----------
+
+string Equalizer [readwrite]
+````````````````````````````
+
+ Indicates Player Equalizer setting.
+
+ Possible values:
+
+ :"off":
+ :"on":
+
+string Repeat [readwrite]
+`````````````````````````
+
+ Indicates Player Repeat setting.
+
+ Possible values:
+
+ :"off":
+ :"singletrack":
+ :"alltracks":
+ :"group":
+
+string Shuffle [readwrite]
+``````````````````````````
+
+ Indicates Player Suffle setting.
+
+ Possible values:
+
+ :"off":
+ :"alltracks":
+ :"group":
+
+string Scan [readwrite]
+```````````````````````
+
+ Indicates Player Scan setting.
+
+ Possible values:
+
+ :"off":
+ :"alltracks":
+ :"group":
+
+string Status [readonly]
+````````````````````````
+
+ Indicates Player Status setting.
+
+ Possible status:
+
+ :"playing":
+ :"stopped":
+ :"paused":
+ :"forward-seek":
+ :"reverse-seek":
+ :"error":
+
+uint32 Position [readonly]
+``````````````````````````
+
+ Playback position in milliseconds. Changing the position may generate
+ additional events that will be sent to the remote device. When position
+ is 0 it means the track is starting and when it's greater than or equal
+ to track's duration the track has ended.
+
+ Note that even if duration is not available in metadata it's possible
+ to signal its end by setting position to the maximum uint32 value.
+
+dict Track [readonly]
+`````````````````````
+
+ Track metadata.
+
+ Possible values:
+
+ :string Title:
+
+ Track title name
+
+ :string Artist:
+
+ Track artist name
+
+ :string Album:
+
+ Track album name
+
+ :string Genre:
+
+ Track genre name
+
+ :uint32 NumberOfTracks:
+
+ Number of tracks in total
+
+ :uint32 TrackNumber:
+
+ Track number
+
+ :uint32 Duration:
+
+ Track duration in milliseconds
+
+object Device [readonly]
+````````````````````````
+
+ Device object path.
+
+string Name [readonly]
+``````````````````````
+
+ Player name
+
+string Type [readonly]
+``````````````````````
+
+ Player type
+
+ Possible values:
+
+ "Audio"
+ "Video"
+ "Audio Broadcasting"
+ "Video Broadcasting"
+
+string Subtype [readonly]
+`````````````````````````
+
+ Player subtype
+
+ Possible values:
+
+ "Audio Book"
+ "Podcast"
+
+boolean Browsable [readonly]
+````````````````````````````
+
+ If present indicates the player can be browsed using MediaFolder
+ interface.
+
+ Possible values:
+
+ :True:
+
+ Supported and active
+
+ :False:
+
+ Supported but inactive
+
+ Note: If supported but inactive clients can enable it by using
+ MediaFolder interface but it might interfere in the playback of other
+ players.
+
+boolean Searchable [readonly]
+`````````````````````````````
+
+ If present indicates the player can be searched using MediaFolder
+ interface.
+
+ Possible values:
+
+ :True:
+
+ Supported and active
+
+ :False:
+
+ Supported but inactive
+
+ Note: If supported but inactive clients can enable it by using
+ MediaFolder interface but it might interfere in the playback of other
+ players.
+
+object Playlist
+```````````````
+
+ Playlist object path.
diff --git a/doc/org.bluez.MediaTransport.rst b/doc/org.bluez.MediaTransport.rst
new file mode 100644
index 000000000000..6e95df8f2ee8
--- /dev/null
+++ b/doc/org.bluez.MediaTransport.rst
@@ -0,0 +1,274 @@
+========================
+org.bluez.MediaTransport
+========================
+
+--------------------------------------------
+BlueZ D-Bus MediaTransport API documentation
+--------------------------------------------
+
+:Version: BlueZ
+:Date: September 2023
+:Manual section: 5
+:Manual group: Linux System Administration
+
+Interface
+=========
+
+:Service: org.bluez
+:Interface: org.bluez.MediaTransport1
+:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/fdX
+
+Methods
+-------
+
+fd, uint16, uint16 Acquire()
+````````````````````````````
+
+ Acquire transport file descriptor and the MTU for read and write
+ respectively.
+
+ Possible Errors:
+
+ :org.bluez.Error.NotAuthorized:
+ :org.bluez.Error.Failed:
+
+fd, uint16, uint16 TryAcquire()
+```````````````````````````````
+
+ Acquire transport file descriptor only if the transport is in "pending"
+ state at the time the message is received by BlueZ. Otherwise no request
+ will be sent to the remote device and the function will just fail with
+ org.bluez.Error.NotAvailable.
+
+ Possible Errors:
+
+ :org.bluez.Error.NotAuthorized:
+ :org.bluez.Error.Failed:
+ :org.bluez.Error.NotAvailable:
+
+void Release()
+``````````````
+
+ Releases file descriptor.
+
+Properties
+----------
+
+object Device [readonly]
+````````````````````````
+
+ Device object which the transport is connected to.
+
+string UUID [readonly]
+``````````````````````
+
+ UUID of the profile which the transport is for.
+
+byte Codec [readonly]
+`````````````````````
+
+ Assigned number of codec that the transport support.
+ The values should match the profile specification which is indicated by
+ the UUID.
+
+array{byte} Configuration [readonly]
+````````````````````````````````````
+
+ Configuration blob, it is used as it is so the size and byte order must
+ match.
+
+string State [readonly]
+```````````````````````
+
+ Indicates the state of the transport. Possible values are:
+
+ :"idle": not streaming
+ :"pending": streaming but not acquired
+ :"active": streaming and acquired
+
+uint16 Delay [readwrite, optional]
+``````````````````````````````````
+
+ Transport delay in 1/10 of millisecond, this property is only writeable
+ when the transport was acquired by the sender.
+
+uint16 Volume [readwrite, optional]
+```````````````````````````````````
+
+ Indicates volume level of the transport, this property is only writeable
+ when the transport was acquired by the sender.
+
+ Possible Values: 0-127
+
+object Endpoint [readonly, optional, experimental]
+``````````````````````````````````````````````````
+
+ Endpoint object which the transport is associated with.
+
+uint32 Location [readonly, ISO only, experimental]
+``````````````````````````````````````````````````
+
+ Indicates transport Audio Location.
+
+array{byte} Metadata [readwrite, ISO Only, experimental]
+````````````````````````````````````````````````````````
+
+ Indicates transport Metadata.
+
+array{object} Links [readonly, optional, ISO only, experimental]
+````````````````````````````````````````````````````````````````
+
+ Linked transport objects which the transport is associated with.
+
+dict QoS [readonly, optional, ISO only, experimental]
+`````````````````````````````````````````````````````
+
+ Only present when QoS is configured.
+
+ Possible values for Unicast:
+
+ :byte CIG:
+
+ Indicates configured CIG.
+
+ Possible values:
+
+ :0x00 - 0xef:
+
+ Valid ID range.
+
+ :0xff:
+
+ Auto allocate.
+
+ :byte CIS:
+
+ Indicates configured CIS.
+
+ Possible values:
+
+ :0x00 - 0xef:
+
+ Valid ID range.
+
+ :0xff:
+
+ Auto allocate.
+
+ :byte Framing:
+
+ Indicates configured framing.
+
+ Possible values:
+
+ :0x00:
+
+ Unframed.
+
+ :0x01:
+
+ Framed.
+
+ :uint32 PresentationDelay:
+
+ Indicates configured transport presentation delay (us).
+
+ :byte TargetLatency:
+
+ Indicates the requested target latency.
+
+ Possible values:
+
+ :0x01:
+
+ Low Latency.
+
+ :0x02:
+
+ Balanced Latency/Reliability.
+
+ :0x03:
+
+ High Reliability.
+
+ Possible values for Broadcast:
+
+ :byte BIG:
+
+ Indicates configured QoS BIG.
+
+ :byte BIS:
+
+ Indicates configured BIS.
+
+ :byte SyncFactor:
+
+ Indicates configured broadcast sync factor.
+
+ :byte Packing:
+
+ Indicates configured packing.
+
+ :byte Framing:
+
+ Indicates configured framing.
+
+ :byte Options:
+
+ Indicates configured broadcast options.
+
+ :uint16 Skip:
+
+ Indicates configured broadcast skip.
+
+ :byte SyncTimeout:
+
+ Indicates configured broadcast sync timeout.
+
+ :byte SyncType:
+
+ Indicates configured broadcast sync CTE type.
+
+ :byte MSE:
+
+ Indicates configured broadcast MSE.
+
+ :uint16 Timeout:
+
+ Indicates configured broadcast timeout.
+
+ Possible values for both Unicast and Broadcast:
+
+ :uint32 Interval:
+
+ Indicates configured ISO interval (us).
+
+ :uint16 Latency:
+
+ Indicates configured transport latency (ms).
+
+ :uint16 SDU:
+
+ Indicates configured maximum SDU.
+
+ :byte PHY:
+
+ Indicates configured PHY.
+
+ Possible values:
+
+ :bit 0:
+
+ LE 1M
+
+ :bit 1:
+
+ LE 2M
+
+ :bit 2:
+
+ LE Coded
+
+ :byte Retransmissions:
+
+ Indicates configured retransmissions.
--
2.41.0

2023-09-29 00:30:41

by patchwork-bot+bluetooth

[permalink] [raw]
Subject: Re: [PATCH v4 01/12] media-api: Update to reflect the last code changes

Hello:

This series was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <[email protected]>:

On Wed, 27 Sep 2023 14:53:43 -0700 you wrote:
> From: Luiz Augusto von Dentz <[email protected]>
>
> This reflect the last code changes adding the missing Broadcast
> properties.
> ---
> doc/media-api.rst | 179 +++++++++++++++++++++++++++++++++++-----------
> 1 file changed, 138 insertions(+), 41 deletions(-)

Here is the summary with links:
- [v4,01/12] media-api: Update to reflect the last code changes
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=676e8b0cf174
- [v4,02/12] transport: Implement QoS property
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=771b19e1966a
- [v4,03/12] client: Make transport.show to print QoS configuration
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=d1bb05e3edbc
- [v4,04/12] media: Implement QoS property
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=df75d2f37ca3
- [v4,05/12] client: Make Endpoint.SelectProperties reply properly
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=1c79a45667e7
- [v4,06/12] doc/media: Convert media-api.rst into manpages
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=3ca45476faa4
- [v4,07/12] shared/bap: Add support content and contexts to bt_bap_pac_qos
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=a6aac75b410e
- [v4,08/12] doc/MediaEndpoint: Move QoS capabilities to its own dict property
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=32afb9df424c
- [v4,09/12] shared/bap: Add support for location and contexts to bt_bap_pac_qos
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=bcd7a6b697aa
- [v4,10/12] bap: Add support for missing MediaEndpoint properties
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=e932ff330fd0
- [v4,11/12] client: Make endpoint.show print ISO specific capabilities
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=8e5142a1fad5
- [v4,12/12] bap: Fix freeing value of dbus_message_iter_get_fixed_array
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=2a61791d1679

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html