summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/headset.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/audio/headset.c b/audio/headset.c
index 489cb09c..107cab47 100644
--- a/audio/headset.c
+++ b/audio/headset.c
@@ -273,6 +273,23 @@ static headset_event_t parse_headset_event(const char *buf, char *rsp, int rsp_l
return HEADSET_EVENT_UNKNOWN;
}
+static void close_sco(struct headset *hs)
+{
+ g_io_channel_close(hs->sco);
+ g_io_channel_unref(hs->sco);
+ hs->sco = NULL;
+ if (hs->audio_output) {
+ g_io_channel_unref(hs->audio_output);
+ hs->audio_output = NULL;
+ }
+ if (hs->audio_input)
+ audio_headset_close_input(hs);
+ assert(hs->rfcomm);
+ hs->state = HEADSET_STATE_CONNECTED;
+ hs_signal(hs, "Stopped");
+}
+
+
static gboolean rfcomm_io_cb(GIOChannel *chan, GIOCondition cond,
struct headset *hs)
{
@@ -364,6 +381,8 @@ static gboolean rfcomm_io_cb(GIOChannel *chan, GIOCondition cond,
return TRUE;
failed:
+ if (hs->sco)
+ close_sco(hs);
hs_disconnect(hs, NULL);
return FALSE;
@@ -476,22 +495,6 @@ failed:
return FALSE;
}
-static void close_sco(struct headset *hs)
-{
- g_io_channel_close(hs->sco);
- g_io_channel_unref(hs->sco);
- hs->sco = NULL;
- if (hs->audio_output) {
- g_io_channel_unref(hs->audio_output);
- hs->audio_output = NULL;
- }
- if (hs->audio_input)
- audio_headset_close_input(hs);
- assert(hs->rfcomm);
- hs->state = HEADSET_STATE_CONNECTED;
- hs_signal(hs, "Stopped");
-}
-
static gboolean sco_input_to_audio_output_cb(GIOChannel *chan, GIOCondition cond, gpointer data)
{
struct headset *hs = data;
@@ -536,7 +539,8 @@ static gboolean sco_input_to_audio_output_cb(GIOChannel *chan, GIOCondition cond
disconn:
error("Audio connection got disconnected");
- close_sco(hs);
+ if (hs->sco)
+ close_sco(hs);
return FALSE;
}