diff options
| -rw-r--r-- | audio/avdtp.c | 15 | ||||
| -rw-r--r-- | audio/avdtp.h | 2 | ||||
| -rw-r--r-- | audio/sink.c | 2 | 
3 files changed, 18 insertions, 1 deletions
diff --git a/audio/avdtp.c b/audio/avdtp.c index 455f2c69..bf3b79e0 100644 --- a/audio/avdtp.c +++ b/audio/avdtp.c @@ -348,6 +348,9 @@ struct avdtp {  	avdtp_session_state_t last_state;  	avdtp_session_state_t state; +	/* True if the session should be automatically disconnected */ +	gboolean auto_dc; +  	guint io;  	int sock; @@ -703,7 +706,7 @@ static void avdtp_sep_set_state(struct avdtp *session,  	switch (state) {  	case AVDTP_STATE_OPEN: -		if (old_state > AVDTP_STATE_OPEN) +		if (old_state > AVDTP_STATE_OPEN && session->auto_dc)  			stream->idle_timer = g_timeout_add_seconds(STREAM_TIMEOUT,  								stream_timeout,  								stream); @@ -2224,6 +2227,7 @@ static struct avdtp *avdtp_get_internal(const bdaddr_t *src, const bdaddr_t *dst  	bacpy(&session->dst, dst);  	session->ref = 1;  	session->state = AVDTP_SESSION_STATE_DISCONNECTED; +	session->auto_dc = TRUE;  	sessions = g_slist_append(sessions, session); @@ -2765,7 +2769,11 @@ static void auth_cb(DBusError *derr, void *user_data)  	session->buf = g_malloc0(session->mtu); +	/* Here we set the disconnect timer so we don't stay in IDLE state +	 * indefinitely but set auto_dc to FALSE so that when a stream is +	 * finally opened it doesn't get closed due to a timeout */  	set_disconnect_timer(session); +	avdtp_set_auto_disconnect(session, FALSE);  	session->state = AVDTP_SESSION_STATE_CONNECTED; @@ -2971,3 +2979,8 @@ gboolean avdtp_has_stream(struct avdtp *session, struct avdtp_stream *stream)  {  	return g_slist_find(session->streams, stream) ? TRUE : FALSE;  } + +void avdtp_set_auto_disconnect(struct avdtp *session, gboolean auto_dc) +{ +	session->auto_dc = auto_dc; +} diff --git a/audio/avdtp.h b/audio/avdtp.h index 906d61ea..197c262d 100644 --- a/audio/avdtp.h +++ b/audio/avdtp.h @@ -265,5 +265,7 @@ int avdtp_error_posix_errno(struct avdtp_error *err);  void avdtp_get_peers(struct avdtp *session, bdaddr_t *src, bdaddr_t *dst); +void avdtp_set_auto_disconnect(struct avdtp *session, gboolean auto_dc); +  int avdtp_init(const bdaddr_t *src, GKeyFile *config);  void avdtp_exit(const bdaddr_t *src); diff --git a/audio/sink.c b/audio/sink.c index a966d2bc..347e3f69 100644 --- a/audio/sink.c +++ b/audio/sink.c @@ -425,6 +425,8 @@ static DBusMessage *sink_connect(DBusConnection *conn,  						".AlreadyConnected",  						"Device Already Connected"); +	avdtp_set_auto_disconnect(sink->session, FALSE); +  	pending = g_new0(struct pending_request, 1);  	pending->conn = dbus_connection_ref(conn);  	pending->msg = dbus_message_ref(msg);  | 
