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

Commit 9217e00d authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes from topic "a2dp_cleanup"

* changes:
  A2DP: Wait for previous AVDTP instance to be clean up before re-enabling
  A2DP: Workaround to clean up previous AVDTP instance while re-enabling
  A2DP: Be more careful in allocating a BtifAvPeer instance
parents 52291da6 51bb3e27
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -110,6 +110,9 @@ void bta_ar_reg_avdt(AvdtpRcb* p_reg, tAVDT_CTRL_CBACK* p_cback,
  if (mask) {
    if (bta_ar_cb.avdt_registered == 0) {
      AVDT_Register(p_reg, bta_ar_avdt_cback);
    } else {
      APPL_TRACE_WARNING("%s: sys_id:%d doesn't register again (registered:%d)",
                         __func__, sys_id, bta_ar_cb.avdt_registered);
    }
    bta_ar_cb.avdt_registered |= mask;
  }
+11 −3
Original line number Diff line number Diff line
@@ -1304,6 +1304,7 @@ void bta_av_conn_chg(tBTA_AV_DATA* p_data) {
 ******************************************************************************/
void bta_av_disable(tBTA_AV_CB* p_cb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
  BT_HDR hdr;
  bool disabling_in_progress = false;
  uint16_t xx;

  p_cb->disabling = true;
@@ -1318,8 +1319,13 @@ void bta_av_disable(tBTA_AV_CB* p_cb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
    if (p_cb->p_scb[xx] != NULL) {
      hdr.layer_specific = xx + 1;
      bta_av_api_deregister((tBTA_AV_DATA*)&hdr);
      disabling_in_progress = true;
    }
  }
  // Since All channels are deregistering by API_DEREGISTER, the DEREG_COMP_EVT
  // would come first before API_DISABLE if there is no connections, and it is
  // no needed to setup this disabling flag.
  p_cb->disabling = disabling_in_progress;

  alarm_free(p_cb->link_signalling_timer);
  p_cb->link_signalling_timer = NULL;
@@ -2249,9 +2255,9 @@ void bta_av_dereg_comp(tBTA_AV_DATA* p_data) {
                     p_scb->hndl);
    mask = BTA_AV_HNDL_TO_MSK(p_scb->hdi);
    p_cb->reg_audio &= ~mask;
    if ((p_cb->conn_audio & mask) && bta_av_cb.audio_open_cnt) {
    if ((p_cb->conn_audio & mask) && p_cb->audio_open_cnt) {
      /* this channel is still marked as open. decrease the count */
      bta_av_cb.audio_open_cnt--;
      p_cb->audio_open_cnt--;
    }
    p_cb->conn_audio &= ~mask;

@@ -2302,7 +2308,9 @@ void bta_av_dereg_comp(tBTA_AV_DATA* p_data) {

    if (p_cb->disabling) {
      p_cb->disabling = false;
      bta_av_cb.features = 0;
      // reset enabling parameters
      p_cb->features = 0;
      p_cb->sec_mask = 0;
    }

    /* Clear the Capturing service class bit */
+5 −0
Original line number Diff line number Diff line
@@ -603,6 +603,7 @@ typedef struct {
  tBTA_SEC sec_mask;            /* security mask */
  tBTA_AV_HNDL handle;          /* the handle for SDP activity */
  bool disabling;               /* true if api disabled called */
  uint8_t enabling_attempts;    // counter to wait for previous disabling
  uint8_t
      disc; /* (hdi+1) or (rc_handle|BTA_AV_CHNL_MSK) if p_disc_db is in use */
  uint8_t state;          /* state machine state */
@@ -617,6 +618,10 @@ typedef struct {
  uint8_t audio_streams; /* handle mask of streaming audio channels */
} tBTA_AV_CB;

// total attempts are half seconds
constexpr uint32_t kEnablingAttemptsIntervalMs = 100;
constexpr uint8_t kEnablingAttemptsCountMaximum = 5;

// A2DP offload VSC parameters
class tBT_A2DP_OFFLOAD {
 public:
+52 −1
Original line number Diff line number Diff line
@@ -203,7 +203,7 @@ const tBTA_AV_NSM_ACT bta_av_nsm_act[] = {
 ****************************************************************************/

/* AV control block */
tBTA_AV_CB bta_av_cb;
tBTA_AV_CB bta_av_cb = {};

static const char* bta_av_st_code(uint8_t state);

@@ -218,6 +218,39 @@ static const char* bta_av_st_code(uint8_t state);
 *
 ******************************************************************************/
static void bta_av_api_enable(tBTA_AV_DATA* p_data) {
  if (bta_av_cb.disabling) {
    APPL_TRACE_WARNING(
        "%s: previous (reg_audio=%#x) is still disabling (attempts=%d)",
        __func__, bta_av_cb.reg_audio, bta_av_cb.enabling_attempts);
    if (++bta_av_cb.enabling_attempts <= kEnablingAttemptsCountMaximum) {
      tBTA_AV_API_ENABLE* p_buf =
          (tBTA_AV_API_ENABLE*)osi_malloc(sizeof(tBTA_AV_API_ENABLE));
      memcpy(p_buf, &p_data->api_enable, sizeof(tBTA_AV_API_ENABLE));
      bta_sys_sendmsg_delayed(p_buf, base::TimeDelta::FromMilliseconds(
                                         kEnablingAttemptsIntervalMs));
      return;
    }
    if (bta_av_cb.sdp_a2dp_handle) {
      SDP_DeleteRecord(bta_av_cb.sdp_a2dp_handle);
      bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SOURCE);
    }
#if (BTA_AV_SINK_INCLUDED == TRUE)
    if (bta_av_cb.sdp_a2dp_snk_handle) {
      SDP_DeleteRecord(bta_av_cb.sdp_a2dp_snk_handle);
      bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SINK);
    }
#endif
#if (BTA_AR_INCLUDED == TRUE)
    // deregister from AVDT
    bta_ar_dereg_avdt(BTA_ID_AV);

    // deregister from AVCT
    bta_ar_dereg_avrc(UUID_SERVCLASS_AV_REMOTE_CONTROL, BTA_ID_AV);
    bta_ar_dereg_avrc(UUID_SERVCLASS_AV_REM_CTRL_TARGET, BTA_ID_AV);
    bta_ar_dereg_avct(BTA_ID_AV);
#endif
  }

  /* initialize control block */
  memset(&bta_av_cb, 0, sizeof(tBTA_AV_CB));

@@ -471,6 +504,21 @@ static void bta_av_api_register(tBTA_AV_DATA* p_data) {
  char* p_service_name;
  tBTA_UTL_COD cod;

  if (bta_av_cb.disabling ||
      (bta_av_cb.features == 0 && bta_av_cb.sec_mask == 0)) {
    APPL_TRACE_WARNING(
        "%s: AV instance (features=%#x, sec_mask=%#x, reg_audio=%#x) is not "
        "ready for app_id %d",
        __func__, bta_av_cb.features, bta_av_cb.sec_mask, bta_av_cb.reg_audio,
        p_data->api_reg.app_id);
    tBTA_AV_API_REG* p_buf =
        (tBTA_AV_API_REG*)osi_malloc(sizeof(tBTA_AV_API_REG));
    memcpy(p_buf, &p_data->api_reg, sizeof(tBTA_AV_API_REG));
    bta_sys_sendmsg_delayed(
        p_buf, base::TimeDelta::FromMilliseconds(kEnablingAttemptsIntervalMs));
    return;
  }

  avdtp_stream_config.Reset();

  registr.status = BTA_AV_FAIL_RESOURCES;
@@ -640,6 +688,9 @@ static void bta_av_api_register(tBTA_AV_DATA* p_data) {
      }
      if (AVDT_CreateStream(p_scb->app_id, &p_scb->seps[codec_index].av_handle,
                            avdtp_stream_config) != AVDT_SUCCESS) {
        APPL_TRACE_WARNING(
            "%s: bta_handle=0x%x (app_id %d) failed to alloc an SEP index:%d",
            __func__, p_scb->hndl, p_scb->app_id, codec_index);
        continue;
      }
      /* Save a copy of the codec */
+1 −0
Original line number Diff line number Diff line
@@ -222,6 +222,7 @@ extern void bta_sys_deregister(uint8_t id);
extern bool bta_sys_is_register(uint8_t id);
extern uint16_t bta_sys_get_sys_features(void);
extern void bta_sys_sendmsg(void* p_msg);
extern void bta_sys_sendmsg_delayed(void* p_msg, const base::TimeDelta& delay);
extern void bta_sys_start_timer(alarm_t* alarm, uint64_t interval_ms,
                                uint16_t event, uint16_t layer_specific);
extern void bta_sys_disable(tBTA_SYS_HW_MODULE module);
Loading