summaryrefslogtreecommitdiffstats
path: root/audio/avdtp.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2009-02-02 19:26:23 -0800
committerJohan Hedberg <johan.hedberg@nokia.com>2009-02-02 19:32:14 -0800
commit38ca09be34dbb514fa1194b9a164d1b63a74069b (patch)
tree8a5e533c31a9e1d286801adafd09aefb3cf6a6c1 /audio/avdtp.c
parent8b3e4cf9d9eaba3cfc5ec5361d136ebb84ab749f (diff)
Set up a stream for incoming connections if the sink doesn't do it
Some headsets when acting as initiators of an AVDTP connection create the AVDTP signaling channel but don't do anything else over it (i.e. they expect us to set up a stream when needed). This patch makes bluetoothd do the same as AudioSink.Connect() if no AVDTP commands have been received from the sink within one second after it has created the AVDTP signaling channel to us. Setting up a stream is also important because the AudioSink Connected property is bound to the existence of a configured stream (which makes sense since an AVDTP connection as such tells us nothing about what sinks and sources there are or even if audio or video will be used).
Diffstat (limited to 'audio/avdtp.c')
-rw-r--r--audio/avdtp.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/audio/avdtp.c b/audio/avdtp.c
index d1cb5ef3..a45b7d28 100644
--- a/audio/avdtp.c
+++ b/audio/avdtp.c
@@ -391,6 +391,9 @@ struct avdtp {
guint dc_timer;
+ /* Attempt stream setup instead of disconnecting */
+ gboolean stream_setup;
+
DBusPendingCall *pending_auth;
};
@@ -597,12 +600,21 @@ static gboolean stream_open_timeout(gpointer user_data)
static gboolean disconnect_timeout(gpointer user_data)
{
struct avdtp *session = user_data;
+ struct audio_device *dev;
+ gboolean stream_setup;
assert(session->ref == 1);
session->dc_timer = 0;
+ stream_setup = session->stream_setup;
+ session->stream_setup = FALSE;
- connection_lost(session, -ETIMEDOUT);
+ dev = manager_get_device(&session->server->src, &session->dst);
+
+ if (dev && dev->sink && stream_setup)
+ sink_setup_stream(dev->sink, session);
+ else
+ connection_lost(session, -ETIMEDOUT);
return FALSE;
}
@@ -611,6 +623,7 @@ static void remove_disconnect_timer(struct avdtp *session)
{
g_source_remove(session->dc_timer);
session->dc_timer = 0;
+ session->stream_setup = FALSE;
}
static void set_disconnect_timer(struct avdtp *session)
@@ -2963,6 +2976,7 @@ static void auth_cb(DBusError *derr, void *user_data)
/* 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 */
+ session->stream_setup = TRUE;
set_disconnect_timer(session);
avdtp_set_auto_disconnect(session, FALSE);