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

Commit ae2a7b51 authored by Sanket Agarwal's avatar Sanket Agarwal Committed by android-build-merger
Browse files

HF Client: SCO routing with multiple devices am: 969eb187 am: b11fd830

am: b9527e06

Change-Id: I44e8c2996a4334462b8c0703cb929c6242986a69
parents 750604b9 b9527e06
Loading
Loading
Loading
Loading
+22 −9
Original line number Diff line number Diff line
@@ -176,6 +176,7 @@ static void bta_hf_client_stop_at_resp_timer(tBTA_HF_CLIENT_CB* client_cb) {
static void bta_hf_client_send_at(tBTA_HF_CLIENT_CB* client_cb,
                                  tBTA_HF_CLIENT_AT_CMD cmd, const char* buf,
                                  uint16_t buf_len) {
  APPL_TRACE_DEBUG("%s", __func__);
  if ((client_cb->at_cb.current_cmd == BTA_HF_CLIENT_AT_NONE ||
       client_cb->svc_conn == false) &&
      !alarm_is_scheduled(client_cb->at_cb.hold_timer)) {
@@ -442,8 +443,13 @@ static void bta_hf_client_handle_ciev(tBTA_HF_CLIENT_CB* client_cb,

static void bta_hf_client_handle_bcs(tBTA_HF_CLIENT_CB* client_cb,
                                     uint32_t codec) {
  APPL_TRACE_DEBUG("%s: %u", __func__, codec);
  APPL_TRACE_DEBUG("%s: codec: %u sco listen state: %d", __func__, codec,
                   client_cb->sco_state);

  // Only send acceptance for the codec request if we are ready to accept the
  // SCO connection. sco_state is set to listen when the upper layer calls for
  // audio connection.
  if (client_cb->sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST) {
    if (codec == BTM_SCO_CODEC_CVSD || codec == BTM_SCO_CODEC_MSBC) {
      client_cb->negotiated_codec = codec;
      bta_hf_client_send_at_bcs(client_cb, codec);
@@ -452,6 +458,7 @@ static void bta_hf_client_handle_bcs(tBTA_HF_CLIENT_CB* client_cb,
      bta_hf_client_send_at_bac(client_cb);
    }
  }
}

static void bta_hf_client_handle_bsir(tBTA_HF_CLIENT_CB* client_cb,
                                      uint32_t provided) {
@@ -1932,6 +1939,11 @@ void bta_hf_client_send_at_bcc(tBTA_HF_CLIENT_CB* client_cb) {
  buf = "AT+BCC\r";

  bta_hf_client_send_at(client_cb, BTA_HF_CLIENT_AT_BCC, buf, strlen(buf));

  // At this point we should also open up an incoming SCO connection
  tBTA_HF_CLIENT_DATA p_data;
  p_data.hdr.layer_specific = client_cb->handle;
  bta_hf_client_sco_listen(&p_data);
}

void bta_hf_client_send_at_cnum(tBTA_HF_CLIENT_CB* client_cb) {
@@ -2042,6 +2054,7 @@ void bta_hf_client_send_at_cmd(tBTA_HF_CLIENT_DATA* p_data) {
  tBTA_HF_CLIENT_DATA_VAL* p_val = (tBTA_HF_CLIENT_DATA_VAL*)p_data;
  char buf[BTA_HF_CLIENT_AT_MAX_LEN];

  APPL_TRACE_DEBUG("%s: at cmd: %d", __func__, p_val->uint8_val);
  switch (p_val->uint8_val) {
    case BTA_HF_CLIENT_AT_CMD_VTS:
      bta_hf_client_send_at_vts(client_cb, (char)p_val->uint32_val1);
@@ -2064,7 +2077,7 @@ void bta_hf_client_send_at_cmd(tBTA_HF_CLIENT_DATA* p_data) {
      bta_hf_client_send_at_cnum(client_cb);
      break;
    case BTA_HF_CLIENT_AT_CMD_ATA:
      // bta_hf_client_send_at_ata(client_cb);
      bta_hf_client_send_at_ata(client_cb);
      break;
    case BTA_HF_CLIENT_AT_CMD_COPS:
      bta_hf_client_send_at_cops(client_cb, true);
+3 −3
Original line number Diff line number Diff line
@@ -82,7 +82,7 @@ const tBTA_HF_CLIENT_ACTION bta_hf_client_action[] = {
    /* BTA_HF_CLIENT_START_CLOSE */ bta_hf_client_start_close,
    /* BTA_HF_CLIENT_START_OPEN */ bta_hf_client_start_open,
    /* BTA_HF_CLIENT_RFC_ACP_OPEN */ bta_hf_client_rfc_acp_open,
    /* BTA_HF_CLIENT_SCO_LISTEN */ bta_hf_client_sco_listen,
    /* BTA_HF_CLIENT_SCO_LISTEN */ NULL,
    /* BTA_HF_CLIENT_SCO_CONN_OPEN */ bta_hf_client_sco_conn_open,
    /* BTA_HF_CLIENT_SCO_CONN_CLOSE*/ bta_hf_client_sco_conn_close,
    /* BTA_HF_CLIENT_SCO_OPEN */ bta_hf_client_sco_open,
@@ -118,7 +118,7 @@ const uint8_t bta_hf_client_st_init[][BTA_HF_CLIENT_NUM_COLS] = {
                              BTA_HF_CLIENT_INIT_ST},
    /* API_AUDIO_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE,
                               BTA_HF_CLIENT_INIT_ST},
    /* RFC_OPEN_EVT */ {BTA_HF_CLIENT_RFC_ACP_OPEN, BTA_HF_CLIENT_SCO_LISTEN,
    /* RFC_OPEN_EVT */ {BTA_HF_CLIENT_RFC_ACP_OPEN, BTA_HF_CLIENT_IGNORE,
                        BTA_HF_CLIENT_OPEN_ST},
    /* RFC_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE,
                         BTA_HF_CLIENT_INIT_ST},
@@ -154,7 +154,7 @@ const uint8_t bta_hf_client_st_opening[][BTA_HF_CLIENT_NUM_COLS] = {
                              BTA_HF_CLIENT_OPENING_ST},
    /* API_AUDIO_CLOSE_EVT */ {BTA_HF_CLIENT_IGNORE, BTA_HF_CLIENT_IGNORE,
                               BTA_HF_CLIENT_OPENING_ST},
    /* RFC_OPEN_EVT */ {BTA_HF_CLIENT_RFC_OPEN, BTA_HF_CLIENT_SCO_LISTEN,
    /* RFC_OPEN_EVT */ {BTA_HF_CLIENT_RFC_OPEN, BTA_HF_CLIENT_IGNORE,
                        BTA_HF_CLIENT_OPEN_ST},
    /* RFC_CLOSE_EVT */ {BTA_HF_CLIENT_RFC_FAIL, BTA_HF_CLIENT_IGNORE,
                         BTA_HF_CLIENT_INIT_ST},
+21 −33
Original line number Diff line number Diff line
@@ -79,18 +79,15 @@ enum {
 * Function         bta_hf_client_remove_sco
 *
 * Description      Removes the specified SCO from the system.
 *                  If only_active is true, then SCO is only removed if
 *                  connected.
 *
 * Returns          bool   - true if SCO removal was started
 *
 ******************************************************************************/
static bool bta_hf_client_sco_remove(tBTA_HF_CLIENT_CB* client_cb,
                                     bool only_active) {
static bool bta_hf_client_sco_remove(tBTA_HF_CLIENT_CB* client_cb) {
  bool removed_started = false;
  tBTM_STATUS status;

  APPL_TRACE_DEBUG("%s: %d", __func__, only_active);
  APPL_TRACE_DEBUG("%s", __func__);

  if (client_cb->sco_idx != BTM_INVALID_SCO_INDEX) {
    status = BTM_RemoveSco(client_cb->sco_idx);
@@ -327,8 +324,8 @@ static void bta_hf_client_sco_create(tBTA_HF_CLIENT_CB* client_cb,
 ******************************************************************************/
static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb,
                                    uint8_t event) {
  APPL_TRACE_DEBUG("%s: state: %d event: %d", __func__, client_cb->sco_state,
                   event);
  APPL_TRACE_DEBUG("%s: before state: %d event: %d", __func__,
                   client_cb->sco_state, event);

  switch (client_cb->sco_state) {
    case BTA_HF_CLIENT_SCO_SHUTDOWN_ST:
@@ -349,13 +346,12 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb,
    case BTA_HF_CLIENT_SCO_LISTEN_ST:
      switch (event) {
        case BTA_HF_CLIENT_SCO_LISTEN_E:
          /* create sco listen connection (Additional channel) */
          bta_hf_client_sco_create(client_cb, false);
          /* Ignore */
          break;

        case BTA_HF_CLIENT_SCO_OPEN_E:
          /* remove listening connection */
          bta_hf_client_sco_remove(client_cb, false);
          bta_hf_client_sco_remove(client_cb);

          /* create sco connection to peer */
          bta_hf_client_sco_create(client_cb, true);
@@ -363,20 +359,13 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb,
          break;

        case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
        case BTA_HF_CLIENT_SCO_CLOSE_E:
          /* remove listening connection */
          bta_hf_client_sco_remove(client_cb, false);
          bta_hf_client_sco_remove(client_cb);

          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
          break;

        case BTA_HF_CLIENT_SCO_CLOSE_E:
          /* remove listening connection */
          /* Ignore the event. We need to keep listening SCO for the active SLC
           */
          APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_LISTEN_ST: Ignoring event %d",
                             event);
          break;

        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
          /* sco failed; create sco listen connection */
          bta_hf_client_sco_create(client_cb, false);
@@ -384,7 +373,8 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb,
          break;

        default:
          APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_LISTEN_ST: Ignoring event %d",
          APPL_TRACE_WARNING(
              "%s: BTA_HF_CLIENT_SCO_LISTEN_ST: Ignoring event %d", __func__,
              event);
          break;
      }
@@ -429,7 +419,7 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb,

        case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
          /* close sco connection */
          bta_hf_client_sco_remove(client_cb, true);
          bta_hf_client_sco_remove(client_cb);

          client_cb->sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
          break;
@@ -450,23 +440,21 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb,
    case BTA_HF_CLIENT_SCO_OPEN_ST:
      switch (event) {
        case BTA_HF_CLIENT_SCO_CLOSE_E:
          /* close sco connection if active */
          if (bta_hf_client_sco_remove(client_cb, true)) {
          if (bta_hf_client_sco_remove(client_cb)) {
            client_cb->sco_state = BTA_HF_CLIENT_SCO_CLOSING_ST;
          }
          break;

        case BTA_HF_CLIENT_SCO_SHUTDOWN_E:
          /* remove all listening connections */
          bta_hf_client_sco_remove(client_cb, false);
          /* remove listening connection */
          bta_hf_client_sco_remove(client_cb);

          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTTING_ST;
          break;

        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
          /* peer closed sco; create sco listen connection */
          bta_hf_client_sco_create(client_cb, false);
          client_cb->sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
          /* peer closed sco */
          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
          break;

        default:
@@ -488,9 +476,7 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb,

        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
          /* peer closed sco; create sco listen connection */
          bta_hf_client_sco_create(client_cb, false);

          client_cb->sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST;
          client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST;
          break;

        default:
@@ -527,7 +513,7 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb,
      switch (event) {
        case BTA_HF_CLIENT_SCO_CONN_OPEN_E:
          /* close sco connection; wait for conn close event */
          bta_hf_client_sco_remove(client_cb, true);
          bta_hf_client_sco_remove(client_cb);
          break;

        case BTA_HF_CLIENT_SCO_CONN_CLOSE_E:
@@ -548,6 +534,8 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb,
    default:
      break;
  }

  APPL_TRACE_DEBUG("%s: after state: %d", __func__, client_cb->sco_state);
}

/*******************************************************************************
+7 −6
Original line number Diff line number Diff line
@@ -473,13 +473,13 @@ static void btif_a2dp_sink_decoder_update_event(
  btif_a2dp_sink_cb.channel_count = channel_count;

  btif_a2dp_sink_cb.rx_flush = false;
  APPL_TRACE_DEBUG("Reset to Sink role");
  APPL_TRACE_DEBUG("%s: Reset to Sink role", __func__);
  status = OI_CODEC_SBC_DecoderReset(
      &btif_a2dp_sink_context, btif_a2dp_sink_context_data,
      sizeof(btif_a2dp_sink_context_data), 2, 2, false);
  if (!OI_SUCCESS(status)) {
    APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d",
                     status);
    APPL_TRACE_ERROR("%s: OI_CODEC_SBC_DecoderReset failed with error code %d",
                     __func__, status);
  }

  APPL_TRACE_DEBUG("%s: A2dpSink: SBC create track", __func__);
@@ -490,16 +490,17 @@ static void btif_a2dp_sink_decoder_update_event(
      NULL;
#endif
  if (btif_a2dp_sink_cb.audio_track == NULL) {
    APPL_TRACE_ERROR("%s: A2dpSink: Track creation failed!!!", __func__);
    APPL_TRACE_ERROR("%s: A2dpSink: Track creation failed", __func__);
    return;
  }

  btif_a2dp_sink_cb.frames_to_process = A2DP_GetSinkFramesCountToProcess(
      BTIF_SINK_MEDIA_TIME_TICK_MS, p_buf->codec_info);
  APPL_TRACE_DEBUG("Frames to be processed in 20 ms %d",
  APPL_TRACE_DEBUG("%s: Frames to be processed in 20 ms %d", __func__,
                   btif_a2dp_sink_cb.frames_to_process);
  if (btif_a2dp_sink_cb.frames_to_process == 0) {
    APPL_TRACE_ERROR("Cannot compute the number of frames to process");
    APPL_TRACE_ERROR("%s: Cannot compute the number of frames to process",
                     __func__);
  }
}