From 1b005648b248d73d8ec14679cff8819d40a83b63 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Wed, 11 Apr 2018 15:44:28 +0200 Subject: [PATCH] hfp: handle accept sco connection in hfp_hf --- src/classic/hfp.c | 28 +++++++++++++++++++--------- src/classic/hfp.h | 1 + src/classic/hfp_hf.c | 1 + 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/classic/hfp.c b/src/classic/hfp.c index 4007c766f..0a84d03a4 100644 --- a/src/classic/hfp.c +++ b/src/classic/hfp.c @@ -106,18 +106,12 @@ static btstack_packet_handler_t hfp_ag_callback; static btstack_packet_handler_t hfp_hf_rfcomm_packet_handler; static btstack_packet_handler_t hfp_ag_rfcomm_packet_handler; +static void (*hfp_hf_run_for_context)(hfp_connection_t * hfp_connection); + static btstack_packet_callback_registration_t hci_event_callback_registration; static hfp_connection_t * sco_establishment_active; -void hfp_set_hf_callback(btstack_packet_handler_t callback){ - hfp_hf_callback = callback; -} - -void hfp_set_ag_callback(btstack_packet_handler_t callback){ - hfp_ag_callback = callback; -} - const char * hfp_hf_feature(int index){ if (index > HFP_HF_FEATURES_SIZE){ return hfp_hf_features[HFP_HF_FEATURES_SIZE]; @@ -580,15 +574,18 @@ void hfp_handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet log_debug("HFP packet_handler type %u, event type %x, size %u", packet_type, hci_event_packet_get_type(packet), size); switch (hci_event_packet_get_type(packet)) { + case HCI_EVENT_CONNECTION_REQUEST: - // printf("hfp HCI_EVENT_CONNECTION_REQUEST\n"); switch(hci_event_connection_request_get_link_type(packet)){ case 0: // SCO case 2: // eSCO hci_event_connection_request_get_bd_addr(packet, event_addr); hfp_connection = get_hfp_connection_context_for_bd_addr(event_addr); if (!hfp_connection) break; + log_info("hf accept sco\n"); hfp_connection->hf_accept_sco = 1; + if (!hfp_hf_run_for_context) break; + (*hfp_hf_run_for_context)(hfp_connection); break; default: break; @@ -1490,13 +1487,26 @@ void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){ sco_voice_setting, hfp_link_settings[setting].retransmission_effort, hfp_link_settings[setting].packet_types); // all types 0x003f, only 2-ev3 0x380 } +void hfp_set_hf_callback(btstack_packet_handler_t callback){ + hfp_hf_callback = callback; +} + +void hfp_set_ag_callback(btstack_packet_handler_t callback){ + hfp_ag_callback = callback; +} + void hfp_set_ag_rfcomm_packet_handler(btstack_packet_handler_t handler){ hfp_ag_rfcomm_packet_handler = handler; } + void hfp_set_hf_rfcomm_packet_handler(btstack_packet_handler_t handler){ hfp_hf_rfcomm_packet_handler = handler; } +void hfp_set_hf_run_for_context(void (*callback)(hfp_connection_t * hfp_connection)){ + hfp_hf_run_for_context = callback; +} + static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ hfp_handle_hci_event(packet_type, channel, packet, size, HFP_ROLE_INVALID); } diff --git a/src/classic/hfp.h b/src/classic/hfp.h index a6d59a0e7..b2c31eb6f 100644 --- a/src/classic/hfp.h +++ b/src/classic/hfp.h @@ -647,6 +647,7 @@ void hfp_set_ag_rfcomm_packet_handler(btstack_packet_handler_t handler); void hfp_set_hf_callback(btstack_packet_handler_t callback); void hfp_set_hf_rfcomm_packet_handler(btstack_packet_handler_t handler); +void hfp_set_hf_run_for_context(void (*callbcack)(hfp_connection_t * hfp_connection)); void hfp_init(void); diff --git a/src/classic/hfp_hf.c b/src/classic/hfp_hf.c index 8ea230b12..193dd8ffe 100644 --- a/src/classic/hfp_hf.c +++ b/src/classic/hfp_hf.c @@ -1100,6 +1100,7 @@ void hfp_hf_init(uint16_t rfcomm_channel_nr){ rfcomm_register_service(rfcomm_packet_handler, rfcomm_channel_nr, 0xffff); hfp_set_hf_rfcomm_packet_handler(&rfcomm_packet_handler); + hfp_set_hf_run_for_context(hfp_run_for_context); hfp_supported_features = HFP_DEFAULT_HF_SUPPORTED_FEATURES; hfp_codecs_nr = 0;