hfp: serialize sco setup

This commit is contained in:
Matthias Ringwald 2023-06-22 09:36:49 +02:00
parent 6b3901f2f7
commit 447743f7db
3 changed files with 16 additions and 10 deletions

View File

@ -879,7 +879,6 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet
hfp_connection->rtk_send_sco_config = true;
#endif
log_info("accept sco %u\n", hfp_connection->accept_sco);
hfp_sco_establishment_active = hfp_connection;
break;
default:
break;
@ -896,6 +895,7 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet
if (hfp_handle_failed_sco_connection(status)) break;
hfp_connection->establish_audio_connection = 0;
hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED;
hfp_sco_establishment_active = NULL;
hfp_emit_sco_connection_established(hfp_connection, status,
hfp_connection->negotiated_codec, 0, 0);
}
@ -903,12 +903,8 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet
case HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETE:{
if (hfp_sco_establishment_active == NULL) break;
hci_event_synchronous_connection_complete_get_bd_addr(packet, event_addr);
hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr, local_role);
if (!hfp_connection) {
log_error("HFP: connection does not exist for remote with addr %s.", bd_addr_to_str(event_addr));
return;
}
hfp_connection = hfp_sco_establishment_active;
status = hci_event_synchronous_connection_complete_get_status(packet);
if (status != ERROR_CODE_SUCCESS){
@ -917,6 +913,7 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet
hfp_connection->establish_audio_connection = 0;
hfp_connection->state = HFP_SERVICE_LEVEL_CONNECTION_ESTABLISHED;
hfp_sco_establishment_active = NULL;
hfp_emit_sco_connection_established(hfp_connection, status,
hfp_connection->negotiated_codec, 0, 0);
break;
@ -968,6 +965,9 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet
hfp_connection->ag_audio_connection_opened_before_vra = true;
break;
}
hfp_sco_establishment_active = NULL;
hfp_emit_sco_connection_established(hfp_connection, status,
hfp_connection->negotiated_codec, rx_packet_length, tx_packet_length);
break;
@ -1908,10 +1908,12 @@ bool hfp_sco_setup_active(void){
}
void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){
hfp_sco_establishment_active = hfp_connection;
// all packet types, fixed bandwidth
int setting = hfp_connection->link_setting;
log_info("hfp_setup_synchronous_connection using setting nr %u", setting);
hfp_sco_establishment_active = hfp_connection;
uint16_t sco_voice_setting = hci_get_sco_voice_setting();
if (hfp_connection->negotiated_codec != HFP_CODEC_CVSD){
#ifdef ENABLE_BCM_PCM_WBS
@ -1931,6 +1933,8 @@ void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){
void hfp_accept_synchronous_connection(hfp_connection_t * hfp_connection, bool use_eSCO){
hfp_sco_establishment_active = hfp_connection;
// use "don't care" where possible
uint16_t max_latency = 0xffff;
uint16_t retransmission_effort = 0xff;

View File

@ -1115,7 +1115,7 @@ static int hfp_ag_run_for_audio_connection(hfp_connection_t * hfp_connection){
}
// accept incoming audio connection (codec negotiation is not used)
if (hfp_connection->accept_sco){
if (hfp_connection->accept_sco && (hfp_sco_setup_active() == false)){
// notify about codec selection if not done already
if (hfp_connection->negotiated_codec == 0){
hfp_connection->negotiated_codec = HFP_CODEC_CVSD;
@ -1133,6 +1133,7 @@ static int hfp_ag_run_for_audio_connection(hfp_connection_t * hfp_connection){
if (sent) return 1;
if (hfp_connection->codecs_state != HFP_CODECS_EXCHANGED) return 0;
if (hfp_sco_setup_active()) return 0;
if (hci_can_send_command_packet_now() == false) return 0;
if (hfp_connection->establish_audio_connection){
hfp_connection->state = HFP_W4_SCO_CONNECTED;

View File

@ -725,6 +725,7 @@ static int hfp_hf_run_for_audio_connection(hfp_connection_t * hfp_connection){
if (done) return 1;
if (hfp_connection->codecs_state != HFP_CODECS_EXCHANGED) return 0;
if (hfp_sco_setup_active()) return 0;
if (hci_can_send_command_packet_now() == false) return 0;
if (hfp_connection->establish_audio_connection){
hfp_connection->state = HFP_W4_SCO_CONNECTED;
@ -825,7 +826,7 @@ static void hfp_hf_run_for_context(hfp_connection_t * hfp_connection){
}
#endif
if (hfp_connection->accept_sco){
if (hfp_connection->accept_sco && (hfp_sco_setup_active() == false)){
bool incoming_eSCO = hfp_connection->accept_sco == 2;
hfp_connection->accept_sco = 0;
// notify about codec selection if not done already