summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2007-08-19 15:27:56 +0000
committerJohan Hedberg <johan.hedberg@nokia.com>2007-08-19 15:27:56 +0000
commit78a94059160d7478624cad315022255f7ebbbe80 (patch)
tree0540f729abd73d2353ae716da22abcdf73709fec /audio
parenta20ed567f6904e0dbf63aac5b45aa1fdd50f45de (diff)
Improve handling of unix clients which stay connected even though the headset connection is lost
Diffstat (limited to 'audio')
-rw-r--r--audio/a2dp.c3
-rw-r--r--audio/avdtp.c7
-rw-r--r--audio/unix.c5
3 files changed, 7 insertions, 8 deletions
diff --git a/audio/a2dp.c b/audio/a2dp.c
index ce50c9cf..ebf6b472 100644
--- a/audio/a2dp.c
+++ b/audio/a2dp.c
@@ -118,10 +118,11 @@ static void setup_callback(struct a2dp_stream_cb *cb,
cb->cb(s->session, s->dev, s->stream, cb->user_data);
}
-static void finalize_stream_setup(struct a2dp_stream_setup *s)
+static gboolean finalize_stream_setup(struct a2dp_stream_setup *s)
{
g_slist_foreach(setup->cb, (GFunc) setup_callback, setup);
stream_setup_free(setup);
+ return FALSE;
}
static gboolean setconf_ind(struct avdtp *session,
diff --git a/audio/avdtp.c b/audio/avdtp.c
index 993bf89c..a82f21d5 100644
--- a/audio/avdtp.c
+++ b/audio/avdtp.c
@@ -1518,7 +1518,6 @@ static gboolean request_timeout(gpointer user_data)
struct avdtp *session = user_data;
struct pending_req *req;
struct seid_req sreq;
- struct avdtp_remote_sep *rsep;
struct avdtp_local_sep *lsep;
struct avdtp_stream *stream;
uint8_t seid;
@@ -1531,12 +1530,6 @@ static gboolean request_timeout(gpointer user_data)
seid = ((struct seid_req *) (req->msg))->acp_seid;
- rsep = find_remote_sep(session->seps, seid);
- if (!rsep) {
- error("Unable to find matching remote SEID %u", seid);
- goto failed;
- }
-
stream = find_stream_by_rseid(session, seid);
if (stream)
diff --git a/audio/unix.c b/audio/unix.c
index 94c84500..f8832c91 100644
--- a/audio/unix.c
+++ b/audio/unix.c
@@ -164,6 +164,8 @@ static void stream_state_changed(struct avdtp_stream *stream,
switch (new_state) {
case AVDTP_STATE_IDLE:
+ a2dp_source_unlock(client->dev, a2dp->session);
+ client->dev = NULL;
if (a2dp->session) {
avdtp_unref(a2dp->session);
a2dp->session = NULL;
@@ -315,6 +317,7 @@ proceed:
client);
if (id == 0) {
error("request_stream failed");
+ a2dp_source_unlock(dev, a2dp->session);
goto failed;
}
@@ -395,6 +398,8 @@ static gboolean client_cb(GIOChannel *chan, GIOCondition cond, gpointer data)
if (cond & (G_IO_HUP | G_IO_ERR)) {
debug("Unix client disconnected");
+ if (!client->dev)
+ goto failed;
if (client->disconnect)
client->disconnect(client->dev, cb_data);
if (client->type == TYPE_SINK && client->req_id > 0)