From 2b13eb7b2ac17bea5ecfad9a6f34c4f4736bc68e Mon Sep 17 00:00:00 2001 From: Pavlin Radoslavov Date: Mon, 26 Feb 2018 22:53:05 -0800 Subject: [PATCH] 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 --- btif/src/btif_av.cc | 130 +++++++++++++++++++++++++++++----------------------- 1 file changed, 73 insertions(+), 57 deletions(-) diff --git a/btif/src/btif_av.cc b/btif/src/btif_av.cc index 16c985d6b..ed48d9a98 100644 --- a/btif/src/btif_av.cc +++ b/btif/src/btif_av.cc @@ -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,11 +1323,11 @@ bool BtifAvStateMachine::StateIdle::ProcessEvent(uint32_t event, void* p_data) { // Copy to avoid alignment problems memcpy(&req, p_data, sizeof(req)); - BTIF_TRACE_WARNING( - "%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, - req.channel_count); + 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, + req.channel_count); if (btif_av_sink.Enabled()) { HAL_CBACK(btif_av_sink.Callbacks(), audio_config_cb, req.peer_bd, req.sample_rate, req.channel_count); @@ -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,11 +1543,11 @@ bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, // Copy to avoid alignment problems memcpy(&req, p_data, sizeof(req)); - BTIF_TRACE_WARNING( - "%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, - req.channel_count); + 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, + req.channel_count); if (peer_.IsSource() && btif_av_sink.Enabled()) { HAL_CBACK(btif_av_sink.Callbacks(), audio_config_cb, peer_.PeerAddress(), req.sample_rate, req.channel_count); @@ -1661,13 +1677,13 @@ bool BtifAvStateMachine::StateOpened::ProcessEvent(uint32_t event, break; case BTA_AV_START_EVT: { - BTIF_TRACE_WARNING( - "%s: Peer %s : event=%s status=%d suspending=%d " - "initiator=%d flags=%s", - __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(), - BtifAvEvent::EventName(event).c_str(), p_av->start.status, - p_av->start.suspending, p_av->start.initiator, - peer_.FlagsToString().c_str()); + LOG_INFO(LOG_TAG, + "%s: Peer %s : event=%s status=%d suspending=%d " + "initiator=%d flags=%s", + __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(), + BtifAvEvent::EventName(event).c_str(), p_av->start.status, + p_av->start.suspending, p_av->start.initiator, + peer_.FlagsToString().c_str()); if ((p_av->start.status == BTA_SUCCESS) && p_av->start.suspending) return true; @@ -1741,9 +1757,9 @@ 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( - "%s : Peer %s : Reconfig done - calling BTA_AvStart()", - __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str()); + LOG_INFO(LOG_TAG, + "%s : Peer %s : Reconfig done - calling BTA_AvStart()", + __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str()); BTA_AvStart(peer_.BtaHandle()); } else if (peer_.CheckFlags(BtifAvPeer::kFlagPendingStart)) { peer_.ClearFlags(BtifAvPeer::kFlagPendingStart); @@ -1827,10 +1843,10 @@ 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__, - peer_.PeerAddress().ToString().c_str(), - BtifAvEvent::EventName(event).c_str(), - peer_.FlagsToString().c_str()); + 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()); // Set pending flag to ensure the BTIF task is not trying to restart // the stream while suspend is in progress. peer_.SetFlags(BtifAvPeer::kFlagLocalSuspendPending); @@ -1849,10 +1865,10 @@ 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__, - peer_.PeerAddress().ToString().c_str(), - BtifAvEvent::EventName(event).c_str(), - peer_.FlagsToString().c_str()); + 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()); // Request AVDTP to close BTA_AvClose(peer_.BtaHandle()); @@ -1869,11 +1885,11 @@ bool BtifAvStateMachine::StateStarted::ProcessEvent(uint32_t event, break; case BTA_AV_SUSPEND_EVT: - BTIF_TRACE_WARNING( - "%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, - p_av->suspend.initiator, peer_.FlagsToString().c_str()); + 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, + p_av->suspend.initiator, peer_.FlagsToString().c_str()); // A2DP suspended, stop A2DP encoder/decoder until resumed btif_a2dp_on_suspended(&p_av->suspend); @@ -1911,10 +1927,10 @@ 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__, - peer_.PeerAddress().ToString().c_str(), - BtifAvEvent::EventName(event).c_str(), - peer_.FlagsToString().c_str()); + 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()); peer_.SetFlags(BtifAvPeer::kFlagPendingStop); btif_a2dp_on_stopped(&p_av->suspend); @@ -1928,10 +1944,10 @@ 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__, - peer_.PeerAddress().ToString().c_str(), - BtifAvEvent::EventName(event).c_str(), - peer_.FlagsToString().c_str()); + 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()); peer_.SetFlags(BtifAvPeer::kFlagPendingStop); @@ -2100,8 +2116,8 @@ 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__, - peer_address.ToString().c_str(), state); + LOG_INFO(LOG_TAG, "%s: peer_address=%s state=%d", __func__, + peer_address.ToString().c_str(), state); if (btif_av_source.Enabled()) { HAL_CBACK(btif_av_source.Callbacks(), connection_state_cb, peer_address, @@ -2123,8 +2139,8 @@ 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__, - peer_address.ToString().c_str(), state); + LOG_INFO(LOG_TAG, "%s: peer_address=%s state=%d", __func__, + peer_address.ToString().c_str(), state); if (btif_av_source.Enabled()) { HAL_CBACK(btif_av_source.Callbacks(), audio_state_cb, peer_address, state); @@ -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,9 +2696,9 @@ 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__, - peer->PeerAddress().ToString().c_str(), state, - peer->FlagsToString().c_str(), ready); + 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); return ready; } @@ -2903,8 +2919,8 @@ 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__, - peer_address.ToString().c_str()); + LOG_INFO(LOG_TAG, "%s: Peer %s : ACL Disconnected", __func__, + peer_address.ToString().c_str()); if (btif_av_source.Enabled()) { btif_av_source_dispatch_sm_event(peer_address, BTIF_AV_ACL_DISCONNECTED); -- 2.11.0