From e43bba53a9be3747b239604802e813411ec7aee1 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 23 Jan 2023 15:56:49 -0800 Subject: [PATCH] media: Rework support of Vendor to use uint32_t as type This reworks the handlings of Vendor property to use a single uint32_t. --- client/player.c | 24 +++++++++++++++++------- profiles/audio/media.c | 37 +++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/client/player.c b/client/player.c index bf81371..2a1da8c 100644 --- a/client/player.c +++ b/client/player.c @@ -1867,13 +1867,18 @@ static gboolean endpoint_get_capabilities(const GDBusPropertyTable *property, return TRUE; } +struct vendor { + uint16_t cid; + uint16_t vid; +} __packed; + static gboolean endpoint_get_vendor(const GDBusPropertyTable *property, DBusMessageIter *iter, void *data) { struct endpoint *ep = data; + struct vendor vendor = { ep->cid, ep->vid }; - dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &ep->cid); - dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &ep->vid); + dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &vendor); return TRUE; } @@ -1890,7 +1895,7 @@ static const GDBusPropertyTable endpoint_properties[] = { { "UUID", "s", endpoint_get_uuid, NULL, NULL }, { "Codec", "y", endpoint_get_codec, NULL, NULL }, { "Capabilities", "ay", endpoint_get_capabilities, NULL, NULL }, - { "Vendor", "qq", endpoint_get_vendor, NULL, endpoint_vendor_exists }, + { "Vendor", "u", endpoint_get_vendor, NULL, endpoint_vendor_exists }, { } }; @@ -1908,7 +1913,14 @@ static void register_endpoint_setup(DBusMessageIter *iter, void *user_data) g_dbus_dict_append_entry(&dict, "Codec", DBUS_TYPE_BYTE, &ep->codec); - if (ep->caps->iov_len) { + if (ep->cid && ep->vid) { + struct vendor vendor = { ep->cid, ep->vid }; + + g_dbus_dict_append_entry(&dict, "Vendor", DBUS_TYPE_UINT32, + &vendor); + } + + if (ep->caps) { g_dbus_dict_append_basic_array(&dict, DBUS_TYPE_STRING, &key, DBUS_TYPE_BYTE, &ep->caps->iov_base, ep->caps->iov_len); @@ -2112,9 +2124,7 @@ static void cmd_register_endpoint(int argc, char *argv[]) g_list_length(local_endpoints)); local_endpoints = g_list_append(local_endpoints, ep); - if (g_strstr_len(argv[2], -1, ":")) { - bt_shell_printf("Found split\r\n"); - + if (strrchr(argv[2], ':')) { list = g_strsplit(argv[2], ":", 2); ep->codec = 0xff; diff --git a/profiles/audio/media.c b/profiles/audio/media.c index 1aea761..8b8f78e 100644 --- a/profiles/audio/media.c +++ b/profiles/audio/media.c @@ -1624,6 +1624,11 @@ media_endpoint_create(struct media_adapter *adapter, return endpoint; } +struct vendor { + uint16_t cid; + uint16_t vid; +} __packed; + static int parse_properties(DBusMessageIter *props, const char **uuid, gboolean *delay_reporting, uint8_t *codec, uint16_t *cid, uint16_t *vid, @@ -1633,6 +1638,7 @@ static int parse_properties(DBusMessageIter *props, const char **uuid, { gboolean has_uuid = FALSE; gboolean has_codec = FALSE; + struct vendor vendor; while (dbus_message_iter_get_arg_type(props) == DBUS_TYPE_DICT_ENTRY) { const char *key; @@ -1657,14 +1663,11 @@ static int parse_properties(DBusMessageIter *props, const char **uuid, dbus_message_iter_get_basic(&value, codec); has_codec = TRUE; } else if (strcasecmp(key, "Vendor") == 0) { - if (var != DBUS_TYPE_UINT16) - return -EINVAL; - dbus_message_iter_get_basic(&value, cid); - dbus_message_iter_next(&value); - var = dbus_message_iter_get_arg_type(&value); - if (var != DBUS_TYPE_UINT16) + if (var != DBUS_TYPE_UINT32) return -EINVAL; - dbus_message_iter_get_basic(&value, vid); + dbus_message_iter_get_basic(&value, &vendor); + *cid = vendor.cid; + *vid = vendor.vid; } else if (strcasecmp(key, "DelayReporting") == 0) { if (var != DBUS_TYPE_BOOLEAN) return -EINVAL; @@ -2961,8 +2964,7 @@ static void app_register_endpoint(void *data, void *user_data) const char *uuid; gboolean delay_reporting = FALSE; uint8_t codec; - uint16_t cid = 0; - uint16_t vid = 0; + struct vendor vendor; struct bt_bap_pac_qos qos; uint8_t *capabilities = NULL; int size = 0; @@ -2995,16 +2997,10 @@ static void app_register_endpoint(void *data, void *user_data) dbus_message_iter_get_basic(&iter, &codec); if (g_dbus_proxy_get_property(proxy, "Vendor", &iter)) { - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT16) - goto fail; - - dbus_message_iter_get_basic(&iter, &cid); - - dbus_message_iter_next(&iter); - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT16) + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32) goto fail; - dbus_message_iter_get_basic(&iter, &vid); + dbus_message_iter_get_basic(&iter, &vendor); } /* DelayReporting and Capabilities are considered optional */ @@ -3084,9 +3080,10 @@ static void app_register_endpoint(void *data, void *user_data) } endpoint = media_endpoint_create(app->adapter, app->sender, path, uuid, - delay_reporting, codec, cid, - vid, &qos, capabilities, - size, metadata, metadata_size, + delay_reporting, codec, + vendor.cid, vendor.vid, &qos, + capabilities, size, + metadata, metadata_size, &app->err); if (!endpoint) { error("Unable to register endpoint %s:%s: %s", app->sender, -- 2.7.4