transport: Add Links property for broadcast transports
authorIulia Tanasescu <iulia.tanasescu@nxp.com>
Fri, 25 Oct 2024 12:21:40 +0000 (15:21 +0300)
committerWootak Jung <wootak.jung@samsung.com>
Thu, 20 Feb 2025 07:43:24 +0000 (16:43 +0900)
This adds the "Links" property for broadcast transports, which allows
upper layer applications to write and link transports together.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
profiles/audio/transport.c

index 62ee464719f56bf4df2eb026261660704c2e9706..c0128d4b9823d32bec4107189b6177bae905892a 100644 (file)
@@ -188,7 +188,8 @@ find_transport_by_bap_stream(const struct bt_bap_stream *stream)
                struct bap_transport *bap;
 
                if (strcasecmp(uuid, PAC_SINK_UUID) &&
-                               strcasecmp(uuid, PAC_SOURCE_UUID))
+                               strcasecmp(uuid, PAC_SOURCE_UUID) &&
+                               strcasecmp(uuid, BAA_SERVICE_UUID))
                        continue;
 
                bap = transport->data;
@@ -1195,6 +1196,64 @@ static gboolean get_links(const GDBusPropertyTable *property,
        return TRUE;
 }
 
+static struct media_transport *find_transport_by_path(const char *path)
+{
+       GSList *l;
+
+       for (l = transports; l; l = g_slist_next(l)) {
+               struct media_transport *transport = l->data;
+
+               if (g_str_equal(path, transport->path))
+                       return transport;
+       }
+
+       return NULL;
+}
+
+static void set_links(const GDBusPropertyTable *property,
+                               DBusMessageIter *iter,
+                               GDBusPendingPropertySet id, void *user_data)
+{
+       struct media_transport *transport = user_data;
+       struct bap_transport *bap = transport->data;
+       DBusMessageIter array;
+
+       if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY) {
+               g_dbus_pending_property_error(id,
+                                       ERROR_INTERFACE ".InvalidArguments",
+                                       "Invalid arguments in method call");
+               return;
+       }
+
+       dbus_message_iter_recurse(iter, &array);
+
+       while (dbus_message_iter_get_arg_type(&array) ==
+                                               DBUS_TYPE_OBJECT_PATH) {
+               struct media_transport *link;
+               struct bap_transport *bap_link;
+               const char *path;
+
+               dbus_message_iter_get_basic(&array, &path);
+
+               link = find_transport_by_path(path);
+               if (!link) {
+                       g_dbus_pending_property_error(id,
+                               ERROR_INTERFACE ".InvalidArguments",
+                               "Invalid arguments in method call");
+                       return;
+               }
+
+               bap_link = link->data;
+
+               /* Link stream */
+               bt_bap_stream_io_link(bap->stream, bap_link->stream);
+
+               dbus_message_iter_next(&array);
+       }
+
+       g_dbus_pending_property_success(id);
+}
+
 static gboolean qos_ucast_exists(const GDBusPropertyTable *property, void *data)
 {
        struct media_transport *transport = data;
@@ -1348,6 +1407,7 @@ static const GDBusPropertyTable transport_bap_bc_properties[] = {
        { "Endpoint", "o", get_endpoint, NULL, endpoint_exists },
        { "Location", "u", get_location },
        { "Metadata", "ay", get_metadata },
+       { "Links", "ao", get_links, set_links, NULL },
        { }
 };