char *path; /* Endpoint object path */
char *uuid; /* Endpoint property UUID */
uint8_t codec; /* Endpoint codec */
+ uint16_t cid; /* Endpoint company ID */
+ uint16_t vid; /* Endpoint vendor codec ID */
bool delay_reporting;/* Endpoint delay_reporting */
struct bt_bap_pac_qos qos; /* Endpoint qos */
uint8_t *capabilities; /* Endpoint property capabilities */
size_t size; /* Endpoint capabilities size */
+ uint8_t *metadata; /* Endpoint property metadata */
+ size_t metadata_size; /* Endpoint metadata size */
guint hs_watch;
guint ag_watch;
guint watch;
g_dbus_remove_watch(btd_get_dbus_connection(), endpoint->watch);
g_free(endpoint->capabilities);
+ g_free(endpoint->metadata);
g_free(endpoint->sender);
g_free(endpoint->path);
g_free(endpoint->uuid);
struct btd_gatt_database *database;
struct gatt_db *db;
struct iovec data;
+ struct iovec *metadata = NULL;
char *name;
if (!(g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL)) {
return false;
}
+ if (!bap_print_cc(endpoint->metadata, endpoint->metadata_size,
+ bap_debug, NULL)) {
+ error("Unable to parse endpoint metadata");
+ return false;
+ }
+
db = btd_gatt_database_get_db(database);
data.iov_base = endpoint->capabilities;
data.iov_len = endpoint->size;
- /* TODO: Add support for metadata */
-
if (asprintf(&name, "%s:%s", endpoint->sender, endpoint->path) < 0) {
error("Could not allocate name for pac %s:%s",
endpoint->sender, endpoint->path);
return false;
}
- endpoint->pac = bt_bap_add_pac(db, name, type, endpoint->codec,
- &endpoint->qos, &data, NULL);
+ /* TODO: Add support for metadata */
+ if (endpoint->metadata_size) {
+ metadata = g_new0(struct iovec, 1);
+ metadata->iov_base = endpoint->metadata;
+ metadata->iov_len = endpoint->metadata_size;
+ }
+
+ endpoint->pac = bt_bap_add_vendor_pac(db, name, type, endpoint->codec,
+ endpoint->cid, endpoint->vid, &endpoint->qos,
+ &data, metadata);
if (!endpoint->pac) {
error("Unable to create PAC");
+ free(metadata);
return false;
}
DBG("PAC %s registered", name);
free(name);
+ free(metadata);
return true;
}
const char *uuid,
gboolean delay_reporting,
uint8_t codec,
+ uint16_t cid,
+ uint16_t vid,
struct bt_bap_pac_qos *qos,
uint8_t *capabilities,
int size,
+ uint8_t *metadata,
+ int metadata_size,
int *err)
{
struct media_endpoint *endpoint;
endpoint->path = g_strdup(path);
endpoint->uuid = g_strdup(uuid);
endpoint->codec = codec;
+ endpoint->cid = cid;
+ endpoint->vid = vid;
endpoint->delay_reporting = delay_reporting;
if (qos)
endpoint->size = size;
}
+ if (metadata_size > 0) {
+ endpoint->metadata = g_new(uint8_t, metadata_size);
+ memcpy(endpoint->metadata, metadata, metadata_size);
+ endpoint->metadata_size = metadata_size;
+ }
+
endpoint->adapter = adapter;
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
static int parse_properties(DBusMessageIter *props, const char **uuid,
gboolean *delay_reporting, uint8_t *codec,
+ uint16_t *cid, uint16_t *vid,
struct bt_bap_pac_qos *qos,
- uint8_t **capabilities, int *size)
+ uint8_t **capabilities, int *size,
+ uint8_t **metadata, int *metadata_size)
{
gboolean has_uuid = FALSE;
gboolean has_codec = FALSE;
return -EINVAL;
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)
+ return -EINVAL;
+ dbus_message_iter_get_basic(&value, vid);
} else if (strcasecmp(key, "DelayReporting") == 0) {
if (var != DBUS_TYPE_BOOLEAN)
return -EINVAL;
dbus_message_iter_recurse(&value, &array);
dbus_message_iter_get_fixed_array(&array, capabilities,
size);
+ } else if (strcasecmp(key, "Metadata") == 0) {
+ DBusMessageIter array;
+
+ if (var != DBUS_TYPE_ARRAY)
+ return -EINVAL;
+
+ dbus_message_iter_recurse(&value, &array);
+ dbus_message_iter_get_fixed_array(&array, metadata,
+ metadata_size);
} else if (strcasecmp(key, "Framing") == 0) {
if (var != DBUS_TYPE_BYTE)
return -EINVAL;
const char *sender, *path, *uuid;
gboolean delay_reporting = FALSE;
uint8_t codec = 0;
+ uint16_t cid = 0;
+ uint16_t vid = 0;
struct bt_bap_pac_qos qos = {};
uint8_t *capabilities = NULL;
+ uint8_t *metadata = NULL;
int size = 0;
+ int metadata_size = 0;
int err;
sender = dbus_message_get_sender(msg);
if (dbus_message_iter_get_arg_type(&props) != DBUS_TYPE_DICT_ENTRY)
return btd_error_invalid_args(msg);
- if (parse_properties(&props, &uuid, &delay_reporting, &codec, &qos,
- &capabilities, &size) < 0)
+ if (parse_properties(&props, &uuid, &delay_reporting, &codec, &cid,
+ &vid, &qos, &capabilities, &size, &metadata,
+ &metadata_size) < 0)
return btd_error_invalid_args(msg);
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
current_delay_reporting = delay_reporting;
#endif
if (media_endpoint_create(adapter, sender, path, uuid, delay_reporting,
- codec, &qos, capabilities, size,
+ codec, cid, vid, &qos, capabilities,
+ size, metadata, metadata_size,
&err) == NULL) {
if (err == -EPROTONOSUPPORT)
return btd_error_not_supported(msg);
const char *uuid;
gboolean delay_reporting = FALSE;
uint8_t codec;
+ uint16_t cid = 0;
+ uint16_t vid = 0;
struct bt_bap_pac_qos qos;
uint8_t *capabilities = NULL;
int size = 0;
+ uint8_t *metadata = NULL;
+ int metadata_size = 0;
DBusMessageIter iter, array;
struct media_endpoint *endpoint;
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)
+ goto fail;
+
+ dbus_message_iter_get_basic(&iter, &vid);
+ }
+
/* DelayReporting and Capabilities are considered optional */
if (g_dbus_proxy_get_property(proxy, "DelayReporting", &iter)) {
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_BOOLEAN)
dbus_message_iter_get_fixed_array(&array, &capabilities, &size);
}
+ if (g_dbus_proxy_get_property(proxy, "Metadata", &iter)) {
+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY)
+ goto fail;
+
+ dbus_message_iter_recurse(&iter, &array);
+ dbus_message_iter_get_fixed_array(&array, &metadata,
+ &metadata_size);
+ }
+
/* Parse QoS preferences */
memset(&qos, 0, sizeof(qos));
if (g_dbus_proxy_get_property(proxy, "Framing", &iter)) {
}
endpoint = media_endpoint_create(app->adapter, app->sender, path, uuid,
- delay_reporting, codec, &qos,
- capabilities, size, &app->err);
+ delay_reporting, codec, cid,
+ vid, &qos, capabilities,
+ size, metadata, metadata_size,
+ &app->err);
if (!endpoint) {
error("Unable to register endpoint %s:%s: %s", app->sender,
path, strerror(-app->err));