Loading system/bta/av/bta_av_aact.cc +32 −11 Original line number Diff line number Diff line Loading @@ -852,7 +852,6 @@ void bta_av_cleanup(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { /* if de-registering shut everything down */ msg.hdr.layer_specific = p_scb->hndl; p_scb->started = false; p_scb->offload_started = false; p_scb->use_rtp_header_marker_bit = false; p_scb->cong = false; p_scb->role = role; Loading @@ -875,8 +874,6 @@ void bta_av_cleanup(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { } */ p_scb->offload_start_pending = false; if (p_scb->deregistering) { /* remove stream */ for (int i = 0; i < BTAV_A2DP_CODEC_INDEX_MAX; i++) { Loading Loading @@ -1171,7 +1168,6 @@ void bta_av_str_opened(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { bta_av_conn_chg((tBTA_AV_DATA*)&msg); /* set the congestion flag, so AV would not send media packets by accident */ p_scb->cong = true; p_scb->offload_start_pending = false; // Don't use AVDTP SUSPEND for restrict listed devices btif_storage_get_stored_remote_name(p_scb->PeerAddress(), remote_name); if (interop_match_name(INTEROP_DISABLE_AVDTP_SUSPEND, remote_name) || Loading Loading @@ -1895,9 +1891,15 @@ void bta_av_str_stopped(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { BTM_unblock_role_switch_and_sniff_mode_for(p_scb->PeerAddress()); if (p_scb->co_started) { if (p_scb->offload_started) { uint16_t handle = get_btm_client_interface().lifecycle.BTM_GetHCIConnHandle( p_scb->PeerAddress(), BT_TRANSPORT_BR_EDR); if (bta_av_cb.offload_started_acl_hdl == handle) { bta_av_vendor_offload_stop(); bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; } else if (bta_av_cb.offload_start_pending_acl_hdl == handle) { APPL_TRACE_WARNING("%s: Stop pending offload start command", __func__); bta_av_vendor_offload_stop(); p_scb->offload_started = false; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; } bta_av_stream_chg(p_scb, false); Loading Loading @@ -2519,9 +2521,15 @@ void bta_av_suspend_cfm(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { /* in case that we received suspend_ind, we may need to call co_stop here */ if (p_scb->co_started) { if (p_scb->offload_started) { uint16_t handle = get_btm_client_interface().lifecycle.BTM_GetHCIConnHandle( p_scb->PeerAddress(), BT_TRANSPORT_BR_EDR); if (bta_av_cb.offload_started_acl_hdl == handle) { bta_av_vendor_offload_stop(); bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; } else if (bta_av_cb.offload_start_pending_acl_hdl == handle) { APPL_TRACE_WARNING("%s: Stop pending offload start command", __func__); bta_av_vendor_offload_stop(); p_scb->offload_started = false; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; } bta_av_stream_chg(p_scb, false); Loading Loading @@ -3012,6 +3020,13 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { APPL_TRACE_DEBUG("%s: VS_HCI_STOP_A2DP_MEDIA successful", __func__); break; case VS_HCI_A2DP_OFFLOAD_START: if (bta_av_cb.offload_start_pending_acl_hdl != HCI_INVALID_HANDLE) { bta_av_cb.offload_started_acl_hdl = bta_av_cb.offload_start_pending_acl_hdl; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; } else { LOG_INFO("%s: No pending start command due to AVDTP suspend immediately", __func__); } (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); break; default: Loading @@ -3020,10 +3035,12 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { } else { APPL_TRACE_DEBUG("%s: Offload failed for subopcode= %d", __func__, sub_opcode); if (param->opcode != VS_HCI_A2DP_OFFLOAD_STOP) if (param->opcode != VS_HCI_A2DP_OFFLOAD_STOP) { bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); } } } void bta_av_vendor_offload_start(tBTA_AV_SCB* p_scb, tBT_A2DP_OFFLOAD* offload_start) { Loading @@ -3046,7 +3063,7 @@ void bta_av_vendor_offload_start(tBTA_AV_SCB* p_scb, UINT16_TO_STREAM(p_param, offload_start->mtu); ARRAY_TO_STREAM(p_param, offload_start->codec_info, (int8_t)sizeof(offload_start->codec_info)); p_scb->offload_started = true; bta_av_cb.offload_start_pending_acl_hdl = offload_start->acl_hdl; LOG_INFO( "codec: %#x, sample rate: %#x, bit depth: %#x, channel: %#x, bitrate: " "%#x, ACL: %#x, L2CAP: %#x, MTU: %#x", Loading Loading @@ -3086,6 +3103,10 @@ void bta_av_offload_req(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { /* Support offload if only one audio source stream is open. */ if (p_scb->started != true) { status = BTA_AV_FAIL_STREAM; } else if (bta_av_cb.offload_start_pending_acl_hdl != HCI_INVALID_HANDLE || bta_av_cb.offload_started_acl_hdl != HCI_INVALID_HANDLE) { APPL_TRACE_WARNING("%s: offload already started, ignore request", __func__); return; } else { bta_av_offload_codec_builder(p_scb, &offload_start); bta_av_vendor_offload_start(p_scb, &offload_start); Loading Loading @@ -3155,7 +3176,7 @@ void bta_av_offload_rsp(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { status = BTA_AV_FAIL_STREAM; } p_scb->offload_start_pending = false; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; tBTA_AV bta_av_data; bta_av_data.status = status; (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &bta_av_data); Loading system/bta/av/bta_av_int.h +2 −2 Original line number Diff line number Diff line Loading @@ -539,8 +539,6 @@ struct tBTA_AV_SCB final { uint8_t q_tag; /* identify the associated q_info union member */ bool no_rtp_header; /* true if add no RTP header */ uint16_t uuid_int; /*intended UUID of Initiator to connect to */ bool offload_start_pending; bool offload_started; /** * Called to setup the state when connected to a peer. Loading Loading @@ -639,6 +637,8 @@ typedef struct { uint8_t rc_acp_idx; /* (index + 1) to RCB */ uint8_t rs_idx; /* (index + 1) to SCB for the one waiting for RS on open */ bool sco_occupied; /* true if SCO is being used or call is in progress */ uint16_t offload_start_pending_acl_hdl; uint16_t offload_started_acl_hdl; } tBTA_AV_CB; // total attempts are half seconds Loading system/bta/av/bta_av_main.cc +17 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ #include "osi/include/properties.h" #include "stack/include/acl_api.h" #include "stack/include/bt_hdr.h" #include "stack/include/btm_api.h" #include "types/hci_role.h" #include "types/raw_address.h" Loading Loading @@ -165,6 +166,8 @@ static void bta_av_api_enable(tBTA_AV_DATA* p_data) { /* store parameters */ bta_av_cb.p_cback = p_data->api_enable.p_cback; bta_av_cb.features = p_data->api_enable.features; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; tBTA_AV_ENABLE enable; enable.features = bta_av_cb.features; Loading Loading @@ -337,6 +340,16 @@ void bta_av_conn_cback(UNUSED_ATTR uint8_t handle, const RawAddress& bd_addr, evt = BTA_AV_SIG_CHG_EVT; if (event == AVDT_DISCONNECT_IND_EVT) { p_scb = bta_av_addr_to_scb(bd_addr); if (p_scb) { uint16_t handle = BTM_GetHCIConnHandle(p_scb->PeerAddress(), BT_TRANSPORT_BR_EDR); if (bta_av_cb.offload_started_acl_hdl == handle || bta_av_cb.offload_start_pending_acl_hdl == handle) { LOG_INFO("%s: Cleanup offload related flag", __func__); bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; } } } else if (event == AVDT_CONNECT_IND_EVT) { APPL_TRACE_DEBUG("%s: CONN_IND is ACP:%d", __func__, p_data->hdr.err_param); Loading Loading @@ -1406,6 +1419,10 @@ void bta_debug_av_dump(int fd) { dprintf(fd, " Connected audio channels mask: 0x%x\n", bta_av_cb.conn_audio); dprintf(fd, " Registered audio channels mask: 0x%x\n", bta_av_cb.reg_audio); dprintf(fd, " Connected LCBs mask: 0x%x\n", bta_av_cb.conn_lcb); dprintf(fd, " Offload start pending handle: %d\n", bta_av_cb.offload_start_pending_acl_hdl); dprintf(fd, " Offload started handle: %d\n", bta_av_cb.offload_started_acl_hdl); for (size_t i = 0; i < sizeof(bta_av_cb.lcb) / sizeof(bta_av_cb.lcb[0]); i++) { Loading Loading
system/bta/av/bta_av_aact.cc +32 −11 Original line number Diff line number Diff line Loading @@ -852,7 +852,6 @@ void bta_av_cleanup(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { /* if de-registering shut everything down */ msg.hdr.layer_specific = p_scb->hndl; p_scb->started = false; p_scb->offload_started = false; p_scb->use_rtp_header_marker_bit = false; p_scb->cong = false; p_scb->role = role; Loading @@ -875,8 +874,6 @@ void bta_av_cleanup(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) { } */ p_scb->offload_start_pending = false; if (p_scb->deregistering) { /* remove stream */ for (int i = 0; i < BTAV_A2DP_CODEC_INDEX_MAX; i++) { Loading Loading @@ -1171,7 +1168,6 @@ void bta_av_str_opened(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { bta_av_conn_chg((tBTA_AV_DATA*)&msg); /* set the congestion flag, so AV would not send media packets by accident */ p_scb->cong = true; p_scb->offload_start_pending = false; // Don't use AVDTP SUSPEND for restrict listed devices btif_storage_get_stored_remote_name(p_scb->PeerAddress(), remote_name); if (interop_match_name(INTEROP_DISABLE_AVDTP_SUSPEND, remote_name) || Loading Loading @@ -1895,9 +1891,15 @@ void bta_av_str_stopped(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { BTM_unblock_role_switch_and_sniff_mode_for(p_scb->PeerAddress()); if (p_scb->co_started) { if (p_scb->offload_started) { uint16_t handle = get_btm_client_interface().lifecycle.BTM_GetHCIConnHandle( p_scb->PeerAddress(), BT_TRANSPORT_BR_EDR); if (bta_av_cb.offload_started_acl_hdl == handle) { bta_av_vendor_offload_stop(); bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; } else if (bta_av_cb.offload_start_pending_acl_hdl == handle) { APPL_TRACE_WARNING("%s: Stop pending offload start command", __func__); bta_av_vendor_offload_stop(); p_scb->offload_started = false; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; } bta_av_stream_chg(p_scb, false); Loading Loading @@ -2519,9 +2521,15 @@ void bta_av_suspend_cfm(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { /* in case that we received suspend_ind, we may need to call co_stop here */ if (p_scb->co_started) { if (p_scb->offload_started) { uint16_t handle = get_btm_client_interface().lifecycle.BTM_GetHCIConnHandle( p_scb->PeerAddress(), BT_TRANSPORT_BR_EDR); if (bta_av_cb.offload_started_acl_hdl == handle) { bta_av_vendor_offload_stop(); bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; } else if (bta_av_cb.offload_start_pending_acl_hdl == handle) { APPL_TRACE_WARNING("%s: Stop pending offload start command", __func__); bta_av_vendor_offload_stop(); p_scb->offload_started = false; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; } bta_av_stream_chg(p_scb, false); Loading Loading @@ -3012,6 +3020,13 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { APPL_TRACE_DEBUG("%s: VS_HCI_STOP_A2DP_MEDIA successful", __func__); break; case VS_HCI_A2DP_OFFLOAD_START: if (bta_av_cb.offload_start_pending_acl_hdl != HCI_INVALID_HANDLE) { bta_av_cb.offload_started_acl_hdl = bta_av_cb.offload_start_pending_acl_hdl; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; } else { LOG_INFO("%s: No pending start command due to AVDTP suspend immediately", __func__); } (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); break; default: Loading @@ -3020,10 +3035,12 @@ void offload_vendor_callback(tBTM_VSC_CMPL* param) { } else { APPL_TRACE_DEBUG("%s: Offload failed for subopcode= %d", __func__, sub_opcode); if (param->opcode != VS_HCI_A2DP_OFFLOAD_STOP) if (param->opcode != VS_HCI_A2DP_OFFLOAD_STOP) { bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &value); } } } void bta_av_vendor_offload_start(tBTA_AV_SCB* p_scb, tBT_A2DP_OFFLOAD* offload_start) { Loading @@ -3046,7 +3063,7 @@ void bta_av_vendor_offload_start(tBTA_AV_SCB* p_scb, UINT16_TO_STREAM(p_param, offload_start->mtu); ARRAY_TO_STREAM(p_param, offload_start->codec_info, (int8_t)sizeof(offload_start->codec_info)); p_scb->offload_started = true; bta_av_cb.offload_start_pending_acl_hdl = offload_start->acl_hdl; LOG_INFO( "codec: %#x, sample rate: %#x, bit depth: %#x, channel: %#x, bitrate: " "%#x, ACL: %#x, L2CAP: %#x, MTU: %#x", Loading Loading @@ -3086,6 +3103,10 @@ void bta_av_offload_req(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { /* Support offload if only one audio source stream is open. */ if (p_scb->started != true) { status = BTA_AV_FAIL_STREAM; } else if (bta_av_cb.offload_start_pending_acl_hdl != HCI_INVALID_HANDLE || bta_av_cb.offload_started_acl_hdl != HCI_INVALID_HANDLE) { APPL_TRACE_WARNING("%s: offload already started, ignore request", __func__); return; } else { bta_av_offload_codec_builder(p_scb, &offload_start); bta_av_vendor_offload_start(p_scb, &offload_start); Loading Loading @@ -3155,7 +3176,7 @@ void bta_av_offload_rsp(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) { status = BTA_AV_FAIL_STREAM; } p_scb->offload_start_pending = false; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; tBTA_AV bta_av_data; bta_av_data.status = status; (*bta_av_cb.p_cback)(BTA_AV_OFFLOAD_START_RSP_EVT, &bta_av_data); Loading
system/bta/av/bta_av_int.h +2 −2 Original line number Diff line number Diff line Loading @@ -539,8 +539,6 @@ struct tBTA_AV_SCB final { uint8_t q_tag; /* identify the associated q_info union member */ bool no_rtp_header; /* true if add no RTP header */ uint16_t uuid_int; /*intended UUID of Initiator to connect to */ bool offload_start_pending; bool offload_started; /** * Called to setup the state when connected to a peer. Loading Loading @@ -639,6 +637,8 @@ typedef struct { uint8_t rc_acp_idx; /* (index + 1) to RCB */ uint8_t rs_idx; /* (index + 1) to SCB for the one waiting for RS on open */ bool sco_occupied; /* true if SCO is being used or call is in progress */ uint16_t offload_start_pending_acl_hdl; uint16_t offload_started_acl_hdl; } tBTA_AV_CB; // total attempts are half seconds Loading
system/bta/av/bta_av_main.cc +17 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ #include "osi/include/properties.h" #include "stack/include/acl_api.h" #include "stack/include/bt_hdr.h" #include "stack/include/btm_api.h" #include "types/hci_role.h" #include "types/raw_address.h" Loading Loading @@ -165,6 +166,8 @@ static void bta_av_api_enable(tBTA_AV_DATA* p_data) { /* store parameters */ bta_av_cb.p_cback = p_data->api_enable.p_cback; bta_av_cb.features = p_data->api_enable.features; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; tBTA_AV_ENABLE enable; enable.features = bta_av_cb.features; Loading Loading @@ -337,6 +340,16 @@ void bta_av_conn_cback(UNUSED_ATTR uint8_t handle, const RawAddress& bd_addr, evt = BTA_AV_SIG_CHG_EVT; if (event == AVDT_DISCONNECT_IND_EVT) { p_scb = bta_av_addr_to_scb(bd_addr); if (p_scb) { uint16_t handle = BTM_GetHCIConnHandle(p_scb->PeerAddress(), BT_TRANSPORT_BR_EDR); if (bta_av_cb.offload_started_acl_hdl == handle || bta_av_cb.offload_start_pending_acl_hdl == handle) { LOG_INFO("%s: Cleanup offload related flag", __func__); bta_av_cb.offload_started_acl_hdl = HCI_INVALID_HANDLE; bta_av_cb.offload_start_pending_acl_hdl = HCI_INVALID_HANDLE; } } } else if (event == AVDT_CONNECT_IND_EVT) { APPL_TRACE_DEBUG("%s: CONN_IND is ACP:%d", __func__, p_data->hdr.err_param); Loading Loading @@ -1406,6 +1419,10 @@ void bta_debug_av_dump(int fd) { dprintf(fd, " Connected audio channels mask: 0x%x\n", bta_av_cb.conn_audio); dprintf(fd, " Registered audio channels mask: 0x%x\n", bta_av_cb.reg_audio); dprintf(fd, " Connected LCBs mask: 0x%x\n", bta_av_cb.conn_lcb); dprintf(fd, " Offload start pending handle: %d\n", bta_av_cb.offload_start_pending_acl_hdl); dprintf(fd, " Offload started handle: %d\n", bta_av_cb.offload_started_acl_hdl); for (size_t i = 0; i < sizeof(bta_av_cb.lcb) / sizeof(bta_av_cb.lcb[0]); i++) { Loading