2023-09-27 22:08:25

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH v4 04/12] media: Implement QoS property

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

This implements QoS as a dict instead of listing each field as
a individual property.
---
profiles/audio/bap.c | 15 +---
profiles/audio/media.c | 159 ++++++++++++++++++++++++-----------------
profiles/audio/media.h | 3 +-
3 files changed, 96 insertions(+), 81 deletions(-)

diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c
index b05d7a2d9675..ed02db40be8c 100644
--- a/profiles/audio/bap.c
+++ b/profiles/audio/bap.c
@@ -457,19 +457,10 @@ static int parse_properties(DBusMessageIter *props, struct iovec **caps,

framing = val;
} else if (!strcasecmp(key, "PHY")) {
- const char *str;
-
- if (var != DBUS_TYPE_STRING)
+ if (var != DBUS_TYPE_BYTE)
goto fail;

- dbus_message_iter_get_basic(&value, &str);
-
- if (!strcasecmp(str, "1M"))
- io_qos.phy = 0x01;
- else if (!strcasecmp(str, "2M"))
- io_qos.phy = 0x02;
- else
- goto fail;
+ dbus_message_iter_get_basic(&value, &io_qos.phy);
} else if (!strcasecmp(key, "SDU")) {
if (var != DBUS_TYPE_UINT16)
goto fail;
@@ -546,7 +537,7 @@ static int parse_properties(DBusMessageIter *props, struct iovec **caps,

dbus_message_iter_get_basic(&value,
&qos->bcast.timeout);
- } else if (!strcasecmp(key, "BroadcastCode")) {
+ } else if (!strcasecmp(key, "BCode")) {
if (var != DBUS_TYPE_ARRAY)
goto fail;
parse_array(&value, &qos->bcast.bcode);
diff --git a/profiles/audio/media.c b/profiles/audio/media.c
index 66f512e007e4..8345487d7a45 100644
--- a/profiles/audio/media.c
+++ b/profiles/audio/media.c
@@ -743,15 +743,100 @@ static int parse_array(DBusMessageIter *iter, struct iovec *iov)
return 0;
}

+static int parse_ucast_qos(DBusMessageIter *iter, struct bt_bap_qos *qos)
+{
+ DBusMessageIter array;
+ const char *key;
+ struct bt_bap_io_qos io_qos;
+
+ dbus_message_iter_recurse(iter, &array);
+
+ memset(&io_qos, 0, sizeof(io_qos));
+ while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter value, entry;
+ int var;
+
+ dbus_message_iter_recurse(&array, &entry);
+ dbus_message_iter_get_basic(&entry, &key);
+
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &value);
+
+ var = dbus_message_iter_get_arg_type(&value);
+
+ if (!strcasecmp(key, "CIG")) {
+ if (var != DBUS_TYPE_BYTE)
+ goto fail;
+
+ dbus_message_iter_get_basic(&value, &qos->ucast.cig_id);
+ } else if (!strcasecmp(key, "CIS")) {
+ if (var != DBUS_TYPE_BYTE)
+ goto fail;
+
+ dbus_message_iter_get_basic(&value, &qos->ucast.cis_id);
+ } else if (!strcasecmp(key, "Interval")) {
+ if (var != DBUS_TYPE_UINT32)
+ goto fail;
+
+ dbus_message_iter_get_basic(&value, &io_qos.interval);
+ } else if (!strcasecmp(key, "Framing")) {
+ if (var != DBUS_TYPE_BYTE)
+ goto fail;
+
+ dbus_message_iter_get_basic(&value,
+ &qos->ucast.framing);
+ } else if (!strcasecmp(key, "PHY")) {
+ if (var != DBUS_TYPE_BYTE)
+ goto fail;
+
+ dbus_message_iter_get_basic(&value, &io_qos.phy);
+ } else if (!strcasecmp(key, "SDU")) {
+ if (var != DBUS_TYPE_UINT16)
+ goto fail;
+
+ dbus_message_iter_get_basic(&value, &io_qos.sdu);
+ } else if (!strcasecmp(key, "Retransmissions")) {
+ if (var != DBUS_TYPE_BYTE)
+ goto fail;
+
+ dbus_message_iter_get_basic(&value, &io_qos.rtn);
+ } else if (!strcasecmp(key, "Latency")) {
+ if (var != DBUS_TYPE_UINT16)
+ goto fail;
+
+ dbus_message_iter_get_basic(&value, &io_qos.latency);
+ } else if (!strcasecmp(key, "PresentationDelay")) {
+ if (var != DBUS_TYPE_UINT32)
+ goto fail;
+
+ dbus_message_iter_get_basic(&value, &qos->ucast.delay);
+ } else if (!strcasecmp(key, "TargetLatency")) {
+ if (var != DBUS_TYPE_BYTE)
+ goto fail;
+
+ dbus_message_iter_get_basic(&value,
+ &qos->ucast.target_latency);
+ }
+
+ dbus_message_iter_next(&array);
+ }
+
+ memcpy(&qos->ucast.io_qos, &io_qos, sizeof(io_qos));
+
+ return 0;
+
+fail:
+ DBG("Failed parsing %s", key);
+
+ return -EINVAL;
+}
+
static int parse_select_properties(DBusMessageIter *props, struct iovec *caps,
struct iovec *metadata,
struct bt_bap_qos *qos)
{
const char *key;
- struct bt_bap_io_qos io_qos;
- uint8_t framing = 0;

- memset(&io_qos, 0, sizeof(io_qos));
while (dbus_message_iter_get_arg_type(props) == DBUS_TYPE_DICT_ENTRY) {
DBusMessageIter value, entry;
int var;
@@ -776,77 +861,17 @@ static int parse_select_properties(DBusMessageIter *props, struct iovec *caps,

if (parse_array(&value, metadata))
goto fail;
- } else if (!strcasecmp(key, "CIG")) {
- if (var != DBUS_TYPE_BYTE)
+ } else if (!strcasecmp(key, "QoS")) {
+ if (var != DBUS_TYPE_ARRAY)
goto fail;

- dbus_message_iter_get_basic(&value, &qos->ucast.cig_id);
- } else if (!strcasecmp(key, "CIS")) {
- if (var != DBUS_TYPE_BYTE)
+ if (parse_ucast_qos(&value, qos))
goto fail;
-
- dbus_message_iter_get_basic(&value, &qos->ucast.cis_id);
- } else if (!strcasecmp(key, "Interval")) {
- if (var != DBUS_TYPE_UINT32)
- goto fail;
-
- dbus_message_iter_get_basic(&value, &io_qos.interval);
- } else if (!strcasecmp(key, "Framing")) {
- dbus_bool_t val;
-
- if (var != DBUS_TYPE_BOOLEAN)
- goto fail;
-
- dbus_message_iter_get_basic(&value, &val);
-
- framing = val;
- } else if (!strcasecmp(key, "PHY")) {
- const char *str;
-
- if (var != DBUS_TYPE_STRING)
- goto fail;
-
- dbus_message_iter_get_basic(&value, &str);
-
- if (!strcasecmp(str, "1M"))
- io_qos.phy = 0x01;
- else if (!strcasecmp(str, "2M"))
- io_qos.phy = 0x02;
- else
- goto fail;
- } else if (!strcasecmp(key, "SDU")) {
- if (var != DBUS_TYPE_UINT16)
- goto fail;
-
- dbus_message_iter_get_basic(&value, &io_qos.sdu);
- } else if (!strcasecmp(key, "Retransmissions")) {
- if (var != DBUS_TYPE_BYTE)
- goto fail;
-
- dbus_message_iter_get_basic(&value, &io_qos.rtn);
- } else if (!strcasecmp(key, "Latency")) {
- if (var != DBUS_TYPE_UINT16)
- goto fail;
-
- dbus_message_iter_get_basic(&value, &io_qos.latency);
- } else if (!strcasecmp(key, "Delay")) {
- if (var != DBUS_TYPE_UINT32)
- goto fail;
-
- dbus_message_iter_get_basic(&value, &qos->ucast.delay);
- } else if (!strcasecmp(key, "TargetLatency")) {
- if (var != DBUS_TYPE_BYTE)
- goto fail;
-
- dbus_message_iter_get_basic(&value,
- &qos->ucast.target_latency);
}

dbus_message_iter_next(props);
}

- memcpy(&qos->ucast.io_qos, &io_qos, sizeof(io_qos));
- qos->ucast.framing = framing;
return 0;

fail:
@@ -1549,7 +1574,7 @@ static int parse_properties(DBusMessageIter *props, const char **uuid,
if (var != DBUS_TYPE_BYTE)
return -EINVAL;
dbus_message_iter_get_basic(&value, &qos->phy);
- } else if (strcasecmp(key, "RTN") == 0) {
+ } else if (strcasecmp(key, "Retransmissions") == 0) {
if (var != DBUS_TYPE_BYTE)
return -EINVAL;
dbus_message_iter_get_basic(&value, &qos->rtn);
diff --git a/profiles/audio/media.h b/profiles/audio/media.h
index 0eeb5746a4fa..2b579877ba34 100644
--- a/profiles/audio/media.h
+++ b/profiles/audio/media.h
@@ -22,6 +22,5 @@ const char *media_endpoint_get_uuid(struct media_endpoint *endpoint);
uint8_t media_endpoint_get_codec(struct media_endpoint *endpoint);
struct btd_adapter *media_endpoint_get_btd_adapter(
struct media_endpoint *endpoint);
-bool media_endpoint_is_broadcast(
- struct media_endpoint *endpoint);
+bool media_endpoint_is_broadcast(struct media_endpoint *endpoint);
int8_t media_player_get_device_volume(struct btd_device *device);
--
2.41.0