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

Commit 5d2be955 authored by Pavlin Radoslavov's avatar Pavlin Radoslavov
Browse files

Clear the A2DP active device within the native stack during cleanup

Use explicit SetActivePeer(RawAddress::kEmpty) for BtifAvSource and
BtifAvSink during Cleanup()

Also, replaced incorrectly classified BTIF_TRACE_WARNING() log messages
with LOG_INFO().

Bug: 73832547
Test: Manual - A2DP streaming, enable Location -> Bluetooth scanning,
      restart Bluetooth in Quick Settings
Change-Id: Ieeae8915a45dc0c98cd68bd4bb113424c2de74d9
parent 86eb8346
Loading
Loading
Loading
Loading
+73 −57
Original line number Diff line number Diff line
@@ -373,6 +373,9 @@ class BtifAvSource {
   * @return true on success, otherwise false
   */
  bool SetActivePeer(const RawAddress& peer_address) {
    LOG_INFO(LOG_TAG, "%s: peer: %s", __PRETTY_FUNCTION__,
             peer_address.ToString().c_str());

    if (active_peer_ == peer_address) return true;  // Nothing has changed
    if (peer_address.IsEmpty()) {
      BTIF_TRACE_EVENT("%s: peer address is empty, shutdown the Audio source",
@@ -486,6 +489,9 @@ class BtifAvSink {
   * @return true on success, otherwise false
   */
  bool SetActivePeer(const RawAddress& peer_address) {
    LOG_INFO(LOG_TAG, "%s: peer: %s", __PRETTY_FUNCTION__,
             peer_address.ToString().c_str());

    if (active_peer_ == peer_address) return true;  // Nothing has changed
    if (peer_address.IsEmpty()) {
      BTIF_TRACE_EVENT("%s: peer address is empty, shutdown the Audio sink",
@@ -833,6 +839,11 @@ void BtifAvSource::Cleanup() {
  if (!enabled_) return;

  btif_queue_cleanup(UUID_SERVCLASS_AUDIO_SOURCE);

  do_in_jni_thread(
      FROM_HERE,
      base::Bind(base::IgnoreResult(&BtifAvSource::SetActivePeer),
                 base::Unretained(&btif_av_source), RawAddress::kEmpty));
  do_in_jni_thread(FROM_HERE, base::Bind(&btif_a2dp_source_cleanup));

  btif_disable_service(BTA_A2DP_SOURCE_SERVICE_ID);
@@ -1004,6 +1015,11 @@ void BtifAvSink::Cleanup() {
  if (!enabled_) return;

  btif_queue_cleanup(UUID_SERVCLASS_AUDIO_SINK);

  do_in_jni_thread(
      FROM_HERE,
      base::Bind(base::IgnoreResult(&BtifAvSink::SetActivePeer),
                 base::Unretained(&btif_av_sink), RawAddress::kEmpty));
  do_in_jni_thread(FROM_HERE, base::Bind(&btif_a2dp_sink_cleanup));

  btif_disable_service(BTA_A2DP_SINK_SERVICE_ID);
@@ -1307,7 +1323,7 @@ bool BtifAvStateMachine::StateIdle::ProcessEvent(uint32_t event, void* p_data) {
      // Copy to avoid alignment problems
      memcpy(&req, p_data, sizeof(req));

      BTIF_TRACE_WARNING(
      LOG_INFO(LOG_TAG,
               "%s: Peer %s : event=%s sample_rate=%d channel_count=%d",
               __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
               BtifAvEvent::EventName(event).c_str(), req.sample_rate,
@@ -1325,8 +1341,8 @@ bool BtifAvStateMachine::StateIdle::ProcessEvent(uint32_t event, void* p_data) {
      tBTA_AV_STATUS status = p_bta_data->open.status;
      bool can_connect = true;

      BTIF_TRACE_WARNING(
          "%s: Peer %s : event=%s flags=%s status=%d(%s) edr=0x%x",
      LOG_INFO(
          LOG_TAG, "%s: Peer %s : event=%s flags=%s status=%d(%s) edr=0x%x",
          __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
          BtifAvEvent::EventName(event).c_str(), peer_.FlagsToString().c_str(),
          status, (status == BTA_AV_SUCCESS) ? "SUCCESS" : "FAILED",
@@ -1474,8 +1490,8 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event,
      int av_state;
      tBTA_AV_STATUS status = p_bta_data->open.status;

      BTIF_TRACE_WARNING(
          "%s: Peer %s : event=%s flags=%s status=%d(%s) edr=0x%x",
      LOG_INFO(
          LOG_TAG, "%s: Peer %s : event=%s flags=%s status=%d(%s) edr=0x%x",
          __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
          BtifAvEvent::EventName(event).c_str(), peer_.FlagsToString().c_str(),
          status, (status == BTA_AV_SUCCESS) ? "SUCCESS" : "FAILED",
@@ -1527,7 +1543,7 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event,
      // Copy to avoid alignment problems
      memcpy(&req, p_data, sizeof(req));

      BTIF_TRACE_WARNING(
      LOG_INFO(LOG_TAG,
               "%s: Peer %s : event=%s sample_rate=%d channel_count=%d",
               __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
               BtifAvEvent::EventName(event).c_str(), req.sample_rate,
@@ -1661,7 +1677,7 @@ bool BtifAvStateMachine::StateOpened::ProcessEvent(uint32_t event,
      break;

    case BTA_AV_START_EVT: {
      BTIF_TRACE_WARNING(
      LOG_INFO(LOG_TAG,
               "%s: Peer %s : event=%s status=%d suspending=%d "
               "initiator=%d flags=%s",
               __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
@@ -1741,7 +1757,7 @@ bool BtifAvStateMachine::StateOpened::ProcessEvent(uint32_t event,
    case BTA_AV_RECONFIG_EVT:
      if (peer_.CheckFlags(BtifAvPeer::kFlagPendingStart) &&
          (p_av->reconfig.status == BTA_AV_SUCCESS)) {
        BTIF_TRACE_WARNING(
        LOG_INFO(LOG_TAG,
                 "%s : Peer %s : Reconfig done - calling BTA_AvStart()",
                 __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str());
        BTA_AvStart(peer_.BtaHandle());
@@ -1827,7 +1843,7 @@ bool BtifAvStateMachine::StateStarted::ProcessEvent(uint32_t event,
    // FIXME -- use suspend = true always to work around issue with BTA AV
    case BTIF_AV_STOP_STREAM_REQ_EVT:
    case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
      BTIF_TRACE_WARNING("%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
      LOG_INFO(LOG_TAG, "%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
               peer_.PeerAddress().ToString().c_str(),
               BtifAvEvent::EventName(event).c_str(),
               peer_.FlagsToString().c_str());
@@ -1849,7 +1865,7 @@ bool BtifAvStateMachine::StateStarted::ProcessEvent(uint32_t event,
      break;

    case BTIF_AV_DISCONNECT_REQ_EVT:
      BTIF_TRACE_WARNING("%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
      LOG_INFO(LOG_TAG, "%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
               peer_.PeerAddress().ToString().c_str(),
               BtifAvEvent::EventName(event).c_str(),
               peer_.FlagsToString().c_str());
@@ -1869,7 +1885,7 @@ bool BtifAvStateMachine::StateStarted::ProcessEvent(uint32_t event,
      break;

    case BTA_AV_SUSPEND_EVT:
      BTIF_TRACE_WARNING(
      LOG_INFO(LOG_TAG,
               "%s: Peer %s : event=%s status=%d initiator=%d flags=%s",
               __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
               BtifAvEvent::EventName(event).c_str(), p_av->suspend.status,
@@ -1911,7 +1927,7 @@ bool BtifAvStateMachine::StateStarted::ProcessEvent(uint32_t event,
      break;

    case BTA_AV_STOP_EVT:
      BTIF_TRACE_WARNING("%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
      LOG_INFO(LOG_TAG, "%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
               peer_.PeerAddress().ToString().c_str(),
               BtifAvEvent::EventName(event).c_str(),
               peer_.FlagsToString().c_str());
@@ -1928,7 +1944,7 @@ bool BtifAvStateMachine::StateStarted::ProcessEvent(uint32_t event,
      break;

    case BTA_AV_CLOSE_EVT:
      BTIF_TRACE_WARNING("%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
      LOG_INFO(LOG_TAG, "%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
               peer_.PeerAddress().ToString().c_str(),
               BtifAvEvent::EventName(event).c_str(),
               peer_.FlagsToString().c_str());
@@ -2100,7 +2116,7 @@ static void btif_av_sink_initiate_av_open_timer_timeout(void* data) {
 */
static void btif_report_connection_state(const RawAddress& peer_address,
                                         btav_connection_state_t state) {
  BTIF_TRACE_WARNING("%s: peer_address=%s state=%d", __func__,
  LOG_INFO(LOG_TAG, "%s: peer_address=%s state=%d", __func__,
           peer_address.ToString().c_str(), state);

  if (btif_av_source.Enabled()) {
@@ -2123,7 +2139,7 @@ static void btif_report_connection_state(const RawAddress& peer_address,
 */
static void btif_report_audio_state(const RawAddress& peer_address,
                                    btav_audio_state_t state) {
  BTIF_TRACE_WARNING("%s: peer_address=%s state=%d", __func__,
  LOG_INFO(LOG_TAG, "%s: peer_address=%s state=%d", __func__,
           peer_address.ToString().c_str(), state);

  if (btif_av_source.Enabled()) {
@@ -2486,7 +2502,7 @@ static bt_status_t src_connect_sink(const RawAddress& peer_address) {
}

static bt_status_t sink_connect_src(const RawAddress& peer_address) {
  BTIF_TRACE_WARNING("%s: Peer %s", __func__, peer_address.ToString().c_str());
  LOG_INFO(LOG_TAG, "%s: Peer %s", __func__, peer_address.ToString().c_str());

  if (!btif_av_sink.Enabled()) {
    BTIF_TRACE_WARNING("%s: BTIF AV Sink is not enabled", __func__);
@@ -2499,7 +2515,7 @@ static bt_status_t sink_connect_src(const RawAddress& peer_address) {
}

static bt_status_t src_disconnect_sink(const RawAddress& peer_address) {
  BTIF_TRACE_WARNING("%s: Peer %s", __func__, peer_address.ToString().c_str());
  LOG_INFO(LOG_TAG, "%s: Peer %s", __func__, peer_address.ToString().c_str());

  if (!btif_av_source.Enabled()) {
    BTIF_TRACE_WARNING("%s: BTIF AV Source is not enabled", __func__);
@@ -2515,7 +2531,7 @@ static bt_status_t src_disconnect_sink(const RawAddress& peer_address) {
}

static bt_status_t sink_disconnect_src(const RawAddress& peer_address) {
  BTIF_TRACE_WARNING("%s: Peer %s", __func__, peer_address.ToString().c_str());
  LOG_INFO(LOG_TAG, "%s: Peer %s", __func__, peer_address.ToString().c_str());

  if (!btif_av_sink.Enabled()) {
    BTIF_TRACE_WARNING("%s: BTIF AV Sink is not enabled", __func__);
@@ -2680,7 +2696,7 @@ bool btif_av_stream_started_ready(void) {
  } else {
    ready = (state == BtifAvStateMachine::kStateStarted);
  }
  BTIF_TRACE_WARNING("%s: Peer %s : state=%d flags=%s ready=%d", __func__,
  LOG_INFO(LOG_TAG, "%s: Peer %s : state=%d flags=%s ready=%d", __func__,
           peer->PeerAddress().ToString().c_str(), state,
           peer->FlagsToString().c_str(), ready);

@@ -2903,7 +2919,7 @@ bool btif_av_peer_supports_3mbps(const RawAddress& peer_address) {

void btif_av_acl_disconnected(const RawAddress& peer_address) {
  // Inform the application that ACL is disconnected and move to idle state
  BTIF_TRACE_WARNING("%s: Peer %s : ACL Disconnected", __func__,
  LOG_INFO(LOG_TAG, "%s: Peer %s : ACL Disconnected", __func__,
           peer_address.ToString().c_str());

  if (btif_av_source.Enabled()) {