static DBusMessage *sink_connect(DBusConnection *conn, DBusMessage *msg, void *data) { struct audio_device *dev = data; struct sink *sink = dev->sink; struct pending_request *pending; if (!sink->session) sink->session = avdtp_get(&dev->src, &dev->dst); if (!sink->session) return btd_error_failed(msg, "Unable to get a session"); if (sink->connect || sink->disconnect) return btd_error_busy(msg); if (sink->stream_state >= AVDTP_STATE_OPEN) return btd_error_already_connected(msg); if (!sink_setup_stream(sink, NULL)) return btd_error_failed(msg, "Failed to create a stream"); dev->auto_connect = FALSE; pending = sink->connect; pending->conn = dbus_connection_ref(conn); pending->msg = dbus_message_ref(msg); DBG("stream creation in progress"); return NULL; }
int sink_connect(struct btd_service *service) { struct sink *sink = btd_service_get_user_data(service); if (!sink->session) sink->session = avdtp_get(btd_service_get_device(service)); if (!sink->session) { DBG("Unable to get a session"); return -EIO; } if (sink->connect_id > 0 || sink->disconnect_id > 0) return -EBUSY; if (sink->state == SINK_STATE_CONNECTING) return -EBUSY; if (sink->stream_state >= AVDTP_STATE_OPEN) return -EALREADY; if (!sink_setup_stream(service, NULL)) { DBG("Failed to create a stream"); return -EIO; } DBG("stream creation in progress"); return 0; }
int sink_connect(struct audio_device *dev) { struct sink *sink = dev->sink; if (!sink->session) sink->session = avdtp_get(dev); if (!sink->session) { DBG("Unable to get a session"); return -EIO; } if (sink->connect_id > 0 || sink->disconnect_id > 0) return -EBUSY; if (sink->stream_state >= AVDTP_STATE_OPEN) return -EALREADY; if (!sink_setup_stream(sink, NULL)) { DBG("Failed to create a stream"); return -EIO; } DBG("stream creation in progress"); return 0; }
static gboolean avdtp_connect_timeout(gpointer user_data) { struct audio_device *dev = user_data; dev->priv->avdtp_timer = 0; if (dev->sink) { struct avdtp *session = avdtp_get(&dev->src, &dev->dst); if (!session) return FALSE; sink_setup_stream(dev->sink, session); avdtp_unref(session); } return FALSE; }
static DBusMessage *dev_connect(DBusConnection *conn, DBusMessage *msg, void *data) { struct audio_device *dev = data; struct dev_priv *priv = dev->priv; if (priv->state == AUDIO_STATE_CONNECTING) return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress", "Connect in Progress"); else if (priv->state == AUDIO_STATE_CONNECTED) return g_dbus_create_error(msg, ERROR_INTERFACE ".AlreadyConnected", "Already Connected"); dev->auto_connect = TRUE; if (dev->headset) headset_config_stream(dev, FALSE, NULL, NULL); if (priv->state != AUDIO_STATE_CONNECTING && dev->sink) { struct avdtp *session = avdtp_get(&dev->src, &dev->dst); if (!session) return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed", "Failed to get AVDTP session"); sink_setup_stream(dev->sink, session); avdtp_unref(session); } /* The previous calls should cause a call to the state callback to * indicate AUDIO_STATE_CONNECTING */ if (priv->state != AUDIO_STATE_CONNECTING) return g_dbus_create_error(msg, ERROR_INTERFACE ".ConnectFailed", "Headset connect failed"); priv->conn_req = dbus_message_ref(msg); return NULL; }