summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz-von@nokia.com>2011-03-24 14:09:53 +0200
committerJohan Hedberg <johan.hedberg@nokia.com>2011-03-25 11:10:53 +0200
commitd3f69537a46b1050d2415ca4afcdedba967096e8 (patch)
tree0cb77d7fa167966297534de68a42f65c50d75d25
parentaef577312e56ca25408e2627574a8949421dde9b (diff)
Wait SCO socket to HUP before changing state
In situations where application wants to switch profiles e.g HFP to A2DP it normally needs to wait SCO to be disconnected to resume A2DP due to resource limitations on headset. There seems to be an issue in the kernel side which prevent this to work properly, apparently shutdown does not wait the link to be disconnected, but it is under investigation.
-rw-r--r--audio/headset.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/audio/headset.c b/audio/headset.c
index bdaa8da91..dff10d15e 100644
--- a/audio/headset.c
+++ b/audio/headset.c
@@ -1345,6 +1345,7 @@ static gboolean sco_cb(GIOChannel *chan, GIOCondition cond,
error("Audio connection got disconnected");
+ pending_connect_finalize(device);
headset_set_state(device, HEADSET_STATE_CONNECTED);
return FALSE;
@@ -2385,6 +2386,7 @@ unsigned int headset_suspend_stream(struct audio_device *dev,
{
struct headset *hs = dev->headset;
unsigned int id;
+ int sock;
if (hs->state == HEADSET_STATE_DISCONNECTED ||
hs->state == HEADSET_STATE_CONNECTING)
@@ -2395,10 +2397,12 @@ unsigned int headset_suspend_stream(struct audio_device *dev,
hs->dc_timer = 0;
}
- headset_set_state(dev, HEADSET_STATE_CONNECTED);
+ sock = g_io_channel_unix_get_fd(hs->sco);
+
+ /* shutdown but leave the socket open and wait for hup */
+ shutdown(sock, SHUT_RDWR);
id = connect_cb_new(hs, HEADSET_STATE_CONNECTED, cb, user_data);
- g_idle_add((GSourceFunc) dummy_connect_complete, dev);
return id;
}