avdtp: streamline request to send for acceptor/initiator signaling connections

avoid stream endpoint lookup by remote seid
This commit is contained in:
Matthias Ringwald 2020-10-16 11:28:59 +02:00
parent 76b0318e1d
commit d80ccd43b8
9 changed files with 97 additions and 123 deletions

View File

@ -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){

View File

@ -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));

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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
}

View File

@ -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;
}

View File

@ -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){

View File

@ -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;
}

View File

@ -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);