Bluetooth-SWB: Enable/Disable SWB.
Enable/Disable SWB based on network type
or property.
CRs-fixed: 2443122
Change-Id: I38445a4c3357ef403ae9000b4419e7a8a93069da
diff --git a/system_bt_ext/bta/include/bta_ag_swb.h b/system_bt_ext/bta/include/bta_ag_swb.h
index 95b77ca..a65f3c3 100644
--- a/system_bt_ext/bta/include/bta_ag_swb.h
+++ b/system_bt_ext/bta/include/bta_ag_swb.h
@@ -31,6 +31,7 @@
#define _BTA_AG_SWB_H_
#include "bta_ag_int.h"
+#include "device/include/esco_parameters.h"
#define BTA_AG_SCO_SWB_SETTINGS_Q0_MASK 4
#define BTA_AG_SCO_SWB_SETTINGS_Q1_MASK 8
@@ -44,9 +45,45 @@
#define BTA_AG_LOCAL_RES_QAC 0x108
#define BTA_AG_LOCAL_RES_QCS 0x109
+#define LEGACY_CODECS 2
+#define SWB_ESCO_NUM_CODECS 1
+
void bta_ag_swb_handle_vs_at_events(tBTA_AG_SCB* p_scb, uint16_t cmd, int16_t int_arg, tBTA_AG_VAL val);
void bta_ag_send_qac(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
void bta_ag_send_qcs(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
tBTA_AG_PEER_CODEC bta_ag_parse_qac(tBTA_AG_SCB* p_scb, char* p_s);
+const enh_esco_params_t default_esco_swb_parameters[SWB_ESCO_NUM_CODECS] = {
+ {.transmit_bandwidth = TXRX_64KBITS_RATE,
+ .receive_bandwidth = TXRX_64KBITS_RATE,
+ .transmit_coding_format = {.coding_format = ESCO_CODING_FORMAT_VS,
+ .company_id = 0x000A,
+ .vendor_specific_codec_id = 0x0000},
+ .receive_coding_format = {.coding_format = ESCO_CODING_FORMAT_VS,
+ .company_id = 0x000A,
+ .vendor_specific_codec_id = 0x0000},
+ .transmit_codec_frame_size = 60,
+ .receive_codec_frame_size = 60,
+ .input_bandwidth = INPUT_OUTPUT_128K_RATE,
+ .output_bandwidth = INPUT_OUTPUT_128K_RATE,
+ .input_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR,
+ .company_id = 0x0000,
+ .vendor_specific_codec_id = 0x0000},
+ .output_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR,
+ .company_id = 0x0000,
+ .vendor_specific_codec_id = 0x0000},
+ .input_coded_data_size = 16,
+ .output_coded_data_size = 16,
+ .input_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP,
+ .output_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP,
+ .input_pcm_payload_msb_position = 0,
+ .output_pcm_payload_msb_position = 0,
+ .input_data_path = ESCO_DATA_PATH_PCM,
+ .output_data_path = ESCO_DATA_PATH_PCM,
+ .input_transport_unit_size = 0x00,
+ .output_transport_unit_size = 0x00,
+ .max_latency_ms = 14,
+ .packet_types = 0x0380,
+ .retransmission_effort = ESCO_RETRANSMISSION_QUALITY}};
+
#endif//_BTA_AG_SWB_H_
diff --git a/system_bt_ext/bta/swb/bta_ag_swb.cc b/system_bt_ext/bta/swb/bta_ag_swb.cc
index ead0572..496f110 100644
--- a/system_bt_ext/bta/swb/bta_ag_swb.cc
+++ b/system_bt_ext/bta/swb/bta_ag_swb.cc
@@ -33,14 +33,22 @@
#include "bta_ag_int.h"
#include "utl.h"
#include "device/include/interop.h"
+#include <hardware/vendor_hf.h>
#if (SWB_ENABLED == TRUE)
+#define SWB_CODECS_SUPPORTED "0,4,6,7"
+#define SWB_CODECS_UNSUPPORTD "0xFFFF"
+
void bta_ag_swb_handle_vs_at_events(tBTA_AG_SCB* p_scb, uint16_t cmd, int16_t int_arg, tBTA_AG_VAL val)
{
APPL_TRACE_DEBUG("%s: p_scb : %x cmd : %d", __func__, p_scb, cmd);
switch(cmd) {
case BTA_AG_AT_QAC_EVT:
+ if (!get_swb_codec_status()) {
+ bta_ag_send_qac(p_scb, NULL);
+ break;
+ }
p_scb->codec_updated = true;
if (p_scb->peer_codecs & BTA_AG_SCO_SWB_SETTINGS_Q0_MASK) {
p_scb->sco_codec = BTA_AG_SCO_SWB_SETTINGS_Q0;
@@ -132,7 +140,12 @@
void bta_ag_send_qac(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) {
/* send +BCS */
APPL_TRACE_DEBUG("send +QAC codecs suuported");
- bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_QAC, "0,4,6,7", 0);
+ if (!get_swb_codec_status()) {
+ bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_QAC, SWB_CODECS_UNSUPPORTD, 0);
+ return;
+ } else{
+ bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_QAC, SWB_CODECS_SUPPORTED, 0);
+ }
if (p_scb->sco_codec == BTA_AG_SCO_SWB_SETTINGS_Q0) {
p_scb->is_swb_codec = true;
}
diff --git a/vhal/include/hardware/vendor_hf.h b/vhal/include/hardware/vendor_hf.h
index 6399de6..6b07c5c 100644
--- a/vhal/include/hardware/vendor_hf.h
+++ b/vhal/include/hardware/vendor_hf.h
@@ -36,6 +36,8 @@
#define BT_PROFILE_VENDOR_HF_ID "vendorhfservice"
+bool get_swb_codec_status();
+
void btif_handle_vendor_hf_events(uint16_t event, uint16_t swb_config, RawAddress *bd_addr);
/* SWB callback events */