From 0273602c19e6c392622f3eabd866e6be618ecc6d Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 24 Jan 2024 10:29:38 -0500 Subject: [PATCH] client/player: Enable endpoint.show to work with local endpoints This enables local endpoints to be printed with endpoint.show: [bluetooth]# endpoint.show /local/endpoint/pac_snk/lc3 Endpoint /local/endpoint/pac_snk/lc3 UUID 00002bc9-0000-1000-8000-00805f9b34fb Codec 0x06 (6) Capabilities.#0: len 0x03 type 0x01 Capabilities.Sampling Frequencies: 0x00ff Capabilities.Sampling Frequency: 8 Khz (0x0001) Capabilities.Sampling Frequency: 11.25 Khz (0x0002) Capabilities.Sampling Frequency: 16 Khz (0x0004) Capabilities.Sampling Frequency: 22.05 Khz (0x0008) Capabilities.Sampling Frequency: 24 Khz (0x0010) Capabilities.Sampling Frequency: 32 Khz (0x0020) Capabilities.Sampling Frequency: 44.1 Khz (0x0040) Capabilities.Sampling Frequency: 48 Khz (0x0080) Capabilities.#1: len 0x02 type 0x02 Capabilities.Frame Duration: 0x03 Capabilities.Frame Duration: 7.5 ms (0x01) Capabilities.Frame Duration: 10 ms (0x02) Capabilities.#2: len 0x02 type 0x03 Capabilities.Audio Channel Count: 0x03 Capabilities.Audio Channel Count: 1 channel (0x01) Capabilities.Audio Channel Count: 2 channel (0x02) Capabilities.#3: len 0x05 type 0x04 Capabilities.Frame Length: 30 (0x001e) - 240 (0x00f0) Locations 0x00000003 (3) SupportedContext 0x00000fff (4095) Context 0x00000fff (4095) --- client/player.c | 103 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 77 insertions(+), 26 deletions(-) diff --git a/client/player.c b/client/player.c index b961c0ba2..45a2fc8ca 100644 --- a/client/player.c +++ b/client/player.c @@ -1002,11 +1002,6 @@ static const struct bt_shell_menu player_menu = { {} }, }; -static char *endpoint_generator(const char *text, int state) -{ - return generic_generator(text, state, endpoints); -} - static char *local_endpoint_generator(const char *text, int state) { int len = strlen(text); @@ -1028,6 +1023,17 @@ static char *local_endpoint_generator(const char *text, int state) return NULL; } +static char *endpoint_generator(const char *text, int state) +{ + char *ret; + + ret = generic_generator(text, state, endpoints); + if (ret) + return ret; + + return local_endpoint_generator(text, state); +} + static void print_endpoint(void *data, void *user_data) { GDBusProxy *proxy = data; @@ -2793,13 +2799,44 @@ static int print_a2dp_codec(uint8_t codec, void *data, uint8_t size) return 0; } +static void print_hexdump(const char *label, struct iovec *iov) +{ + if (!iov) + return; + + bt_shell_printf("%s:\n", label); + bt_shell_hexdump(iov->iov_base, iov->iov_len); +} + +static void print_codec(const char *uuid, uint8_t codec, struct iovec *caps, + struct iovec *meta) +{ + if (!strcasecmp(uuid, A2DP_SINK_UUID) || + !strcasecmp(uuid, A2DP_SOURCE_UUID)) { + print_a2dp_codec(codec, caps->iov_base, caps->iov_len); + return; + } + + if (codec != LC3_ID) { + print_hexdump("Capabilities", caps); + print_hexdump("Metadata", meta); + return; + } + + print_lc3_caps(caps->iov_base, caps->iov_len); + + if (!meta) + return; + + print_lc3_meta(meta->iov_base, meta->iov_len); +} + static void print_capabilities(GDBusProxy *proxy) { DBusMessageIter iter, subiter; const char *uuid; uint8_t codec; - uint8_t *data; - int len; + struct iovec caps, meta; if (!g_dbus_proxy_get_property(proxy, "UUID", &iter)) return; @@ -2816,29 +2853,37 @@ static void print_capabilities(GDBusProxy *proxy) dbus_message_iter_recurse(&iter, &subiter); - dbus_message_iter_get_fixed_array(&subiter, &data, &len); - - if (!strcasecmp(uuid, A2DP_SINK_UUID) || - !strcasecmp(uuid, A2DP_SOURCE_UUID)) { - print_a2dp_codec(codec, data, len); - return; - } + dbus_message_iter_get_fixed_array(&subiter, &caps.iov_base, + (int *)&caps.iov_len); - if (codec != LC3_ID) { - print_property(proxy, "Capabilities"); - return; + if (g_dbus_proxy_get_property(proxy, "Metadata", &iter)) { + dbus_message_iter_recurse(&iter, &subiter); + dbus_message_iter_get_fixed_array(&subiter, &meta.iov_base, + (int *)&meta.iov_len); + } else { + meta.iov_base = NULL; + meta.iov_len = 0; } - print_lc3_caps(data, len); - - if (!g_dbus_proxy_get_property(proxy, "Metadata", &iter)) - return; - - dbus_message_iter_recurse(&iter, &subiter); - - dbus_message_iter_get_fixed_array(&subiter, &data, &len); + print_codec(uuid, codec, &caps, &meta); +} - print_lc3_meta(data, len); +static void print_local_endpoint(struct endpoint *ep) +{ + bt_shell_printf("Endpoint %s\n", ep->path); + bt_shell_printf("\tUUID %s\n", ep->uuid); + bt_shell_printf("\tCodec 0x%02x (%u)\n", ep->codec, ep->codec); + if (ep->caps) + print_codec(ep->uuid, ep->codec, ep->caps, ep->meta); + if (ep->locations) + bt_shell_printf("\tLocations 0x%08x (%u)\n", ep->locations, + ep->locations); + if (ep->supported_context) + bt_shell_printf("\tSupportedContext 0x%08x (%u)\n", + ep->supported_context, ep->supported_context); + if (ep->context) + bt_shell_printf("\tContext 0x%08x (%u)\n", ep->context, + ep->context); } static void cmd_show_endpoint(int argc, char *argv[]) @@ -2848,6 +2893,12 @@ static void cmd_show_endpoint(int argc, char *argv[]) proxy = g_dbus_proxy_lookup(endpoints, NULL, argv[1], BLUEZ_MEDIA_ENDPOINT_INTERFACE); if (!proxy) { + struct endpoint *ep; + + ep = endpoint_find(argv[1]); + if (ep) + return print_local_endpoint(ep); + bt_shell_printf("Endpoint %s not found\n", argv[1]); return bt_shell_noninteractive_quit(EXIT_SUCCESS); } -- 2.47.3