Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24acfaa6 authored by shihchienc's avatar shihchienc Committed by Patrick Chang
Browse files

[HFP1.9] Add LC3 settings and Codec events

1. add LC3 codec settings
2. adjust wbs event to be generic
3. enable LC3 codec with specific condition
4. add LC3 callback event to java native layer

Tag: #feature
Bug: 277338500
Test: manual
Test: atest --host net_test_btif_stack net_test_stack_btu net_test_stack_btm -c
Change-Id: I98071d5455f2f7e2673f9c15b56011a60e564148
parent 4886ea13
Loading
Loading
Loading
Loading
+11 −4
Original line number Original line Diff line number Diff line
@@ -380,6 +380,7 @@ void bta_ag_rfc_close(tBTA_AG_SCB* p_scb,
  p_scb->codec_updated = false;
  p_scb->codec_updated = false;
  p_scb->codec_fallback = false;
  p_scb->codec_fallback = false;
  p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
  p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
  p_scb->codec_lc3_settings = BTA_AG_SCO_LC3_SETTINGS_T2;
  p_scb->role = 0;
  p_scb->role = 0;
  p_scb->svc_conn = false;
  p_scb->svc_conn = false;
  p_scb->hsp_version = HSP_VERSION_1_2;
  p_scb->hsp_version = HSP_VERSION_1_2;
@@ -480,7 +481,13 @@ void bta_ag_rfc_open(tBTA_AG_SCB* p_scb, const tBTA_AG_DATA& data) {
      if (!p_scb->received_at_bac && sdp_wbs_support) {
      if (!p_scb->received_at_bac && sdp_wbs_support) {
        p_scb->codec_updated = true;
        p_scb->codec_updated = true;
        p_scb->peer_codecs = BTM_SCO_CODEC_CVSD | BTM_SCO_CODEC_MSBC;
        p_scb->peer_codecs = BTM_SCO_CODEC_CVSD | BTM_SCO_CODEC_MSBC;
        p_scb->sco_codec = UUID_CODEC_MSBC;
        p_scb->sco_codec = BTM_SCO_CODEC_MSBC;
      }
      bool sdp_swb_support = p_scb->peer_sdp_features & BTA_AG_FEAT_SWB_SUPPORT;
      if (!p_scb->received_at_bac && sdp_swb_support) {
        p_scb->codec_updated = true;
        p_scb->peer_codecs |= BTM_SCO_CODEC_LC3;
        p_scb->sco_codec = BTM_SCO_CODEC_LC3;
      }
      }
    } else {
    } else {
      APPL_TRACE_WARNING("%s: Failed read cached peer HFP SDP features for %s",
      APPL_TRACE_WARNING("%s: Failed read cached peer HFP SDP features for %s",
@@ -824,12 +831,12 @@ void bta_ag_setcodec(tBTA_AG_SCB* p_scb, const tBTA_AG_DATA& data) {
  /* Check if the requested codec type is valid */
  /* Check if the requested codec type is valid */
  if ((codec_type != BTM_SCO_CODEC_NONE) &&
  if ((codec_type != BTM_SCO_CODEC_NONE) &&
      (codec_type != BTM_SCO_CODEC_CVSD) &&
      (codec_type != BTM_SCO_CODEC_CVSD) &&
      (codec_type != BTM_SCO_CODEC_MSBC)) {
      (codec_type != BTM_SCO_CODEC_MSBC) && (codec_type != BTM_SCO_CODEC_LC3)) {
    val.num = codec_type;
    val.num = codec_type;
    val.hdr.status = BTA_AG_FAIL_RESOURCES;
    val.hdr.status = BTA_AG_FAIL_RESOURCES;
    APPL_TRACE_ERROR("bta_ag_setcodec error: unsupported codec type %d",
    APPL_TRACE_ERROR("bta_ag_setcodec error: unsupported codec type %d",
                     codec_type);
                     codec_type);
    (*bta_ag_cb.p_cback)(BTA_AG_WBS_EVT, (tBTA_AG*)&val);
    (*bta_ag_cb.p_cback)(BTA_AG_CODEC_EVT, (tBTA_AG*)&val);
    return;
    return;
  }
  }


@@ -847,7 +854,7 @@ void bta_ag_setcodec(tBTA_AG_SCB* p_scb, const tBTA_AG_DATA& data) {
                     codec_type);
                     codec_type);
  }
  }


  (*bta_ag_cb.p_cback)(BTA_AG_WBS_EVT, (tBTA_AG*)&val);
  (*bta_ag_cb.p_cback)(BTA_AG_CODEC_EVT, (tBTA_AG*)&val);
}
}


static void bta_ag_collision_timer_cback(void* data) {
static void bta_ag_collision_timer_cback(void* data) {
+13 −4
Original line number Original line Diff line number Diff line
@@ -203,6 +203,11 @@ typedef enum {
  BTA_AG_SCO_MSBC_SETTINGS_T1,
  BTA_AG_SCO_MSBC_SETTINGS_T1,
} tBTA_AG_SCO_MSBC_SETTINGS;
} tBTA_AG_SCO_MSBC_SETTINGS;


typedef enum {
  BTA_AG_SCO_LC3_SETTINGS_T2 = 0, /* preferred/default when codec is LC3 */
  BTA_AG_SCO_LC3_SETTINGS_T1,
} tBTA_AG_SCO_LC3_SETTINGS;

/* type for each service control block */
/* type for each service control block */
struct tBTA_AG_SCB {
struct tBTA_AG_SCB {
  char clip[BTA_AG_AT_MAX_LEN + 1];     /* number string used for CLIP */
  char clip[BTA_AG_AT_MAX_LEN + 1];     /* number string used for CLIP */
@@ -253,8 +258,10 @@ struct tBTA_AG_SCB {
      inuse_codec;     /* codec being used for the current SCO connection */
      inuse_codec;     /* codec being used for the current SCO connection */
  bool codec_updated;  /* set to true whenever the app updates codec type */
  bool codec_updated;  /* set to true whenever the app updates codec type */
  bool codec_fallback; /* If sco nego fails for mSBC, fallback to CVSD */
  bool codec_fallback; /* If sco nego fails for mSBC, fallback to CVSD */
  tBTA_AG_SCO_MSBC_SETTINGS
  tBTA_AG_SCO_MSBC_SETTINGS codec_msbc_settings; /* settings to be used for the
      codec_msbc_settings; /* settings to be used for the impending eSCO */
                                                    impending eSCO on WB */
  tBTA_AG_SCO_LC3_SETTINGS codec_lc3_settings;   /* settings to be used for the
                                                    impending eSCO on SWB */


  tBTA_AG_HF_IND
  tBTA_AG_HF_IND
      peer_hf_indicators[BTA_AG_MAX_NUM_PEER_HF_IND]; /* Peer supported
      peer_hf_indicators[BTA_AG_MAX_NUM_PEER_HF_IND]; /* Peer supported
@@ -266,9 +273,11 @@ struct tBTA_AG_SCB {
  std::string ToString() const {
  std::string ToString() const {
    return base::StringPrintf(
    return base::StringPrintf(
        "codec_updated=%d, codec_fallback=%d, "
        "codec_updated=%d, codec_fallback=%d, "
        "sco_codec=%d, peer_codec=%d, msbc_settings=%d, device=%s",
        "sco_codec=%d, peer_codec=%d, msbc_settings=%d, lc3_settings=%d, "
        "device=%s",
        codec_updated, codec_fallback, sco_codec, peer_codecs,
        codec_updated, codec_fallback, sco_codec, peer_codecs,
        codec_msbc_settings, ADDRESS_TO_LOGGABLE_CSTR(peer_addr));
        codec_msbc_settings, codec_lc3_settings,
        ADDRESS_TO_LOGGABLE_CSTR(peer_addr));
  }
  }
};
};


+1 −1
Original line number Original line Diff line number Diff line
@@ -329,7 +329,7 @@ typedef enum : uint8_t {
  BTA_AG_MIC_EVT = 8,         /* Microphone volume changed */
  BTA_AG_MIC_EVT = 8,         /* Microphone volume changed */
  BTA_AG_AT_CKPD_EVT = 9,     /* CKPD from the HS */
  BTA_AG_AT_CKPD_EVT = 9,     /* CKPD from the HS */
  BTA_AG_DISABLE_EVT = 30,    /* AG disabled */
  BTA_AG_DISABLE_EVT = 30,    /* AG disabled */
  BTA_AG_WBS_EVT = 31,        /* SCO codec info */
  BTA_AG_CODEC_EVT = 31,      /* SCO codec info */
  /* Values below are for HFP only */
  /* Values below are for HFP only */
  BTA_AG_AT_A_EVT = 10,    /* Answer a call */
  BTA_AG_AT_A_EVT = 10,    /* Answer a call */
  BTA_AG_AT_D_EVT = 11,    /* Place a call using number or memory dial */
  BTA_AG_AT_D_EVT = 11,    /* Place a call using number or memory dial */
+27 −7
Original line number Original line Diff line number Diff line
@@ -26,10 +26,10 @@
 ******************************************************************************/
 ******************************************************************************/


#define LOG_TAG "bt_btif_hf"
#define LOG_TAG "bt_btif_hf"

#include <base/functional/callback.h>
#include <base/functional/callback.h>
#include <base/logging.h>
#include <base/logging.h>
#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h>
#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h>

#ifdef OS_ANDROID
#ifdef OS_ANDROID
#include <hfp.sysprop.h>
#include <hfp.sysprop.h>
#endif
#endif
@@ -575,19 +575,30 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) {
      bt_hf_callbacks->KeyPressedCallback(&btif_hf_cb[idx].connected_bda);
      bt_hf_callbacks->KeyPressedCallback(&btif_hf_cb[idx].connected_bda);
      break;
      break;


    case BTA_AG_WBS_EVT:
    case BTA_AG_CODEC_EVT:
      BTIF_TRACE_DEBUG(
      BTIF_TRACE_DEBUG(
          "BTA_AG_WBS_EVT Set codec status %d codec %d 1=CVSD 2=MSBC",
          "BTA_AG_CODEC_EVT Set codec status %d codec %d 1=CVSD 2=MSBC 4=LC3",
          p_data->val.hdr.status, p_data->val.num);
          p_data->val.hdr.status, p_data->val.num);
      if (p_data->val.num == BTM_SCO_CODEC_CVSD) {
      if (p_data->val.num == BTM_SCO_CODEC_CVSD) {
        bt_hf_callbacks->WbsCallback(BTHF_WBS_NO,
        bt_hf_callbacks->WbsCallback(BTHF_WBS_NO,
                                     &btif_hf_cb[idx].connected_bda);
                                     &btif_hf_cb[idx].connected_bda);
        bt_hf_callbacks->SwbCallback(BTHF_SWB_NO,
                                     &btif_hf_cb[idx].connected_bda);
      } else if (p_data->val.num == BTM_SCO_CODEC_MSBC) {
      } else if (p_data->val.num == BTM_SCO_CODEC_MSBC) {
        bt_hf_callbacks->WbsCallback(BTHF_WBS_YES,
        bt_hf_callbacks->WbsCallback(BTHF_WBS_YES,
                                     &btif_hf_cb[idx].connected_bda);
                                     &btif_hf_cb[idx].connected_bda);
        bt_hf_callbacks->SwbCallback(BTHF_SWB_NO,
                                     &btif_hf_cb[idx].connected_bda);
      } else if (p_data->val.num == BTM_SCO_CODEC_LC3) {
        bt_hf_callbacks->WbsCallback(BTHF_WBS_NO,
                                     &btif_hf_cb[idx].connected_bda);
        bt_hf_callbacks->SwbCallback(BTHF_SWB_YES,
                                     &btif_hf_cb[idx].connected_bda);
      } else {
      } else {
        bt_hf_callbacks->WbsCallback(BTHF_WBS_NONE,
        bt_hf_callbacks->WbsCallback(BTHF_WBS_NONE,
                                     &btif_hf_cb[idx].connected_bda);
                                     &btif_hf_cb[idx].connected_bda);
        bt_hf_callbacks->SwbCallback(BTHF_SWB_NONE,
                                     &btif_hf_cb[idx].connected_bda);
      }
      }
      break;
      break;


@@ -625,9 +636,14 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) {
      /* If the peer supports mSBC and the BTIF preferred codec is also mSBC,
      /* If the peer supports mSBC and the BTIF preferred codec is also mSBC,
       * then we should set the BTA AG Codec to mSBC. This would trigger a +BCS
       * then we should set the BTA AG Codec to mSBC. This would trigger a +BCS
       * to mSBC at the time of SCO connection establishment */
       * to mSBC at the time of SCO connection establishment */
      if (hfp_hal_interface::get_wbs_supported() &&
      if (hfp_hal_interface::get_swb_supported() &&
          (p_data->val.num & BTM_SCO_CODEC_LC3)) {
        BTIF_TRACE_EVENT("%s: btif_hf override-Preferred Codec to LC3",
                         __func__);
        BTA_AgSetCodec(btif_hf_cb[idx].handle, BTM_SCO_CODEC_LC3);
      } else if (hfp_hal_interface::get_wbs_supported() &&
                 (p_data->val.num & BTM_SCO_CODEC_MSBC)) {
                 (p_data->val.num & BTM_SCO_CODEC_MSBC)) {
        BTIF_TRACE_EVENT("%s: btif_hf override-Preferred Codec to MSBC",
        BTIF_TRACE_EVENT("%s: btif_hf override-Preferred Codec to mSBC",
                         __func__);
                         __func__);
        BTA_AgSetCodec(btif_hf_cb[idx].handle, BTM_SCO_CODEC_MSBC);
        BTA_AgSetCodec(btif_hf_cb[idx].handle, BTM_SCO_CODEC_MSBC);
      } else {
      } else {
@@ -636,13 +652,17 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) {
        BTA_AgSetCodec(btif_hf_cb[idx].handle, BTM_SCO_CODEC_CVSD);
        BTA_AgSetCodec(btif_hf_cb[idx].handle, BTM_SCO_CODEC_CVSD);
      }
      }
      break;
      break;

    case BTA_AG_AT_BCS_EVT:
    case BTA_AG_AT_BCS_EVT:
      BTIF_TRACE_DEBUG("%s: AG final selected codec is 0x%02x 1=CVSD 2=MSBC",
      BTIF_TRACE_DEBUG("%s: AG final selected codec is 0x%02x 1=CVSD 2=MSBC",
                       __func__, p_data->val.num);
                       __func__, p_data->val.num);
      /* No BTHF_WBS_NONE case, because HF1.6 supported device can send BCS */
      /* No BTHF_WBS_NONE case, because HF1.6 supported device can send BCS */
      /* Only CVSD is considered narrow band speech */
      /* Only CVSD is considered narrow band speech */
      bt_hf_callbacks->WbsCallback(
      bt_hf_callbacks->WbsCallback(
          (p_data->val.num == BTM_SCO_CODEC_CVSD) ? BTHF_WBS_NO : BTHF_WBS_YES,
          (p_data->val.num == BTM_SCO_CODEC_MSBC) ? BTHF_WBS_YES : BTHF_WBS_NO,
          &btif_hf_cb[idx].connected_bda);
      bt_hf_callbacks->SwbCallback(
          (p_data->val.num == BTM_SCO_CODEC_LC3) ? BTHF_SWB_YES : BTHF_SWB_NO,
          &btif_hf_cb[idx].connected_bda);
          &btif_hf_cb[idx].connected_bda);
      break;
      break;


+1 −1
Original line number Original line Diff line number Diff line
@@ -179,7 +179,7 @@ const char* dump_hf_event(uint16_t event) {
    CASE_RETURN_STR(BTA_AG_MIC_EVT)
    CASE_RETURN_STR(BTA_AG_MIC_EVT)
    CASE_RETURN_STR(BTA_AG_AT_CKPD_EVT)
    CASE_RETURN_STR(BTA_AG_AT_CKPD_EVT)
    CASE_RETURN_STR(BTA_AG_DISABLE_EVT)
    CASE_RETURN_STR(BTA_AG_DISABLE_EVT)
    CASE_RETURN_STR(BTA_AG_WBS_EVT)
    CASE_RETURN_STR(BTA_AG_CODEC_EVT)
    CASE_RETURN_STR(BTA_AG_AT_A_EVT)
    CASE_RETURN_STR(BTA_AG_AT_A_EVT)
    CASE_RETURN_STR(BTA_AG_AT_D_EVT)
    CASE_RETURN_STR(BTA_AG_AT_D_EVT)
    CASE_RETURN_STR(BTA_AG_AT_CHLD_EVT)
    CASE_RETURN_STR(BTA_AG_AT_CHLD_EVT)
Loading