media: Add broadcast sink media endpoint
authorClaudia Draghicescu <claudia.rosu@nxp.com>
Tue, 22 Aug 2023 14:29:32 +0000 (17:29 +0300)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 5 Jan 2024 13:34:03 +0000 (19:04 +0530)
This patch adds the possibility to register a broadcast
media endpoint if the controller has support for ISO Sync Receiver.

profiles/audio/media.c
profiles/audio/media.h

index 1b67f64..3b6bc23 100644 (file)
@@ -1269,17 +1269,21 @@ static struct media_transport *pac_bcast_config(struct bt_bap_stream *stream,
                                                struct media_endpoint *endpoint)
 {
        struct bt_bap *bap = bt_bap_stream_get_session(stream);
-       struct btd_adapter *adapter = bt_bap_get_user_data(bap);
+       struct btd_adapter *adapter = endpoint->adapter->btd_adapter;
+       struct btd_device *device;
        const char *path;
 
-       if (!adapter) {
-               error("Unable to find adapter");
+       if (!adapter)
                return NULL;
-       }
+
+       if (!strcmp(endpoint->uuid, BCAA_SERVICE_UUID))
+               device = NULL;
+       else
+               device = btd_service_get_device(bt_bap_get_user_data(bap));
 
        path = bt_bap_stream_get_user_data(stream);
 
-       return media_transport_create(NULL, path, cfg->iov_base, cfg->iov_len,
+       return media_transport_create(device, path, cfg->iov_base, cfg->iov_len,
                                        endpoint, stream);
 }
 
@@ -1449,6 +1453,12 @@ static bool endpoint_init_broadcast_source(struct media_endpoint *endpoint,
        return endpoint_init_pac(endpoint, BT_BAP_BCAST_SOURCE, err);
 }
 
+static bool endpoint_init_broadcast_sink(struct media_endpoint *endpoint,
+                                               int *err)
+{
+       return endpoint_init_pac(endpoint, BT_BAP_BCAST_SINK, err);
+}
+
 static bool endpoint_properties_exists(const char *uuid,
                                                struct btd_device *dev,
                                                void *user_data)
@@ -1562,6 +1572,17 @@ static bool experimental_broadcaster_ep_supported(struct btd_adapter *adapter)
        return g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL;
 }
 
+static bool experimental_bcast_sink_ep_supported(struct btd_adapter *adapter)
+{
+       if (!btd_adapter_has_exp_feature(adapter, EXP_FEAT_ISO_SOCKET))
+               return false;
+
+       if (!btd_adapter_has_settings(adapter, MGMT_SETTING_ISO_SYNC_RECEIVER))
+               return false;
+
+       return g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL;
+}
+
 static struct media_endpoint_init {
        const char *uuid;
        bool (*func)(struct media_endpoint *endpoint, int *err);
@@ -1577,6 +1598,8 @@ static struct media_endpoint_init {
                                experimental_endpoint_supported },
        { BCAA_SERVICE_UUID, endpoint_init_broadcast_source,
                        experimental_broadcaster_ep_supported },
+       { BAA_SERVICE_UUID, endpoint_init_broadcast_sink,
+                       experimental_bcast_sink_ep_supported },
 };
 
 static struct media_endpoint *
@@ -3667,3 +3690,12 @@ struct btd_adapter *media_endpoint_get_btd_adapter(
 {
        return endpoint->adapter->btd_adapter;
 }
+
+bool media_endpoint_is_broadcast(struct media_endpoint *endpoint)
+{
+       if (!strcmp(endpoint->uuid, BCAA_SERVICE_UUID)
+               || !strcmp(endpoint->uuid, BAA_SERVICE_UUID))
+               return true;
+
+       return false;
+}
index 1de84a8..0eeb574 100755 (executable)
@@ -22,5 +22,6 @@ 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);
 int8_t media_player_get_device_volume(struct btd_device *device);