hfp: use HFP_SCO_PACKET_TYPES in link settings table

This commit is contained in:
Matthias Ringwald 2020-09-08 18:51:39 +02:00
parent 01e5b7274c
commit 352a05047d
4 changed files with 34 additions and 34 deletions

View File

@ -1581,14 +1581,14 @@ static const struct link_settings {
const bool eSCO;
const uint8_t codec;
} hfp_link_settings [] = {
{ 0xffff, 0xff, 0x03c1, false, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_D0, HV1
{ 0xffff, 0xff, 0x03c4, false, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_D1, HV3
{ 0x0007, 0x01, 0x03c8, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S1, EV3
{ 0x0007, 0x01, 0x0380, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S2, 2-EV3
{ 0x000a, 0x01, 0x0380, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S3, 2-EV3
{ 0x000c, 0x02, 0x0380, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S4, 2-EV3
{ 0x0008, 0x02, 0x03c8, true, HFP_CODEC_MSBC }, // HFP_LINK_SETTINGS_T1, EV3
{ 0x000d, 0x02, 0x0380, true, HFP_CODEC_MSBC } // HFP_LINK_SETTINGS_T2, 2-EV3
{ 0xffff, 0xff, SCO_PACKET_TYPES_HV1, false, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_D0
{ 0xffff, 0xff, SCO_PACKET_TYPES_HV3, false, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_D1
{ 0x0007, 0x01, SCO_PACKET_TYPES_EV3, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S1
{ 0x0007, 0x01, SCO_PACKET_TYPES_2EV3, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S2
{ 0x000a, 0x01, SCO_PACKET_TYPES_2EV3, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S3
{ 0x000c, 0x02, SCO_PACKET_TYPES_2EV3, true, HFP_CODEC_CVSD }, // HFP_LINK_SETTINGS_S4
{ 0x0008, 0x02, SCO_PACKET_TYPES_EV3, true, HFP_CODEC_MSBC }, // HFP_LINK_SETTINGS_T1
{ 0x000d, 0x02, SCO_PACKET_TYPES_2EV3, true, HFP_CODEC_MSBC } // HFP_LINK_SETTINGS_T2
};
void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){
@ -1600,8 +1600,10 @@ void hfp_setup_synchronous_connection(hfp_connection_t * hfp_connection){
if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){
sco_voice_setting = 0x0043; // Transparent data
}
// get packet types - bits 6-9 are 'don't allow'
uint16_t packet_types = hfp_link_settings[setting].packet_types ^ 0x03c0;
hci_send_cmd(&hci_setup_synchronous_connection, hfp_connection->acl_handle, 8000, 8000, hfp_link_settings[setting].max_latency,
sco_voice_setting, hfp_link_settings[setting].retransmission_effort, hfp_link_settings[setting].packet_types); // all types 0x003f, only 2-ev3 0x380
sco_voice_setting, hfp_link_settings[setting].retransmission_effort, packet_types);
}
void hfp_set_hf_callback(btstack_packet_handler_t callback){
@ -1625,7 +1627,7 @@ void hfp_set_hf_run_for_context(void (*callback)(hfp_connection_t * hfp_connecti
}
void hfp_init(void){
hfp_allowed_sco_packet_types = HFP_SCO_PACKET_TYPES_NONE;
hfp_allowed_sco_packet_types = SCO_PACKET_TYPES_ALL;
}
void hfp_set_sco_packet_types(uint16_t packet_types){
@ -1648,9 +1650,9 @@ hfp_link_settings_t hfp_next_link_setting(hfp_link_settings_t current_setting, b
// skip wrong codec
if ( hfp_link_settings[setting].codec != negotiated_codec) continue;
// skip disabled packet types
uint16_t required_packet_types = hfp_link_settings[setting].packet_types ^ HFP_SCO_PACKET_TYPES_NONE;
uint16_t allowed_packet_types = hfp_allowed_sco_packet_types ^HFP_SCO_PACKET_TYPES_NONE;
if ((allowed_packet_types != 0) && ((required_packet_types & allowed_packet_types) == 0)) continue;
uint16_t required_packet_types = hfp_link_settings[setting].packet_types;
uint16_t allowed_packet_types = hfp_allowed_sco_packet_types;
if ((required_packet_types & allowed_packet_types) == 0) continue;
// found matching setting
return (hfp_link_settings_t) setting;

View File

@ -156,12 +156,6 @@ extern "C" {
#define HFP_CODEC_CVSD 0x01
#define HFP_CODEC_MSBC 0x02
#define HFP_SCO_PACKET_TYPES_NONE 0x3c0
#define HFP_SCO_PACKET_TYPES_HV1 0x3C1
#define HFP_SCO_PACKET_TYPES_HV3 0x3C4
#define HFP_SCO_PACKET_TYPES_EV3 0x3C8
#define HFP_SCO_PACKET_TYPES_2EV3 0x380
typedef enum {
HFP_ROLE_INVALID = 0,
HFP_ROLE_AG,
@ -706,13 +700,13 @@ const char * hfp_enhanced_call_mode2str(uint16_t index);
const char * hfp_enhanced_call_mpty2str(uint16_t index);
/**
* @brief Set packet types used to accept incoming SCO connection requests
* @brief Set packet types for SCO connections
* @param common single packet_types: HFP_SCO_PACKET_TYPES_*
*/
void hfp_set_sco_packet_types(uint16_t packet_types);
/**
* @brief Get packet types used to accept incoming SCO connection requests
* @brief Get packet types for SCO connections
* @returns packet_types
*/
uint16_t hfp_get_sco_packet_types(void);

View File

@ -607,23 +607,27 @@ static void hfp_run_for_context(hfp_connection_t * hfp_connection){
if (eSCO && hci_extended_sco_link_supported() && hci_remote_esco_supported(hfp_connection->acl_handle)){
max_latency = 0x000c;
retransmission_effort = 0x02;
packet_types = 0x388;
// eSCO: EV3 and 2-EV3
packet_types = 0x0048;
} else {
max_latency = 0xffff;
retransmission_effort = 0xff;
packet_types = 0x003f;
}
// packet type override
if (hfp_get_sco_packet_types() != HFP_SCO_PACKET_TYPES_NONE){
packet_types = hfp_get_sco_packet_types();
// sco: HV1 and HV3
packet_types = 0x005;
}
// mSBC only allows for transparent data
uint16_t sco_voice_setting = hci_get_sco_voice_setting();
if (hfp_connection->negotiated_codec == HFP_CODEC_MSBC){
sco_voice_setting = 0x0043; // Transparent data
}
// filter packet types
packet_types &= hfp_get_sco_packet_types();
// bits 6-9 are 'don't allow'
packet_types ^= 0x3c0;
log_info("HFP: sending hci_accept_connection_request, packet types 0x%04x, sco_voice_setting 0x%02x", packet_types, sco_voice_setting);
hci_send_cmd(&hci_accept_synchronous_connection, hfp_connection->remote_addr, 8000, 8000, max_latency,
sco_voice_setting, retransmission_effort, packet_types);

View File

@ -7,7 +7,7 @@
TEST_GROUP(HFPLinkSettings){
void setup(void){
hfp_set_sco_packet_types(HFP_SCO_PACKET_TYPES_NONE);
hfp_set_sco_packet_types(SCO_PACKET_TYPES_ALL);
}
void teardown(void){
}
@ -58,24 +58,24 @@ TEST(HFPLinkSettings, D1_D0){
// initial settings based on packet types
TEST(HFPLinkSettings, HV1){
hfp_set_sco_packet_types(HFP_SCO_PACKET_TYPES_HV1);
hfp_set_sco_packet_types(SCO_PACKET_TYPES_HV1);
CHECK_EQUAL(HFP_LINK_SETTINGS_D0, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, false, true, true, HFP_CODEC_CVSD));
CHECK_EQUAL(HFP_LINK_SETTINGS_D0, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, false, true, HFP_CODEC_CVSD));
}
TEST(HFPLinkSettings, HV3){
hfp_set_sco_packet_types(HFP_SCO_PACKET_TYPES_HV3);
hfp_set_sco_packet_types(SCO_PACKET_TYPES_HV3);
CHECK_EQUAL(HFP_LINK_SETTINGS_D1, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, false, HFP_CODEC_CVSD));
}
TEST(HFPLinkSettings, EV3){
hfp_set_sco_packet_types(HFP_SCO_PACKET_TYPES_EV3);
hfp_set_sco_packet_types(SCO_PACKET_TYPES_EV3);
CHECK_EQUAL(HFP_LINK_SETTINGS_S1, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, true, HFP_CODEC_CVSD));
CHECK_EQUAL(HFP_LINK_SETTINGS_T1, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, true, HFP_CODEC_MSBC));
}
TEST(HFPLinkSettings, 2EV3){
hfp_set_sco_packet_types(HFP_SCO_PACKET_TYPES_2EV3);
hfp_set_sco_packet_types(SCO_PACKET_TYPES_2EV3);
CHECK_EQUAL(HFP_LINK_SETTINGS_S3, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, false, HFP_CODEC_CVSD));
CHECK_EQUAL(HFP_LINK_SETTINGS_S4, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, true, HFP_CODEC_CVSD));
CHECK_EQUAL(HFP_LINK_SETTINGS_T2, hfp_next_link_setting(HFP_LINK_SETTINGS_NONE, true, true, true, HFP_CODEC_MSBC));