[PATCH BlueZ] a2dp: Use streaming mode when MPS is enabled

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>

If MPS is enabled use L2CAP streaming mode for AVDTP channels.
---
 profiles/audio/a2dp.c  |  8 ++++++++
 profiles/audio/avdtp.c |  9 +++++++++
 src/hcid.h             |  7 +++++++
 src/main.c             | 16 ++++++----------
 4 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
index 0a66589b0..f00e5c923 100644
--- a/profiles/audio/a2dp.c
+++ b/profiles/audio/a2dp.c
@@ -43,6 +43,7 @@
 
 #include "gdbus/gdbus.h"
 
+#include "src/hcid.h"
 #include "src/plugin.h"
 #include "src/adapter.h"
 #include "src/device.h"
@@ -2331,14 +2332,21 @@ drop:
 static bool a2dp_server_listen(struct a2dp_server *server)
 {
 	GError *err = NULL;
+	BtIOMode mode;
 
 	if (server->io)
 		return true;
 
+	if (main_opts.mps == MPS_OFF)
+		mode = BT_IO_MODE_BASIC;
+	else
+		mode = BT_IO_MODE_STREAMING;
+
 	server->io = bt_io_listen(NULL, confirm_cb, server, NULL, &err,
 				BT_IO_OPT_SOURCE_BDADDR,
 				btd_adapter_get_address(server->adapter),
 				BT_IO_OPT_PSM, AVDTP_PSM,
+				BT_IO_OPT_MODE, mode,
 				BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
 				BT_IO_OPT_MASTER, true,
 				BT_IO_OPT_INVALID);
diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
index 45727f01e..e5193f79b 100644
--- a/profiles/audio/avdtp.c
+++ b/profiles/audio/avdtp.c
@@ -42,6 +42,7 @@
 #include "lib/uuid.h"
 
 #include "btio/btio.h"
+#include "src/hcid.h"
 #include "src/log.h"
 #include "src/shared/util.h"
 #include "src/shared/queue.h"
@@ -2406,9 +2407,15 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
 	GError *err = NULL;
 	GIOChannel *io;
 	const bdaddr_t *src;
+	BtIOMode mode;
 
 	src = btd_adapter_get_address(device_get_adapter(session->device));
 
+	if (main_opts.mps == MPS_OFF)
+		mode = BT_IO_MODE_BASIC;
+	else
+		mode = BT_IO_MODE_STREAMING;
+
 	if (session->phy)
 		io = bt_io_connect(avdtp_connect_cb, session,
 					NULL, &err,
@@ -2416,6 +2423,7 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
 					BT_IO_OPT_DEST_BDADDR,
 					device_get_address(session->device),
 					BT_IO_OPT_PSM, AVDTP_PSM,
+					BT_IO_OPT_MODE, mode,
 					BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
 					/* Set Input MTU to 0 to auto-tune */
 					BT_IO_OPT_IMTU, 0,
@@ -2427,6 +2435,7 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
 					BT_IO_OPT_DEST_BDADDR,
 					device_get_address(session->device),
 					BT_IO_OPT_PSM, AVDTP_PSM,
+					BT_IO_OPT_MODE, mode,
 					BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
 					BT_IO_OPT_INVALID);
 	if (!io) {
diff --git a/src/hcid.h b/src/hcid.h
index 56e2b4f31..1b2714b1d 100644
--- a/src/hcid.h
+++ b/src/hcid.h
@@ -41,6 +41,12 @@ enum jw_repairing_t {
 	JW_REPAIRING_ALWAYS,
 };
 
+enum mps_mode_t {
+	MPS_OFF,
+	MPS_SINGLE,
+	MPS_MULTIPLE,
+};
+
 struct main_opts {
 	char		*name;
 	uint32_t	class;
@@ -102,6 +108,7 @@ struct main_opts {
 	bt_gatt_cache_t gatt_cache;
 	uint16_t	gatt_mtu;
 	uint8_t		gatt_channels;
+	enum mps_mode_t	mps;
 
 	uint8_t		key_size;
 
diff --git a/src/main.c b/src/main.c
index 50e37e57a..e51f614b3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -74,12 +74,6 @@ struct main_opts main_opts;
 static GKeyFile *main_conf;
 static char *main_conf_file_path;
 
-static enum {
-	MPS_OFF,
-	MPS_SINGLE,
-	MPS_MULTIPLE,
-} mps = MPS_OFF;
-
 static const char *supported_options[] = {
 	"Name",
 	"Class",
@@ -583,9 +577,11 @@ static void parse_config(GKeyFile *config)
 		DBG("MultiProfile=%s", str);
 
 		if (!strcmp(str, "single"))
-			mps = MPS_SINGLE;
+			main_opts.mps = MPS_SINGLE;
 		else if (!strcmp(str, "multiple"))
-			mps = MPS_MULTIPLE;
+			main_opts.mps = MPS_MULTIPLE;
+		else
+			main_opts.mps = MPS_OFF;
 
 		g_free(str);
 	}
@@ -910,8 +906,8 @@ int main(int argc, char *argv[])
 						main_opts.did_version);
 	}
 
-	if (mps != MPS_OFF)
-		register_mps(mps == MPS_MULTIPLE);
+	if (main_opts.mps != MPS_OFF)
+		register_mps(main_opts.mps == MPS_MULTIPLE);
 
 	/* Loading plugins has to be done after D-Bus has been setup since
 	 * the plugins might wanna expose some paths on the bus. However the
-- 
2.25.3




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux