summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorAbhay Maheta <abhay.maheshbhai.maheta@intel.com>2023-01-23 15:56:46 -0800
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2023-01-31 17:07:31 -0800
commit33d99e12c37f6075d2b3819c30c1cf17fa52c57f (patch)
treeccc9144c8c6708e23e861d59c80fe1ddac1a2ed3 /client
parent17bcd2a37629cc12b683cc92dc51d124e0ab3fe1 (diff)
downloadbluez-33d99e12c37f6075d2b3819c30c1cf17fa52c57f.tar.gz
client/player: Add support for Company ID, Vendor ID
This adds support for Company ID and Vendor Codec ID in BAP profile. This also adds handling of Vendor Specific Coding format for BAP Profile. Now it allows to enter zero codec capabilities for vendor codec. In order to register zero codec capabilities, 0 shall be entered when prompted.
Diffstat (limited to 'client')
-rw-r--r--client/player.c61
1 files changed, 54 insertions, 7 deletions
diff --git a/client/player.c b/client/player.c
index eba233329..bab563eec 100644
--- a/client/player.c
+++ b/client/player.c
@@ -66,6 +66,8 @@ struct endpoint {
char *path;
char *uuid;
uint8_t codec;
+ uint16_t cid;
+ uint16_t vid;
struct iovec *caps;
bool auto_accept;
bool acquiring;
@@ -1815,7 +1817,8 @@ static void endpoint_free(void *data)
struct endpoint *ep = data;
if (ep->caps) {
- g_free(ep->caps->iov_base);
+ if (ep->caps->iov_base)
+ g_free(ep->caps->iov_base);
g_free(ep->caps);
}
@@ -1865,10 +1868,30 @@ static gboolean endpoint_get_capabilities(const GDBusPropertyTable *property,
return TRUE;
}
+static gboolean endpoint_get_vendor(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct endpoint *ep = data;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &ep->cid);
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &ep->vid);
+
+ return TRUE;
+}
+
+static gboolean endpoint_vendor_exists(const GDBusPropertyTable *property,
+ void *data)
+{
+ struct endpoint *ep = data;
+
+ return ep->cid && ep->vid;
+}
+
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 },
{ }
};
@@ -1886,12 +1909,14 @@ static void register_endpoint_setup(DBusMessageIter *iter, void *user_data)
g_dbus_dict_append_entry(&dict, "Codec", DBUS_TYPE_BYTE, &ep->codec);
- g_dbus_dict_append_basic_array(&dict, DBUS_TYPE_STRING, &key,
+ if (ep->caps->iov_len) {
+ g_dbus_dict_append_basic_array(&dict, DBUS_TYPE_STRING, &key,
DBUS_TYPE_BYTE, &ep->caps->iov_base,
ep->caps->iov_len);
- bt_shell_printf("Capabilities:\n");
- bt_shell_hexdump(ep->caps->iov_base, ep->caps->iov_len);
+ bt_shell_printf("Capabilities:\n");
+ bt_shell_hexdump(ep->caps->iov_base, ep->caps->iov_len);
+ }
dbus_message_iter_close_container(iter, &dict);
}
@@ -2014,13 +2039,21 @@ static void endpoint_set_capabilities(const char *input, void *user_data)
{
struct endpoint *ep = user_data;
- if (ep->caps)
+ if (ep->caps && ep->caps->iov_base) {
g_free(ep->caps->iov_base);
- else
+ ep->caps = g_new0(struct iovec, 1);
+ } else
ep->caps = g_new0(struct iovec, 1);
ep->caps->iov_base = str2bytearray((char *) input, &ep->caps->iov_len);
+ if (ep->caps->iov_len == 0x01 &&
+ (*(uint8_t *)(ep->caps->iov_base)) == 0x00) {
+ g_free(ep->caps->iov_base);
+ ep->caps->iov_base = NULL;
+ ep->caps->iov_len = 0x00;
+ }
+
bt_shell_prompt_input(ep->path, "Auto Accept (yes/no):",
endpoint_auto_accept, ep);
}
@@ -2069,14 +2102,28 @@ static void cmd_register_endpoint(int argc, char *argv[])
{
struct endpoint *ep;
char *endptr = NULL;
+ char **list;
ep = g_new0(struct endpoint, 1);
ep->uuid = g_strdup(argv[1]);
ep->codec = strtol(argv[2], &endptr, 0);
+ ep->cid = 0x0000;
+ ep->vid = 0x0000;
ep->path = g_strdup_printf("%s/ep%u", BLUEZ_MEDIA_ENDPOINT_PATH,
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");
+
+ list = g_strsplit(argv[2], ":", 2);
+
+ ep->codec = 0xff;
+ ep->vid = strtol(list[0], &endptr, 0);
+ endptr = NULL;
+ ep->cid = strtol(list[1], &endptr, 0);
+ }
+
if (argc > 3)
endpoint_set_capabilities(argv[3], ep);
else {
@@ -2638,7 +2685,7 @@ static const struct bt_shell_menu endpoint_menu = {
{ "show", "<endpoint>", cmd_show_endpoint,
"Endpoint information",
endpoint_generator },
- { "register", "<UUID> <codec> [capabilities...]",
+ { "register", "<UUID> <codec[:company]> [capabilities...]",
cmd_register_endpoint,
"Register Endpoint",
uuid_generator },