Add immediate parameter to avdtp_close
When TRUE if there is an outstanding command in the sending queue it will
cause abort which cancel any pending command.
diff --git a/audio/a2dp.c b/audio/a2dp.c
index c48105a..148898a 100644
--- a/audio/a2dp.c
+++ b/audio/a2dp.c
@@ -1393,7 +1393,7 @@
if (l != NULL) {
setup->reconfigure = TRUE;
- if (avdtp_close(session, tmp->stream) < 0) {
+ if (avdtp_close(session, tmp->stream, FALSE) < 0) {
error("avdtp_close failed");
goto failed;
}
@@ -1423,7 +1423,7 @@
g_idle_add((GSourceFunc) finalize_config, setup);
} else if (!setup->reconfigure) {
setup->reconfigure = TRUE;
- if (avdtp_close(session, sep->stream) < 0) {
+ if (avdtp_close(session, sep->stream, FALSE) < 0) {
error("avdtp_close failed");
goto failed;
}
diff --git a/audio/avdtp.c b/audio/avdtp.c
index af8059a..beacb32 100644
--- a/audio/avdtp.c
+++ b/audio/avdtp.c
@@ -804,7 +804,7 @@
struct avdtp_stream *stream = user_data;
struct avdtp *session = stream->session;
- avdtp_close(session, stream);
+ avdtp_close(session, stream, FALSE);
stream->idle_timer = 0;
@@ -3475,7 +3475,8 @@
&req, sizeof(req));
}
-int avdtp_close(struct avdtp *session, struct avdtp_stream *stream)
+int avdtp_close(struct avdtp *session, struct avdtp_stream *stream,
+ gboolean immediate)
{
struct seid_req req;
int ret;
@@ -3491,6 +3492,9 @@
return -EINVAL;
}
+ if (immediate && session->req && stream == session->req->stream)
+ return avdtp_abort(session, stream);
+
memset(&req, 0, sizeof(req));
req.acp_seid = stream->rseid;
diff --git a/audio/avdtp.h b/audio/avdtp.h
index 2e5ad5f..3fe682b 100644
--- a/audio/avdtp.h
+++ b/audio/avdtp.h
@@ -275,7 +275,8 @@
struct avdtp_stream *stream);
int avdtp_start(struct avdtp *session, struct avdtp_stream *stream);
int avdtp_suspend(struct avdtp *session, struct avdtp_stream *stream);
-int avdtp_close(struct avdtp *session, struct avdtp_stream *stream);
+int avdtp_close(struct avdtp *session, struct avdtp_stream *stream,
+ gboolean immediate);
int avdtp_abort(struct avdtp *session, struct avdtp_stream *stream);
int avdtp_delay_report(struct avdtp *session, struct avdtp_stream *stream,
uint16_t delay);
diff --git a/audio/sink.c b/audio/sink.c
index 3a8eb23..4d46e52 100644
--- a/audio/sink.c
+++ b/audio/sink.c
@@ -178,7 +178,7 @@
debug("Sink: disconnect %s", device->path);
- avdtp_close(sink->session, sink->stream);
+ avdtp_close(sink->session, sink->stream, TRUE);
}
static void stream_state_changed(struct avdtp_stream *stream,
@@ -634,7 +634,7 @@
return reply;
}
- err = avdtp_close(sink->session, sink->stream);
+ err = avdtp_close(sink->session, sink->stream, FALSE);
if (err < 0)
return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
"%s", strerror(-err));
@@ -836,7 +836,7 @@
if (!sink->stream)
return FALSE;
- if (avdtp_close(sink->session, sink->stream) < 0)
+ if (avdtp_close(sink->session, sink->stream, FALSE) < 0)
return FALSE;
return TRUE;
diff --git a/audio/source.c b/audio/source.c
index 1530c34..0ea0f00 100644
--- a/audio/source.c
+++ b/audio/source.c
@@ -171,7 +171,7 @@
debug("Source: disconnect %s", device->path);
- avdtp_close(source->session, source->stream);
+ avdtp_close(source->session, source->stream, TRUE);
}
static void stream_state_changed(struct avdtp_stream *stream,
@@ -596,7 +596,7 @@
return reply;
}
- err = avdtp_close(source->session, source->stream);
+ err = avdtp_close(source->session, source->stream, FALSE);
if (err < 0)
return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
"%s", strerror(-err));
@@ -762,7 +762,7 @@
if (!source->stream)
return FALSE;
- if (avdtp_close(source->session, source->stream) < 0)
+ if (avdtp_close(source->session, source->stream, FALSE) < 0)
return FALSE;
return TRUE;