struct audio_device *audio_device_register(DBusConnection *conn, struct btd_device *device, const char *path, const bdaddr_t *src, const bdaddr_t *dst) { struct audio_device *dev; if (!conn || !path) return NULL; dev = g_new0(struct audio_device, 1); dev->btd_dev = btd_device_ref(device); dev->path = g_strdup(path); bacpy(&dev->dst, dst); bacpy(&dev->src, src); dev->conn = dbus_connection_ref(conn); dev->priv = g_new0(struct dev_priv, 1); dev->priv->state = AUDIO_STATE_DISCONNECTED; if (!g_dbus_register_interface(dev->conn, dev->path, AUDIO_INTERFACE, dev_methods, dev_signals, NULL, dev, NULL)) { error("Unable to register %s on %s", AUDIO_INTERFACE, dev->path); device_free(dev); return NULL; } DBG("Registered interface %s on path %s", AUDIO_INTERFACE, dev->path); if (sink_callback_id == 0) sink_callback_id = sink_add_state_cb(device_sink_cb, NULL); if (avdtp_callback_id == 0) avdtp_callback_id = avdtp_add_state_cb(device_avdtp_cb, NULL); if (avctp_callback_id == 0) avctp_callback_id = avctp_add_state_cb(device_avctp_cb, NULL); if (headset_callback_id == 0) headset_callback_id = headset_add_state_cb(device_headset_cb, NULL); dev->uinput = -1; return dev; }
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 audio_device *audio_device_register(struct btd_device *device) { struct audio_device *dev; DBG("%s", device_get_path(device)); dev = g_new0(struct audio_device, 1); dev->btd_dev = btd_device_ref(device); dev->priv = g_new0(struct dev_priv, 1); dev->priv->state = AUDIO_STATE_DISCONNECTED; if (sink_callback_id == 0) sink_callback_id = sink_add_state_cb(device_sink_cb, NULL); if (avdtp_callback_id == 0) avdtp_callback_id = avdtp_add_state_cb(device_avdtp_cb, NULL); if (avctp_callback_id == 0) avctp_callback_id = avctp_add_state_cb(device_avctp_cb, NULL); return dev; }
static int media_transport_init_source(struct media_transport *transport) { struct btd_service *service; struct a2dp_transport *a2dp; service = btd_device_get_service(transport->device, A2DP_SINK_UUID); if (service == NULL) return -EINVAL; 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; a2dp->volume = -1; transport->sink_watch = sink_add_state_cb(service, sink_state_changed, transport); return 0; }