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

Commit d2a3a166 authored by Ajay Panicker's avatar Ajay Panicker Committed by Andre Eisenbach
Browse files

Don't reject notifications and wait until new addressed player is ready (2/2)

There are some carkits like the ones found in the 2016 Honda CRZ and some
Audi's that do not follow the spec and do not honor reject pending notification
messages after switching players. This causes an issue whenever you switch
players, the metadata freezes due to the fact that the carkit never re-registers
for new track changed notifications. This patch removes the reject notification
and reorders the current notifications.

Bug: 64142363
Test: Test with Audi S7 and 2016 Honda CRZ and see that switching players works
      TestTracker: 105391/3975
Change-Id: Iaec70863594e13217916ab740d529f526d27c2d1
Merged-In: Iaec70863594e13217916ab740d529f526d27c2d1
(cherry picked from commit d8abe6d0)
parent 117ef039
Loading
Loading
Loading
Loading
+0 −42
Original line number Diff line number Diff line
@@ -1887,32 +1887,6 @@ static bt_status_t get_element_attr_rsp(bt_bdaddr_t* bd_addr, uint8_t num_attr,
  return BT_STATUS_SUCCESS;
}

/***************************************************************************
 *
 * Function         reject_pending_notification
 *
 * Description      Utility function to reject a pending notification. When
 *                  AddressedPlayer change is received, all pending
 *                  notifications should be completed.
 *
 * Returns          void
 *
 **************************************************************************/
static void reject_pending_notification(btrc_event_id_t event_id, int idx) {
  tAVRC_RESPONSE avrc_rsp;
  memset(&(avrc_rsp.reg_notif), 0, sizeof(tAVRC_REG_NOTIF_RSP));

  avrc_rsp.reg_notif.event_id = event_id;
  avrc_rsp.reg_notif.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
  avrc_rsp.reg_notif.opcode = opcode_from_pdu(AVRC_PDU_REGISTER_NOTIFICATION);
  avrc_rsp.reg_notif.status = AVRC_STS_ADDR_PLAYER_CHG;
  BTIF_TRACE_WARNING("%s: Handling event ID: 0x%x", __func__, event_id);

  send_metamsg_rsp(&btif_rc_cb.rc_multi_cb[idx], -1,
                   btif_rc_cb.rc_multi_cb[idx].rc_notif[event_id - 1].label,
                   AVRC_RSP_REJ, &avrc_rsp);
}

/***************************************************************************
 *
 * Function         register_notification_rsp
@@ -1997,22 +1971,6 @@ static bt_status_t register_notification_rsp(
        ((type == BTRC_NOTIFICATION_TYPE_INTERIM) ? AVRC_CMD_NOTIF
                                                  : AVRC_RSP_CHANGED),
        &avrc_rsp);

    /* if notification type is address player changed, then complete all player
    * specific
    * notifications with AV/C C-Type REJECTED with error code Addressed Player
    * Changed. */
    if (event_id == BTRC_EVT_ADDR_PLAYER_CHANGE &&
        type == BTRC_NOTIFICATION_TYPE_CHANGED) {
      /* array includes notifications to be completed on addressed player change
       */
      btrc_event_id_t evt_id[] = {
          BTRC_EVT_PLAY_STATUS_CHANGED, BTRC_EVT_TRACK_CHANGE,
          BTRC_EVT_PLAY_POS_CHANGED, BTRC_EVT_NOW_PLAYING_CONTENT_CHANGED};
      for (uint8_t id = 0; id < sizeof(evt_id) / sizeof((evt_id)[0]); id++) {
        reject_pending_notification(evt_id[id], idx);
      }
    }
  }
  return BT_STATUS_SUCCESS;
}