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

Commit d18dfa5a authored by William Escande's avatar William Escande Committed by Gerrit Code Review
Browse files

Merge "AptX Voice: Use flag wrapper" into main

parents 562e1cc7 5a625c1e
Loading
Loading
Loading
Loading
+6 −11
Original line number Diff line number Diff line
@@ -22,12 +22,9 @@
 *
 ******************************************************************************/

#include <android_bluetooth_flags.h>
#include <base/logging.h>

#ifdef __ANDROID__
#include <com_android_bluetooth_flags.h>
#endif

#include <cstdint>
#include <cstring>

@@ -848,13 +845,11 @@ void bta_ag_svc_conn_open(tBTA_AG_SCB* p_scb,
void bta_ag_setcodec(tBTA_AG_SCB* p_scb, const tBTA_AG_DATA& data) {
  tBTA_AG_PEER_CODEC codec_type = data.api_setcodec.codec;
  tBTA_AG_VAL val = {};
  bool aptx_voice = false;
#ifdef __ANDROID__
  if (com::android::bluetooth::flags::hfp_codec_aptx_voice()) {
    aptx_voice = codec_type == BTA_AG_SCO_APTX_SWB_SETTINGS_Q0;
    LOG_INFO("aptx_voice=%d", aptx_voice);
  }
#endif
  const bool aptx_voice = IS_FLAG_ENABLED(hfp_codec_aptx_voice) &&
                          (codec_type == BTA_AG_SCO_APTX_SWB_SETTINGS_Q0);
  LOG_VERBOSE("aptx_voice=%s, codec_type=%#x", logbool(aptx_voice).c_str(),
              codec_type);

  val.hdr.handle = bta_ag_scb_to_idx(p_scb);

  /* Check if the requested codec type is valid */
+21 −28
Original line number Diff line number Diff line
@@ -18,12 +18,9 @@

#define LOG_TAG "bta_ag_cmd"

#include <android_bluetooth_flags.h>
#include <base/logging.h>

#ifdef __ANDROID__
#include <com_android_bluetooth_flags.h>
#endif

#include <cstdint>
#include <cstring>

@@ -1259,14 +1256,10 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type,

        bool wbs_supported = hfp_hal_interface::get_wbs_supported();
        bool swb_supported = hfp_hal_interface::get_swb_supported();
        bool aptx_voice = false;

#ifdef __ANDROID__
        if (com::android::bluetooth::flags::hfp_codec_aptx_voice()) {
          aptx_voice = p_scb->is_aptx_swb_codec;
          LOG_VERBOSE("BTA_AG_AT_BAC_EVT aptx_voice=%d", aptx_voice);
        }
#endif
        const bool aptx_voice =
            IS_FLAG_ENABLED(hfp_codec_aptx_voice) && p_scb->is_aptx_swb_codec;
        LOG_VERBOSE("BTA_AG_AT_BAC_EVT aptx_voice=%s",
                    logbool(aptx_voice).c_str());

        if (swb_supported && (p_scb->peer_codecs & BTM_SCO_CODEC_LC3) &&
            !(p_scb->disabled_codecs & BTM_SCO_CODEC_LC3)) {
@@ -1351,28 +1344,28 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type,
      bta_ag_sco_open(p_scb, tBTA_AG_DATA::kEmpty);
      break;
    }
#ifdef __ANDROID__
    case BTA_AG_AT_QAC_EVT:
      if (com::android::bluetooth::flags::hfp_codec_aptx_voice()) {
      if (!IS_FLAG_ENABLED(hfp_codec_aptx_voice)) {
        bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
        break;
      }
      p_scb->peer_codecs |= bta_ag_parse_qac(p_arg);
      // AT+%QAC needs to be responded with +%QAC
      bta_ag_swb_handle_vs_at_events(p_scb, cmd, int_arg, &val);
      // followed by OK
      bta_ag_send_ok(p_scb);
      break;
      }
      FALLTHROUGH_INTENDED;
    case BTA_AG_AT_QCS_EVT:
      if (com::android::bluetooth::flags::hfp_codec_aptx_voice()) {
      if (!IS_FLAG_ENABLED(hfp_codec_aptx_voice)) {
        bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
        break;
      }
      // AT+%QCS is a response to +%QCS sent from AG.
      // Send OK to BT headset
      bta_ag_send_ok(p_scb);
      // Handle AT+%QCS
      bta_ag_swb_handle_vs_at_events(p_scb, cmd, int_arg, &val);
      break;
      }
      FALLTHROUGH_INTENDED;
#endif
    default:
      bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
      break;
+32 −51
Original line number Diff line number Diff line
@@ -22,13 +22,10 @@
 *
 ******************************************************************************/

#include <android_bluetooth_flags.h>
#include <base/functional/bind.h>
#include <base/logging.h>

#ifdef __ANDROID__
#include <com_android_bluetooth_flags.h>
#endif

#include <cstdint>

#include "bt_target.h"  // Must be first to define build configuration
@@ -200,16 +197,14 @@ static void bta_ag_sco_disc_cback(uint16_t sco_idx) {
  }

  if (handle != 0) {
    bool aptx_voice = false;
#ifdef __ANDROID__
    if (com::android::bluetooth::flags::hfp_codec_aptx_voice() &&
        bta_ag_cb.sco.p_curr_scb->is_aptx_swb_codec == true) {
      aptx_voice = bta_ag_cb.sco.p_curr_scb->inuse_codec ==
                   BTA_AG_SCO_APTX_SWB_SETTINGS_Q0;
      LOG_VERBOSE("aptx_voice=%d, inuse_codec=%d", aptx_voice,
    const bool aptx_voice =
        IS_FLAG_ENABLED(hfp_codec_aptx_voice) &&
        (bta_ag_cb.sco.p_curr_scb->is_aptx_swb_codec == true) &&
        (bta_ag_cb.sco.p_curr_scb->inuse_codec ==
         BTA_AG_SCO_APTX_SWB_SETTINGS_Q0);
    LOG_VERBOSE("aptx_voice=%s, inuse_codec=%#x", logbool(aptx_voice).c_str(),
                bta_ag_cb.sco.p_curr_scb->inuse_codec);
    }
#endif

    /* Restore settings */
    if (bta_ag_cb.sco.p_curr_scb->inuse_codec == UUID_CODEC_MSBC ||
        bta_ag_cb.sco.p_curr_scb->inuse_codec == UUID_CODEC_LC3 || aptx_voice) {
@@ -425,14 +420,12 @@ void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
  }
#endif

#ifdef __ANDROID__
  if (com::android::bluetooth::flags::hfp_codec_aptx_voice()) {
  if (IS_FLAG_ENABLED(hfp_codec_aptx_voice)) {
    if ((p_scb->sco_codec == BTA_AG_SCO_APTX_SWB_SETTINGS_Q0) &&
        !p_scb->codec_fallback) {
      esco_codec = BTA_AG_SCO_APTX_SWB_SETTINGS_Q0;
    }
  }
#endif

  if ((p_scb->sco_codec == BTM_SCO_CODEC_LC3) && !p_scb->codec_fallback &&
      hfp_hal_interface::get_swb_supported()) {
@@ -471,8 +464,7 @@ void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
    } else {
      params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T1, offload);
    }
#ifdef __ANDROID__
  } else if (com::android::bluetooth::flags::hfp_codec_aptx_voice() &&
  } else if (IS_FLAG_ENABLED(hfp_codec_aptx_voice) &&
             (p_scb->is_aptx_swb_codec == true && !p_scb->codec_updated)) {
    if (p_scb->codec_aptx_settings == BTA_AG_SCO_APTX_SWB_SETTINGS_Q3) {
      params = esco_parameters_for_codec(ESCO_CODEC_SWB_Q3, true);
@@ -483,7 +475,6 @@ void bta_ag_create_sco(tBTA_AG_SCB* p_scb, bool is_orig) {
    } else if (p_scb->codec_aptx_settings == BTA_AG_SCO_APTX_SWB_SETTINGS_Q0) {
      params = esco_parameters_for_codec(ESCO_CODEC_SWB_Q0, true);
    }
#endif
  } else {
    if ((p_scb->features & BTA_AG_FEAT_ESCO_S4) &&
        (p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO_S4)) {
@@ -557,8 +548,7 @@ void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {
      } else {
        params = esco_parameters_for_codec(ESCO_CODEC_LC3_T1, offload);
      }
#ifdef __ANDROID__
    } else if (com::android::bluetooth::flags::hfp_codec_aptx_voice() &&
    } else if (IS_FLAG_ENABLED(hfp_codec_aptx_voice) &&
               (p_scb->is_aptx_swb_codec == true && !p_scb->codec_updated)) {
      if (p_scb->codec_aptx_settings == BTA_AG_SCO_APTX_SWB_SETTINGS_Q3) {
        params = esco_parameters_for_codec(ESCO_CODEC_SWB_Q3, true);
@@ -572,7 +562,6 @@ void bta_ag_create_pending_sco(tBTA_AG_SCB* p_scb, bool is_local) {
                 BTA_AG_SCO_APTX_SWB_SETTINGS_Q0) {
        params = esco_parameters_for_codec(ESCO_CODEC_SWB_Q0, true);
      }
#endif
    } else if (esco_codec == UUID_CODEC_MSBC) {
      if (p_scb->codec_msbc_settings == BTA_AG_SCO_MSBC_SETTINGS_T2) {
        params = esco_parameters_for_codec(ESCO_CODEC_MSBC_T2, offload);
@@ -694,20 +683,19 @@ void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb) {
    LOG_INFO("Assume CVSD by default due to mask mismatch");
    p_scb->sco_codec = UUID_CODEC_CVSD;
  }
  bool aptx_voice = false;
#ifdef __ANDROID__
  if (com::android::bluetooth::flags::hfp_codec_aptx_voice()) {
    aptx_voice = p_scb->is_aptx_swb_codec;
    LOG_VERBOSE("aptx_voice=%d, is_aptx_swb_codec=%d", aptx_voice,
                p_scb->is_aptx_swb_codec);
  }
#endif
  const bool aptx_voice =
      IS_FLAG_ENABLED(hfp_codec_aptx_voice) && p_scb->is_aptx_swb_codec &&
      (p_scb->peer_codecs & BTA_AG_SCO_APTX_SWB_SETTINGS_Q0_MASK);
  LOG_VERBOSE("aptx_voice=%s, is_aptx_swb_codec=%s, Q0 codec supported=%s",
              logbool(aptx_voice).c_str(),
              logbool(p_scb->is_aptx_swb_codec).c_str(),
              logbool(p_scb->peer_codecs & BTA_AG_SCO_APTX_SWB_SETTINGS_Q0_MASK)
                  .c_str());

  if (((p_scb->codec_updated || p_scb->codec_fallback) &&
       (p_scb->features & BTA_AG_FEAT_CODEC) &&
       (p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC)) ||
      (aptx_voice &&
       (p_scb->peer_codecs & BTA_AG_SCO_APTX_SWB_SETTINGS_Q0_MASK))) {
      (aptx_voice)) {
    LOG_INFO("Starting codec negotiation");
    /* Change the power mode to Active until SCO open is completed. */
    bta_sys_busy(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
@@ -717,21 +705,17 @@ void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb) {
        p_scb->sco_codec = BTA_AG_SCO_APTX_SWB_SETTINGS_Q0;
        p_scb->is_aptx_swb_codec = true;
      }
      LOG_VERBOSE("Sending +QCS, sco_codec=%d, is_aptx_swb_codec=%d",
                  p_scb->sco_codec, p_scb->is_aptx_swb_codec);
      LOG_VERBOSE("Sending +QCS, sco_codec=%d, is_aptx_swb_codec=%s",
                  p_scb->sco_codec, logbool(p_scb->is_aptx_swb_codec).c_str());
      /* Send +QCS to the peer */
      bta_ag_send_qcs(p_scb, NULL);
    } else {
#ifdef __ANDROID__
      if (com::android::bluetooth::flags::hfp_codec_aptx_voice() &&
          ((p_scb->is_aptx_swb_codec == true) &&
           (p_scb->peer_codecs & BTA_AG_SCO_APTX_SWB_SETTINGS_Q0_MASK))) {
      if (aptx_voice) {
        p_scb->sco_codec = BTM_SCO_CODEC_MSBC;
        p_scb->is_aptx_swb_codec = false;
      }
#endif
      LOG_VERBOSE("Sending +BCS, sco_codec=%d, is_aptx_swb_codec=%d",
                  p_scb->sco_codec, p_scb->is_aptx_swb_codec);
      LOG_VERBOSE("Sending +BCS, sco_codec=%d, is_aptx_swb_codec=%s",
                  p_scb->sco_codec, logbool(p_scb->is_aptx_swb_codec).c_str());
      /* Send +BCS to the peer */
      bta_ag_send_bcs(p_scb);
    }
@@ -1462,18 +1446,15 @@ void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb,
 ******************************************************************************/
void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb,
                           UNUSED_ATTR const tBTA_AG_DATA& data) {
  bool aptx_voice = false;
  /* clear current scb */
  bta_ag_cb.sco.p_curr_scb = nullptr;
  p_scb->sco_idx = BTM_INVALID_SCO_INDEX;
#ifdef __ANDROID__
  if (com::android::bluetooth::flags::hfp_codec_aptx_voice()) {
    aptx_voice = p_scb->codec_fallback &&
                 p_scb->sco_codec == BTA_AG_SCO_APTX_SWB_SETTINGS_Q0;
    LOG_VERBOSE("aptx_voice=%d, codec_fallback=%d, sco_codec=%d", aptx_voice,
                p_scb->codec_fallback, p_scb->sco_codec);
  }
#endif
  const bool aptx_voice = IS_FLAG_ENABLED(hfp_codec_aptx_voice) &&
                          p_scb->codec_fallback &&
                          (p_scb->sco_codec == BTA_AG_SCO_APTX_SWB_SETTINGS_Q0);
  LOG_VERBOSE("aptx_voice=%s, codec_fallback=%#x, sco_codec=%#x",
              logbool(aptx_voice).c_str(), p_scb->codec_fallback,
              p_scb->sco_codec);

  /* codec_fallback is set when AG is initiator and connection failed for mSBC.
   * OR if codec is msbc and T2 settings failed, then retry Safe T1 settings
+22 −26
Original line number Diff line number Diff line
@@ -27,14 +27,10 @@

#define LOG_TAG "bt_btif_hf"

#include <android_bluetooth_flags.h>
#include <android_bluetooth_sysprop.h>
#include <base/functional/callback.h>
#include <base/logging.h>

#ifdef __ANDROID__
#include <com_android_bluetooth_flags.h>
#endif

#include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h>

#include <cstdint>
@@ -594,12 +590,16 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) {
      } else {
        bt_hf_callbacks->WbsCallback(BTHF_WBS_NONE,
                                     &btif_hf_cb[idx].connected_bda);
#ifdef __ANDROID__
        if (com::android::bluetooth::flags::hfp_codec_aptx_voice()) {

        bthf_swb_codec_t codec = BTHF_SWB_CODEC_LC3;
        bthf_swb_config_t config = BTHF_SWB_NONE;

        if (IS_FLAG_ENABLED(hfp_codec_aptx_voice)) {
          codec = BTHF_SWB_CODEC_VENDOR_APTX;

          LOG_VERBOSE(
              "AG final selected SWB codec is 0x%02x 0=Q0 4=Q1 6=Q2 7=Q3",
              p_data->val.num);
          bthf_swb_config_t config;
          if (p_data->val.num == BTA_AG_SCO_APTX_SWB_SETTINGS_Q0 ||
              p_data->val.num == BTA_AG_SCO_APTX_SWB_SETTINGS_Q1 ||
              p_data->val.num == BTA_AG_SCO_APTX_SWB_SETTINGS_Q2 ||
@@ -608,14 +608,9 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) {
          } else {
            config = BTHF_SWB_NO;
          }
          bt_hf_callbacks->SwbCallback(BTHF_SWB_CODEC_VENDOR_APTX, config,
                                       &btif_hf_cb[idx].connected_bda);
        } else
#endif  // call SwbCallback with LC3 on non android target
        {
          bt_hf_callbacks->SwbCallback(BTHF_SWB_CODEC_LC3, BTHF_SWB_NONE,
                                       &btif_hf_cb[idx].connected_bda);
        }
        bt_hf_callbacks->SwbCallback(codec, config,
                                     &btif_hf_cb[idx].connected_bda);
      }
      break;

@@ -707,10 +702,14 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) {
      }
      break;

#ifdef __ANDROID__
    case BTA_AG_AT_QCS_EVT:
      if (com::android::bluetooth::flags::hfp_codec_aptx_voice()) {
        LOG_INFO("AG final selected SWB codec is 0x%02x 0=Q0 4=Q1 6=Q2 7=Q3",
      if (!IS_FLAG_ENABLED(hfp_codec_aptx_voice)) {
        LOG(WARNING) << __func__ << ": unhandled event " << event
                     << ". Aptx codec is not enabled";
        break;
      }

      LOG_INFO("AG final selected SWB codec is %#02x 0=Q0 4=Q1 6=Q2 7=Q3",
               p_data->val.num);
      bt_hf_callbacks->SwbCallback(
          BTHF_SWB_CODEC_VENDOR_APTX,
@@ -718,9 +717,6 @@ static void btif_hf_upstreams_evt(uint16_t event, char* p_param) {
                                                             : BTHF_SWB_NO,
          &btif_hf_cb[idx].connected_bda);
      break;
      }
      FALLTHROUGH_INTENDED;
#endif

    default:
      LOG(WARNING) << __func__ << ": unhandled event " << event;