avdtp : Use kernel streaming mode 99/136499/1
authorSeungyoun Ju <sy39.ju@samsung.com>
Thu, 4 May 2017 10:21:10 +0000 (19:21 +0900)
committerSeungyoun Ju <sy39.ju@samsung.com>
Fri, 30 Jun 2017 04:12:19 +0000 (13:12 +0900)
[Problem] If BT controller's buffer is occupied by another profile
 such as OPP or SPP, and it is blocked due to RF condition,
 A2DP packets for another device couldn't be sent properly.
 It causes the A2DP chopping issue because it does not have
 available buffer though RF is available.

[Cause & Measure] HCI buffer is limited but another tx requests occupy it.
 It causes audio sreaming packet delay.
 Because of this issue, streaming mode has been implemented in Kernel.
 This patch uses that feature as per avdtp state.

[Checking Method] Connect Bluetooth headset to DUT -> Play Music on DUT ->
 Install watchface on DUT or send some files from DUT to other remote device ->
 Observe BT audio quality

Change-Id: Ia00fa75b2ab6bd90f0373ad1605cabf5a5aa305e

lib/mgmt.h
profiles/audio/avdtp.c
src/adapter.c
src/adapter.h

index e92aa3a..6286839 100644 (file)
@@ -1061,6 +1061,12 @@ struct mgmt_cp_set_dev_rpa_res_support {
        uint8_t res_support;
 } __packed;
 
+#define MGMT_OP_SET_STREAMING_MODE     (TIZEN_OP_CODE_BASE + 0x1b)
+struct mgmt_cp_set_streaming_mode {
+       uint8_t streaming_mode;
+       bdaddr_t bdaddr;
+} __packed;
+
 /* BEGIN TIZEN_Bluetooth :: name update changes */
 #define MGMT_EV_DEVICE_NAME_UPDATE             (TIZEN_EV_BASE + 0x01)
 struct mgmt_ev_device_name_update {
index df54a41..c62385e 100644 (file)
@@ -1137,6 +1137,7 @@ static void avdtp_sep_set_state(struct avdtp *session,
 {
        struct avdtp_stream *stream = sep->stream;
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+       struct btd_adapter *adapter = device_get_adapter(session->device);
 #if (defined(TIZEN_FEATURE_BLUEZ_BRCM_QOS) || defined(TIZEN_FEATURE_BLUEZ_ROLE_CHANGE)) || \
        defined(TIZEN_FEATURE_BLUEZ_SPRD_QOS)
        const bdaddr_t *dst;
@@ -1183,6 +1184,7 @@ static void avdtp_sep_set_state(struct avdtp *session,
 #ifdef TIZEN_FEATURE_BLUEZ_ROLE_CHANGE
                fix_role_to_master(dst, FALSE);
 #endif /* TIZEN_FEATURE_BLUEZ_ROLE_CHANGE */
+               btd_adapter_set_streaming_mode(adapter, dst, FALSE);
 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
 
                break;
@@ -1202,6 +1204,7 @@ static void avdtp_sep_set_state(struct avdtp *session,
 #ifdef TIZEN_FEATURE_BLUEZ_ROLE_CHANGE
                fix_role_to_master(dst, TRUE);
 #endif /* TIZEN_FEATURE_BLUEZ_ROLE_CHANGE */
+               btd_adapter_set_streaming_mode(adapter, dst, TRUE);
 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
                stream->open_acp = FALSE;
                break;
index 3c13dcf..957c875 100644 (file)
@@ -13743,3 +13743,25 @@ bool btd_le_connect_before_pairing(void)
 
        return false;
 }
+
+int btd_adapter_set_streaming_mode(struct btd_adapter *adapter,
+                                  const bdaddr_t *bdaddr, gboolean enable)
+{
+       struct mgmt_cp_set_streaming_mode cp;
+       char addr[18];
+
+       ba2str(bdaddr, addr);
+       DBG("hci%u device %s", adapter->dev_id, addr);
+
+       memset(&cp, 0, sizeof(cp));
+
+       cp.streaming_mode = enable ? 1 : 0;
+       bacpy(&cp.bdaddr, bdaddr);
+
+       if (mgmt_send(adapter->mgmt, MGMT_OP_SET_STREAMING_MODE,
+                                       adapter->dev_id, sizeof(cp), &cp,
+                                       NULL, NULL, NULL) > 0)
+               return 0;
+
+       return -EIO;
+}
index 46d80ae..e05a81c 100644 (file)
@@ -338,6 +338,10 @@ int btd_adapter_le_set_data_length(struct btd_adapter *adapter, bdaddr_t *bdaddr
                        uint16_t max_tx_octets, uint16_t max_tx_time);
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
 void adapter_check_version(struct btd_adapter *adapter, uint8_t hci_ver);
+
+int btd_adapter_set_streaming_mode(struct btd_adapter *adapter,
+                                  const bdaddr_t *bdaddr, gboolean enable);
+
 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
 charging_state_e get_charging_state(struct btd_adapter *adapter);
 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */