mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-02-28 16:11:24 +00:00
avdtp: streamline request to send for acceptor/initiator signaling connections
avoid stream endpoint lookup by remote seid
This commit is contained in:
parent
76b0318e1d
commit
d80ccd43b8
@ -127,7 +127,7 @@ static avdtp_connection_t * avdtp_get_connection_for_bd_addr(bd_addr_t addr){
|
||||
}
|
||||
|
||||
|
||||
avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_seid(uint16_t seid){
|
||||
avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_with_seid(uint16_t seid){
|
||||
btstack_linked_list_iterator_t it;
|
||||
btstack_linked_list_iterator_init(&it, avdtp_get_stream_endpoints());
|
||||
while (btstack_linked_list_iterator_has_next(&it)){
|
||||
@ -139,6 +139,10 @@ avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_seid(uint16_t seid){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_seid(uint16_t seid){
|
||||
return avdtp_get_stream_endpoint_with_seid(seid);
|
||||
}
|
||||
|
||||
avdtp_connection_t * avdtp_get_connection_for_l2cap_signaling_cid(uint16_t l2cap_cid){
|
||||
btstack_linked_list_iterator_t it;
|
||||
btstack_linked_list_iterator_init(&it, &connections);
|
||||
@ -182,30 +186,6 @@ static avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_signaling_cid(uin
|
||||
return NULL;
|
||||
}
|
||||
|
||||
avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_with_seid(uint8_t seid){
|
||||
btstack_linked_list_iterator_t it;
|
||||
btstack_linked_list_iterator_init(&it, avdtp_get_stream_endpoints());
|
||||
while (btstack_linked_list_iterator_has_next(&it)){
|
||||
avdtp_stream_endpoint_t * stream_endpoint = (avdtp_stream_endpoint_t *)btstack_linked_list_iterator_next(&it);
|
||||
if (stream_endpoint->sep.seid == seid){
|
||||
return stream_endpoint;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_associated_with_acp_seid(uint16_t acp_seid){
|
||||
btstack_linked_list_iterator_t it;
|
||||
btstack_linked_list_iterator_init(&it, avdtp_get_stream_endpoints());
|
||||
while (btstack_linked_list_iterator_has_next(&it)){
|
||||
avdtp_stream_endpoint_t * stream_endpoint = (avdtp_stream_endpoint_t *)btstack_linked_list_iterator_next(&it);
|
||||
if (stream_endpoint->remote_sep.seid == acp_seid){
|
||||
return stream_endpoint;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uint16_t avdtp_get_next_transaction_label(void){
|
||||
transaction_id_counter++;
|
||||
if (transaction_id_counter == 16){
|
||||
@ -419,27 +399,46 @@ void avdtp_register_media_handler(void (*callback)(uint8_t local_seid, uint8_t *
|
||||
avdtp_sink_handle_media_data = callback;
|
||||
}
|
||||
|
||||
/* START: tracking can send now requests pro l2cap cid */
|
||||
void avdtp_handle_can_send_now(avdtp_connection_t *connection, uint16_t l2cap_cid) {
|
||||
if (connection->wait_to_send_acceptor){
|
||||
log_debug("call avdtp_acceptor_stream_config_subsm_run");
|
||||
connection->wait_to_send_acceptor = 0;
|
||||
avdtp_acceptor_stream_config_subsm_run(connection);
|
||||
} else if (connection->wait_to_send_initiator){
|
||||
log_debug("call avdtp_initiator_stream_config_subsm_run");
|
||||
connection->wait_to_send_initiator = 0;
|
||||
avdtp_initiator_stream_config_subsm_run(connection);
|
||||
}
|
||||
/* START: tracking can send now requests per l2cap cid */
|
||||
static void avdtp_handle_can_send_now(uint16_t l2cap_cid) {
|
||||
|
||||
// re-register
|
||||
bool more_to_send = connection->wait_to_send_acceptor || connection->wait_to_send_initiator;
|
||||
log_debug("ask for more to send %d: acc-%d, ini-%d", more_to_send, connection->wait_to_send_acceptor, connection->wait_to_send_initiator);
|
||||
log_debug("avdtp_packet_handler, L2CAP_EVENT_CAN_SEND_NOW l2cap_cid 0x%02x", l2cap_cid);
|
||||
|
||||
if (more_to_send){
|
||||
l2cap_request_can_send_now_event(l2cap_cid);
|
||||
}
|
||||
// get signaling connection for l2cap cid
|
||||
avdtp_connection_t * connection = avdtp_get_connection_for_l2cap_signaling_cid(l2cap_cid);
|
||||
|
||||
if (connection != NULL) {
|
||||
if (connection->wait_to_send_acceptor) {
|
||||
log_debug("call avdtp_acceptor_stream_config_subsm_run %p", connection);
|
||||
connection->wait_to_send_acceptor = false;
|
||||
avdtp_acceptor_stream_config_subsm_run(connection);
|
||||
} else if (connection->wait_to_send_initiator) {
|
||||
log_debug("call avdtp_initiator_stream_config_subsm_handle_can_send_now_signaling %p", connection);
|
||||
connection->wait_to_send_initiator = false;
|
||||
avdtp_initiator_stream_config_subsm_handle_can_send_now_signaling(connection);
|
||||
}
|
||||
bool more_to_send = connection->wait_to_send_acceptor || connection->wait_to_send_initiator;
|
||||
if (more_to_send){
|
||||
l2cap_request_can_send_now_event(l2cap_cid);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// get stream endpoint connection for l2cap cid
|
||||
avdtp_stream_endpoint_t * stream_endpoint = avdtp_get_stream_endpoint_for_l2cap_cid(l2cap_cid);
|
||||
if (stream_endpoint != NULL) {
|
||||
log_debug("call avdtp_initiator_stream_config_subsm_handle_can_send_now_stream_endpoint %p", stream_endpoint);
|
||||
if (stream_endpoint->request_can_send_now) {
|
||||
stream_endpoint->request_can_send_now = 0;
|
||||
avdtp_initiator_stream_config_subsm_handle_can_send_now_stream_endpoint(stream_endpoint);
|
||||
}
|
||||
bool more_to_send = stream_endpoint->request_can_send_now != 0;
|
||||
if (more_to_send){
|
||||
l2cap_request_can_send_now_event(l2cap_cid);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* END: tracking can send now requests pro l2cap cid */
|
||||
/* END: tracking can send now requests per l2cap cid */
|
||||
|
||||
|
||||
avdtp_stream_endpoint_t * avdtp_create_stream_endpoint(avdtp_sep_type_t sep_type, avdtp_media_type_t media_type){
|
||||
@ -576,7 +575,7 @@ static void avdtp_handle_sdp_query_failed(avdtp_connection_t * connection, uint8
|
||||
case AVDTP_SIGNALING_CONNECTION_OPENED:
|
||||
// SDP query failed: try query that must be supported
|
||||
connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_CAPABILITIES;
|
||||
avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_initiator(connection);
|
||||
return;
|
||||
|
||||
default:
|
||||
@ -598,7 +597,7 @@ static void avdtp_handle_sdp_query_succeeded(avdtp_connection_t * connection){
|
||||
} else {
|
||||
connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_ALL_CAPABILITIES;
|
||||
}
|
||||
avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_initiator(connection);
|
||||
break;
|
||||
default:
|
||||
connection->state = AVDTP_SIGNALING_CONNECTION_W4_L2CAP_CONNECTED;
|
||||
@ -975,13 +974,7 @@ void avdtp_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet
|
||||
|
||||
case L2CAP_EVENT_CAN_SEND_NOW:
|
||||
log_debug("avdtp_packet_handler, L2CAP_EVENT_CAN_SEND_NOW l2cap_cid 0x%02x", channel);
|
||||
connection = avdtp_get_connection_for_l2cap_signaling_cid(channel);
|
||||
if (!connection) {
|
||||
stream_endpoint = avdtp_get_stream_endpoint_for_l2cap_cid(channel);
|
||||
if (!stream_endpoint->connection) break;
|
||||
connection = stream_endpoint->connection;
|
||||
}
|
||||
avdtp_handle_can_send_now(connection, channel);
|
||||
avdtp_handle_can_send_now(channel);
|
||||
break;
|
||||
default:
|
||||
log_info("Unknown HCI event type %02x", hci_event_packet_get_type(packet));
|
||||
@ -1054,7 +1047,7 @@ uint8_t avdtp_open_stream(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote
|
||||
connection->initiator_local_seid = local_seid;
|
||||
stream_endpoint->initiator_config_state = AVDTP_INITIATOR_W2_OPEN_STREAM;
|
||||
stream_endpoint->state = AVDTP_STREAM_ENDPOINT_W2_REQUEST_OPEN_STREAM;
|
||||
avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_initiator(connection);
|
||||
return ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@ -1088,7 +1081,7 @@ uint8_t avdtp_start_stream(uint16_t avdtp_cid, uint8_t local_seid){
|
||||
stream_endpoint->start_stream = 1;
|
||||
connection->initiator_local_seid = local_seid;
|
||||
connection->initiator_remote_seid = stream_endpoint->remote_sep.seid;
|
||||
avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_initiator(connection);
|
||||
return ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@ -1117,7 +1110,7 @@ uint8_t avdtp_stop_stream(uint16_t avdtp_cid, uint8_t local_seid){
|
||||
stream_endpoint->close_stream = 1;
|
||||
connection->initiator_local_seid = local_seid;
|
||||
connection->initiator_remote_seid = stream_endpoint->remote_sep.seid;
|
||||
avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_initiator(connection);
|
||||
return ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@ -1146,7 +1139,7 @@ uint8_t avdtp_abort_stream(uint16_t avdtp_cid, uint8_t local_seid){
|
||||
stream_endpoint->abort_stream = 1;
|
||||
connection->initiator_local_seid = local_seid;
|
||||
connection->initiator_remote_seid = stream_endpoint->remote_sep.seid;
|
||||
avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_initiator(connection);
|
||||
return ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@ -1174,7 +1167,7 @@ uint8_t avdtp_suspend_stream(uint16_t avdtp_cid, uint8_t local_seid){
|
||||
stream_endpoint->suspend_stream = 1;
|
||||
connection->initiator_local_seid = local_seid;
|
||||
connection->initiator_remote_seid = stream_endpoint->remote_sep.seid;
|
||||
avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_initiator(connection);
|
||||
return ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@ -1191,7 +1184,7 @@ uint8_t avdtp_discover_stream_endpoints(uint16_t avdtp_cid){
|
||||
|
||||
connection->initiator_transaction_label= avdtp_get_next_transaction_label();
|
||||
connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_DISCOVER_SEPS;
|
||||
return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
return avdtp_request_can_send_now_initiator(connection);
|
||||
}
|
||||
|
||||
|
||||
@ -1209,7 +1202,7 @@ uint8_t avdtp_get_capabilities(uint16_t avdtp_cid, uint8_t remote_seid){
|
||||
connection->initiator_transaction_label= avdtp_get_next_transaction_label();
|
||||
connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_CAPABILITIES;
|
||||
connection->initiator_remote_seid = remote_seid;
|
||||
return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
return avdtp_request_can_send_now_initiator(connection);
|
||||
}
|
||||
|
||||
|
||||
@ -1240,7 +1233,7 @@ uint8_t avdtp_get_all_capabilities(uint16_t avdtp_cid, uint8_t remote_seid){
|
||||
} else {
|
||||
connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_ALL_CAPABILITIES;
|
||||
}
|
||||
return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
return avdtp_request_can_send_now_initiator(connection);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1258,7 +1251,7 @@ uint8_t avdtp_get_configuration(uint16_t avdtp_cid, uint8_t remote_seid){
|
||||
connection->initiator_transaction_label= avdtp_get_next_transaction_label();
|
||||
connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_W2_GET_CONFIGURATION;
|
||||
connection->initiator_remote_seid = remote_seid;
|
||||
return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
return avdtp_request_can_send_now_initiator(connection);
|
||||
}
|
||||
|
||||
uint8_t avdtp_set_configuration(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, uint16_t configured_services_bitmap, avdtp_capabilities_t configuration){
|
||||
@ -1299,7 +1292,7 @@ uint8_t avdtp_set_configuration(uint16_t avdtp_cid, uint8_t local_seid, uint8_t
|
||||
|
||||
log_debug("SE %p, initiator_config_state: 0x%02x", stream_endpoint, stream_endpoint->initiator_config_state);
|
||||
|
||||
return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
return avdtp_request_can_send_now_initiator(connection);
|
||||
}
|
||||
|
||||
uint8_t avdtp_reconfigure(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote_seid, uint16_t configured_services_bitmap, avdtp_capabilities_t configuration){
|
||||
@ -1331,7 +1324,7 @@ uint8_t avdtp_reconfigure(uint16_t avdtp_cid, uint8_t local_seid, uint8_t remote
|
||||
stream_endpoint->remote_configuration_bitmap = configured_services_bitmap;
|
||||
stream_endpoint->remote_configuration = configuration;
|
||||
stream_endpoint->initiator_config_state = AVDTP_INITIATOR_W2_RECONFIGURE_STREAM_WITH_SEID;
|
||||
return avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
return avdtp_request_can_send_now_initiator(connection);
|
||||
}
|
||||
|
||||
void avdtp_set_preferred_sampling_frequeny(avdtp_stream_endpoint_t * stream_endpoint, uint32_t sampling_frequency){
|
||||
|
@ -460,9 +460,9 @@ typedef struct {
|
||||
|
||||
uint8_t initiator_transaction_label;
|
||||
uint8_t acceptor_transaction_label;
|
||||
uint8_t wait_to_send_acceptor;
|
||||
uint8_t wait_to_send_initiator;
|
||||
|
||||
bool wait_to_send_acceptor;
|
||||
bool wait_to_send_initiator;
|
||||
|
||||
uint8_t suspended_seids[AVDTP_MAX_NUM_SEPS];
|
||||
uint8_t num_suspended_seids;
|
||||
|
||||
@ -560,8 +560,7 @@ btstack_linked_list_t * avdtp_get_connections(void);
|
||||
btstack_linked_list_t * avdtp_get_stream_endpoints(void);
|
||||
|
||||
avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_for_seid(uint16_t seid);
|
||||
avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_with_seid(uint8_t seid);
|
||||
avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_associated_with_acp_seid(uint16_t acp_seid);
|
||||
avdtp_stream_endpoint_t * avdtp_get_stream_endpoint_with_seid(uint16_t seid);
|
||||
|
||||
btstack_packet_handler_t avdtp_packet_handler_for_stream_endpoint(const avdtp_stream_endpoint_t *stream_endpoint);
|
||||
void avdtp_emit_sink_and_source(uint8_t * packet, uint16_t size);
|
||||
@ -575,7 +574,6 @@ void avdtp_register_content_protection_category(avdtp_stream_endpoint_t * stream
|
||||
void avdtp_register_header_compression_category(avdtp_stream_endpoint_t * stream_endpoint, uint8_t back_ch, uint8_t media, uint8_t recovery);
|
||||
void avdtp_register_media_codec_category(avdtp_stream_endpoint_t * stream_endpoint, avdtp_media_type_t media_type, avdtp_media_codec_type_t media_codec_type, uint8_t * media_codec_info, uint16_t media_codec_info_len);
|
||||
void avdtp_register_multiplexing_category(avdtp_stream_endpoint_t * stream_endpoint, uint8_t fragmentation);
|
||||
void avdtp_handle_can_send_now(avdtp_connection_t *connection, uint16_t l2cap_cid);
|
||||
|
||||
// sink only
|
||||
void avdtp_register_media_handler(void (*callback)(uint8_t local_seid, uint8_t *packet, uint16_t size));
|
||||
|
@ -151,7 +151,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t
|
||||
connection->error_code = BAD_LENGTH;
|
||||
connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_REJECT_WITH_ERROR_CODE;
|
||||
connection->reject_signal_identifier = connection->acceptor_signaling_packet.signal_identifier;
|
||||
avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_acceptor(connection);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -161,7 +161,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t
|
||||
if (connection->state != AVDTP_SIGNALING_CONNECTION_OPENED) return;
|
||||
log_info("W2_ANSWER_DISCOVER_SEPS");
|
||||
connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_ANSWER_DISCOVER_SEPS;
|
||||
avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_acceptor(connection);
|
||||
return;
|
||||
case AVDTP_SI_GET_CAPABILITIES:
|
||||
case AVDTP_SI_GET_ALL_CAPABILITIES:
|
||||
@ -188,7 +188,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t
|
||||
connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_REJECT_CATEGORY_WITH_ERROR_CODE;
|
||||
}
|
||||
connection->reject_signal_identifier = connection->acceptor_signaling_packet.signal_identifier;
|
||||
avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_acceptor(connection);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
@ -211,7 +211,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t
|
||||
connection->reject_service_category = connection->acceptor_local_seid;
|
||||
connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_REJECT_CATEGORY_WITH_ERROR_CODE;
|
||||
connection->reject_signal_identifier = connection->acceptor_signaling_packet.signal_identifier;
|
||||
avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_acceptor(connection);
|
||||
return;
|
||||
}
|
||||
// deal with first susspended seid
|
||||
@ -224,7 +224,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t
|
||||
connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_REJECT_CATEGORY_WITH_ERROR_CODE;
|
||||
connection->reject_signal_identifier = connection->acceptor_signaling_packet.signal_identifier;
|
||||
connection->num_suspended_seids = 0;
|
||||
avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_acceptor(connection);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
@ -233,7 +233,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t
|
||||
connection->acceptor_connection_state = AVDTP_SIGNALING_CONNECTION_ACCEPTOR_W2_GENERAL_REJECT_WITH_ERROR_CODE;
|
||||
connection->reject_signal_identifier = connection->acceptor_signaling_packet.signal_identifier;
|
||||
log_info("AVDTP_CMD_MSG signal %d not implemented, general reject", connection->acceptor_signaling_packet.signal_identifier);
|
||||
avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_acceptor(connection);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -425,7 +425,7 @@ void avdtp_acceptor_stream_config_subsm(avdtp_connection_t *connection, uint8_t
|
||||
if (!request_to_send){
|
||||
log_info("NOT IMPLEMENTED");
|
||||
}
|
||||
avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_acceptor(connection);
|
||||
}
|
||||
|
||||
static int avdtp_acceptor_send_seps_response(uint16_t cid, uint8_t transaction_label, avdtp_stream_endpoint_t * endpoints){
|
||||
@ -654,6 +654,6 @@ void avdtp_acceptor_stream_config_subsm_run(avdtp_connection_t *connection) {
|
||||
}
|
||||
// check fragmentation
|
||||
if ((connection->acceptor_signaling_packet.packet_type != AVDTP_SINGLE_PACKET) && (connection->acceptor_signaling_packet.packet_type != AVDTP_END_PACKET)){
|
||||
avdtp_request_can_send_now_acceptor(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_acceptor(connection);
|
||||
}
|
||||
}
|
||||
|
@ -82,20 +82,13 @@ void avdtp_initiator_stream_config_subsm(avdtp_connection_t *connection, uint8_t
|
||||
if (connection->initiator_connection_state == AVDTP_SIGNALING_CONNECTION_INITIATOR_W4_ANSWER) {
|
||||
connection->initiator_connection_state = AVDTP_SIGNALING_CONNECTION_INITIATOR_IDLE;
|
||||
} else {
|
||||
stream_endpoint = avdtp_get_stream_endpoint_associated_with_acp_seid(connection->initiator_remote_seid);
|
||||
if (stream_endpoint == NULL){
|
||||
stream_endpoint = avdtp_get_stream_endpoint_with_seid(connection->initiator_local_seid);
|
||||
if (stream_endpoint == NULL){
|
||||
log_debug("no stream endpoint for local %u, remote %u", connection->initiator_local_seid, connection->initiator_remote_seid);
|
||||
return;
|
||||
} else {
|
||||
log_debug("Using stream endpoint %p for local seid %u", stream_endpoint, connection->initiator_local_seid);
|
||||
}
|
||||
} else {
|
||||
log_debug("Using stream endpoint %p for remote seid %u", stream_endpoint, connection->initiator_remote_seid);
|
||||
stream_endpoint = avdtp_get_stream_endpoint_with_seid(connection->initiator_local_seid);
|
||||
if (stream_endpoint == NULL) {
|
||||
log_debug("no stream endpoint for local seid %u", connection->initiator_local_seid);
|
||||
return;
|
||||
}
|
||||
log_debug("using stream endpoint %p for local seid %u", stream_endpoint, connection->initiator_local_seid);
|
||||
|
||||
log_debug("SE %p, initiator_connection_state: 0x%02x, initiator_config_state: 0x%02x", stream_endpoint, connection->initiator_connection_state, stream_endpoint->initiator_config_state);
|
||||
sep.seid = connection->initiator_remote_seid;
|
||||
|
||||
if (stream_endpoint->initiator_config_state != AVDTP_INITIATOR_W4_ANSWER) {
|
||||
@ -386,7 +379,7 @@ static bool avdtp_initiator_stream_config_subsm_run_endpoint(avdtp_connection_t
|
||||
}
|
||||
l2cap_send_prepared(connection->l2cap_signaling_cid, pos);
|
||||
if (stream_endpoint->initiator_config_state == AVDTP_INITIATOR_FRAGMENTATED_COMMAND){
|
||||
avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_initiator(connection);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -402,7 +395,7 @@ static bool avdtp_initiator_stream_config_subsm_run_endpoint(avdtp_connection_t
|
||||
}
|
||||
l2cap_send_prepared(connection->l2cap_signaling_cid, pos);
|
||||
if (stream_endpoint->initiator_config_state == AVDTP_INITIATOR_FRAGMENTATED_COMMAND){
|
||||
avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_initiator(connection);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -424,25 +417,15 @@ static bool avdtp_initiator_stream_config_subsm_run_endpoint(avdtp_connection_t
|
||||
return false;
|
||||
}
|
||||
|
||||
void avdtp_initiator_stream_config_subsm_run(avdtp_connection_t *connection) {
|
||||
void avdtp_initiator_stream_config_subsm_handle_can_send_now_signaling(avdtp_connection_t *connection) {
|
||||
bool sent;
|
||||
|
||||
sent = avdtp_initiator_stream_config_subsm_run_signaling(connection);
|
||||
if (sent) return;
|
||||
|
||||
avdtp_stream_endpoint_t * stream_endpoint = avdtp_get_stream_endpoint_associated_with_acp_seid(connection->initiator_remote_seid);
|
||||
if (stream_endpoint == NULL){
|
||||
stream_endpoint = avdtp_get_stream_endpoint_with_seid(connection->initiator_local_seid);
|
||||
if (stream_endpoint == NULL){
|
||||
log_debug("no stream endpoint for local %u, remote %u", connection->initiator_local_seid, connection->initiator_remote_seid);
|
||||
return;
|
||||
} else {
|
||||
log_debug("Using stream endpoint %p for local seid %u", stream_endpoint, connection->initiator_local_seid);
|
||||
}
|
||||
} else {
|
||||
log_debug("Using stream endpoint %p for remote seid %u", stream_endpoint, connection->initiator_remote_seid);
|
||||
}
|
||||
avdtp_stream_endpoint_t * stream_endpoint = avdtp_get_stream_endpoint_for_seid(connection->initiator_local_seid);
|
||||
|
||||
if (stream_endpoint == NULL) return;
|
||||
sent = avdtp_initiator_stream_config_subsm_run_endpoint(connection, stream_endpoint);
|
||||
if (sent) return;
|
||||
|
||||
@ -507,12 +490,11 @@ void avdtp_initiator_stream_config_subsm_run(avdtp_connection_t *connection) {
|
||||
}
|
||||
}
|
||||
|
||||
if (stream_endpoint->request_can_send_now){
|
||||
stream_endpoint->request_can_send_now = 0;
|
||||
if (stream_endpoint->state == AVDTP_STREAM_ENDPOINT_STREAMING){
|
||||
stream_endpoint->state = AVDTP_STREAM_ENDPOINT_STREAMING;
|
||||
avdtp_streaming_emit_can_send_media_packet_now(stream_endpoint, stream_endpoint->sequence_number);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void avdtp_initiator_stream_config_subsm_handle_can_send_now_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint) {
|
||||
if (stream_endpoint->state == AVDTP_STREAM_ENDPOINT_STREAMING){
|
||||
stream_endpoint->state = AVDTP_STREAM_ENDPOINT_STREAMING;
|
||||
avdtp_streaming_emit_can_send_media_packet_now(stream_endpoint, stream_endpoint->sequence_number);
|
||||
}
|
||||
}
|
||||
|
@ -53,7 +53,8 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
void avdtp_initiator_stream_config_subsm(avdtp_connection_t *connection, uint8_t *packet, uint16_t size, int offset);
|
||||
void avdtp_initiator_stream_config_subsm_run(avdtp_connection_t *connection);
|
||||
void avdtp_initiator_stream_config_subsm_handle_can_send_now_signaling(avdtp_connection_t *connection);
|
||||
void avdtp_initiator_stream_config_subsm_handle_can_send_now_stream_endpoint(avdtp_stream_endpoint_t *stream_endpoint);
|
||||
|
||||
#if defined __cplusplus
|
||||
}
|
||||
|
@ -196,7 +196,7 @@ uint8_t avdtp_sink_delay_report(uint16_t avdtp_cid, uint8_t local_seid, uint16_t
|
||||
connection->delay_ms = delay_100us;
|
||||
connection->initiator_local_seid = local_seid;
|
||||
connection->initiator_remote_seid = stream_endpoint->remote_sep.seid;
|
||||
avdtp_request_can_send_now_initiator(connection, connection->l2cap_signaling_cid);
|
||||
avdtp_request_can_send_now_initiator(connection);
|
||||
return ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -244,7 +244,7 @@ void avdtp_source_stream_endpoint_request_can_send_now(uint16_t avdtp_cid, uint8
|
||||
return;
|
||||
}
|
||||
stream_endpoint->request_can_send_now = true;
|
||||
avdtp_request_can_send_now_initiator(stream_endpoint->connection, stream_endpoint->l2cap_media_cid);
|
||||
l2cap_request_can_send_now_event(stream_endpoint->l2cap_media_cid);
|
||||
}
|
||||
|
||||
int avdtp_max_media_payload_size(uint16_t avdtp_cid, uint8_t local_seid){
|
||||
|
@ -998,17 +998,17 @@ void avdtp_streaming_emit_can_send_media_packet_now(avdtp_stream_endpoint_t *str
|
||||
(*packet_handler)(HCI_EVENT_PACKET, 0, event, sizeof(event));
|
||||
}
|
||||
|
||||
uint8_t avdtp_request_can_send_now_acceptor(avdtp_connection_t * connection, uint16_t l2cap_cid){
|
||||
uint8_t avdtp_request_can_send_now_acceptor(avdtp_connection_t *connection) {
|
||||
if (!connection) return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
|
||||
connection->wait_to_send_acceptor = 1;
|
||||
l2cap_request_can_send_now_event(l2cap_cid);
|
||||
connection->wait_to_send_acceptor = true;
|
||||
l2cap_request_can_send_now_event(connection->l2cap_signaling_cid);
|
||||
return ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
uint8_t avdtp_request_can_send_now_initiator(avdtp_connection_t * connection, uint16_t l2cap_cid){
|
||||
uint8_t avdtp_request_can_send_now_initiator(avdtp_connection_t *connection) {
|
||||
if (!connection) return ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER;
|
||||
connection->wait_to_send_initiator = 1;
|
||||
l2cap_request_can_send_now_event(l2cap_cid);
|
||||
connection->wait_to_send_initiator = true;
|
||||
l2cap_request_can_send_now_event(connection->l2cap_signaling_cid);
|
||||
return ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -107,9 +107,9 @@ void avdtp_streaming_emit_connection_released(avdtp_stream_endpoint_t *stream_en
|
||||
|
||||
void avdtp_streaming_emit_can_send_media_packet_now(avdtp_stream_endpoint_t *stream_endpoint, uint16_t sequence_number);
|
||||
|
||||
uint8_t avdtp_request_can_send_now_acceptor(avdtp_connection_t * connection, uint16_t l2cap_cid);
|
||||
uint8_t avdtp_request_can_send_now_acceptor(avdtp_connection_t *connection);
|
||||
|
||||
uint8_t avdtp_request_can_send_now_initiator(avdtp_connection_t * connection, uint16_t l2cap_cid);
|
||||
uint8_t avdtp_request_can_send_now_initiator(avdtp_connection_t *connection);
|
||||
|
||||
void avdtp_reset_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user