void transport_get_properties(struct media_transport *transport, DBusMessageIter *iter) { DBusMessageIter dict; const char *uuid; uint8_t codec; dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); /* Device */ dict_append_entry(&dict, "Device", DBUS_TYPE_OBJECT_PATH, &transport->device->path); uuid = media_endpoint_get_uuid(transport->endpoint); dict_append_entry(&dict, "UUID", DBUS_TYPE_STRING, &uuid); codec = media_endpoint_get_codec(transport->endpoint); dict_append_entry(&dict, "Codec", DBUS_TYPE_BYTE, &codec); dict_append_array(&dict, "Configuration", DBUS_TYPE_BYTE, &transport->configuration, transport->size); if (transport->get_properties) transport->get_properties(transport, &dict); dbus_message_iter_close_container(iter, &dict); }
static gboolean get_uuid(const GDBusPropertyTable *property, DBusMessageIter *iter, void *data) { struct media_transport *transport = data; const char *uuid = media_endpoint_get_uuid(transport->endpoint); dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &uuid); return TRUE; }
struct media_transport *media_transport_create(struct audio_device *device, uint8_t *configuration, size_t size, void *data) { struct media_endpoint *endpoint = data; struct media_transport *transport; const char *uuid; static int fd = 0; transport = g_new0(struct media_transport, 1); transport->device = device; transport->endpoint = endpoint; transport->configuration = g_new(uint8_t, size); memcpy(transport->configuration, configuration, size); transport->size = size; transport->path = g_strdup_printf("%s/fd%d", device_get_path(device->btd_dev), fd++); transport->fd = -1; uuid = media_endpoint_get_uuid(endpoint); if (strcasecmp(uuid, A2DP_SOURCE_UUID) == 0 || strcasecmp(uuid, A2DP_SINK_UUID) == 0) { struct a2dp_transport *a2dp; a2dp = g_new0(struct a2dp_transport, 1); transport->resume = resume_a2dp; transport->suspend = suspend_a2dp; transport->cancel = cancel_a2dp; transport->data = a2dp; transport->destroy = destroy_a2dp; if (strcasecmp(uuid, A2DP_SOURCE_UUID) == 0) { a2dp->volume = -1; transport->sink_watch = sink_add_state_cb(device, sink_state_changed, transport); } else { a2dp->volume = 127; avrcp_set_volume(device, a2dp->volume); transport->source_watch = source_add_state_cb(device, source_state_changed, transport); } } else goto fail;
struct media_transport *media_transport_create(struct btd_device *device, uint8_t *configuration, size_t size, void *data) { struct media_endpoint *endpoint = data; struct media_transport *transport; const char *uuid; static int fd = 0; transport = g_new0(struct media_transport, 1); transport->device = device; transport->endpoint = endpoint; transport->configuration = g_new(uint8_t, size); memcpy(transport->configuration, configuration, size); transport->size = size; transport->path = g_strdup_printf("%s/fd%d", device_get_path(device), fd++); transport->fd = -1; uuid = media_endpoint_get_uuid(endpoint); if (strcasecmp(uuid, A2DP_SOURCE_UUID) == 0) { if (media_transport_init_source(transport) < 0) goto fail; } else if (strcasecmp(uuid, A2DP_SINK_UUID) == 0) { if (media_transport_init_sink(transport) < 0) goto fail; } else goto fail; if (g_dbus_register_interface(btd_get_dbus_connection(), transport->path, MEDIA_TRANSPORT_INTERFACE, transport_methods, NULL, transport_properties, transport, media_transport_free) == FALSE) { error("Could not register transport %s", transport->path); goto fail; } transports = g_slist_append(transports, transport); return transport; fail: media_transport_free(transport); return NULL; }
struct media_transport *media_transport_create(DBusConnection *conn, struct media_endpoint *endpoint, struct audio_device *device, uint8_t *configuration, size_t size) { struct media_transport *transport; const char *uuid; static int fd = 0; transport = g_new0(struct media_transport, 1); transport->conn = dbus_connection_ref(conn); transport->device = device; transport->endpoint = endpoint; transport->configuration = g_new(uint8_t, size); memcpy(transport->configuration, configuration, size); transport->size = size; transport->path = g_strdup_printf("%s/fd%d", device->path, fd++); transport->fd = -1; uuid = media_endpoint_get_uuid(endpoint); if (strcasecmp(uuid, A2DP_SOURCE_UUID) == 0 || strcasecmp(uuid, A2DP_SINK_UUID) == 0) { struct a2dp_transport *a2dp; a2dp = g_new0(struct a2dp_transport, 1); a2dp->volume = -1; transport->resume = resume_a2dp; transport->suspend = suspend_a2dp; transport->cancel = cancel_a2dp; transport->get_properties = get_properties_a2dp; transport->set_property = set_property_a2dp; transport->data = a2dp; transport->destroy = destroy_a2dp; } else if (strcasecmp(uuid, HFP_AG_UUID) == 0 ||
struct media_transport *media_transport_create(DBusConnection *conn, struct media_endpoint *endpoint, struct audio_device *device, uint8_t *configuration, size_t size) { struct media_transport *transport; const char *uuid; static int fd = 0; transport = g_new0(struct media_transport, 1); transport->conn = dbus_connection_ref(conn); transport->device = device; transport->endpoint = endpoint; transport->configuration = g_new(uint8_t, size); memcpy(transport->configuration, configuration, size); transport->size = size; transport->path = g_strdup_printf("%s/fd%d", device->path, fd++); transport->fd = -1; uuid = media_endpoint_get_uuid(endpoint); if (strcasecmp(uuid, A2DP_SOURCE_UUID) == 0 || strcasecmp(uuid, A2DP_SINK_UUID) == 0) { transport->resume = resume_a2dp; transport->suspend = suspend_a2dp; transport->cancel = cancel_a2dp; transport->get_properties = get_properties_a2dp; transport->set_property = set_property_a2dp; } else if (strcasecmp(uuid, HFP_AG_UUID) == 0 || strcasecmp(uuid, HSP_AG_UUID) == 0) { transport->resume = resume_headset; transport->suspend = suspend_headset; transport->cancel = cancel_headset; transport->get_properties = get_properties_headset; transport->set_property = set_property_headset; transport->nrec_id = headset_add_nrec_cb(device, headset_nrec_changed, transport); } else if (strcasecmp(uuid, HFP_HS_UUID) == 0 || strcasecmp(uuid, HSP_HS_UUID) == 0) { transport->resume = resume_gateway; transport->suspend = suspend_gateway; transport->cancel = cancel_gateway; transport->get_properties = get_properties_gateway; transport->set_property = set_property_gateway; } else goto fail; if (g_dbus_register_interface(transport->conn, transport->path, MEDIA_TRANSPORT_INTERFACE, transport_methods, transport_signals, NULL, transport, media_transport_free) == FALSE) { error("Could not register transport %s", transport->path); goto fail; } return transport; fail: media_transport_free(transport); return NULL; }