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;