a2dp: Use streaming mode when MPS is enabled
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 8 Jun 2020 20:24:40 +0000 (13:24 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 12 Apr 2021 09:00:49 +0000 (14:30 +0530)
If MPS is enabled use L2CAP streaming mode for AVDTP channels.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
profiles/audio/a2dp.c
profiles/audio/avdtp.c
src/hcid.h
src/main.c

index fc11c4e..b71615d 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "gdbus/gdbus.h"
 
+#include "src/hcid.h"
 #include "src/plugin.h"
 #include "src/adapter.h"
 #include "src/device.h"
@@ -2435,16 +2436,23 @@ 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;
+
 #if defined(TIZEN_FEATURE_BLUEZ_MODIFY)
        if (btd_adapter_get_a2dp_role(server->adapter) == BLUETOOTH_A2DP_SINK_ROLE) {
                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_IMTU, 895,
                                BT_IO_OPT_MASTER, true,
@@ -2454,6 +2462,7 @@ static bool a2dp_server_listen(struct a2dp_server *server)
                                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);
@@ -2463,6 +2472,7 @@ static bool a2dp_server_listen(struct a2dp_server *server)
                                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);
index 9371670..23fa047 100644 (file)
@@ -47,6 +47,7 @@
 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
 
 #include "btio/btio.h"
+#include "src/hcid.h"
 #include "src/log.h"
 #include "src/shared/util.h"
 #include "src/shared/queue.h"
@@ -2886,12 +2887,17 @@ static GIOChannel *l2cap_connect(struct avdtp *session)
        GError *err = NULL;
        GIOChannel *io;
        const bdaddr_t *src;
+       BtIOMode mode;
 #if defined TIZEN_FEATURE_BLUEZ_MODIFY
        struct btd_adapter *adapter;
        adapter = avdtp_get_adapter(session);
 #endif
 
        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 defined TIZEN_FEATURE_BLUEZ_MODIFY
        if (btd_adapter_get_a2dp_role(adapter) == BLUETOOTH_A2DP_SINK_ROLE) {
@@ -2901,6 +2907,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_IMTU, 895,
                                BT_IO_OPT_INVALID);
@@ -2912,6 +2919,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);
        }
@@ -2923,6 +2931,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,
@@ -2934,6 +2943,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);
 #endif
index 7ad6277..9396dfe 100755 (executable)
@@ -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;
@@ -107,6 +113,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;
 
index 6c0444f..a366fa4 100755 (executable)
@@ -73,12 +73,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",
@@ -587,9 +581,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);
        }
@@ -945,8 +941,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